限制 AWS 帳號必須啟動多因素認證 (Multi Factor Auth, MFA)

前言

越來越多企業將服務甚至內部核心搬上雲端,因此雲端平台的帳號保護就顯得非常重要,保護帳號的原則除了密碼複雜度外,我都會建議要啟動多因素認證 (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 才可以進行資源操作的目的。

備註

  1. aws:MultiFactorAuthPresent 只有在使用者登入的時候才會更新,也就是設定完 MFA 要重新登入一次
  2. 上方的範例要求 MFA 的名稱要跟使用者名稱相同,可以透過修改 arn:aws:iam::*:mfa/${aws:username}arn:aws:iam::*:mfa/${aws:username}-*,讓使用者可以在名稱後方加上 - 來加上自己的標註資訊