

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Cloud Custodian 封鎖對 Amazon RDS 的公開存取
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian"></a>

*abhay kumar 和 Dwarika Patra，Amazon Web Services*

## 總結
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-summary"></a>

許多組織會在多個雲端廠商上執行工作負載和服務。在這些混合雲端環境中，除了個別雲端提供者提供的安全性之外，雲端基礎設施還需要嚴格的雲端控管。Amazon Relational Database Service (Amazon RDS) 等雲端資料庫是一項重要的服務，必須監控是否有任何存取和許可漏洞。雖然您可以透過設定安全群組來限制對 Amazon RDS 資料庫的存取，但您可以新增第二層保護來禁止公開存取等動作。封鎖公開存取可協助您符合一般資料保護法規 (GDPR)、健康保險流通與責任法案 (HIPAA)、國家標準與技術研究所 (NIST)，以及支付卡產業資料安全標準 (PCI DSS)。

Cloud Custodian 是開放原始碼規則引擎，可用來強制執行 Amazon RDS 等 Amazon Web Services (AWS) 資源的存取限制。使用 Cloud Custodian，您可以設定規則，根據定義的安全和合規標準來驗證環境。您可以使用 Cloud Custodian 來管理雲端環境，方法是協助確保符合安全政策、標籤政策，以及未使用的資源和成本管理的垃圾回收。使用 Cloud Custodian，您可以使用單一界面在混合雲端環境中實作控管。例如，您可以使用 Cloud Custodian 介面與 AWS 和 Microsoft Azure 互動，減少使用 AWS Config AWS 安全群組和 Azure 政策等機制的工作量。

此模式提供在 上使用 Cloud Custodian AWS 以在 Amazon RDS 執行個體上強制執行公有可存取性限制的指示。

## 先決條件和限制
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶
+ [金鑰對](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-creds-create)
+ AWS Lambda 已安裝

## Architecture
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-architecture"></a>

下圖顯示 Cloud Custodian 將政策部署到 AWS Lambda、 AWS CloudTrail 啟動`CreateDBInstance`事件，以及將 Amazon RDS 上的 Lambda 函數設定為 `PubliclyAccessible` false。

![\[在 AWS 上使用 Cloud Custodian 來限制對 Amazon RDS 執行個體的公開存取。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/90f9537e-9365-4da2-8a28-da0ff374743c/images/6d04ca3b-6aa4-4c62-ade9-8b7474928c5e.png)


## 工具
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-tools"></a>

**AWS 服務**
+ [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 可協助您稽核 的控管、合規和營運風險 AWS 帳戶。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一種開放原始碼工具，可協助您 AWS 服務 透過命令列 shell 中的命令與 互動。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需支付使用的運算時間。
+ [Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) 可協助您在 中設定、操作和擴展關聯式資料庫 AWS 雲端。

**其他工具**
+ [Cloud Custodian](https://cloudcustodian.io/) 會將許多組織用來管理公有雲端帳戶的工具和指令碼統一為單一開放原始碼工具。它使用無狀態規則引擎進行政策定義和強制執行，具有指標、結構化輸出和雲端基礎設施的詳細報告。它與無伺服器執行期緊密整合，以低營運開銷提供即時修補和回應。

## 史詩
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-epics"></a>

### 設定 AWS CLI
<a name="set-up-the-cli"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝 AWS CLI。 | 若要安裝 AWS CLI，請遵循 [AWS 文件](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)中的指示。 | AWS 管理員 | 
| 設定 AWS 登入資料。 | 設定 AWS CLI 用來與 互動的設定 AWS，包括您要使用的 AWS 區域 和輸出格式。<pre>$>aws configure<br />AWS Access Key ID [None]: <your_access_key_id><br />AWS Secret Access Key [None]: <your_secret_access_key><br />Default region name [None]:<br />Default output format [None]:</pre>如需詳細資訊，請參閱 [AWS 文件](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。 | AWS 管理員 | 
| 建立 IAM 角色。 | 若要使用 Lambda 執行角色建立 IAM 角色，請執行下列命令。<pre>aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17",		 	 	 "Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}</pre> | AWS DevOps | 

### 設定雲端託管人
<a name="set-up-cloud-custodian"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝 Cloud Custodian。 | 若要為您的作業系統和環境安裝 Cloud Custodian，請遵循 [Cloud Custodian 文件](https://cloudcustodian.io/docs/quickstart/index.html#install-cc)中的指示。 | DevOps 工程師 | 
| 檢查雲端託管結構描述。 | 若要查看您可以對其執行政策的 Amazon RDS 資源完整清單，請使用下列命令。<pre>custodian schema aws.rds</pre> | DevOps 工程師 | 
| 建立 Cloud Custodian 政策。 | 使用 YAML 擴充功能，在[其他資訊](#block-public-access-to-amazon-rds-by-using-cloud-custodian-additional)區段中儲存 *Cloud Custodian 政策檔案*下的程式碼。 | DevOps 工程師 | 
| 定義 Cloud Custodian 動作以變更可公開存取的旗標。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/block-public-access-to-amazon-rds-by-using-cloud-custodian.html) | DevOps 工程師 | 
| 執行試轉。 | （選用） 若要檢查政策識別哪些資源，而不對資源執行任何動作，請使用下列命令。<pre>custodian run -dryrun <policy_name>.yaml -s <output_directory></pre> | DevOps 工程師 | 

### 部署政策
<a name="deploy-the-policy"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 使用 Lambda 部署政策。 | 若要建立將執行政策的 Lambda 函數，請使用下列命令。<pre>custodian run -s policy.yaml</pre>此政策接著將由事件 AWS CloudTrail `CreateDBInstance`啟動。因此， 針對符合條件的執行個體， AWS Lambda 會將可公開存取的旗標設定為 `false` 。 | DevOps 工程師 | 

## 相關資源
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-resources"></a>
+ [AWS Lambda website](https://aws.amazon.com/lambda/)
+ [Amazon RDS 網站](https://aws.amazon.com/rds/)
+ [雲端託管人文件](https://cloudcustodian.io/docs/quickstart/index.html)

## 其他資訊
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-additional"></a>

**雲端託管人政策 YAML 檔案**

```
policies:
  - name: "block-public-access"
    resource: rds
    description: |
      This Enforcement blocks public access for RDS instances.
    mode:
      type: cloudtrail
      events:
        - event: CreateDBInstance # Create RDS instance cloudtrail event
          source: rds.amazonaws.com
          ids: requestParameters.dBInstanceIdentifier
      role: arn:aws:iam::1234567890:role/Custodian-compliance-role
    filters:
      - type: event
        key: 'detail.requestParameters.publiclyAccessible'
        value: true
    actions:
      - type: set-public-access
        state: false
```

**c7n 資源 rds.py 檔案**

```
@actions.register('set-public-access')
 class RDSSetPublicAvailability(BaseAction):
 
     schema = type_schema(
         "set-public-access",
         state={'type': 'boolean'})
     permissions = ('rds:ModifyDBInstance',)
 
     def set_accessibility(self, r):
         client = local_session(self.manager.session_factory).client('rds')
         waiter = client.get_waiter('db_instance_available')
         waiter.wait(DBInstanceIdentifier=r['DBInstanceIdentifier'])
         client.modify_db_instance(
             DBInstanceIdentifier=r['DBInstanceIdentifier'],
             PubliclyAccessible=self.data.get('state', False))
 
 
     def process(self, rds):
         with self.executor_factory(max_workers=2) as w:
             futures = {w.submit(self.set_accessibility, r): r for r in rds}
             for f in as_completed(futures):
                 if f.exception():
                     self.log.error(
                         "Exception setting public access on %s  \n %s",
                         futures[f]['DBInstanceIdentifier'], f.exception())
         return rds
```

**Security Hub CSPM 整合**

雲端託管人可與 整合[AWS Security Hub CSPM](https://aws.amazon.com/security-hub/)，以傳送安全調查結果並嘗試修復動作。如需詳細資訊，請參閱[與 宣布雲端託管整合 AWS Security Hub CSPM](https://aws.amazon.com/blogs/opensource/announcing-cloud-custodian-integration-aws-security-hub/)。