【问题标题】:Writing an IAM policy to restrict AWS SSM connections to EC2 instances by EC2 tags编写 IAM 策略以通过 EC2 标签限制与 EC2 实例的 AWS SSM 连接
【发布时间】:2019-08-25 14:41:30
【问题描述】:

我希望所有用户能够使用 AWS SSM(系统管理器)“startsession”命令连接到 EC2 实例,但限制他们可以通过 EC2 实例上的标签连接到哪些实例。属于“webserver-dev”组的 IAM 用户将有一个策略,允许他们aws ssm start-session --target i-12341234 到标签名称为“SSMTag”且值为“WebServer”的任何 EC2 实例。 devserver-dev 组中的任何用户都可以使用 SSMTag = 'DevServer' 等连接到实例。

我有一个允许访问连接到 任何 EC2 实例的策略,但只要我在策略 JSON 中添加“条件”子句,访问总是被拒绝(或总是被允许) .

我尝试为策略添加具有各种不同语法的条件、aws:TagKeys、ssm:ResourceTag、ec2:ResourceTag 和其他一些条件,但似乎没有一个允许我做我想做的事。 documentation 似乎表明我完全可以做到这一点,但要么我不了解标记的工作原理,要么误解了文档。

我当前的开发服务器政策如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ssm:StartSession",
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "StringEquals": {
                    "ssm:ResourceTag/SSMTag": "DevServer"
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "ssm:TerminateSession",
            "Resource": "arn:aws:ssm:*:*:session/${aws:username}-*"
        }
    ]
}

我也尝试过以下条件线的变化:

            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/SSMTag": "DevServer"
                }
            }

            "Condition": {
                "ForAllValues:StringEquals": {
                    "ec2:ResourceTag:SSMTag": "DevServer"
                }
            }

我想要的是,如果用户不属于 webserver-dev 组,则他们无法运行 aws ssm start-session 并连接到任何 ec2 实例除非他们被标记为标签 SSMTag,其值为网络服务器。

结果要么是属于策略附加到的组的一部分的用户要么被拒绝访问,要么被允许连接到任何实例,而不管附加到它的标签。

我读过很多类似问题的解决方案,基本上都是“有些函数不支持资源级标记,但文档似乎明确表示支持。

【问题讨论】:

  • 当你说“开发服务器的当前策略看起来像这样”时,你的意思是“devserver-dev 组的当前策略看起来像这样”,是吗?
  • 是的,我的错。这是附加到用户所在组的策略。

标签: amazon-web-services policy tagging ssm


【解决方案1】:

我收到了来自 AWS 支持的电子邮件,看起来这是条件的“StringEquals”部分的方式问题。此策略正常运行:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ssm:StartSession",
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "ForAnyValue:StringEqualsIfExists": {
                    "ssm:resourceTag/SSMTag": "DevServer"
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "ssm:TerminateSession",
            "Resource": "arn:aws:ssm:*:*:session/${aws:username}-*"
        }
    ]
}

语法差异是"ForAnyValue:StringEqualsIfExists": {

希望这对将来的人有所帮助。

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 2019-08-06
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2023-01-29
    相关资源
    最近更新 更多