

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 创建 AWS Config 自定义策略规则
<a name="evaluate-config_develop-rules_cfn-guard"></a>

您可以通过 AWS 管理控制台 AWS CLI、或 AWS Config API 创建 AWS Config 自定义策略规则。

## 添加 AWS Config 自定义策略规则
<a name="config-custom-policy-rules-add"></a>

------
#### [ Using the console ]

1. 登录 AWS 管理控制台 并在家中打开[https://console.aws.amazon.com/config/主 AWS Config](https://console.aws.amazon.com/config/home)机。

1. 在 AWS 管理控制台 菜单中，确认区域选择器设置为支持 AWS Config 规则的 AWS 区域。有关支持的区域的列表，请参阅《Amazon Web Services 一般参考》**中的 [AWS Config 区域和终端节点](https://docs.aws.amazon.com/general/latest/gr/awsconfig.html)。

1. 在左侧导航窗格中，选择 **Rules**。

1. 在 **Rules** 页面，选择 **Add rule**。

1. 在**指定规则类型**页面上，选择**使用 Guard 创建自定义规则**。

1. 在**配置规则**页面上，通过完成以下步骤创建规则：

   1. 对于**规则名称**，键入一个唯一的规则名称。

   1. 对于**描述**，键入规则的描述。

   1. 对于 **Guard 运行时版本**，请为您的 AWS Config 自定义策略规则选择运行时系统。

   1. 对于**规则内容**，可以为其填充规则的 Guard 自定义策略。

   1. 对于**评估模式**，请选择在资源创建和管理过程中何 AWS Config 时评估您的资源。根据规则， AWS Config 可以在置备资源之前、资源调配之后或两者兼而有之地评估您的资源配置。

      1. 选择**开启主动评估**，以允许您在部署资源之前对资源的配置设置进行评估。

         开启主动评估后，您可以使用 [StartResourceEvaluation](https://docs.aws.amazon.com/config/latest/APIReference/API_StartResourceEvaluation.html)API 和 [GetResourceEvaluationSummary](https://docs.aws.amazon.com/config/latest/APIReference/API_GetResourceEvaluationSummary.html)API 来检查您在这些命令中指定的资源是否会被您所在地区的账户中的主动规则标记为 “不合规”。

          有关使用此命令的更多信息，请参阅[使用 AWS Config 规则评估您的资源](https://docs.aws.amazon.com/config/latest/developerguide/evaluating-your-resources.html#evaluating-your-resources-proactive)。有关支持主动评估的托管规则[列表，请参阅按评估模式列出的 AWS Config 托管规则](https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-evaluation-mode.html)列表。

      1. 选择**开启侦查评估**以评估您的现有资源的配置设置。

         对于侦探评估， AWS Config 自定义策略规则由**配置更改**启动。将预先选择以下选项。
         +  **资源** – 在创建、更改或删除与指定资源类型（或类型和标识符）匹配的资源时。
         +  **标签** – 在创建、更改或删除包含指定标签的资源时。
         +  **所有更改**-创建、更改或删除记录的资源时。 AWS Config 

         AWS Config 当它检测到与规则范围相匹配的资源发生变化时，就会运行评估。您可以使用范围来限制哪些资源启动评估。否则，当配置后的资源发生变化时，就会启动评估。

   1. 对于**参数**，如果您的规则包含参数，可以自定义所提供的键的值。参数是资源在被视为符合规则之前必须遵守的属性。

1. 在**审核和创建**页面上，查看您的所有选择，然后再将规则添加到您的。 AWS 账户

1. 查看完规则后，选择**添加规则**。

------
#### [ Using the AWS CLI ]

使用 [https://docs.aws.amazon.com/cli/latest/reference/configservice/put-config-rule.html](https://docs.aws.amazon.com/cli/latest/reference/configservice/put-config-rule.html) 命令。

`Owner` 字段应为。`CUSTOM_POLICY` AWS Config 自定义策略规则需要以下附加字段：
+ `Runtime`：您的 AWS Config 自定义策略规则的运行时系统。
+ `PolicyText`：包含 AWS Config 自定义策略规则逻辑的策略定义。
+ `EnableDebugLogDelivery`：用于为 AWS Config 自定义策略规则启用调试日志记录的布尔表达式。默认值为 `false`。

------
#### [ Using the API Reference ]

使用 [PutConfigRule](https://docs.aws.amazon.com/config/latest/APIReference/API_PutConfigRule.html) 操作。

`Owner` 字段应为。`CUSTOM_POLICY` AWS Config 自定义策略规则需要以下附加字段：
+ `Runtime`：您的 AWS Config 自定义策略规则的运行时系统。
+ `PolicyText`：包含 AWS Config 自定义策略规则逻辑的策略定义。
+ `EnableDebugLogDelivery`：用于为 AWS Config 自定义策略规则启用调试日志记录的布尔表达式。默认值为 `false`。

------

## 为 AWS Config 自定义策略规则编写规则内容
<a name="config-custom-policy-rules"></a>

使用 AWS Config 自定义策略规则，您可以使用 AWS CloudFormation Guard 的域特定语言 (DSL) 来评估资源配置。本主题提供了编写自定义策略规则的模式和最佳实践。

有关如何使用 Guard 编写规则的更多信息，请参阅 Guard 用户指南中的[编写 AWS CloudFormation 防护规则](https://docs.aws.amazon.com/cfn-guard/latest/ug/writing-rules.html)和 G [AWS CloudFormation uard 2.0 在 Guard GitHub 存储库中的操作模式](https://github.com/aws-cloudformation/cloudformation-guard/tree/main/guard)。

### 基本规则结构
<a name="config-custom-policy-rules-structure"></a>

使用以下基本格式创建规则：

```
# Basic rule format
rule <rule_name> when
    resourceType == "<AWS::Service::Resource>" {
    # Evaluation clauses
}

# Example with filtering
let resources_of_type = Resources.*[ Type == 'AWS::Service::Resource' ]
rule check_resources when %resources_of_type !empty {
    %resources_of_type.configuration.property == expected_value
}
```

### 关键组件
<a name="config-custom-policy-rules-components"></a>

配置  
包含资源配置的内容。

supplementaryConfiguration  
包含资源配置的其他内容。 AWS Config 为某些资源类型返回此字段，以补充为配置字段返回的信息。

resourceType  
AWS 正在评估的资源类型。

resourceId  
资源的 ID（例如，`sg-xxxxxx`）。

accountId  
与资源关联 AWS 账户 的 12 位数字 ID。

### 常见模式
<a name="config-custom-policy-rules-patterns"></a>

------
#### [ Status checks ]

```
let allowed_status = ['ACTIVE', 'RUNNING']
rule check_resource_status when
    resourceType == "AWS::Service::Resource" {
    configuration.status IN %allowed_status
}
```

------
#### [ Required properties ]

```
rule check_required_properties when
    resourceType == "AWS::Service::Resource" {
    configuration.propertyName exists
    configuration.propertyName is_string  # or is_list, is_struct
}
```

------
#### [ Query blocks ]

```
configuration.Properties {
    property1 exists
    property2 is_string
    property3 IN [allowed_value1, allowed_value2]
}
```

------
#### [ Conditional evaluation ]

```
when configuration.feature_enabled == true {
    configuration.feature_settings exists
    configuration.feature_settings is_struct
}
```

------
#### [ Custom messages ]

```
rule check_compliance when
    resourceType == "AWS::Service::Resource" {
    configuration.property == expected_value <<Custom error message explaining the requirement>>
}}
```

------

### 高级功能
<a name="config-custom-policy-rules-advanced"></a>

------
#### [ Range checks ]

```
rule check_numeric_limits {
    # Inclusive range (lower_limit <= value <= upper_limit)
    configuration.value IN r[minimum_value, maximum_value]  

    # Exclusive range (lower_limit < value < upper_limit)
    configuration.value IN r(exclusive_min, exclusive_max)  

    # Left inclusive, right exclusive (lower_limit <= value < upper_limit)
    configuration.value IN r[minimum_value, exclusive_max)

    # Left exclusive, right inclusive (lower_limit < value <= upper_limit)
    configuration.value IN r(exclusive_min, maximum_value]
}
```

------
#### [ Combining conditions ]

```
# AND conditions (implicit through new lines)
condition_1
condition_2

# OR conditions (explicit)
condition_3 OR
condition_4
```

------
#### [ Chaining rules ]

```
rule check_prerequisites {
    configuration.required_setting exists
}

rule check_details when check_prerequisites {
    configuration.required_setting == expected_value
}
```

------

### 最佳实践
<a name="config-custom-policy-rules-best-practices"></a>
+ 将变量与 `let` 语句结合使用来提高可读性。
+ 使用命名规则块对相关检查进行分组。
+ 包括描述性注释。
+ 使用适当的运算符（`exists`、`is_string`、`is_list`）。
+ 使用支持不区分大小写匹配的正则表达式模式。

### 例如： dynamodb-pitr-enabled
<a name="config-custom-policy-rules-example"></a>

以下示例显示了 AWS Config 托管规则的 AWS Config 自定义策略规则版本的策略定义[dynamodb-pitr-enabled](dynamodb-pitr-enabled.md)。此规则检查 DynamoDB 表 Point-in-Time是否启用了恢复。

```
# Check if DynamoDB tables have Point-in-Time Recovery enabled
let status = ['ACTIVE']

rule tableisactive when
    resourceType == "AWS::DynamoDB::Table" {
    configuration.tableStatus == %status
}

rule checkcompliance when
    resourceType == "AWS::DynamoDB::Table"
    tableisactive {
    let pitr = supplementaryConfiguration.ContinuousBackupsDescription.pointInTimeRecoveryDescription.pointInTimeRecoveryStatus
    %pitr == "ENABLED" <<DynamoDB tables must have Point-in-Time Recovery enabled>>
}
```