Amazon web services 如何使用SES主体和IAM角色主体编写AWS Bucket策略

Amazon web services 如何使用SES主体和IAM角色主体编写AWS Bucket策略,amazon-web-services,amazon-s3,amazon-ses,amazon-policy,Amazon Web Services,Amazon S3,Amazon Ses,Amazon Policy,我最初将SES设置为接收电子邮件,在此过程中,我创建了一个bucket策略,允许服务将电子邮件放入S3。我现在有一个lambda函数,它应该能够使用STS来承担角色并访问同一个bucket。不幸的是,我无法找到正确的策略来允许服务和IAM角色访问同一个bucket,现在我得到了“拒绝访问”。我使用策略模拟器来验证其他所有功能是否正常工作,例如,我添加了一个通用策略,在aim角色上执行了更多操作,如果我告诉模拟器忽略bucket策略,那么它会说它可以访问文件 我尝试过使用两个语句,一个将主体设置为

我最初将SES设置为接收电子邮件,在此过程中,我创建了一个bucket策略,允许服务将电子邮件放入S3。我现在有一个lambda函数,它应该能够使用STS来承担角色并访问同一个bucket。不幸的是,我无法找到正确的策略来允许服务和IAM角色访问同一个bucket,现在我得到了“拒绝访问”。我使用策略模拟器来验证其他所有功能是否正常工作,例如,我添加了一个通用策略,在aim角色上执行了更多操作,如果我告诉模拟器忽略bucket策略,那么它会说它可以访问文件

我尝试过使用两个语句,一个将主体设置为“services”,另一个设置为aim角色(添加两个只是为了看看其中一个是否有效)

我还试着把它放在一句话中:

{
"Version": "2012-10-17",
"Id": "Policy1478013193612",
"Statement": [
    {
        "Sid": "Stmt1478013187203",
        "Effect": "Allow",
        "Principal": {
            "AWS": [
                "arn:aws:sts::[id-num-with-no-dashes]:assumed-role/[role-name]/[session-name]",
                "arn:aws:iam::[id-num-with-no-dashes]:role/[role-name]"
            ],
            "Service": "ses.amazonaws.com"
        },
        "Action": [
            "s3:PutObject",
            "s3:GetObject"
        ],
        "Resource": "arn:aws:s3:::email-01-bucket/*"
    }
]
}
顺便说一句,文件路径是: arn:aws:s3::email-01-bucket/email/[文件id]

我无法放入ListBucket,因为它会抛出错误

感谢您的帮助:D

如果我还需要补充什么,请告诉我

[更新]

为了更容易地找到正确的策略,我将描述我目前在IAM策略模拟器中设置的内容,我假设如果我们可以在这里让它工作,那么它应该在lambda函数上工作

角色:serviceDev

此角色有两个附加的策略

1) 服务项目:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:PutBucketLogging",
            "s3:ListBucket"
        ],
        "Resource": "arn:aws:s3:::email-01-bucket/*"
    }
]
}
2) AWSLambdaBasic执行角色

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Resource": "*"
    }
]
}
在策略模拟器中:

下拉菜单
Select Service
设置为
S3

下拉菜单
Select Action
设置为
GetObject

Resource
Object
下,我键入现有文件的路径
arn:aws:s3::email-01-bucket/email/U245HNT85UIVPFKRRLHGO0JT86GFJGNCA2FGCG1
(在仔细检查文件是否确实存在后)

一旦我这样做了,现在在左边有一个
资源策略
部分,它显示了附加到我的Bucket的Bucket策略以及以下策略:

{
"Version": "2012-10-17",
"Id": "Policy1478013193612",
"Statement": [
    {
        "Sid": "Stmt1478013187203",
        "Effect": "Allow",
        "Principal": {
            "Service": "ses.amazonaws.com"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::email-01-bucket/*"
    }
]
}
现在这里是我迷路的地方,返回到
资源
对象
区域,在那里我指定现有文件的路径有一个标记为
包含资源策略
的复选框,如果我取消选中该复选框,则模拟器会说允许该权限,但如果我选中该复选框,则会出现以下错误:
无法执行模拟!:模拟失败

据我所知,您需要一个S3 bucket策略(允许SE将对象放入S3 bucket),并且您需要一个IAM角色,您的Lambda函数将使用该角色列出该bucket并将/获取对象放入该bucket。IAM角色还需要信任关系,允许AWS Lambda服务代表您承担该角色(这样您就不必在代码中手动承担该角色)

具体而言:

  • 不要将Lambda权限添加到S3 bucket策略
  • 不要在Lambda中使用STS来承担角色;只需使用该角色配置Lambda
  • 通常,您不必在Lambda函数中显式编写与担任角色或获取权限相关的任何代码(Lambda服务为您完成所有工作)
S3桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::BUCKET-NAME/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "AWSACCOUNTID"
                }
            }
        }
    ]
}
IAM角色:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "sidlist",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::BUCKET-NAME"
        },
        {
            "Sid": "sidputget",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::BUCKET-NAME/*"
        }
    ]
}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
IAM角色上的信任关系:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

我不确定您为什么在示例中包括s3:PutBucketLogging,但如果您确实需要它,那么将其添加到Lambda的IAM角色中,以对抗arn:aws:s3:::BUCKET-NAME资源(而不是arn:aws:s3:::BUCKET-NAME/*资源——这是对BUCKET的操作,而不是对对象的操作)

据我所知,您需要一个s3 BUCKET策略(允许SES将对象放入S3 bucket)并且您需要一个IAM角色,Lambda函数将使用该角色列出该bucket并在该bucket中放入/获取对象。IAM角色还需要一个信任关系,允许AWS Lambda服务代表您承担该角色(这样您就不必在代码中手动承担该角色)

具体而言:

  • 不要将Lambda权限添加到S3 bucket策略
  • 不要在Lambda中使用STS来承担角色;只需使用该角色配置Lambda
  • 通常,您不必在Lambda函数中显式编写与担任角色或获取权限相关的任何代码(Lambda服务为您完成所有工作)
S3桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::BUCKET-NAME/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "AWSACCOUNTID"
                }
            }
        }
    ]
}
IAM角色:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "sidlist",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::BUCKET-NAME"
        },
        {
            "Sid": "sidputget",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::BUCKET-NAME/*"
        }
    ]
}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
IAM角色上的信任关系:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

我不确定您为什么在示例中包括s3:PutBucketLogging,但如果您确实需要它,请将其添加到Lambda的IAM角色中,以对抗arn:aws:s3::BUCKET-NAME资源(而不是arn:aws:s3:::BUCKET-NAME/*资源——这是对BUCKET的操作,而不是对对象的操作)

向Lambda函数授予权限的典型方式是,与Lambda函数的IAM角色关联的策略授予权限。通常情况下,您不会通过S3 bucket策略执行此操作(除非您特别尝试拒绝除IAM角色以外的所有主体)。正如我在开始时提到的,bucket策略是为SES服务添加的,我仍然需要此服务才能工作,因此无法删除它。我还尝试使用bucket策略,其中只有SES作为主体,然后在IAM角色上使用一个单独的策略,但仍然得到“拒绝访问”。bucket策略确实需要SES权限,但它不需要,通常也不应该有Lambda权限。独立于bucket策略调试Lambda权限。@jarmod我做了,在验证其他一切正常工作时,我创建了一个IAM角色策略,包含所有必需的S3 bucket相关操作。在策略模拟器中切换“Include Resourc”时e Policy“option“off”它可以工作,但如果我将其打开则不行。bucket策略似乎与角色权限冲突。bucket策略不会与IAM策略冲突,除非