允许AWS EC2访问AWS SES(简单电子邮件服务)并拒绝公共访问的身份策略

时间:2016-09-23 13:30:27

标签: amazon-web-services amazon-ec2 policy amazon-ses

所以我在ec2实例上的服务器上运行了我的项目,它使用SES发送电子邮件。当公众可以访问SES时,我能够发送电子邮件,但是当我尝试实现安全性时,它开始出现问题。我已将以下身份策略附加到SES电子邮件地址,一个公开阻止访问,另一个允许ec2访问SES电子邮件地址。但我总是被错误阻止:

The email was not sent.Error message: User `arn_of_ec2_role' is not authorized to perform 
`ses:SendEmail' on resource `arn_of_email_address' (Service: AmazonSimpleEmailService; 
Status Code: 403; Error Code: AccessDenied; 
Request ID: b92h2a02-4502-32g8-8334-9504941fdefd4e35)

我的政策是:

允许ec2:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "stmt8473824324",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn_of_role_used_by_ec2"
            },
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "arn_of_email"
        }
    ]
}

否认公众:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
      "Resource": "arn_of_email"
    }
  ]
}

编辑1: 事实证明,我只需要将包含{}添加到" AWS":" arn_of_role_used_by_ec2"。但即便如此,我也没有获得许可。我仍然得到同样的错误。为了验证,我甚至使用了一个用户策略并试图使用该用户访问它,但即使这样我也得到了相同的错误,只是现在拒绝了不同的arn。我的政策如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": "arn_of_role_used_by_ec2"
            },
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "arn_of_email"
        }
    ]
}

EDIT2:

对于迟到的回复感到抱歉,以下是我根据您的更新所做的事情:

    {
        "Version": "2008-10-17",
        "Statement": [
            {
                "Sid": "stmt1476011587135",
                "Effect": "Allow",
                "Principal": "*",
                "Action": [
                    "ses:SendEmail",
                    "ses:SendRawEmail"
                ],
                "Resource": "arn_of_email",
                "Condition": {
                    "StringEquals": {
                        "aws:SourceArn": "arn_of_ecs_instance"
                    }
                }
            }
        ]
    }

    {
        "Version": "2008-10-17",
        "Statement": [
            {
                "Sid": "stmt1476011639899",
                "Effect": "Deny",
                "Principal": "*",
                "Action": [
                    "ses:SendEmail",
                    "ses:SendRawEmail"
                ],
                "Resource": "arn_of_email",
                "Condition": {
                    "StringNotEquals": {
                        "aws:SourceArn": "arn_of_ecs_instance"
                    }
                }
            }
        ]
    }

使用了arn_of_ecs_instance,因为我只是使用IAM用户进行验证,只需要访问ec2实例。但是,在使用My IAM用户凭据发送邮件时,我仍然可以通过java API发送电子邮件地址。

1 个答案:

答案 0 :(得分:0)

“拒绝”规则将始终否决“允许”规则。

这就是您的两个策略所发生的情况:拒绝公共规则会覆盖您的IAM角色的允许规则,因为您的EC2角色属于这两个策略。

所以你需要以下内容:

  1. 一个“允许”规则允许您允许的人和
  2. 一个“拒绝”规则,拒绝所有您想要允许的人。
  3. 另一个问题是,使用具有这些类型策略的IAM角色很困难,因为使用该角色的IAM角色都需要列入白名单。

    相反,您可以在语句中使用条件来允许IAM角色的“用户ID”。

    首先,您需要获取IAM角色的唯一ID。这不会显示在AWS管理控制台中。使用AWS CLI,执行以下操作:

    aws iam get-role --role-name my-role

    从此输出中,从RoleId属性中获取值。它的价值看起来像这样:“AROAID2GEXAMPLEROLEID”。

    接下来,使用以下政策允许角色使用电子邮件地址:

    {
        "Version": "2008-10-17",
        "Statement": [
            {
                "Sid": "stmt1474900930602",
                "Effect": "Allow",
                "Principal": "*",
                "Action": [
                    "ses:SendEmail",
                    "ses:SendRawEmail"
                ],
                "Resource": "arn_of_email",
                "Condition": {
                    "StringLike": {
                        "aws:userid": "AROAID2GEXAMPLEROLEID:*"
                    }
                }
            }
        ]
    }
    

    注意,请将“AROAID2GEXAMPLEROLEID”替换为实际的RoleId值。

    这将允许任何假定您的角色的人从您的电子邮件地址发送。

    最后,使用以下政策拒绝任何人担任您的角色:

    {
        "Version": "2008-10-17",
        "Statement": [
            {
                "Sid": "stmt1474900930602",
                "Effect": "Deny",
                "Principal": "*",
                "Action": [
                    "ses:SendEmail",
                    "ses:SendRawEmail"
                ],
                "Resource": "arn:aws:ses:us-east-1:905741729283:identity/matt@eleven41.com",
                "Condition": {
                    "StringNotLike": {
                        "aws:userid": "AROAID2GEXAMPLEROLEID:*"
                    }
                }
            }
        ]
    }
    

    再次,将“AROAID2GEXAMPLEROLEID”替换为您的实际RoleId值。

    一旦你有了这些,你的EC2实例将被允许,其他人将被拒绝。