Help us understand the problem. What is going on with this article?

AWS で MFA 必須の IAM アカウントを作成し、ユーザに受け渡す手順について

多段階認証 (MFA) が必須の IAM アカウントを作成して、ユーザに受け渡す手順について。

MFA 必須でパスワードリセット可のポリシーについて

公式のドキュメントは以下の2つです。

基本的にはドキュメントの通りにやればいいのですが、このままだと、初回のパスワードリセットが許可されません。

この点についての説明が、英語版と日本語版で異なっていました。

注記
このポリシー例では、サインイン時のパスワードのリセットをユーザーに許可していません。新しいユーザーおよびパスワードの期限が切れているユーザーは、これを行う場合があります。これを許可するには、iam:ChangePassword をステートメント DenyAllExceptListedIfNoMFA に追加します。

英語版だと、

Note
This example policy does not allow users to reset a password while signing in. New users and users with an expired password might try to do so. You can allow this by adding iam:ChangePassword and iam:GetAccountPasswordPolicy to the statement DenyAllExceptListedIfNoMFA.

英語版に従っておくのが無難そうなので、以下の2つを DenyAllExceptListedIfNoMFA に追加します。

  • iam:ChangePassword
  • iam:GetAccountPasswordPolicy

追加した JSON は以下です。(実際に設定するときは、公式のドキュメントからコピペしてください)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowViewAccountInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetAccountPasswordPolicy",
                "iam:GetAccountSummary",       
                "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",

                "iam:ChangePassword",
                "iam:GetAccountPasswordPolicy"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}

初期ユーザ用・MFA 設定済みユーザ用ポリシー

ポリシーを2つ作ります。

  • パスワードリセットを許可したポリシー (初期ユーザ用)
  • パスワードリセットにMFA が必要なポリシー (既存ユーザ用)

前者のポリシー名と説明を、以下のように設定します。
説明文に URL が書けないので、後から参照できるように公式ドキュメントのタイトルを書くことにしました。

MFARequiredOnlyForTheFirstLogin
Created YYYY-MM-DD - Copied and edited the official sample JSON to enable password reset - AWS Allows MFA-Authenticated IAM Users to Manage Their Own Credentials on the My Security Credentials Page

ポリシーの JSON は、上で説明した通り、公式ドキュメントからコピペして、Action を2つ追加したものを設定します。

そして、このポリシーだけを設定したグループ NotYetLoginUsers を作成します。

後者のポリシー名と説明は、以下のように設定します。

MFARequiredForCurrentUsers
Created YYYY-MM-DD - Copied from the official document - AWS Allows MFA-Authenticated IAM Users to Manage Their Own Credentials on the My Security Credentials Page

ポリシーの JSON は、公式ドキュメントのものをそのまま使います。

IAM アカウントの受け渡し

以下の手順で受け渡します。

  1. アカウントを作成し、NotYetLoginUsers グループにだけ所属させる
  2. メール等で仮のパスワードを伝えて、パスワードリセットと MFA 登録を依頼する
  3. 本人の MFA 登録が確認できたら、NotYetLoginUsers グループから外し、MFARequiredForCurrentUsers と必要な権限を設定する

2 の時点では何も権限がないので、パスワードはメールで送ってもよいことにしています。

パスワードポリシーの影響について

パスワードポリシーに、ユーザにパスワードの変更を許可する Allow users to change their own password というオプションがあります。

image.png

このオプションは、オンにしておく方が良さそうでした。

オフの場合、

  • ポリシーで明示的に指定しない限り、パスワードを変更できなくなる
  • ユーザ作成時にパスワードリセットを求めると、自動的に IAMUserChangePassword が追加される

という挙動になるようです。

image.png

逆に、ポリシーを設定さえすれば、そちらが優先されるようです。全ユーザに、上記 MFA 必須のポリシーを設定するのであれば、どちらでも基本的には同じ動作になります。

ただし、オフにすると、新規ユーザ作成時に勝手に IAMUserChangePassword ポリシーが設定されてしまうので、オンにしておくのが無難だと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away