Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

IAMユーザでMFAを強制し、自身でMFAデバイスや認証情報を管理できるようにする方法

はじめに

IAMユーザーをセキュアに運用したいが、IAM管理者の運用負荷は抑えたいという要件を想定して、どのようなIAMポリシーを作成していけばよいか記載していきたいと思います。

今回は、以下の要件があった場合を想定してみます。

  • IAMユーザーにMFAを強制する
  • IAM管理者の運用負担は減らしたいため、MFAデバイスや認証情報はユーザー自身で設定管理してもらいたい
    • MFAデバイスの設定管理
    • AWSマネジメントコンソールのパスワード管理
    • アクセスキーの作成・更新・削除
    • CodeCommitのGit認証情報の生成・更新・削除

<注記>
今回、記載する内容はタイトルにある権限「のみ」を付与するものとなります。
ユーザーが本来必要なIAM権限(IAMポリシー)はこれに加えて付与する必要ある点ご注意ください。
例)CodeCommitやS3、EC2、VPCといった操作権限

IAMポリシーの作成

AWS公式ドキュメント上に参考になるポリシー例が記載されていますので、こちらを修正しながらIAMポリシーを作成します。
AWS: MFA で認証された IAM ユーザーが [My security credentials] (セキュリティ認証情報) ページで自分の認証情報を管理できるようにします - AWS Identity and Access Management

上記のポリシー例をコピーして、今回の要件に合わないSID部分を削除します。
今回はポリシー名「forced-mfa-and-my-sec-creds-self-manage」として作成します。

{
    "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": "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"
            ],
            "Resource": "arn:aws:iam::*:mfa/*"
        },
        {
            "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"
                }
            }
        }
    ]
}

<今回削除したSID>

AllowManageOwnSigningCertificates
AllowManageOwnSSHPublicKeys

動作確認

テスト用のIAMユーザー作成

AWS Management ConsoleのIAM画面からIAMユーザーを作成します。

  1. 「ユーザーを追加」ボタンをクリック
  2. ユーザーの詳細を指定の画面、以下入力して「次へ」
    ユーザー名: test
    AWSマネジメントコンソールへのユーザアクセスを提供する:チェックする
    コンソールパスワード:自動生成されたパスワード
    ユーザーは次回のサインイン時に新しいパスワードを生成する必要があります(推奨):チェックしない
  3. 許可を設定の画面、以下入力して「次へ」
    許可のオプション:ポリシーを直接アタッチする
    許可ポリシー:前項で作成した「forced-mfa-and-my-sec-creds-self-manage」を選択
  4. 確認して作成の画面、「ユーザーの作成」をクリック

上記手順で作成したIAMユーザー
テスト用IAMユーザー

初回ログインからMFAの割り当て

初回ログイン後、画面右上の「アカウント名@アカウントID」から「セキュリティ認証情報」をクリックします。
セキュリティ認証情報

「MFAを割り当てる」をクリックします。
MFAの割り当て

デバイス名を入力して、MFAデバイスを選択します。
MFAデバイスを選択

画面の指示通り実施していき「MFAを追加」をクリックします。
MFAデバイスを選択

※①に記載されるとおり、認証アプリケーションをインストールしておきます 互換性のあるアプリケーションのリストを表示

一度「サインアウト」してから再ログインしなおします。
再ログイン時にはMFAコードの入力を促されるようになります。
MFA認証

※本ブログでは、MFAデバイスの割り当てしか記載しておりませんが、削除、再同期も実行できることは確認しております。

コンソールパスワードの更新

MFA割り当て完了後であれば実施できるようになっています。
画面右上の「アカウント名@アカウントID」から「セキュリティ認証情報」をクリックして「コンソールパスワードの更新」ボタンからパスワードを更新します。
コンソールパスワードの更新1 コンソールパスワードの更新2

「パスワードを変更」ボタンを押した後に画面上部に以下メッセージが表示されれば完了です。

パスワードが正常に変更されました。

アクセスキーの作成

同じくMFA割り当て完了後であれば実施できるようになっています。

  1. 画面右上の「アカウント名@アカウントID」から「セキュリティ認証情報」をクリックして「アクセスキーを作成」ボタンをクリック
    アクセスキーを作成1

  2. コマンドラインインターフェース(CLI)を選択して「次へ」をクリック
    アクセスキーを作成2

  3. 「説明タグを設定」の画面はそのまま「アクセスキーを作成」をクリックすると、「アクセススキーが作成されました」と表示されて完了
    アクセスキーを作成3

※本ブログでは、アクセスキーの作成しか記載しておりませんが、アクセスキーの無効化、削除も実行できることは確認しております。

CodeCommitのHTTPS Git 認証情報の生成

同じくMFA割り当て完了後であれば実施できるようになっています。

画面右上の「アカウント名@アカウントID」から「セキュリティ認証情報」をクリック、「AWS CodeCommit 認証情報」タブを選択し「認証情報を生成」ボタンをクリック
Git認証情報を生成1 Git認証情報を生成2

※本ブログでは、認証情報を生成しか記載しておりませんが、認証情報の無効化、削除、パスワードリセットも実行できることは確認しております。

注記

参考にしたAWS公式ドキュメント上のポリシー例にも記載されていますが、初回ログイン時のパスワードリセットは、以下の理由により推奨されていません。
そのため、AWS Management Consoleのログインパスワード変更は、MFAデバイス設定を実施した後に変更するようIAMユーザーへ案内しましょう。

このポリシー例では、初めて AWS Management Console にサインインする際のパスワードのリセットをユーザーに許可していません。新しいユーザーがサインインするまで、当該ユーザーにアクセス権を許可しないことをお勧めします。詳細については、「IAM ユーザーを安全に作成するにはどうすればよいですか?」を参照してください。また、これにより失効したパスワードを持つユーザーは、サインイン中にパスワードをリセットできなくなります。この操作を許可するには、iam:ChangePassword と iam:GetAccountPasswordPolicy をステートメント DenyAllExceptListedIfNoMFA に追加します。ただし、ユーザーが多要素認証(MFA) なしで自分のパスワードを変更できるようになると、セキュリティ上のリスクが生じる可能性があるためこれを推奨しません。

おわりに

今回のように、実現したい要件に似たポリシー例がAWS公式ドキュメント上には、さまざま紹介されています。
IAMポリシーを作成する際は、一度AWS公式ドキュメントを覗いてみるとよいかもしれません。