iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
Build on AWS

亞馬遜熱帶雨林生存日記系列 第 12

Day 12: DynamoDB IAM 實戰 - Attribute Level 權限設計和踩坑實錄

  • 分享至 

  • xImage
  •  

除了鎖 Table 之外,如果今天我們想封鎖特定 Attribute ,避免一些機敏資料不小心外洩,要怎麼做呢?也許可以先在 Condition 加上 ForAnyValue:StringEquals ,限定指定的 Attribute 可以被 Scan

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListTableForConsole",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ListTables"
            ],
            "Resource": [
                "arn:aws:dynamodb:*:262969866776:table/*"
            ]
        },
        {
            "Sid": "DescribeTableForConsole",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeTable"
            ],
            "Resource": [
                "arn:aws:dynamodb:*:262969866776:table/Articles"
            ]
        },
        {
            "Sid": "AllowDynamodbQuery",
            "Effect": "Allow",
            "Action": [
                "dynamodb:Scan",
                "dynamodb:Query"
            ],
            "Resource": "arn:aws:dynamodb:us-east-1:262969866776:table/Articles",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "dynamodb:Attributes": [
                        "ArticleId",
                        "ColumnId",
                        "Content",
                        "CreatedAt",
                        "Summary",
                        "Title",
                        "Url"
                    ]
                }
            }
        }
    ]
}

但加了發現沒有用,所有資料一樣被看光光 QQ 。

嘗試加上 "dynamodb:Select": "SPECIFIC_ATTRIBUTES" ,讓 ScanQuery 只能查詢特定欄位。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListTableForConsole",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ListTables"
            ],
            "Resource": [
                "arn:aws:dynamodb:*:262969866776:table/*"
            ]
        },
        {
            "Sid": "DescribeTableForConsole",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeTable"
            ],
            "Resource": [
                "arn:aws:dynamodb:*:262969866776:table/Articles"
            ]
        },
        {
            "Sid": "AllowDynamodbQuery",
            "Effect": "Allow",
            "Action": [
                "dynamodb:Scan",
                "dynamodb:Query"
            ],
            "Resource": "arn:aws:dynamodb:us-east-1:262969866776:table/Articles",
            "Condition": {
                "StringEquals": {
                    "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
                }
            }
        }
    ]
}

實際測試,資料會被封印住,就沒有像一開始會看到所有欄位了!

但這樣要怎麼看到資料?使用 Specific attributes 並選擇要搜尋的 attribute , 即可拉出想要看的資料。

但這篇文章的目標不是封鎖特定 Attribute ,假設不想被 User 看到 Author ,這個方法還是可以拿到 Author 的資料,這樣不是自欺欺人?!

其實只要多加一個 Deny 的權限,加上 ForAnyValue:StringEquals 這個條件並指定 attributes,就可以在 ScanQuery 的時候限制 User 不能拿到特定 attributes 的資料。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListTableForConsole",
            "Effect": "Allow",
            "Action": [
                "dynamodb:ListTables"
            ],
            "Resource": [
                "arn:aws:dynamodb:*:262969866776:table/*"
            ]
        },
        {
            "Sid": "DescribeTableForConsole",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeTable"
            ],
            "Resource": [
                "arn:aws:dynamodb:*:262969866776:table/Articles"
            ]
        },
        {
            "Sid": "AllowDynamodbQuery",
            "Effect": "Allow",
            "Action": [
                "dynamodb:Scan",
                "dynamodb:Query"
            ],
            "Resource": "arn:aws:dynamodb:us-east-1:262969866776:table/Articles",
            "Condition": {
                "StringEquals": {
                    "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
                }
            }
        },
        {
            "Sid": "DenyIfAttributesNotSpecified",
            "Effect": "Deny",
            "Action": [
                "dynamodb:Scan",
                "dynamodb:Query"
            ],
            "Resource": "arn:aws:dynamodb:us-east-1:262969866776:table/Articles",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "dynamodb:Attributes": [
                        "Author"
                    ]
                }
            }
        }
    ]
}

再次搜尋,就可以看到 Author 被封印住了。

測試讀取其他 attributes 的資料,也可以順利看到,這樣就可以達到 Attribute Level 權限設定的效果。

然而這樣的設計有一個不便之處:使用者必須事先知道有哪些 attributes 才能正確查詢,系統無法在使用者請求撈取全部欄位時,智能地只回傳其有權限存取的屬性資料。

換句話說,用戶在查詢時需要精確指定欄位,否則將可能因權限不足而無法取得任何資料,而非自動只顯示允許存取的部分。


上一篇
Day 11: DynamoDB IAM 實戰 - Table Level 權限設計和踩坑實錄
系列文
亞馬遜熱帶雨林生存日記12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言