AWS Parameter Store IAM 策略无法正常工作

AWS Parameter Store IAM policies are not working correctly

我需要一些与创建 AWS 策略相关的帮助。

我需要一个链接到 EC2 实例的策略,以便能够仅向 AWS SSM 参数存储中的特定参数提供 get-parameters-by-path,而不能更改 DeleteCreate, 等等,应该只能得到值。

此政策的特殊性将通过标签给出。

这是我正在尝试使用的政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["ssm:*"],
            "Resource": ["*"]
        },
        {
            "Effect": "Deny",
            "Action": [
               "ssm:PutParameter",
               "ssm:GetParameter",
               "ssm:GetParameters",
               "ssm:DeleteParameter",
               "ssm:GetParameterHistory",
               "ssm:DeleteParameters",
               "ssm:GetParametersByPath"
             ],
            "Resource": ["*"],
            "Condition": {
                "StringNotEquals": {
                    "ssm:resourceTag/env": "development-1"
                }
            }
        }
    ]
}

使用 AWS Policy Simulator 它会通知您当尝试 ViewCreateModifyDelete 参数时 "ssm:resourceTag/env": "development-2"拒绝消息被告知,而其他项目 "ssm:resourceTag/env": "development-1" 可以修改,查看等

但是,当将同一策略绑定到 EC2 实例时,该策略会阻止在拒绝中添加的任何操作。

EC2 知情消息:

/development-1/project-1

aws --region us-east-2 ssm get-parameters-by-path --path /development-1/project-1/ --recursive --with-decryption --output text --query "Parameters[].[Value]"

An error occurred (AccessDeniedException) when calling the GetParametersByPath operation: User: arn:aws:sts::111111111:assumed-role/rule-ec2/i-11111111111 is not authorized to perform: ssm:GetParametersByPath on resource: arn:aws:ssm:us-east-2:11111111111:parameter/development-1/project-1/ with an explicit deny

/development-2/project-2

aws --region us-east-2 ssm get-parameters-by-path --path /development-2/project-2/ --recursive --with-decryption --output text --query "Parameters[].[Value]"
    
An error occurred (AccessDeniedException) when calling the GetParametersByPath operation: User: arn:aws:sts::11111111111:assumed-role/rule-ec2/i-11111111111 is not authorized to perform: ssm:GetParametersByPath on resource: arn:aws:ssm:us-east-2:11111111111:parameter/development-2/project-2/ with an explicit deny

使用的标签:

键=值

/development-1/project-1:

env=development-1

/development-2/project-2:

env=development-2

我做错了什么?

您正在使用 Denyssm:GetParametersByPath,因此它将 始终被拒绝 。拒绝总是优先于任何允许。

但在您的情况下,由于其实例配置文件,您的策略不必那么复杂。默认情况下,一切都是隐式拒绝,所以你只需要显式允许:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["ssm:GetParametersByPath"],
            "Resource": ["*"]
        }
    ]
}

对于 Resource,您可以只添加您希望允许访问的 ssm 参数,而不是所有参数。

您不能根据任何 ssm:GetParameter* IAM actions because the API doesn't (currently) support condition keys 的参数标签设置条件键。

相反,您可以通过参数的 ARN 进行限制,通常 SSM 参数存储的做法是使用参数的分层路径,以允许您通过 IAM 限制访问,然后可以选择在您满意的地方使用通配符对于在该路径下有任何东西的东西。

所以一个常见的模式可能是有一些看起来像这样的结构:

/production/foo-service/database/password
/production/foo-service/bar-service/api-key
/production/bar-service/database/password
/production/bar-service/foo-service/api-key
/development/foo-service/database/password
/development/foo-service/bar-service/api-key
/development/bar-service/database/password
/development/bar-service/foo-service/api-key

然后在生产环境中为您的 foo-service 运行 赋予它一个具有以下权限的 IAM 角色:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["ssm:GetParameter*"],
            "Resource": ["arn:aws:ssm:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:parameter/production/foo-service/*"]
        }
    ]
}

这将允许生产中的 foo-service 然后访问 /production/foo-service/database/password/production/foo-service/bar-service/api-key 但不允许访问任何其他参数或修改或删除的能力参数。

@Marcin's 中所述,您无需在此处向 IAM 策略添加拒绝语句,因为 IAM 的默认设置是拒绝,除非已明确给出允许语句。

例外情况是,如果您正在做非常复杂的事情,您希望授予大部分访问范围广泛的内容,然后阻止一小部分内容。 This blog post talks about how the default ReadOnlyAccess 政策对他们的组织来说过于宽松,因此他们通过拒绝声明来限制访问他们不想给予这种开放访问权限的事物。他们也可以反其道而行之,从不使用该 AWS 托管策略,而是必须在许多服务中维护一组非常广泛的操作,这可能被认为更安全,但也可能需要大量工作。