進入職場還是要看職位,才知道能取得哪些操作權限啊!
昨天在 AWS IAM 中建立了系統管理員角色 (Role),還給了它 AdministratorAccess
權限。
看到這個畫面,立刻來測試使用者+角色!
莫急、莫慌、莫害怕
目前只是用員工的身分進了公司,還需要切換成對應的職位才有權限。
點開畫面右上角,下方有個「切換角色」的按鈕。
點它。
輸入 Account ID
與 Role Name
理論上應該可以順利使用了,但實際測試卻發現...什麼都不能做。
怎麼會這樣?
還記得在建立角色的時候,曾經寫了一段 JSON 格式的設定嗎?
它是 AWS 中的 信任政策 (Trust Policy)
,文末會再仔細介紹。
設定中的其中一段:
"Condition": {
"StringEquals": {
"aws:PrincipalAccount": "590184072539"
},
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
這裡明確要求:一定要透過 MFA 登入 才能使用這個角色
。
所以單純用帳號密碼登入就想做角色切換,當然會被 AWS 拒絕。
就像是雖然持有識別證,但進申請機房通行證需要驗證指紋,否則門禁不會放行。
AWS 顯然知道大家會在這裡卡關,因此在 IAM 使用者頁面就能直接設定 MFA。
直接點擊「啟用 MFA」
選擇要使用的 MFA 裝置
跟著畫面完成綁定,掃描 QR code,輸入兩組連續的驗證碼
完成後,IAM 使用者的狀態會顯示「已啟用且具有 MFA 」
從這一刻開始,每次使用這個 User 登入 AWS Console 都要額外輸入動態驗證碼囉!
完成後,畫面上方會顯示你已切換到指定角色
這時候再看畫面,就會發現原本的「拒絕存取」紅框都不見了!
一路看下來,AWS 的權限機制實在是很麻煩很嚴謹。
那麼,在這樣嚴謹機制中,AWS 是怎麼做權限判斷的?
AssumeRole
User Policies + Group Policies + Identity-based Policies
Role Policies + Resource-based Policies
沒錯,在 AssumeRole
(切換角色)之後,就**只看**
Role 的權限設定。
這也是避免 User 同時擁有兩組權限導致混亂。
Deny 永遠優先
在 IAM 的世界裡:Deny > Allow
只要有任何一個規則出現 Deny,就算同時有多個 Allow,也會直接被拒絕。
所以在實務上的設定中 Deny 用的場景不太多,因為一旦設定上去,就等於是「最高限制」。
「Trust policy」=資源端決定要信任誰。
最常見的例子就是 IAM Role,但其實它不是 Role 獨有的機制,也會用在 IAM Identity Provider、AWS Service-linked Roles、跨帳號存取 等場景。
基本格式:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "AllowLoginUserWithMFA",
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:user/login-user" },
"Action": "sts:AssumeRole",
"Condition": {
"Bool": { "aws:MultiFactorAuthPresent": "true" },
"StringEquals": { "aws:PrincipalAccount": "ACCOUNT_ID" }
}
}]
}
欄位 | 位置/格式 | 意義 |
---|---|---|
Version | 最外層 | IAM 政策語言版本,固定使用 "2012-10-17" |
Statement | 最外層/陣列 | 由一或多個規則組成,每個規則獨立判斷 |
Sid | Statement 內 | 規則的識別字串,方便人閱讀 |
Effect | Statement 內 | 指定規則是 Allow 或 Deny |
Principal | Statement 內 | 誰可以來 Assume 這個 Role,可以是 User/Role/Service/Account |
Action | Statement 內 | 被允許的動作;信任政策通常只會是 sts:AssumeRole |
Condition | Statement 內 | 額外限制條件,必須同時符合才會生效 |
Bool | Condition 內 | 設定條件為 True or False。"aws:MultiFactorAuthPresent": "true" :要求需有 MFA 狀態 |
StringEquals | Condition 內 | 設定條件為完全相符的字串。"aws:PrincipalAccount": "ACCOUNT_ID" :指定要相符的帳號 ID |
明明設定了 AdministratorAccess
,卻發現無法存取費用設定?
即使給了 AdministratorAccess,也不一定能進 Billing Console。
AdministratorAccess 本身雖然有包含帳務相關權限,但是要實際存取 AWS Billing Console (存取帳務資訊),還需要額外的帳戶層級設定。
而且這個設定需要由 Root 來做。
常見盲區