所以我的项目在 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 用户凭证发送邮件。
“拒绝”规则将始终推翻“允许”规则。
这就是您的两个策略所发生的情况:拒绝公共规则会覆盖您的 IAM 角色的允许规则,因为您的 EC2 角色属于这两个策略。
因此您需要以下内容:
另一个问题是,将 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 实例将被允许,而其他所有实例都将被拒绝。
我使用 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"
}
}
}
]
}