【问题标题】:Identity Policy for allowing AWS EC2 to access AWS SES(Simple Email Service) and deny public access允许 AWS EC2 访问 AWS SES(简单电子邮件服务)并拒绝公共访问的身份策略
【发布时间】:2017-02-01 09:22:55
【问题描述】:

所以我的项目在 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"
        }
    ]
}

编辑2:

抱歉回复晚了,以下是我根据您的更新所做的:

    {
        "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 实例的访问权限。但我仍然可以通过 java API 发送电子邮件地址,同时使用 My IAM 用户凭据发送邮件。

【问题讨论】:

  • 尝试将所有政策中的资源发送至*
  • @MattHouser 我试过了,但我得到了错误 应用策略时出错:无效的 ARN:ARN 必须以 'arn:' 开头:*(请求 ID:4b922926-83e8-11e6- 8845-5946c19d3615) 因为我将政策附加到特定的电子邮件地址。我什至尝试过 "Resource": "arn:aws:ses:us-east-1:453679034254:identity/*" 我收到错误 应用策略时出错:预期资源是'arn_of_email' 但是 'arn:aws:ses:us-east-1:453679034254:identity/*'。

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


【解决方案1】:

“拒绝”规则总是会推翻“允许”规则。

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

所以你需要以下内容:

  1. 一个“允许”规则允许您希望允许的人,并且
  2. “拒绝”规则可拒绝您希望允许的所有人。

另一个问题是,将 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 实例将被允许,而其他所有人都将被拒绝。

【讨论】:

  • 我得到并错误 应用策略时出错:无法解析策略。 (请求 ID:6e95ca8b-824a-11e6-9e43-45832a24323) 我正在尝试通过转到 SES 控制台> 电子邮件地址> 身份策略> 自定义策略来附加此策略
  • @Mirhawk 我已经用经过测试的解决方案更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 2016-04-29
  • 2016-09-19
  • 2021-06-12
  • 1970-01-01
  • 2018-12-26
  • 2021-07-27
  • 2018-11-20
相关资源
最近更新 更多