[英]S3 Bucket Policy and IAM Role Conflicting
我正在嘗試使用S3存儲桶策略提供對存儲桶的常規訪問,同時還允許使用角色策略對角色進行特定訪問。 Lambda函數使用該角色來處理存儲桶中的對象。 它在第一個障礙時停止 - 它不能使用前綴“incoming /”獲取任何內容,即使它在角色策略中被允許,並且未在存儲桶策略中明確拒絕。
角色政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowBucketPut",
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::bucket-name/*"
},
{
"Sid": "AllowIncomingGetDelete",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::bucket-name",
"Condition": {
"StringLike": {
"s3:prefix": "incoming/*"
}
}
}
]
}
注意:我也嘗試刪除條件並將資源更改為“arn:aws:s3 ::: bucket-name / incoming *”,這似乎只會改變策略模擬器的行為方式。 另一個注意事項:來自桶的帶有“incoming / *”前綴的GET在模擬器中工作,而不是在實踐中。
我沒有刪除以下存儲桶策略中的任何語句,因為我不確定可能相關的內容。 IP地址已被省略。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPublicList",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::bucket-name",
"Condition": {
"StringLike": {
"s3:prefix": "public*"
}
}
},
{
"Sid": "AllowPublicGet",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/public*"
},
{
"Sid": "AllowPrivateList",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::bucket-name",
"Condition": {
"StringLike": {
"s3:prefix": "private*"
},
"IpAddress": {
"aws:SourceIp": [
"..."
]
}
}
},
{
"Sid": "AllowPrivateGet",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/private*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"..."
]
}
}
},
{
"Sid": "AllowIncomingPut",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::bucket-name/incoming*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"..."
]
}
}
}
]
}
為文本牆道歉。
我不明白為什么我的角色無法使用前綴“incoming /”獲取對象。
執行以下操作時,Lambda函數正在拒絕403訪問:
S3.download_file(bucket, key, localfile)
根據文檔( http://docs.aws.amazon.com/AmazonS3/latest/dev/amazon-s3-policy-keys.html),s3 s3:prefix
條件僅適用於s3:ListBucket
API,強制使用調用者在ListBucket操作上指定前綴。 它似乎不適用於GetObject
API調用。
正因為如此,你Allow
對GetObject
使用條件s3:prefix == ...
不會匹配任何GET(對象)的請求(因為這些請求不包含策略的關鍵!“S3:前綴”),所以你實際上不允許在角色策略中使用這些請求。 由於您似乎也沒有在存儲桶策略上允許該請求,並且在任何地方都沒有拒絕語句,因此您的Lambda代碼被隱式拒絕 。
您應該使用Resource
,正如您所提到的,您已嘗試使用策略模擬器: "Resource": "arn:aws:s3:::bucket-name/incoming/*"
。
另外 - 您可能有理由完全像您一樣指定策略,但它似乎有點不尋常 - 通常是S3相關策略中的"Resource"
元素,當您想要描述前綴時,將類似於...incoming/*
,而不僅僅是...incoming*
。 這可以防止一些意外的結果。 例如,假設您有一個名為incoming/
的“文件夾”,稍后您將創建一個名為incoming-top-secret/
的文件夾。 您編寫策略的方式,您將授予訪問這兩個前綴的權限! 但同樣 - 如果不真正了解環境的具體細節,很難說出你真正需要的是什么。 只是想確保你(以及其他任何讀過這篇文章的人)都知道這個微妙(但很重要)的細節!
根據您給出的描述,這是我能想到的全部內容。 如果您嘗試進行這些更改,但仍然無效,請使用您嘗試過的新政策相應地更新您的問題。 祝好運!
您可以嘗試將以下語句添加到存儲桶策略嗎?
{
"Sid": "AllowIncomingGet",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/incoming/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"..."
]
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.