我们有一个策略附加到角色,以确保 EC2 配置程序包含我们财务部门定义的必需标签。 此处示例
我可以想象一个工程师每次尝试启动 EC2 实例时都会感到沮丧,因为它会立即关闭,因为他忘记在 IAM 策略中包含所需的标签并点击 DENY ,但他无法知道。
我希望 API 返回自定义错误描述。 它不一定是 iam,如果使用 lambda 从 cloudwatch runinstances 事件触发有好处,我也对此持开放态度。
我们可以做些什么来通知工程师他的实例由于缺少必需的标签而关闭?
很想听听您的建议!
AWS 提供了一组基本的 API。不可能提供所有用户想要的所有功能,但使用基本 API,任何人都可以在 AWS之上构建服务。
例如,您可以让他们使用自定义界面(可能是 Intranet 上的页面),而不是让他们直接通过 AWS 启动实例,他们可以在其中请求某些服务。然后,此接口可以代表它们调用 AWS API,包括必需的元素,例如标签。这就像存储 - 人们不直接写入磁盘,他们通过操作系统进行。
如果这对您来说太低级别,另一种方法是使用AWS CloudFormation,它基于模板启动服务。该模板可以收集所需的信息,也可以在实例启动时自动将其添加到实例中。
然后,加入AWS 服务目录,您可以强制用户通过 CloudFormation 模板启动服务。服务目录提供了用户可以启动的服务列表(实际上只是 CloudFormation 模板),即使用户没有自行启动服务的权限!
例如,假设您的开发人员无权创建 Amazon EC2 实例。您可以通过服务目录提供一个模板,该模板代表他们启动 EC2 实例,但也强制执行您的标准,例如标记、子网、安全组等。
底线:如果您在 AWS 中没有看到专门满足您需求的内容,您通常可以通过自己的代码或 AWS 服务目录在 AWS 之上构建它。
tl;dr 拒绝访问消息确实包含它失败的条件。
链接到的示例提供了一个 IAM 策略,用于在 RunInstances api 调用中未包含标签时拒绝运行实例。2017 年 3 月提供了资源级别权限,允许用户在 RunInstances API 调用中包含标签,并允许 IAM 强制执行 ec2 资源级别权限,在本例中,强制用户包含所需的标签。
在 2017 年 3 月之前,需要两次 API 调用才能创建代码:
-
ec2 run-instances --image-id ami-6df1e514 --count 1 --instance-type t2.micro --subnet-id subnet-e25e29bb
-
ec2-create-tags <instanceid> --tag "Name=<value>" --tag "App=<value>" --tag "AppOwner=<value>" --tag "Environment=<value>"
实施此 iam 策略后,上述工作流将在步骤 1 中拒绝。
以下是预置包含标签的 EC2 实例的新工作流程:
ec2 run-instances --image-id ami-6df1e514 --count 1 --instance-type t2.micro --subnet-id subnet-e25e29bb --tag-specifications 'ResourceType=instance,Tags=[{Key=name,Value=required_tag_name_value},{Key=App,Value=required_tag_app_value},{Key=AppOwner,Value=required_tag_appowner_value},{Key=Environment,Value=required_tag_env_value}]'
根据链接到的示例 iam 策略,如果用户不包含所需的标签,则会对返回的错误消息进行编码,并按如下方式显示给用户:
调用 运行实例操作:您无权执行此操作 操作。编码的授权失败消息: zGetZzIIedikZSAbE4YGEGhy1ytjrXD8Ak-hr1UJvDkKW7wzDu27ZS0NfMGaOUBQGO1I3b3v6Us8BXO-41973SckcmEH17019Sheua16dmrTPYHYymw9pftYope_jmR6MgsvH1bMP0FE_gHnEvaJCIMNukOo-utK....
如果用户的 iam 策略还包括 sts:DecodeAuthorizationMessage,则可以使用以下方式解码消息:
aws sts decode-authorization-message --encoded-message <encoded message here>
{ "DecodedMessage": "{\"allowed\":false,\"explicitDeny\":true,\"matchedStatement\":{\"items\":[{\"statementId\":\",\"effect\":\"DENY\",\"principals\":{\"items\":[{\"value\":\"AROAJVNFHTEF6I2STOU\"}]},\"principalGroups\":{\"items\":[]},\"actions\":{\"items\":[{\"value\":\"ec2:RunInstances\"}]},\"resources\":{\"items\":[{\"value\":\"arn:aws:ec2:::instance/\"}]},\"条件\":{\"items\":[{\"key\":\"aws:RequestTag/AppOwner\",\"values\":{\"items\":[{\"value\":\"true\"}]}}]}},\"failures\":{\"items\":[]},\"context\":{\"principal\":{\"id\":\"AROAJVNFHTEF6I2STOU-CLI-session-1501883988\",\"arn\":\"arn:aws:sts:::assumed-role/_test_require_tags/AWS-CLI-session-1501883988\"},\"action\":\"ec2:RunInstances\",\"resource\":\"arn:aws:ec2:us-west-2::instance/\",\"条件\":{\"项目\":[{\"键":\"ec2:租户",,\"values\":{\"items\":[{\"value\":\"default\"}]}},{\"key\":\"ec2:AvailabilityZone\",\"values\":{\"items\":[{\"value\":\"us-west-2c\"}]}},{\"key\":\"ec2:Region\",\"values\":{\"items\":[{\"value\":\"us-west-2\"}]}},{\"key\":\"ec2:ebsOptimized\",\"values\":{\"items\":[{\"value\":\"false\"}]}},{\"key\":\"ec2:InstanceType\",\"values\":{\"items\":[{\"value\":\"t2.micro\"}]}},{\"key\":\"ec2:RootDeviceType\",\"values\":{\"items\":[{\"value\":\"ebs\"}]}}]}}}" }
虽然有点难以阅读,但我们可以看到 RunInstance 调用在哪个条件下失败:
aws:RequestTag/AppOwner\",\"values\":{\"items\":[{\"value\":\"true\"}]}}]}}]},\"failures\":