4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2019-11-23

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

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

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

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

このドキュメントの注記にあるとおり、以下の2つを DenyAllExceptListedIfNoMFA に追加します。

  • iam:ChangePassword
  • iam:GetAccountPasswordPolicy

また、こちらの記事を参考に、MFA のデバイス名をユーザ名のみに制限したほうが良いかもしれません。* のままだと他人の MFA を削除できてしまいます。

            "Resource": "arn:aws:iam::*:mfa/*"
            ↓
            "Resource": "arn:aws:iam::*:mfa/${aws:username}"

ただし、ユーザにデバイス名を正しく入力してもらう必要があり、運用は難しくなります。IAM の MFA を削除しても時間稼ぎにしかならなそうな気もします。

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

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

  1. MFA 無しでもパスワードリセットできるポリシー (初期ユーザ用)
  2. パスワードリセットにMFA が必要なポリシー (既存ユーザ用)

最初は1のポリシーを設定し、ユーザが MFA の登録を終えたら2に切り替えます。

1. 初期ユーザ用ポリシー

公式ドキュメントのポリシーに、冒頭に書いた、パスワード変更を許可する修正と、デバイス名を制限する修正を行います。JSON は以下のようになります。
(実際に設定するときは、公式のドキュメントからコピペして編集してください)

{
    "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",
                "iam:GetAccessKeyLastUsed"
            ],
            "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"
            ],
            "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:GetMFADevice",
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice",
                "sts:GetSessionToken",

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

ポリシー名と説明を、以下のように設定します。
説明文に 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

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

2. 既存ユーザ用ポリシー

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

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 は、公式ドキュメントのものを使います。

自動化

一連の操作を行うスクリプトを以下に作成しました。setup.sh プロファイル名 でポリシー 2 つと、NotYetLoginUsers グループを作成します。

ポリシーの 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 ポリシーが設定されてしまうので、オンにしておくのが無難だと思います。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?