1
1

More than 1 year has passed since last update.

AWS IAM で、セルフサービスな MFA 環境を作ってみた

Posted at

はじめに

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 を押します。

image-20221228212704018.png

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 を押します。

image-20221228212752764.png

適当にポリシー名を入れます。

image-20221228212930399.png

IAM Policy が作成されました。

image-20221228213124735.png

管理者 : IAM User を作成

上記 IAM Policy を紐づけた IAM User を作成します。より大規模な環境では、Group を作成して、全 IAM User を Group に紐づけるのが楽だと思います。

 

Add users を押します。

image-20221228213651030.png

 

Require password reset はチェックを外します。チェック外す理由は、こちらの Document で推奨されているためです。自分自身によるパスワードリセットは、MFA を使っている時だけ許可するようにするためです。

image-20221228213448664.png

 

上述の通り、Require password reset のチェックを外して、Next を押します。

image-20221228213240003.png

 

作成した IAM Policy を指定します。

image-20221228213825030.png

 

また、AdministratorAccess も追加します。何らかの許可のポリシーがないと、何も操作ができない IAM User が出来上がります。Administrator の権限を追加した時でも、明示的な禁止のポリシーの方が優先度が高いので、MFA を設定しない状況では、何もできません。

image-20221228215628769.png

Create user を押します。

image-20221228213849479.png

 

IAM User が作成されました。

image-20221228213926853.png

利用者 : 作った IAM User でログイン

次に利用者側の視点です。管理者によって払いだされた IAM User でマネージメントコンソールにログインをします。

image-20221228214056327.png

ログインできました

image-20221228214250492.png

初回のログインでは MFA を使っていないので、EC2 や S3 といったサービスのページを開いても何も表示されません。

image-20221228214333417.png

利用者 : MFA を有効化

自分自身で MFA を有効化します。IAM のページで、ダッシュボードを開き、MFA を追加のボタンを押します。いろいろエラーになっていますが、MFA を使っていないので正常な状態です。

image-20221228214744669.png

ちなみに、User のページから設定しようと見てみましたが、エラーで一覧も表示されませんでした。

image-20221228214835957.png

AWS IAM Credentials の画面で、Assign MFA device を選びます。

image-20221228215054336.png

適当に名前を指定して、Continue を押します。

image-20221228193722301.png

QR コードによる登録方法と、secret key による登録方法があります。どっちでもいいですが、今回は secret key でやっていきます。

image-20221228193822547.png

secret key を MFA デバイスに紐づけたあと、表示される 6 桁の数字を入力します。

image-20221228194104442.png

 

紐づけが出来ました。Close を押します。

image-20221228194119935.png

 

MFA を設定したので、一度サインアウトをします。再度ログインするときに、MFA が求められました。

image-20221228220059456.png

 

MFA を有効化したので、EC2 などのサービスが操作できるようになりました。

image-20221228224908528.png

検証を通じてわかったこと

  • セルフサービスで 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/

1
1
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
1
1