前言
越來越多企業將服務甚至內部核心搬上雲端,因此雲端平台的帳號保護就顯得非常重要,保護帳號的原則除了密碼複雜度外,我都會建議要啟動多因素認證 (MFA) 來進一步強化帳號的保護。
今天就來介紹一下該如何透過 IAM Policy 來限制帳號必須啟動 MFA (Multi Factor Auth) 才可以進行操作。
實行方法
IAM Policy Condition
要進行這樣的限制其實非常容易,在 Condition
中加入 aws:MultiFactorAuthPresent
的判斷即可,範例如下:
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "true"
}
}
反向表達 (Deny)
如果針對每一個資源進行一次 aws:MultiFactorAuthPresent
判斷是非常耗時的,因此我們將條件反過來寫,範例如下:
"Sid": "DenyAllExceptListedIfNoMFA",
"Effect": "Deny",
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent ": "false"
}
}
}
排除必要操作的限制 (NotAction)
如果我們將所有資源 "Resource": "*"
都加入 aws:MultiFactorAuthPresent
,這將會導致沒有 MFA 的帳號無法啟用 MFA。
為了避免上述的問題,我們可以透過 NotAction 反過來排除相關限制,並允許 MFA 相關操作,讓使用者可以正常啟用帳號的 MFA,不會因此陷入死循環中,範例如下:
[
{
"Sid": "AllowViewAccountInfo",
"Effect": "Allow",
"Action": "iam:ListVirtualMFADevices",
"Resource": "*"
},
{
"Sid": "AllowManageOwnVirtualMFADevice",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice",
"iam:DeleteVirtualMFADevice"
],
"Resource": "arn:aws:iam::*:mfa/${aws:username}"
},
{
"Sid": "AllowManageOwnUserMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"iam:ResyncMFADevice"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "DenyAllExceptListedIfNoMFA",
"Effect": "Deny",
"NotAction": [
"iam:GetUser",
"iam:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:ResyncMFADevice",
"sts:GetSessionToken",
"iam:ChangePassword"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
最後一步
我們只需要將 Policy 套用到使用者身上,就可以達到強制啟動 MFA 才可以進行資源操作的目的。
備註
aws:MultiFactorAuthPresent
只有在使用者登入的時候才會更新,也就是設定完 MFA 要重新登入一次。- 上方的範例要求 MFA 的名稱要跟使用者名稱相同,可以透過修改
arn:aws:iam::*:mfa/${aws:username}
為arn:aws:iam::*:mfa/${aws:username}-*
,讓使用者可以在名稱後方加上-
來加上自己的標註資訊