

# Amazon VPC 策略示例
<a name="vpc-policy-examples"></a>

默认情况下，IAM 角色没有创建或修改 VPC 资源的权限。它们还无法使用 Amazon Web Services 管理控制台、Amazon CLI 或 Amazon API 执行任务。IAM 管理员必须创建 IAM 策略，以便为角色授予权限以对所需的指定资源执行特定的 API 操作。然后，管理员必须将这些策略附加到需要这些权限的 IAM 角色。

要了解如何使用这些示例 JSON 策略文档创建基于 IAM 身份的策略，请参阅《IAM 用户指南》中的[创建 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-json-editor)。

**Topics**
+ [策略最佳实践](#security_iam_service-with-iam-policy-best-practices)
+ [使用 Amazon VPC 控制台](#security_iam_id-based-policy-examples-console)
+ [创建带公有子网的 VPC](#vpc-public-subnet-iam)
+ [修改和删除 VPC 资源](#modify-vpc-resources-iam)
+ [管理安全组](#vpc-security-groups-iam)
+ [管理安全组规则](#vpc-security-group-rules-iam)
+ [在特定子网中启动实例](#subnet-sg-example-iam)
+ [在特定 VPC 中启动实例](#subnet-ami-example-iam)
+ [屏蔽 VPC 和子网的公共访问权限](#vpc-bpa-example-iam)
+ [其他 Amazon VPC 策略示例](#security-iam-additional-examples)

## 策略最佳实践
<a name="security_iam_service-with-iam-policy-best-practices"></a>

基于身份的策略确定某个人是否可以创建、访问或删除您账户中的 Amazon VPC 资源。这些操作可能会使 Amazon Web Services 账户产生成本。创建或编辑基于身份的策略时，请遵循以下指南和建议：
+ **Amazon 托管式策略及转向最低权限许可入门**：要开始向用户和工作负载授予权限，请使用 *Amazon 托管式策略*来为许多常见使用场景授予权限。您可以在 Amazon Web Services 账户 中找到这些策略。建议通过定义特定于您的使用场景的 Amazon 客户托管式策略来进一步减少权限。有关更多信息，请参阅《IAM 用户指南》**中的 [Amazon 托管策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)或[工作职能的 Amazon 托管策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_job-functions.html)。
+ **应用最低权限**：在使用 IAM 策略设置权限时，请仅授予执行任务所需的权限。为此，您可以定义在特定条件下可以对特定资源执行的操作，也称为*最低权限许可*。有关使用 IAM 应用权限的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的策略和权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html)。
+ **使用 IAM 策略中的条件进一步限制访问权限**：您可以向策略添加条件来限制对操作和资源的访问。例如，您可以编写策略条件来指定必须使用 SSL 发送所有请求。如果通过特定 Amazon Web Services 服务（例如 Amazon CloudFormation）使用服务操作，您还可以使用条件来授予对服务操作的访问权限。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素：条件](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition.html)。
+ **使用 IAM Access Analyzer 验证您的 IAM 策略，以确保权限的安全性和功能性**：IAM Access Analyzer 会验证新策略和现有策略，以确保策略符合 IAM 策略语言（JSON）和 IAM 最佳实践。IAM Access Analyzer 提供 100 多项策略检查和可操作的建议，以帮助您制定安全且功能性强的策略。有关更多信息，请参阅《IAM 用户指南》**中的[使用 IAM Access Analyzer 验证策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。
+ **需要多重身份验证（MFA）**：如果您所处的场景要求您的 Amazon Web Services 账户 中有 IAM 用户或根用户，请启用 MFA 来提高安全性。若要在调用 API 操作时需要 MFA，请将 MFA 条件添加到您的策略中。有关更多信息，请参阅《IAM 用户指南》**中的[使用 MFA 保护 API 访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)。

有关 IAM 中的最佳实操的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)。

## 使用 Amazon VPC 控制台
<a name="security_iam_id-based-policy-examples-console"></a>

要访问 Amazon VPC 控制台，您必须具有一组最低的权限。这些权限必须允许您列出和查看有关您 Amazon 账户中的 Amazon VPC 资源的详细信息。如果您创建的基于身份的策略比所需的最低权限更严格，则无法为具有该策略的实体（IAM 角色）正常运行控制台。

以下策略授予角色在 VPC 控制台中列出资源的权限，但不允许创建、更新或删除这些资源。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeAccountAttributes",
                "ec2:DescribeAddresses",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeClassicLinkInstances",
                "ec2:DescribeClientVpnEndpoints",
                "ec2:DescribeCustomerGateways",
                "ec2:DescribeDhcpOptions",
                "ec2:DescribeEgressOnlyInternetGateways",
                "ec2:DescribeFlowLogs",
                "ec2:DescribeInternetGateways",
                "ec2:DescribeManagedPrefixLists",
                "ec2:DescribeMovingAddresses",
                "ec2:DescribeNatGateways",
                "ec2:DescribeNetworkAcls",
                "ec2:DescribeNetworkInterfaceAttribute",
                "ec2:DescribeNetworkInterfacePermissions",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribePrefixLists",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroupReferences",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSecurityGroupRules",
                "ec2:DescribeStaleSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeTags",
                "ec2:DescribeTrafficMirrorFilters",
                "ec2:DescribeTrafficMirrorSessions",
                "ec2:DescribeTrafficMirrorTargets",
                "ec2:DescribeTransitGateways",
                "ec2:DescribeTransitGatewayVpcAttachments",
                "ec2:DescribeTransitGatewayRouteTables",
                "ec2:DescribeVpcAttribute",
                "ec2:DescribeVpcClassicLink",
                "ec2:DescribeVpcClassicLinkDnsSupport",
                "ec2:DescribeVpcEndpoints",
                "ec2:DescribeVpcEndpointConnectionNotifications",
                "ec2:DescribeVpcEndpointConnections",
                "ec2:DescribeVpcEndpointServiceConfigurations",
                "ec2:DescribeVpcEndpointServicePermissions",
                "ec2:DescribeVpcEndpointServices",
                "ec2:DescribeVpcPeeringConnections",
                "ec2:DescribeVpcs",
                "ec2:DescribeVpnConnections",
                "ec2:DescribeVpnGateways",
                "ec2:GetManagedPrefixListAssociations",
                "ec2:GetManagedPrefixListEntries"
            ],
            "Resource": "*"
        }
    ]
}
```

------

对于仅调用 Amazon CLI 或 Amazon API 的角色，您不需要允许最低控制台权限。而应仅允许访问与该角色需要执行的 API 操作相匹配的操作。

## 创建带公有子网的 VPC
<a name="vpc-public-subnet-iam"></a>

以下示例允许角色创建 VPC、子网、路由表和互联网网关。角色还可以将互联网网关连接到 VPC 并在路由表中创建路由。`ec2:ModifyVpcAttribute` 操作允许角色为 VPC 启用 DNS 主机名，使得在 VPC 中启动的每个实例都会收到一个 DNS 主机名。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [{
      "Effect": "Allow",
      "Action": [
        "ec2:CreateVpc", 
        "ec2:CreateSubnet", 
        "ec2:DescribeAvailabilityZones",
        "ec2:CreateRouteTable", 
        "ec2:CreateRoute", 
        "ec2:CreateInternetGateway", 
        "ec2:AttachInternetGateway", 
        "ec2:AssociateRouteTable", 
        "ec2:ModifyVpcAttribute"
      ],
      "Resource": "*"
    }
   ]
}
```

------

上述策略还允许角色在 Amazon VPC 控制台中创建 VPC。

## 修改和删除 VPC 资源
<a name="modify-vpc-resources-iam"></a>

您可能需要控制角色可以修改或删除的 VPC 资源。例如，以下策略允许角色使用和删除具有标签 `Purpose=Test` 的路由表。该策略还规定角色只能删除具有标签 `Purpose=Test` 的互联网网关。角色不能使用没有此标签的路由表或互联网网关。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:DeleteInternetGateway",
            "Resource": "arn:aws:ec2:*:*:internet-gateway/*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/Purpose": "Test"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DeleteRouteTable",
                "ec2:CreateRoute",
                "ec2:ReplaceRoute",
                "ec2:DeleteRoute"
            ],
            "Resource": "arn:aws:ec2:*:*:route-table/*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/Purpose": "Test"
                }
            }
        }
    ]
}
```

------

## 管理安全组
<a name="vpc-security-groups-iam"></a>

以下策略允许角色管理安全组。第一个语句允许角色删除任何带有标签 `Stack=test` 的安全组，并管理任何带有标签 `Stack=test` 的安全组的入站和出站规则。第二个语句要求角色使用标签 `Stack=Test` 来标记其创建的任何安全组。第三个语句允许角色在创建安全组时创建标签。第四个语句允许角色查看任何安全组和安全组规则。第五个语句允许角色在 VPC 中创建安全组。

**注意**  
Amazon CloudFormation 服务无法使用此策略来创建带有所需标签的安全组。如果您移除需要标签的 `ec2:CreateSecurityGroup` 操作的条件，则该策略将生效。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:RevokeSecurityGroupIngress",
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:UpdateSecurityGroupRuleDescriptionsEgress",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:DeleteSecurityGroup",
                "ec2:ModifySecurityGroupRules",
                "ec2:UpdateSecurityGroupRuleDescriptionsIngress"
            ],
            "Resource": "arn:aws:ec2:*:*:security-group/*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/Stack": "test"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:CreateSecurityGroup",
            "Resource": "arn:aws:ec2:*:*:security-group/*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/Stack": "test"
                },
                "ForAnyValue:StringEquals": {
                    "aws:TagKeys": "Stack"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:CreateTags",
            "Resource": "arn:aws:ec2:*:*:security-group/*",
            "Condition": {
                "StringEquals": {
                    "ec2:CreateAction": "CreateSecurityGroup"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeSecurityGroupRules",
                "ec2:DescribeVpcs",
                "ec2:DescribeSecurityGroups"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ec2:CreateSecurityGroup",
            "Resource": "arn:aws:ec2:*:*:vpc/*"
        }
    ]
}
```

------

要允许角色更改与实例关联的安全组，请将 `ec2:ModifyInstanceAttribute` 操作添加到策略中。

要允许角色能够更改网络接口的安全组，请将 `ec2:ModifyNetworkInterfaceAttribute` 操作添加到策略中。

## 管理安全组规则
<a name="vpc-security-group-rules-iam"></a>

以下策略为角色授予相应的权限，以便查看所有安全组和安全组规则、添加和移除特定 VPC 的安全组的入站和出站规则，以及为指定 VPC 修改规则描述。第一个语句使用 `ec2:Vpc` 条件键来将权限范围扩展到特定 VPC。

第二个语句授予角色描述所有安全组、安全组规则和标签的权限。这使角色能够查看安全组规则以便对其进行修改。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupIngress",
                "ec2:UpdateSecurityGroupRuleDescriptionsIngress",
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:UpdateSecurityGroupRuleDescriptionsEgress",
                "ec2:ModifySecurityGroupRules"
            ],
            "Resource": "arn:aws:ec2:us-east-1:123456789012:security-group/*",
            "Condition": {
                "ArnEquals": {
                    "ec2:Vpc": "arn:aws:ec2:us-east-1:123456789012:vpc/vpc-1234567890abcdef0"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSecurityGroupRules",
                "ec2:DescribeTags"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:ModifySecurityGroupRules"
            ],
            "Resource": "arn:aws:ec2:us-east-1:123456789012:security-group-rule/*"
        }
    ]
}
```

------

## 在特定子网中启动实例
<a name="subnet-sg-example-iam"></a>

以下策略允许角色在特定子网中启动实例，以及在请求中使用特定安全组。该策略通过指定子网 ARN 和安全组 ARN 来实现上述目的。如果角色尝试在其他子网中启动实例或使用其他的安全组，请求将失败（除非其他策略或语句授予角色相应的权限）。

该策略还授予使用网络接口资源的权限。在子网中启动时，`RunInstances` 请求会默认创建一个主网络接口，因此角色在启动实例时需要有创建此资源的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:us-east-1::image/ami-*",
                "arn:aws:ec2:us-east-1:123456789012:instance/*",
                "arn:aws:ec2:us-east-1:123456789012:subnet/subnet-1234567890abcdef0",
                "arn:aws:ec2:us-east-1:123456789012:network-interface/*",
                "arn:aws:ec2:us-east-1:123456789012:volume/*",
                "arn:aws:ec2:us-east-1:123456789012:key-pair/*",
                "arn:aws:ec2:us-east-1:123456789012:security-group/sg-0abcdef1234567890"
            ]
        }
    ]
}
```

------

## 在特定 VPC 中启动实例
<a name="subnet-ami-example-iam"></a>

以下策略允许角色在特定 VPC 中的任意子网中启动实例。此策略通过将条件密钥 (`ec2:Vpc`) 应用于子网资源来实现上述目的。

该策略还授予角色仅使用具有标签“`department=dev`”的 AMI 启动实例的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:us-east-1:123456789012:subnet/*",
            "Condition": {
                "ArnEquals": {
                    "ec2:Vpc": "arn:aws:ec2:us-east-1:123456789012:vpc/vpc-1234567890abcdef0"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:us-east-1::image/ami-*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/department": "dev"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:us-east-1:123456789012:instance/*",
                "arn:aws:ec2:us-east-1:123456789012:volume/*",
                "arn:aws:ec2:us-east-1:123456789012:network-interface/*",
                "arn:aws:ec2:us-east-1:123456789012:key-pair/*",
                "arn:aws:ec2:us-east-1:123456789012:security-group/*"
            ]
        }
    ]
}
```

------

## 屏蔽 VPC 和子网的公共访问权限
<a name="vpc-bpa-example-iam"></a>

以下策略示例授予角色使用 [VPC 屏蔽公共访问权限（BPA）功能](security-vpc-bpa.md)的权限，以屏蔽 VPC 和子网中资源的公共访问权限。

示例 1：允许对 VPC BPA 账户范围的设置和 VPC BPA 排除项的只读访问。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "VPCBPAReadOnlyAccess",
      "Action": [
        "ec2:DescribeVpcBlockPublicAccessOptions",
        "ec2:DescribeVpcBlockPublicAccessExclusions"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

------

示例 2：允许对 VPC BPA 账户范围的设置和 VPC BPA 排除项的完全读取和写入访问。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "VPCBPAFullAccess",
      "Action": [
        "ec2:DescribeVpcBlockPublicAccessOptions",
        "ec2:DescribeVpcBlockPublicAccessExclusions",
        "ec2:ModifyVpcBlockPublicAccessOptions",
        "ec2:CreateVpcBlockPublicAccessExclusion",
        "ec2:ModifyVpcBlockPublicAccessExclusion",
        "ec2:DeleteVpcBlockPublicAccessExclusion"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

------

示例 3：允许访问所有 EC2 API，但修改 VPC BPA 设置和创建排除项除外。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EC2FullAccess",
            "Action": [
                "ec2:*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Sid": "VPCBPAPartialAccess",
            "Action": [
                "ec2:ModifyVpcBlockPublicAccessOptions",
                "ec2:CreateVpcBlockPublicAccessExclusion"
            ],
            "Effect": "Deny",
            "Resource": "*"
        }
    ]
}
```

------

## 其他 Amazon VPC 策略示例
<a name="security-iam-additional-examples"></a>

您可以在以下文档中找到与 Amazon VPC 相关的其他示例 IAM 策略：
+ [托管前缀列表](managed-prefix-lists.md#managed-prefix-lists-iam)
+ [流量镜像](https://docs.amazonaws.cn/vpc/latest/mirroring/traffic-mirroring-security.html)
+ [中转网关](https://docs.amazonaws.cn/vpc/latest/tgw/transit-gateway-authentication-access-control.html#tgw-example-iam-policies)
+ [VPC 端点和 VPC 端点服务 (Amazon PrivateLink)](https://docs.amazonaws.cn/vpc/latest/privatelink/security_iam_id-based-policy-examples.html)
+ [VPC 对等连接](https://docs.amazonaws.cn/vpc/latest/peering/security-iam.html)