Amazon VPC 策略示例
默认情况下,IAM 用户和角色没有创建或修改 VPC 资源的权限。它们还无法使用 Amazon Web Services Management Console、Amazon CLI 或 Amazon API 执行任务。IAM 管理员必须创建 IAM 策略,以便为用户和角色授予权限以对所需的指定资源执行特定的 API 操作。然后,管理员必须将这些策略附加到需要这些权限的 IAM 用户或组。
要了解如何使用这些示例 JSON 策略文档创建 IAM 基于身份的策略,请参阅 IAM 用户指南 中的在 JSON 选项卡上创建策略。
目录
策略最佳实践
基于身份的策略非常强大。它们确定某个人是否可以创建、访问或删除您账户中的 Amazon VPC 资源。这些操作可能会使 Amazon Web Services 账户 产生成本。创建或编辑基于身份的策略时,请遵循以下准则和建议:
-
开始使用 Amazon 托管式策略 – 要快速开始使用 Amazon VPC,请使用 Amazon 托管式策略,为您的员工提供他们所需的权限。这些策略已在您的账户中提供,并由 Amazon 维护和更新。有关更多信息,请参阅 IAM 用户指南中的开始使用 Amazon 托管式策略中的权限。
-
授予最低权限 – 创建自定义策略时,仅授予执行任务所需的许可。最开始只授予最低权限,然后根据需要授予其它权限。这样做比起一开始就授予过于宽松的权限而后再尝试收紧权限来说更为安全。有关更多信息,请参阅 IAM 用户指南 中的授予最低权限。
-
为敏感操作启用 MFA – 为增强安全性,要求 IAM 用户使用多重身份验证 (MFA) 来访问敏感资源或 API 操作。要了解更多信息,请参阅《IAM 用户指南》中的在 Amazon 中使用多重身份验证 (MFA)。
-
使用策略条件来增强安全性 – 在切实可行的范围内,定义基于身份的策略在哪些情况下允许访问资源。例如,您可编写条件来指定请求必须来自允许的 IP 地址范围。您也可以编写条件,以便仅允许指定日期或时间范围内的请求,或者要求使用 SSL 或 MFA。有关更多信息,请参阅 IAM 用户指南 中的 IAM JSON 策略元素:条件。
使用 Amazon VPC 控制台
要访问 Amazon VPC 控制台,您必须具有一组最低的权限。这些权限必须允许您列出和查看有关您 Amazon 账户中的 Amazon VPC 资源的详细信息。如果您创建的基于身份的策略比所需的最低权限更严格,则无法为具有该策略的实体(IAM 用户或角色)正常运行控制台。
以下策略授予用户在 VPC 控制台中列出资源的权限,但不允许用户创建、更新或删除这些资源。
{ "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
以下示例允许用户创建 VPC、子网、路由表和互联网网关。用户还可以将互联网网关连接到 VPC 并在路由表中创建路由。该 ec2:ModifyVpcAttribute
操作允许用户为 VPC 启用 DNS 主机名,使得在 VPC 中启动的每个实例都会收到一个 DNS 主机名。
{ "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 向导,用户还必须具有使用 ec2:DescribeVpcEndpointServices
的权限。这可确保 VPC 向导的 VPC 终端节点部分正确加载。
修改和删除 VPC 资源
您可能需要控制用户可以修改或删除哪些 VPC 资源。例如,以下策略允许用户使用和删除具有标签 Purpose=Test
的路由表。该策略还指定用户只能删除具有标签 Purpose=Test
的互联网网关。用户无法处理没有此标签的路由表或互联网网关。
{ "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
" } } } ] }
管理安全组
以下策略允许查看任何安全组和安全组规则。第二个语句允许用户删除任何带有标签 Stack=test
的安全组,并管理任何具有标签 Stack=test
的安全组的入站和出站规则。第三个语句要求用户使用标记 Stack=Test
来标记其创建的任何安全组。第四个语句允许用户在创建安全组时创建标签。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "ec2:DescribeSecurityGroups", "ec2:DescribeSecurityGroupRules", "ec2:DescribeVpcs" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:AuthorizeSecurityGroupIngress", "ec2:RevokeSecurityGroupIngress", "ec2:UpdateSecurityGroupRuleDescriptionsIngress", "ec2:AuthorizeSecurityGroupEgress", "ec2:RevokeSecurityGroupEgress", "ec2:UpdateSecurityGroupRuleDescriptionsEgress", "ec2:ModifySecurityGroupRules", "ec2:DeleteSecurityGroup" ], "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
" }, "ForAllValues:StringEquals": { "aws:TagKeys": ["Stack
"] } } }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:*:*:security-group/*", "Condition": { "StringEquals": { "ec2:CreateAction" : "CreateSecurityGroup" } } } ] }
要允许用户更改与实例关联的安全组,请将 ec2:ModifyInstanceAttribute
操作添加到策略中。
要允许用户能够更改网络接口的安全组,请将 ec2:ModifyNetworkInterfaceAttribute
操作添加到策略中。
管理安全组规则
以下策略为用户授予相应的权限,以便查看所有安全组和安全组规则、添加和移除特定 VPC 的安全组的入站和出站规则,以及为指定 VPC 修改规则描述。第一个语句使用 ec2:Vpc
条件键来将权限范围扩展到特定 VPC。
第二个语句授予用户描述所有安全组、安全组规则和标签的权限。这使用户能够查看安全组规则以便对其进行修改。
{ "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:
region
:account-id
:security-group/*", "Condition": { "ArnEquals": { "ec2:Vpc": "arn:aws:ec2:region
:account-id
:vpc/vpc-id
" } } }, { "Effect": "Allow", "Action": [ "ec2:DescribeSecurityGroups", "ec2:DescribeSecurityGroupRules", "ec2:DescribeTags" ], "Resource": "*" } ] }
在特定子网中启动实例
以下策略允许用户在特定子网中启动实例,以及在请求中使用特定安全组。该策略通过指定子网 ARN 和安全组 ARN 来实现上述目的。如果用户尝试在其他子网中启动实例或使用其他的安全组,请求将失败 (除非其他策略或声明授予用户相应的权限)。
该策略还授予使用网络接口资源的权限。在子网中启动时,RunInstances
请求会默认创建一个主网络接口,因此,用户在启动实例时需要有创建此资源的权限。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:
region
::image/ami-*", "arn:aws:ec2:region
:account
:instance/*", "arn:aws:ec2:region
:account
:subnet/subnet-id
", "arn:aws:ec2:region
:account
:network-interface/*", "arn:aws:ec2:region
:account
:volume/*", "arn:aws:ec2:region
:account
:key-pair/*", "arn:aws:ec2:region
:account
:security-group/sg-id
" ] } ] }
在特定 VPC 中启动实例
以下策略允许用户在特定 VPC 中的任意子网中启动实例。此策略通过将条件密钥 (ec2:Vpc
) 应用于子网资源来实现上述目的。
该策略还授予用户仅使用具有标签“department=dev
”的 AMI 启动实例的权限。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:
region
:account-id
:subnet/*", "Condition": { "ArnEquals": { "ec2:Vpc": "arn:aws:ec2:region
:account-id
:vpc/vpc-id
" } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:region
::image/ami-*", "Condition": { "StringEquals": { "ec2:ResourceTag/department
": "dev
" } } }, { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": [ "arn:aws:ec2:region
:account
:instance/*", "arn:aws:ec2:region
:account
:volume/*", "arn:aws:ec2:region
:account
:network-interface/*", "arn:aws:ec2:region
:account
:key-pair/*", "arn:aws:ec2:region
:account
:security-group/*" ] } ] }
其他 Amazon VPC 策略示例
您可以在以下文档中找到与 Amazon VPC 相关的其他示例 IAM 策略: