

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

# 声明性策略语法和示例
<a name="orgs_manage_policies_declarative_syntax"></a>

本页将介绍声明性策略语法并提供示例。

## 注意事项
<a name="declarative-policy-syntax-considerations"></a>
+ 当您使用声明式策略配置服务属性时，它可能会影响多个 APIs属性。任何不合规的操作都将失败。
+ 账户管理员将无法在个人账户级别修改服务属性的值。

## 声明性策略的语法
<a name="declarative-policy-syntax-reference"></a>

声明性策略是一个纯文本文件，根据 [JSON](http://json.org) 的规则设置结构。声明性策略的语法遵循所有管理策略类型的语法。有关该语法的完整讨论，请参阅[管理策略类型的策略语法和继承](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_inheritance_mgmt.html)。本主题重点介绍如何使用该常规语法来满足声明性策略类型的特定要求。

以下示例展示了声明性策略的基本语法：

```
{
  "ec2_attributes": {
    "exception_message": {
      "@@assign": "Your custom error message.https://myURL"
    }
  }
}
```
+ `ec2_attributes` 字段键名称。声明式策略始终以给 AWS 服务定密钥的固定密钥名称开头。它是上面示例策略中的顶行。目前，声明性策略仅支持与 Amazon EC2 相关的服务。
+ 在 `ec2_attributes` 下，您可以使用 `exception_message` 设置自定义错误消息。有关更多信息，请参阅[声明性策略的自定义错误消息](orgs_manage_policies_declarative.md#orgs_manage_policies_declarative-custom-message)。
+ 在 `ec2_attributes` 下，您可以插入一个或多个支持的声明性策略。有关这些架构，请参阅[支持的声明性策略](#declarative-policy-examples)。

## 支持的声明性策略
<a name="declarative-policy-examples"></a>

以下是声明式策略支持的 AWS 服务 和属性。在以下某些示例中，可能会压缩 JSON 空白格式以节省空间。
+ VPC 屏蔽公共访问权限
+ Serial Console 访问权限
+ 映像屏蔽公共访问权限
+ 允许的映像设置
+ 实例元数据
+ 快照屏蔽公共访问权限

------
#### [ VPC Block Public Access ]

**策略效果**

控制 Amazon VPCs 和子网中的资源能否通过互联网网关访问互联网（IGWs）。有关更多信息，请参阅《Amazon Virtual Private Cloud 用户指南》**中的[互联网访问配置](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-igw-internet-access.html)。

**策略内容**

```
{
  "ec2_attributes": {
    "vpc_block_public_access": {
      "internet_gateway_block": {
        "mode": {
          "@@assign": "block_ingress"
        },
        "exclusions_allowed": {
          "@@assign": "enabled"
        }
      }
    }
  }
}
```

以下是此属性的可用字段：
+ `"internet_gateway"`:
  + `"mode"`:
    + `"off"`：VPC BPA 未启用。
    + `"block_ingress"`：所有通往 VPCs （不包括的子网除外）的 VPCs 互联网流量都已被阻止。仅允许进出 NAT 网关和仅出口互联网网关的流量，因为这些网关仅允许建立出站连接。
    + `"block_bidirectional"`：所有进出互联网网关和仅限出口的互联网网关（排除的 VPCs 和子网除外）的流量都被阻止。
+ `"exclusions_allowed"`：排除是一种可以应用于单个 VPC 或子网的模式，可将其排除在账户的 VPC BPA 模式之外，并允许双向或仅出口访问。
  + `"enabled"`：可由账户创建排除项。
  + `"disabled"`：无法由账户创建排除项。
**注意**  
您可以使用该属性配置是否允许排除项，但不能使用该属性本身创建排除项。要创建排除项，必须在拥有 VPC 的账户中创建。有关创建 VPC BPA 排除项的更多信息，请参阅《Amazon VPC 用户指南》**中的[创建和删除排除项](https://docs.aws.amazon.com//vpc/latest/userguide/security-vpc-bpa.html#security-vpc-bpa-exclusions)。

**注意事项**

如果在声明性策略中使用此属性，则无法使用以下操作来修改范围内账户的强制配置。此列表并不详尽：
+ `ModifyVpcBlockPublicAccessOptions`
+ `CreateVpcBlockPublicAccessExclusion`
+ `ModifyVpcBlockPublicAccessExclusion`

------
#### [ Serial Console Access ]

**策略效果**

控制 EC2 Serial Console 是否可访问。有关 EC2 Serial Console 的更多信息，请参阅《Amazon Elastic Compute Cloud 用户指南》**中的 [EC2 Serial Console](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-serial-console.html)。

**策略内容**

```
{
  "ec2_attributes": {
    "serial_console_access": {
      "status": {
        "@@assign": "enabled"
      }
    }
  }
}
```

以下是此属性的可用字段：
+ `"status"`:
  + `"enabled"`：允许访问 EC2 Serial Console。
  + `"disabled"`：阻止访问 EC2 Serial Console。

**注意事项**

如果在声明性策略中使用此属性，则无法使用以下操作来修改范围内账户的强制配置。此列表并不详尽：
+ `EnableSerialConsoleAccess`
+ `DisableSerialConsoleAccess`

------
#### [ Image Block Public Access ]

**策略效果**

控制 Amazon 机器映像 (AMIs) 是否可公开共享。有关更多信息 AMIs，请参阅《[亚马逊*弹性计算云用户指南》中的亚马逊系统*映像 (AMIs)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html)。

**策略内容**

```
{
  "ec2_attributes": {
    "image_block_public_access": {
      "state": {
        "@@assign": "block_new_sharing"
      }
    }
  }
}
```

以下是此属性的可用字段：
+ `"state"`:
  + `"unblocked"`: 对公开共享没有限制 AMIs。
  + `"block_new_sharing"`: 阻止新的公开共享 AMIs。 AMIs 已经公开分享的内容仍然是公开的。

**注意事项**

如果在声明性策略中使用此属性，则无法使用以下操作来修改范围内账户的强制配置。此列表并不详尽：
+ `EnableImageBlockPublicAccess`
+ `DisableImageBlockPublicAccess`

------
#### [ Allowed Images Settings ]

**策略效果**

使用 “允许” 控制在 Amazon EC2 中发现和使用亚马逊系统映像 (AMI) AMIs。有关更多信息 AMIs，请参阅[《亚马逊*弹性计算云用户指南*》中的 “允许控制 Amazon EC2 AMIs 中 AMI 的发现和使用](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-allowed-amis.html)”。

**策略内容**

以下是此属性的可用字段：

```
{
  "ec2_attributes": {
    "allowed_images_settings": {
      "state": {
        "@@assign": "enabled"
      },
      "image_criteria": {
        "criteria_1": {
          "allowed_image_providers": {
            "@@append": [
              "amazon"
            ]
          }
        }
      }
    }
  }
}
```
+ `"state"`:
  + `"enabled"`：该属性处于活动状态且已强制执行。
  + `"disabled"`：该属性处于活动状态且未强制执行。
  + `"audit_mode"`：该属性处于审核模式。这意味着它会识别不合规的映像，但不会阻止其使用。
+ `"image_criteria"`：条件列表。最多支持 10 个条件，名称从 criteria\_1 到 criteria\_10
  + `"allowed_image_providers"`: 亚马逊、aws\_marketplace、aws\_backup\_vault 的 12 位账户 IDs 或所有者别名的逗号分隔列表。
  + `"image_names"`：允许的映像的名称。名称可以包含通配符（? 和 \*）。长度：1–128 个字符。使用 ? 时，最小长度为 3 个字符。
  + `"marketplace_product_codes"`：允许的图片的 AWS Marketplace 商品代码。长度：1–25 个字符，有效字符：字母（A–Z、a–z）和数字（0–9）
  + `"creation_date_condition"`：允许的映像的最大期限。
    + `"maximum_days_since_created"`：自映像创建以来经过的最长天数。有效范围：最小值为 0。最大值为 2147483647。
  + `"deprecation_time_condition"`：自弃用允许的映像以来的最长期限。
    + `"maximum_days_since_deprecated"`：自映像弃用以来经过的最长天数。有效范围：最小值为 0。最大值为 2147483647。

**注意事项**

如果在声明性策略中使用此属性，则无法使用以下操作来修改范围内账户的强制配置。此列表并不详尽：
+ `EnableAllowedImagesSettings`
+ `ReplaceImageCriteriaInAllowedImagesSettings`
+ `DisableAllowedImagesSettings`

------
#### [ Instance Metadata ]

**策略效果**

控制所有新 EC2 实例启动时的 IMDS 默认值和 IMDSv2 强制执行。有关 IMDS 默认值和 IMDSv2 强制执行的更多信息，请参阅 *Amazon [EC2 用户指南中的使用实例元数据管理您](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)的 EC2* 实例。

**策略内容**

以下是此属性的可用字段：

```
{
  "ec2_attributes": {
    "instance_metadata_defaults": {
      "http_tokens": {
        "@@assign": "required"
      },
      "http_put_response_hop_limit": {
        "@@assign": "4"
      },
      "http_endpoint": {
        "@@assign": "enabled"
      },
      "instance_metadata_tags": {
        "@@assign": "enabled"
      },
      "http_tokens_enforced": {
        "@@assign": "enabled"
      }
    }
  }
}
```
+ `"http_tokens"`:
  + `"no_preference"`：其他默认值适用。例如 AMI 默认值（如适用）。
  + `"required"`: IMDSv2 必须使用。 IMDSv1 是不允许的。
  + `"optional"`: 两者 IMDSv1 IMDSv2 都允许。
**注意**  
**元数据版本**  
在设置`http_tokens`为`required`（IMDSv2 必须使用）之前，请确保您的所有实例都没有进行 IMDSv1 调用。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[步骤 1：使用 IMDSv2 =optional 识别实例并审计 IMDSv1 使用情况](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-transition-to-version-2.html#path-step-1)。
+ `"http_put_response_hop_limit"`:
  + `"{{Integer}}"`：-1 至 64 之间的整数值，表示元数据令牌可以传输的最大跃点数。要表示无首选项，请指定 -1。
**注意**  
**跃点限制**  
如果将 `http_tokens` 设置为 `required`，则建议至少将 `http_put_response_hop_limit` 设置为 2。有关更多信息，请参阅《Amazon Elastic Compute Cloud 用户指南》**中的[实例元数据访问注意事项](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html#imds-considerations)。
+ `"http_endpoint"`:
  + `"no_preference"`：其他默认值适用。例如 AMI 默认值（如适用）。
  + `"enabled"`：实例元数据服务端点可访问。
  + `"disabled"`：实例元数据服务端点不可访问。
+ `"instance_metadata_tags"`:
  + `"no_preference"`：其他默认值适用。例如 AMI 默认值（如适用）。
  + `"enabled"`：可以从实例元数据访问实例标签。
  + `"disabled"`：无法从实例元数据访问实例标签。
+ `"http_tokens_enforced":`
  + `"no_preference"`：其他默认值适用。例如 AMI 默认值（如适用）。
  + `"enabled"`: IMDSv2 必须使用。尝试启动 IMDSv1 实例或 IMDSv1 在现有实例上启用将失败。
  + `"disabled"`: 两者 IMDSv1 IMDSv2 都允许。
**警告**  
**IMDSv2 执法**  
在允许 IMDSv1 和 IMDSv2（令牌可选）的同时启用 IMDSv2 强制将导致启动失败 IMDSv1 ，除非通过启动参数或 AMI 默认值明确禁用。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[启动 IMDSv1启用实例失败](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshooting-launch.html#launching-an-imdsv1-enabled-instance-fails)。

------
#### [ Snapshot Block Public Access ]

**策略效果**

控制 Amazon EBS 快照是否可以公开访问。有关 EBS 快照的更多信息，请参阅《Amazon Elastic Block Store User Guide》**中的 [Amazon EBS snapshots](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-snapshots.html)。

**策略内容**

```
{
  "ec2_attributes": {
    "snapshot_block_public_access": {
      "state": {
        "@@assign": "block_new_sharing"
      }
    }
  }
}
```

以下是此属性的可用字段：
+ `"state"`:
  + `"block_all_sharing"`：阻止所有公开共享快照的行为。已公开共享的快照将被视为私有快照，不可再公开访问。
  + `"block_new_sharing"`：阻止新的公开共享快照的行为。已经公开共享的快照仍可公开访问。
  + `"unblocked"`：对快照的公开共享不设限制。

**注意事项**

如果在声明性策略中使用此属性，则无法使用以下操作来修改范围内账户的强制配置。此列表并不详尽：
+ `EnableSnapshotBlockPublicAccess`
+ `DisableSnapshotBlockPublicAccess`

------