簡體   English   中英

S3存儲桶策略和IAM角色沖突

[英]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調用。

正因為如此,你AllowGetObject使用條件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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM