
我正在嘗試建立一個儲存桶策略,該策略將授予來自 ec2 或 ecs 實例的存取權限,以便授予它們對特定儲存桶的 putObject 權限。
我有幾個基本問題:
1) 如果您只想授予從 ec2 到相同帳戶內的儲存桶的存取權限,那麼使用儲存桶策略是否正確?這些文件似乎引用了許多跨帳戶存取的內容。
2)實現這目標的原則是什麼?例如,我是否可以設定一個原則,簡單地說「授予此 aws 帳戶中任何資源的存取權」?
3) 我透過在原理中指定 ec2 實例的 IAM 角色來使其工作(見下文)。但這是首選方法嗎?
{
"Version": "2012-10-17",
"Id": "Policy1563569774763",
"Statement": [
{
"Sid": "Stmt1563569772515",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::XXXX:role/S3_Read_All"
]
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::some-test-bucket-12345/*"
}
]
}
先感謝您!我發現很難理解這一點。
答案1
你的直覺是對的。如果您只想授予對同一帳戶中的儲存桶的存取權限,那麼可能更簡單使用 IAM 策略。您可以將這樣的策略附加到角色,它將依序附加到 EC2 執行個體。
需要注意的一點是,考慮第一個連結中的政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListObjectsInBucket",
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bucket-name"]
},
{
"Sid": "AllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": ["arn:aws:s3:::bucket-name/*"]
}
]
}
第一個語句「ListObjectsInBucket」將資源設定到儲存桶。 ARN 是arn:aws:s3:::bucket-name
(*
沒有)。第二條語句將 arn 設定為arn:aws:s3:::bucket-name/*
。 There/*
的意思是「bucket-name 中的所有物件」。有些 IAM 操作適用於儲存桶,其他操作適用於物件。
您也可以使用前綴,例如arn:aws:s3:::bucket-name/prefix*
,它將允許存取名稱以“prefix”開頭的所有物件。請記住,S3 中物件的名稱是全名,包括路徑標記(“/”),因此是“/path/to/object”,而不僅僅是“object”。 S3 中沒有目錄。
另一件事是,當您將角色附加到 EC2 執行個體時,您向有權存取該執行個體的任何人授予與該角色相同的權限。因此,請確保任何可以登入 EC2 執行個體的使用者也應該有權存取 S3 儲存桶。
請記住,物件(使用者、ec2 實例、lambda 函數等)對儲存桶的存取等級由 IAM 策略和儲存桶策略組合產生的策略集給出。且 Deny 語句具有優先權。當物件和儲存桶位於同一帳戶時,您只需使用其中之一,並且 IAM 策略可能是自然的選擇。在跨帳戶存取儲存桶策略中,基本上用於向其他帳戶授予對儲存桶的存取權限。在另一個帳戶中也設定了 IAM 政策。