所以我在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发送电子邮件地址。
答案 0 :(得分:0)
“拒绝”规则将始终否决“允许”规则。
这就是您的两个策略所发生的情况:拒绝公共规则会覆盖您的IAM角色的允许规则,因为您的EC2角色属于这两个策略。
所以你需要以下内容:
另一个问题是,使用具有这些类型策略的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实例将被允许,其他人将被拒绝。