👨‍🏭

【AWS】IAMで読み取り専用ユーザー本人がMFAの設定が出来るようにする方法

2023/07/19に公開

はじめに

社内の有志メンバーでの活動で本人がMFAの設定をする機会がありました。
この経験は、何度もある事ではないと思いますので、備忘録として執筆します。

ReadOnlyAccessIAMUserChangePasswordのポリシーだけでは設定できない

ReadOnlyAccessのユーザーを作成後にMFAの認証を行うとしましたが、下記のエラーメッセージが表示されました。
どうやら、「権限がありません」と記載されています。
なので、ポリシーで追加する必要がありそうです。

sandbooks-aws-IAM-MFA-step00

ユーザー本人でMFAの設定可能にする

1. 本人がMFAの設定できるポリシーを作成する

  1. 左側のポリシーをクリックする

  2. ポリシーを作成をクリックする
    sandbooks-aws-IAM-MFA-step01

  3. 右側のJSONをクリックする

  4. ポリシーエディタに下記JSONをコピペする

  5. 次へをクリックする
    sandbooks-aws-IAM-MFA-step02

{
    "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/*"
        },
        {
            "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"
                }
            }
        }
    ]
}

補足情報

単語 意味
AllowViewAccountInfo IAMユーザーがアカウント情報を表示するために許可されているアクションが定義されています。具体的には、アカウントのパスワードポリシーを取得したり、アカウントのサマリー情報を取得したり、仮想多要素認証(MFA)デバイスのリストを取得することができます
AllowManageOwnPasswords IAMユーザーが自分自身のパスワードを管理するために許可されているアクションが定義されています。具体的には、パスワードの変更、自分自身のログインプロファイルの作成と削除、ログインプロファイルの取得と更新が許可されています
AllowManageOwnAccessKeys IAMユーザーが自分自身のアクセスキーを管理するために許可されているアクションが定義されています。具体的には、アクセスキーの作成、削除、リストの表示、アクセスキーの更新が許可されています
AllowManageOwnSigningCertificates IAMユーザーが自分自身の署名証明書を管理するために許可されているアクションが定義されています。具体的には、署名証明書の削除、リストの表示、署名証明書の更新とアップロードが許可されています
AllowManageOwnSSHPublicKeys IAMユーザーが自分自身のSSH公開鍵を管理するために許可されているアクションが定義されています。具体的には、SSH公開鍵の削除、取得、リストの表示、SSH公開鍵の更新とアップロードが許可されています
AllowManageOwnGitCredentials IAMユーザーが自分自身のGitクレデンシャルを管理するために許可されているアクションが定義されています。具体的には、サービス固有のクレデンシャルの作成、削除、リストの表示、サービス固有のクレデンシャルのリセットと更新が許可されています。
AllowManageOwnVirtualMFADevice IAMユーザーが自分自身の仮想多要素認証(MFA)デバイスを管理するために許可されているアクションが定義されています。具体的には、仮想MFAデバイスの作成と削除が許可されています
AllowManageOwnUserMFA IAMユーザーが自分自身のMFAデバイスを管理するために許可されているアクションが定義されています。具体的には、MFAデバイスの無効化と有効化、MFAデバイスのリストの表示、MFAデバイスの再同期が許可されています
DenyAllExceptListedIfNoMFA MFAが無効化されている場合に、ユーザーに許可されるアクションを制限する条件が定義されています。MFAが無効な場合、特定のアクション(仮想MFAデバイスの作成、MFAデバイスの有効化、パスワード変更など)に対してのみ許可され、それ以外のアクションに対しては拒否されます

3. 任意のポリシーを設定する

  1. ポリシー名の欄に任意の名前を入力します。
    ※今回は、test-MFAという名前で作成します。
    sandbooks-aws-IAM-MFA-step03
  2. 許可の欄にIAMがある事を確認する
    ※先ほどのJSONでIAMの内容の設定が反映されました。
  3. 内容を確認し、ポリシーの作成をクリックする
    sandbooks-aws-IAM-MFA-step04

4. 成功メッセージを確認する

  1. 画面上部にポリシー test-MFAが作成されました。を確認する
  2. 任意で設定したポリシー名のtest-MFAが一覧で確認出来ます。
    sandbooks-aws-IAM-MFA-step05

5. 対象ユーザーに作成したポリシーを付与する

  1. 左側のユーザーをクリックする

  2. 対象のユーザーをクリックする
    ※今回は、test-userを選択します。
    sandbooks-aws-IAM-MFA-step06

  3. 許可を追加の右横の▲をクリックし、許可を追加をクリックする
    sandbooks-aws-IAM-MFA-step07

  4. ポリシーを直接アタッチするを選択する

  5. 検索欄にキーワードを入力し調べやすくします。
    test-MFAだったのでtestというキーワードで検索しています。

  6. 先ほど作成したtest-MFAに✅を付ける

  7. 次へをクリックする
    sandbooks-aws-IAM-MFA-step08

  8. 対象ユーザーと付与するポリシーを確認する

  9. 許可を追加をクリックする
    sandbooks-aws-IAM-MFA-step09

  10. ポリシーが追加されましたという成功メッセージを確認する

  11. ポリシーの一覧にtest-MFAが追加されていることを確認する
    sandbooks-aws-IAM-MFA-step10

6. 本人がMFA設定を行う

  1. 対象のユーザーでログインをする
    sandbooks-aws-IAM-step10

  2. 左側のダッシュボードからMFAを追加をクリックする
    sandbooks-aws-IAM-MFA-step11

  3. 少しスクロールし多要素認証(MFA)を見つけ、MFAデバイスの割り当てをクリックする
    sandbooks-aws-IAM-MFA-step12

  4. 登録するデバイス名をデバイス名の入力欄に記入する

  5. 認証アプリケーションを選択する

  6. 次へをクリックする
    sandbooks-aws-IAM-MFA-step13

  7. 認証アプリケーションをスマホにダウンロードする

    自分は下記を利用しました。

sandbooks-aws-IAM-MFA-step14
8. QRコードを表示をクリックし、QRコードさせる
9. 先ほどインストールした認証アプリケーションQRコードを読み込む
sandbooks-aws-IAM-MFA-step15
10. スマホの画面に30秒に1回6桁の数字が表示されるので、連続で6桁の数字を2回分入力する
11. MFAを追加をクリックする
sandbooks-aws-IAM-MFA-step16
12. 成功メッセージを確認する
sandbooks-aws-IAM-MFA-step17
13. 多要素認証(MFA)の一覧に先ほどのデバイス名が登録させている事を確認する
sandbooks-aws-IAM-MFA-step18

7. MFAが機能しているのか確認する

  1. 一度サインアウトする
  2. 再度ログインをする
  3. 下記の画面が表示されることを確認する
    sandbooks-aws-IAM-MFA-step19

おわりに

セキュリティ対策として大切な設定なので必ず行いたいですね。

GitHubで編集を提案

Discussion