4

我正在尝试创建一个限制性 SSM 角色 IAM 策略,该策略能够在 SendCommand 命令执行失败时发送 SNS 通知。我目前有以下政策,在没有其他信息的情况下给我“AccessDenied”(已替换占位符):

{
  "Statement": {
    "Effect": "Allow",
    "Action": [ "ssm:SendCommand" ],
    "Resource": [
      "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:instance/*",
      "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:document/${DocumentName}",
      "arn:aws:s3:::${S3BucketName}",
      "arn:aws:s3:::${S3BucketName}/*",
      "arn:aws:iam::${AWS::AccountId}:role/${RoleThatHasSNSPublishPerms}",
      "arn:aws:sns:${AWS::RegionId}:${AWS::AccountId}:${SNSTopicName}"
    ]
  }
}

我还拥有 ${RoleThatHasSNSPublishPerms} 的 iam::PassRole 权限。我以这种方式使用 python boto3 从 lambda 调用它:

        ssm = boto3.client('ssm')
        ssm.send_command(
            InstanceIds = [ instance_id ],
            DocumentName = ssm_document_name,
            TimeoutSeconds = 300,
            OutputS3Region = aws_region,
            OutputS3BucketName = output_bucket_name,
            OutputS3KeyPrefix = ssm_document_name,
            ServiceRoleArn = ssm_service_role_arn,
            NotificationConfig = {
                'NotificationArn': sns_arn,
                'NotificationEvents': ['TimedOut', 'Cancelled', 'Failed'],
                'NotificationType': 'Command'
            }
        )

我知道问题出在我的 IAM 策略的“资源”部分,因为当我将资源块更改为简单的“*”时,运行命令会正确执行。此外,当我删除 python 命令的 NotificationConfig 和 ServiceRoleArn 部分时,SendCommand 也会成功。

我不希望这个 lambda 角色的许可策略只是在任何地方和任何地方执行命令。问题是,我如何限制此策略并仍然发送失败通知?

编辑:不确定这是新的还是我之前错过了它,但 AWS 发布了一些关于如何将权限缩小到仅标记的 EC2 的说明: https ://docs.aws.amazon.com/systems-manager/latest/userguide /sysman-rc-setting-up-cmdsec.html

这仍然不能回答问题的 SNS/S3 部分,但至少这是朝着正确方向迈出的一步。

4

0 回答 0