Adminユーザ発行時に最低限やっておきたいMFA必須化

## はじめに
- 本記事の目的と背景
同一のAWSアカウント内で複数の開発メンバーと検証を行う必要が生じました。その際、自身が管理するAWSアカウント内に、他メンバーに管理者権限を付与したIAMユーザを発行することになりました（本来的には必要なポリシーのみをアタッチすることが推奨されますが…）。初めてのIAMユーザ発行だったため、GPTやAWSドキュメントを参考にポリシー内容を調査し、備忘録としてまとめることを目的としています。

## 前提・注意点
**管理者権限の付与は誤操作や不正利用、情報漏洩といった重大なリスクを伴います。**
**検証対象のリソース・アクションを規定し、最小権限の原則を守ることがベストプラクティスです。**

## 設定手順
今回の設定は以下の手順で実施します。
1. カスタムポリシーの作成
**MFAデバイスの管理許可**＆MFAを用いたサインインを実施していない場合、
**アクションを拒否する設定**
1. ユーザグループの作成
1のカスタムポリシーと「AdministratorAccess」をグループにアタッチ
1. ユーザグループにユーザを割当
### カスタムポリシーの作成

ポリシー作成>ポリシーエディタにて以下のアクセス許可ステートメントを設定します。

``` JSON
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowIndividualUserToManageTheirOwnMFA",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice",
                "iam:DeleteVirtualMFADevice",
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice",
                "iam:ListMFADevices"
            ],
            "Resource": [
                "arn:aws:iam::*:mfa/${aws:username}",
                "arn:aws:iam::*:user/${aws:username}"
            ]
        },
        {
            "Sid": "BlockMostAccessUnlessSignedInWithMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:DeleteVirtualMFADevice",
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice",
                "iam:ListMFADevices"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
```


- 1つめのブロック
    このステートメントはユーザーが自身のMFA（多要素認証）デバイスを管理できるようにするためのものです。各設定内容の意味は以下の通りです。
    
    - iam:CreateVirtualMFADevice：仮想MFAデバイスの作成
    - iam:DeleteVirtualMFADevice：仮想MFAデバイスの削除
    - iam:DeactivateMFADevice：MFAデバイスの無効化
    - iam:EnableMFADevice：MFAデバイスの有効化
    - iam:ResyncMFADevice：MFAデバイスの再同期
    - iam:ListMFADevices：MFAデバイスの一覧取得

Resourceで指定されているARN（Amazonリソースネーム）は、リクエストを実行するユーザー自身に紐付くMFAデバイスとユーザー情報（${aws:username}）に限定されており、他のユーザへの影響を防止します。

- 2つめのブロック
このステートメントは、ユーザーがMFA（多要素認証）によるサインインを使用していない場合、MFAの設定や管理に関連するアクション（上記の設定内容と同様）以外は拒否することを示しています。

ここでは上記のステートメントを設定したポリシーを「mustSetMFA」という名称で保存します。

## ユーザグループの作成
ユーザグループを作成し（ここでは「admin」という名称で作成しています）許可に、
前提で作成したカスタムポリシーとデフォルトで存在する「AdministratorAccess」をアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796493/a001b026-25c2-397d-c28f-79e8f5990946.png)

## ユーザグループにユーザを割当
ユーザにグループを割り当て、上記のグループを割り当てます。
※当該のユーザにはコンソールアクセス提供オプションを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796493/c1a7cdbe-3b90-6ada-ec2c-25a70d01904c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796493/d453a9f4-c72d-76bc-6b78-10751045275d.png)

## 検証

### 各リソースへのアクセス・実行許可がないことを確認する
上記手順でグループに割り当てたIAMユーザにて、サインインして検証してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796493/adc7fba9-2278-e563-90d8-237fee4f2db1.png)

以下にて各サービスの表示・実行権限がないことを確認できます。

▼コンソールホーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796493/43f38f76-08b5-6714-9624-1cdd879f84c6.png)

▼VPCダッシュボード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796493/bce36832-f657-f4bb-828f-2ae3adef5ccd.png)

▼VPC作成画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796493/5edb7d8e-1968-24f3-53f1-84d4d3fb314c.png)

### MFAを設定し各リソースへのアクセス・実行許可が存在することを確認する

IAM>セキュリティ認証情報よりMFAデバイスの割り当てが選択できることを確認し、MFAデバイスを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796493/9910e54c-32a6-82c8-0c27-1f2b192d913d.png)

設定後、**一度サインアウトしてから再度サインイン**し各サービスの表示・実行権限が存在することを確認できます。

▼コンソールホーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796493/a3357226-8bae-ab9c-3b1f-ac219ab9ac9a.png)

▼VPCダッシュボード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796493/3a8e7f2e-5baa-028a-6ef8-9d9d361b6140.png)

▼VPC作成画面　※正常に作成可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796493/2896397e-e471-40b5-46d1-26c4342a2429.png)

## まとめ
本記事では、管理者権限のリスクを踏まえた上で、MFAを利用したセキュリティ強化策を適用したIAMユーザ作成手順を簡単にまとめました。前提・注意点に記載通り検証対象のリソース・アクションを規定することが原則のため、本記事を参照の際はご注意ください。