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

问题描述 投票:0回答:2

所以我的项目在 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 发送电子邮件地址,同时使用我的 IAM 用户凭证发送邮件。

amazon-web-services amazon-ec2 policy amazon-ses
2个回答
0
投票

“拒绝”规则将始终推翻“允许”规则。

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

因此您需要以下内容:

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

另一个问题是,将 IAM 角色与这些类型的策略结合使用很困难,因为 IAM 角色使用该角色的委托人都需要列入白名单。

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

首先,您需要获取您的 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/[email protected]",
            "Condition": {
                "StringNotLike": {
                    "aws:userid": "AROAID2GEXAMPLEROLEID:*"
                }
            }
        }
    ]
}

再次将“AROAID2GEXAMPLEROLEID”替换为您的实际

RoleId
值。

一旦这些准备就绪,您想要的 EC2 实例将被允许,而其他所有实例都将被拒绝。


0
投票

我使用 EC2/BeanStalk/..... 的 IP 来做到这一点,您可以根据需要添加任意数量的 IP 地址:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Write_here_the_description_of_the_CustomPermissionSet",
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "arn_of_ses_identity",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "1.2.3.4/32",
                    "aws:SourceIp": "2.3.4.5/32"
                }
            }
        }
    ]
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.