基于template_url

时间:2018-09-10 02:45:28

标签: amazon-cloudformation amazon-iam

我目前正在参加使用AWS EMR的一门课程。每次我想使用EMR时,都必须启动一个.sh(我们将其称为launch.sh)脚本,该脚本基本上是在启动一个cloudformation模板(例如,它称为cf.json)。 template_url中有一个launch.sh变量,可将其定向到带有http端点的s3(cf.json)中的json文件。

我有权对该存储桶进行读写操作(不能删除/附加ACL)。我成功创建了cf.json的副本,并将其称为cf2.json。但是,当我将launch.sh指向cf2.json时,出现权限被拒绝的错误。

您知道是什么原因造成的吗?在cloudformation中是否有关于template_url的权限控制?

这是我得到的错误。我屏蔽了日志中的所有详细信息,以防止隐私问题。

An error occurred (AccessDenied) when calling the CreateStack operation: User:
 arn:aws:sts::12345678:assumed-role/CrossStack-IamRole-
ABCDEFGH/i-0123456 is not authorized to perform:
 cloudformation:CreateStack on resource: arn:aws:cloudformation:us-east-
1:12345678:stack/student-emr/*

但是,当我使用原始网址时,会收到一条成功消息:

Creating EMR Cluster. This will take about 15 minutes...
{
    "StackId": "arn:aws:cloudformation:us-east-1:12345678:stack/student-emr/some-hash-id"
}

这是launch.sh

中的脚本
aws cloudformation create-stack --region $emr_region --stack-name $stackname \
    --template-url $template_url \
    --parameters ParameterKey=Owner,ParameterValue=$student_id \
    --role-arn $cf_role_arn

我更改了$template_url变量的值

注意

两个.json文件(cf.jsoncf2.json)都没有public-read ACL,我已通过尝试从我的个人计算机复制该文件进行确认,该文件在尝试时会返回403执行s3 cp

1 个答案:

答案 0 :(得分:1)

我在https://aws.amazon.com/blogs/devops/aws-cloudformation-security-best-practices/的AWS文档中找到了它

您可以在IAM角色中强制使用template_url

{
    "Version":"2012-10-17",
    "Statement":[{
        "Effect": "Deny",
        "Action": [
            "cloudformation:CreateStack",
            “cloudformation:UpdateStack”
        ],
        "Resource": "*",
        "Condition": {
            "StringNotEquals": {
                "cloudformation:TemplateURL": [
                    "https://s3.amazonaws.com/cloudformation-templates-us-east-1/IAM_Users_Groups_and_Policies.template"
                ]
            }
        }
    },
    {
        "Effect": "Deny",
        "Action": [
            "cloudformation:CreateStack",
            "cloudformation:UpdateStack"
        ],
        "Resource": "*",
        "Condition": {
            "Null": {
                "cloudformation:TemplateURL": "true"
            }
        }
    }]
}