AWSのIAMユーザーを一時的に無効化する

### 作業の背景
自分がAWSアカウントの管理を担当しているAWSの構築案件でメンバーが一時的に離任することになった。
離任中のメンバーのAWSへのアクセスを制限するために、IAMユーザーを削除する代わりに、離任中は一時的にIAMユーザーの権限を無効化し再び着任した際に有効化するという運用を試してみた。

あえてIAMユーザー削除を選ばなかった理由は2つある。
1. 開発したプログラム内のAWSのリソースへアクセスするロジックにて、AWSの認証・認可のために個人のIAMユーザーのパスワードやアクセスキーを埋め込んでいる可能性がなきにしもあらずだった。IAMユーザーを使えなくすることでプログラム実行時に問題が生じた際に、認証情報をより復活させやすい状態としておきたいと考えた
2. IAMユーザーの権限設計で1つのIAMユーザーに多数のグループを紐づける設計をとっており、IAMユーザーによっても紐づくグループが異なる形となっていた（下記の画像のようなイメージ）。IAMユーザーの再発行時のグループの紐付け作業が煩雑になるので、作業ミスを防ぐ意味でグループの紐付けは残したまま権限を無効化できるとよいと考えた
![スクリーンショット 2025-01-30 16.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/cdc0aeb7-c8da-2c5f-ba85-d8c1d100ac91.png)



各IAMユーザーに認証情報として配布していたのはコンソールログイン用のパスワードとAWS CLI用のアクセスキーなので、以下でAWSコンソールとAWS CLIそれぞれのアクセスの無効化方法について検証して分かった内容を書いていく。


### 無効化対象のIAMユーザーの権限設計について

具体的な無効化作業に入る前に、IAMユーザーのIAM関連の操作の権限設計について触れておく。

離任するメンバーにはAWS管理アカウント管理担当のメンバーも含まれていたため、該当のメンバーにはIAMFullAccessポリシーを紐付けていた。
その他のメンバーにはIAMUserChangePasswordポリシーを含む一部のIAM関連の更新操作を許可するポリシーを紐付けていた。

また、全メンバーに対して共通で以下のMFA強制ポリシーを紐付けていた。

```:json
{	
    "Version": "2012-10-17",	
    "Statement": [	
        {	
            "Sid": "AllowListActions",	
            "Effect": "Allow",	
            "Action": [	
                "iam:ListUsers",	
                "iam:ListVirtualMFADevices"	
            ],	
            "Resource": "*"	
        },	
        {	
            "Sid": "AllowUserToCreateVirtualMFADevice",	
            "Effect": "Allow",	
            "Action": [	
                "iam:CreateVirtualMFADevice"	
            ],	
            "Resource": "arn:aws:iam::*:mfa/*"	
        },	
        {	
            "Sid": "AllowUserToManageTheirOwnMFA",	
            "Effect": "Allow",	
            "Action": [	
                "iam:EnableMFADevice",	
                "iam:ListMFADevices",	
                "iam:ResyncMFADevice"	
            ],	
            "Resource": "arn:aws:iam::*:user/${aws:username}"	
        },	
        {	
            "Sid": "AllowUserToDeactivateTheirOwnMFAOnlyWhenUsingMFA",	
            "Effect": "Allow",	
            "Action": [	
                "iam:DeactivateMFADevice"	
            ],	
            "Resource": [	
                "arn:aws:iam::*:user/${aws:username}"	
            ],	
            "Condition": {	
                "Bool": {	
                    "aws:MultiFactorAuthPresent": "true"	
                }	
            }	
        },	
        {	
            "Sid": "BlockMostAccessUnlessSignedInWithMFA",	
            "Effect": "Deny",	
            "NotAction": [	
                "iam:CreateVirtualMFADevice",	
                "iam:EnableMFADevice",	
                "iam:ListMFADevices",	
                "iam:ListUsers",	
                "iam:ListVirtualMFADevices",	
                "iam:ResyncMFADevice",	
                "iam:ChangePassword"	
            ],	
            "Resource": "*",	
            "Condition": {	
                "BoolIfExists": {	
                    "aws:MultiFactorAuthPresent": "false"	
                }	
            }	
        }	
    ]	
}	

```

そのため、事前の検証作業にあたっては、以下の点を含めて確認した。
- IAMFullAccessやIAMUserChangePasswordの権限を持つメンバーが自力で権限を有効化できないようにできるか
- 権限を再度有効化した際にIAMユーザーはMFAの再設定が必要になるのか


### AWSコンソール利用の無効化

#### コンソールアクセス無効化の方法

コンソールアクセス無効化の手順は以下の通り。
1. 対象のIAMユーザーの画面の「セキュリティ認証情報」タブで「コンソールアクセスを管理」をクリック
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/a246da0b-db11-47bf-93b4-e606cd270253.png)


2. 「コンソールアクセスを無効にする」を選択した状態で「アクセスの無効化」をクリック
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/bdf2c4cc-8920-488c-b346-f7e758b4634e.png)


3. 「コンソールサインイン」で「コンソールパスワード：有効になっていません」となっていることを確認
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/ba60f5ad-6eef-48e3-a4bb-2439776aeb3f.png)


無効化されたIAMユーザー側は、AWSコンソールにログイン済みの場合は（おそらくセッションの有効期限まで）継続利用できるが、一度ログアウトすると再ログインできなくなった。

再ログインを試すと、IAMユーザー/パスワードとMFAコードを入力した後に「Authentification failed 認証情報が正しくありません。もう一度試してください。」と表示された。
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/48d162cc-95a6-4cc6-9402-0bf7b5dabe67.png)

検証で用いたこのIAMユーザーにはIAMFullAccessとIAMUserChangePasswordを紐付けていたが、「Having trouble?」をクリックしても「For IAM users, contact your administrator to reset your password.」と表示されるだけで、自身でパスワード更新やコンソールアクセス有効化等の操作はできないよう抑制されていた。


ちなみに無効化手順の2で「アクティブなコンソールセッションを取り消す」にチェックを入れた場合には、IAMユーザーに対して以下のようなAWS RevokeOlder Sessionsというインラインポリシーが付与された。
![スクリーンショット 2025-02-14 14.40.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/eab36960-76ef-4191-a39c-bce0e64e6cfb.png)

無効化されたIAMユーザー側は、AWSコンソールにログイン済みの場合には即時に以下のようにアクセス拒否されて何の情報も参照できなくなった。
![スクリーンショット 2025-02-14 13.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/d67a0bcd-c3cf-425a-bd5a-8f71a1e9f3dc.png)

#### コンソールアクセス有効化の方法
コンソールアクセスを無効化した状態から有効化する場合には以下の手順となる。
1. 対象のIAMユーザーの画面の「セキュリティ認証情報」タブで「コンソールアクセスを有効にする」をクリック
![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/648eb0a0-f39e-4057-9224-49ab9ac4b3e7.png)

2.「コンソールパスワード」でパスワードの生成方法を指定して、必要な場合は「ユーザーは次回のサインイン時に新しいパスワードを作成する必要があります」にチェックを入れて、「コンソールアクセスを有効にする」をクリック
![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/562d9cf8-8851-497a-a39b-6ea08852c2f6.png)


3. 「.csvファイルをダウンロード」クリック等によりパスワードを保存
![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/e29ba494-9908-4585-82d5-40252a718ac4.png)


4. 「コンソールサインイン」で「コンソールパスワード：有効になっていません」の表示が消えていることを確認
![図8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/54cd8d9b-2d0d-464e-92d2-6bdab5b3afaa.png)


5. 新しいパスワードを対象のIAMユーザーの持ち主に連携


手順の2で新しいパスワードを生成する選択肢しか出てこないので、有効化されたIAMユーザーが以前のパスワードを継続利用することはできない模様。

有効化されたIAMユーザー側は新しいパスワードを使ってログインすることができた。
その際は、パスワード更新が求められたが、MFAデバイスは継続利用することができた。

### AWS CLI利用の無効化

前提として、IAMユーザーがAWS CLIを利用する場合、コンソールログイン時と同様MFA認証を課しているために、 [AWS リソースへのアクセスを認証する方法を教えてください。](https://repost.aws/ja/knowledge-center/authenticate-mfa-cli)の手順のようにaws sts get-session-tokenコマンドを実行してもらうようにしていた。


#### アクセスキーの無効化方法

無効化の手順は以下の通り。
1. 対象のIAMユーザーの画面の「セキュリティ認証情報」タブで「アクセスキー」で「アクション」をクリックし、「無効化」をクリック
![図9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/2f6dc265-6ddb-4a11-84bf-04e761ca228b.png)


2. 「ステータス」が「Inactive」になったことを確認
![図10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/e3027f5e-f862-45db-86ce-d5c087a3f8c4.png)


アクセスキーの持ち主のIAMユーザー側の挙動は、AWS CLIで認証済みの場合はaws s3 lsコマンドはしばらく使うことができた。
おそらくアクセスキーを無効化しても直近のセッションの有効期限まではコマンドを実行できる挙動の模様。
有効期限を過ぎると、「An error occurred (ExpiredToken) when calling the ListBuckets operation: The provided token has expired.」等のエラーが出るようになった。

一方、認証のためのget-session-tokenコマンドは即時に実行できなくなり、「An error occurred (AccessDenied) when calling the GetSessionToken operation: Cannot call GetSessionToken with session credentials」のエラーが出るようになった。

今回はアクセスキーを無効化する手順を試したが、手順1では削除のオプションを出てきたため、即時にアクセスキーの利用を停止したい場合には削除を選ぶとよさそうである。

#### アクセスキー有効化の方法

無効化したアクセスキーを再度有効化する際は以下の手順を実行する。
1. 対象のIAMユーザーの画面の「セキュリティ認証情報」タブで「アクセスキー」で「アクション」をクリックし、「有効化」をクリック
![図11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/959f7843-f0a4-45fa-9a19-34301d8f75c8.png)


2. 「ステータス」が「Active」になったことを確認
![図12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271327/b9bf9a1d-e708-4d21-a3d3-9963e8733cb3.png)

コンソールのパスワードと違って、アクセスキーは有効化した際に以前のものをそのまま再利用できるようになるので、新しいアクセスキーのやり取りは不要だった。

アクセスキーの持ち主のIAMユーザー側はaws sts get-session-tokenコマンドを実行すれば即時に認証が通るようになった。
MFAデバイスも以前のものをそのまま利用することができた。

### まとめ

IAMユーザーのコンソールアクセスとアクセスキーは一時的に無効化することできる。

コンソールアクセスを無効化する場合は、
- IAMユーザーのIAMの操作権限に関わらず、自力でコンソールアクセス有効化等の操作はできないよう抑制される
- アクティブセッションを取り消すか選択することができ、取り消さない場合は（おそらく）既存セッションの有効期限までコンソールを利用できる
- 再度有効化する際にパスワードを再発行する形となり、MFAデバイスは以前のものを継続利用できる

アクセスキーを無効化する場合は、
- get-session-tokenコマンドは即時に実行できなくなり、aws s3 lsコマンド等は（おそらく）既存セッションの有効期限まで実行することができる
- 再度有効化すると、アクセスキーとMFAいずれも以前のものを継続利用できる
- 既存セッションを即時に取り消すことはできないので、即時に利用停止したい場合はアクセスキーの無効化でなく削除を選ぶ

IAMユーザーを削除する場合に比べると、管理者・IAMユーザー利用者双方の作業が楽になるので利用するメリットはあると感じた。