我擁有對 S3 Bucket 具有完全訪問權限的用戶my-bucket。我想擔任該用戶的角色,以在該會話期間僅限制對特定檔案夾(由角色名稱標記)的訪問。將有多個角色/檔案夾,因此我需要以編程方式執行此操作,而不是對每個角色/檔案夾進行硬編碼。
例如:
test_user假設角色safe_role訪問 s3 檔案夾my-bucket/safe_role
我認為這對于策略變數來說很簡單,但是我已經被困了好幾天,只是試圖進行設定。
我可以通過 成功創建safe_role、附加策略safe_role并承擔角色test_user。使用以下策略,我可以成功地從任何檔案夾下載物件,因為它可以完全訪問 S3 存盤桶。
這是有效的初始策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket/*",
"arn:aws:s3:::my-bucket"
]
}
]
}
現在要限制對safe_role我嘗試過的檔案夾的訪問(以及其他一百萬件事):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket/${aws:username}/*",
"arn:aws:s3:::my-bucket"
]
}
]
}
擔任該safe_role角色后,我無法從任何檔案夾下載任何物件,包括my-bucket/safe_role. 我收到以下錯誤:
Exception has occurred: ClientError
An error occurred (403) when calling the HeadObject operation: Forbidden
問題:
- 在這種情況下,我們應該期望變數
${aws:username}變為test_userorsafe_role嗎? - 發出測驗請求時,是否有某種方法可以在控制臺(或任何其他方法)中查看策略變數替換?
- 如果這不是正確的變數,什么策略變數會給我角色名稱?
根據@jarmod 評論和 AWS 檔案,看起來我們無法以我想的方式獲取角色的變數。有沒有其他方法可以達到同樣的效果?可能是標簽?
uj5u.com熱心網友回復:
根據IAM 策略元素:變數和標簽 - AWS Identity and Access Management,假設 IAM 角色時:
aws:userid=role-id:caller-specified-role-name
其中role-id是角色的唯一 ID,呼叫者指定的角色名稱由傳遞給 AssumeRole 請求的 RoleSessionName 引數指定。
因此,它不僅僅是讓檔案夾與角色命名相同那么簡單。它需要以 和role-id命名RoleSessionName。
uj5u.com熱心網友回復:
正如 jarmod 指出的那樣,我們不能使用aws:username它,因為它沒有為假定的角色填充。但約翰正確地指出,我們可以使用該aws:userid欄位來扮演一個假定的角色。(請參閱IAM 策略元素:變數和標簽 - AWS Identity and Access Management)
對于代入角色,用戶 ID 采用以下形式:
aws:userid = role-id:caller-specified-role-name
有了這些知識,我們現在可以用 . 標記檔案夾中的每個物件user = role_name。標記物件后,我們可以通過將以下策略附加到角色來限制訪問:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RestrictAccessToFolderRoleName",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket/*",
"arn:aws:s3:::my-bucket"
],
"Condition": {
"StringLike": {
"aws:userid": "*:${s3:ExistingObjectTag/user}"
}
}
}
]
}
此條件將用戶標識的第二部分caller-specified-role-name與物件上的user標記進行比較。如果兩者不匹配,則代入角色將無法下載物件。
需要注意的是,這個角色名稱是“caller specified”。這對我的應用程式來說是可以的,但在其他情況下可能是一個安全問題。
如果其他人有更安全的解決方案,我愿意更改接受的答案!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/511513.html
下一篇:Python中的分頁器
