はじめに
AWS のマネージメントコンソールでは、MFA の設定が出来ます。これによってセキュリティレベルを上げることが出来ます。
一点考えないといけないのが、誰が MFA を設定するのか?という点です。AWS を使う人が小規模な場合は、一部の管理者が代わりに MFA の設定を行うことで、MFA の設定を強制化できるでしょう。AWS の利用が大規模になったときはどうでしょうか?全員分の MFA の設定を管理者が行うのは大変です。
そこで、利用者がセルフサービスで MFA の設定を出来るようにすることがのぞましいです。要件を整理するとこんな感じです
- AWS のサービスを利用するためには、強制的に MFA を有効化させたい
- 管理負担の軽減の観点で、自分自身の IAM User に、セルフサービスの MFA デバイスの紐づけを許可させたい。
- 管理者が IAM User を作成したあとに、利用者に ユーザーに ID と Password を展開するときには、MFA の設定は入っていない。MFA 無しでも、ログインして MFA の有効化が出来る環境が必要
この環境を実現するための IAM Policy の書き方が AWS Document で紹介されています。この設定方法を簡単に紹介していきます。
「管理者」と「利用者」の 2 つの役割にわけで、それぞれ行う作業を紹介していきます。
管理者 : IAM Policy の作成
セルフサービスの MFA 設定を許可するための、IAM Policy を作成します。
Create policy を押します。
IAM Policy に与える権限設定として、以下の JSON を入力します。
-
DenyAllExceptListedIfNoMFA
: の部分で、ユーザー自身による MFA 設定を許可している - MFA に関する設定は、MFA を使っていなくても操作を許可する
- MFA を使っていないときは、EC2 や S3 といった AWS サービス群の操作を禁止している
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowViewAccountInfo",
"Effect": "Allow",
"Action": [
"iam:GetAccountPasswordPolicy",
"iam:ListVirtualMFADevices"
],
"Resource": "*"
},
{
"Sid": "AllowManageOwnPasswords",
"Effect": "Allow",
"Action": [
"iam:ChangePassword",
"iam:GetUser"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnAccessKeys",
"Effect": "Allow",
"Action": [
"iam:CreateAccessKey",
"iam:DeleteAccessKey",
"iam:ListAccessKeys",
"iam:UpdateAccessKey"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnSigningCertificates",
"Effect": "Allow",
"Action": [
"iam:DeleteSigningCertificate",
"iam:ListSigningCertificates",
"iam:UpdateSigningCertificate",
"iam:UploadSigningCertificate"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnSSHPublicKeys",
"Effect": "Allow",
"Action": [
"iam:DeleteSSHPublicKey",
"iam:GetSSHPublicKey",
"iam:ListSSHPublicKeys",
"iam:UpdateSSHPublicKey",
"iam:UploadSSHPublicKey"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnGitCredentials",
"Effect": "Allow",
"Action": [
"iam:CreateServiceSpecificCredential",
"iam:DeleteServiceSpecificCredential",
"iam:ListServiceSpecificCredentials",
"iam:ResetServiceSpecificCredential",
"iam:UpdateServiceSpecificCredential"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"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:ListMFADevices",
"iam:ResyncMFADevice"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "DenyAllExceptListedIfNoMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"sts:GetSessionToken"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
JSON を入力したら、Next を押します。
適当にポリシー名を入れます。
IAM Policy が作成されました。
管理者 : IAM User を作成
上記 IAM Policy を紐づけた IAM User を作成します。より大規模な環境では、Group を作成して、全 IAM User を Group に紐づけるのが楽だと思います。
Add users を押します。
Require password reset はチェックを外します。チェック外す理由は、こちらの Document で推奨されているためです。自分自身によるパスワードリセットは、MFA を使っている時だけ許可するようにするためです。
上述の通り、Require password reset のチェックを外して、Next を押します。
作成した IAM Policy を指定します。
また、AdministratorAccess も追加します。何らかの許可のポリシーがないと、何も操作ができない IAM User が出来上がります。Administrator の権限を追加した時でも、明示的な禁止のポリシーの方が優先度が高いので、MFA を設定しない状況では、何もできません。
Create user を押します。
IAM User が作成されました。
利用者 : 作った IAM User でログイン
次に利用者側の視点です。管理者によって払いだされた IAM User でマネージメントコンソールにログインをします。
ログインできました
初回のログインでは MFA を使っていないので、EC2 や S3 といったサービスのページを開いても何も表示されません。
利用者 : MFA を有効化
自分自身で MFA を有効化します。IAM のページで、ダッシュボードを開き、MFA を追加のボタンを押します。いろいろエラーになっていますが、MFA を使っていないので正常な状態です。
ちなみに、User のページから設定しようと見てみましたが、エラーで一覧も表示されませんでした。
AWS IAM Credentials の画面で、Assign MFA device を選びます。
適当に名前を指定して、Continue を押します。
QR コードによる登録方法と、secret key による登録方法があります。どっちでもいいですが、今回は secret key でやっていきます。
secret key を MFA デバイスに紐づけたあと、表示される 6 桁の数字を入力します。
紐づけが出来ました。Close を押します。
MFA を設定したので、一度サインアウトをします。再度ログインするときに、MFA が求められました。
MFA を有効化したので、EC2 などのサービスが操作できるようになりました。
検証を通じてわかったこと
- セルフサービスで MFA 設定を許可しようとすると、IAM Policy でコントロールをしていく必要がある。小規模な環境ではここまでしなくても、管理者が設定代行する方法でも良さそうに思える。
- もしくは、会社が既に使っている Okta などの Identity Provider があれば、それと連携するのが一番楽だと思う。
参考 URL
AWSコンソールとCLI利用時にMFA認証を必須にする
https://www.karakaram.com/requiring-mfa-authentication-when-using-aws-console-and-cli/
AWS: MFA で認証された IAM ユーザーが [My Security Credentials] (マイセキュリティ資格情報) ページで自分の認証情報を管理できるようにする
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_aws_my-sec-creds-self-manage.html
AWS CLI で MFA 必須のアクセス制御を設定
https://blog.nijot.com/aws/aws-cli-mfa-force-setting/