簡體   English   中英

基於 IAM 用戶標簽限制 S3 訪問(前綴)的 AWS IAM 策略

[英]AWS IAM Policy To Restrict S3 Access (Prefix) Based On IAM User's Tag

各種 IAM 用戶共享對 S3 存儲桶的訪問。 S3 存儲桶包含由用戶分隔的內容,因此每個用戶都有一個他們有權訪問的唯一區域。

例如:

  • S3 存儲桶: example-bucket
  • IAM 用戶: UserOne 該用戶被標記為sampleTag=u11111
  • IAM 用戶: UserTwo 該用戶被標記為sampleTag=u22222
  • 更多標記的 IAM 用戶。

我想編寫一個 IAM 策略,以便:

  • UserOne可以訪問s3://example-bucket/u11111/*讀+寫內容並從s3://example-bucket/config/u11111/讀取內容
  • UserTwo可以訪問s3://example-bucket/u22222/*讀+寫內容並從s3://example-bucket/config/u22222/讀取內容
  • 等等...

請注意,S3 鍵包括路徑中的sampleTag值。

我希望這個單一策略能夠應用於整個 IAM 用戶組,而無需為每個用戶包含一個單獨的策略。

由於${aws:PrincipalTag/sampleTag}我認為這會成為可能,我認為它會在資源字符串的那個位置注入標簽值。 但是在玩了策略模擬器之后,它似乎並沒有做到這一點。

當前政策如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket",
                "arn:aws:s3:::example-bucket-test"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket",
                "arn:aws:s3:::example-bucket-test"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:prefix": [
                        "",
                        "${aws:PrincipalTag/sampleTag}/"
                    ],
                    "s3:delimiter": ["/"]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket",
                "arn:aws:s3:::example-bucket-test"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": ["${aws:PrincipalTag/sampleTag}/*"]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket/config/${aws:PrincipalTag/sampleTag}/*",
                "arn:aws:s3:::example-bucket-test/config/${aws:PrincipalTag/sampleTag}/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket/${aws:PrincipalTag/sampleTag}/*",
                "arn:aws:s3:::example-bucket-test/${aws:PrincipalTag/sampleTag}/*"
            ]
        }
    ]
}

我認為最后兩個政策不起作用。 我找不到文檔來說明您是否可以將變量嵌入到Resource字符串中,但是s3:prefix似乎不適用於GetObjectPutObject操作——所以我不確定如何限制范圍這些權限。

關於什么是錯誤的或如何實現這一點的任何想法將不勝感激!

我認為可以在策略的 Ressource 屬性中使用 ${aws:PrincipalTag} 。 只需查看 IAM 的文檔即可 該示例使用 PrincipalTag 作為 Ressource 值的最后一部分。

(只需使用 Strg + F 並在文檔網站上輸入 PrincipalTag 即可找到示例)

你是對的,最后兩個策略不起作用。

根據文檔aws:PrincipalTag/tag-key字符串運算符一起使用,因此aws:PrincipalTag/tag-key用法僅適用於Condition策略元素。

此外, s3:prefix條件鍵僅適用於ListBucketListBucketVersions操作: https : ListBucketVersions

您可以將 PrincipalTag 作為資源的一部分。 這有效。

    {
        "Sid": "FullPermissionOnlyForPrefix",
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::mybucket/${aws:PrincipalTag/team}*",
            "arn:aws:s3:::mybucket/${aws:PrincipalTag/team}/*"
        ]
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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