AWS Organizationの新機能 Root access managementで、root権限を保護する

# Root access management
2024/11/15に、AWS Organizationでのroot権限の管理を楽にするサービスがリリースされました。
https://aws.amazon.com/jp/blogs/aws/centrally-managing-root-access-for-customers-using-aws-organizations/

簡単に有効化できますので、このサービスでできることと有効化手順を紹介します。

## Root access management概要
`AssumeRoot`というAPIを使用して、各アカウントのroot権限で操作を行います。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_root-user-privileged-task.html#root-user-privileged-task_action-cli

```mermaid
flowchart TD
    subgraph Organization
        management[管理アカウント] -- 委譲 --> delegate[委譲アカウント]

        management -- AssumeRoot --> child1[子アカウント]
        delegate -- AssumeRoot --> child1
        
        delegate -- AssumeRoot --> child2[子アカウント]
        management -- AssumeRoot --> child2
    end
```
### 解決できる課題
#### Organization内の子アカウントで、rootユーザーへログインできないように設定可能
Organization内に子アカウントを作成する際は、通常のサインアップ手順と異なり、rootユーザーのパスワードは設定しません。
しかしメールアドレスにアクセスできるユーザーは、パスワードリセットによりroot権限を取得できてしまいます。
パスワードリセットを防ぎたい場合は、AWS作成後にパスワードリセットしてrootユーザーにログインした上で、MFAを設定する必要があります。

AWSアカウントのメールアドレスには、個人のアドレスではなくメーリングリストを設定している組織が多いと思います。
その場合にMFAを設定していないと、メーリングリストにアクセスできるメンバー全員がroot権限を持っているも同然です。

メーリングリストに追加されているメンバーは制限されているでしょうが、それでも内部不正や乗っ取りなどのリスクは存在します。
また、rootユーザーに直接ログインしてしまうと、誰が実際にログインしたのかの追跡が困難です。

Root access managementを使用すると、子アカウントのrootユーザーへログインできないように設定できます。
- パスワードリセットの拒否
- 設定されているパスワードを削除
- MFA設定の解除

意図せず誰かにrootユーザーにログインされてしまうのは非常に危険なので、ログインを禁止できると管理がとても楽になります。

#### rootユーザーにログインせず、一部のroot権限での操作を実行可能
AWSが定義したポリシーの範囲内で、一部の操作をroot権限で行えます。
記事投稿時点（2024/12/01）では、以下の5つのポリシーが存在します。

- IAMAuditRootUserCredentials
- IAMCreateRootUserPassword
- IAMDeleteRootUserCredentials
- S3UnlockBucketPolicy
- SQSUnlockQueuePolicy

上三つは、前述のrootユーザーへのログインを禁止する操作に必要なポリシーです。
下二つは、root権限が必要な操作として、誤った設定をしてロックされてしまったS3とSQSのリソースポリシーを削除する権限が定義されています。

詳細は後述しますが、管理アカウントもしくはRoot access managementの権限を委譲されたAWSアカウントで、上記の操作を行えます。
Organization内の各AWSアカウントは、委譲アカウントでない限り自身のroot権限での操作はできなくなります。

最新のポリシー一覧（操作可能な権限の一覧）は、AWSのドキュメントをご覧ください。
https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user-privileged-task.html#root-user-privileged-task_action-cli

また、AWS CLIの`--task-policy-arn`のヘルプにも、一覧が記載されているようです。
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-root.html

### 解決できない課題
#### 管理アカウントのrootユーザーへのログイン
[解決できる課題](#解決できる課題)で軽く触れましたが、Organizationの管理アカウントのroot権限だけは、この機能で管理できません。
管理アカウントのroot権限を取得されてしまうと、組織内の全てのAWSアカウントを乗っ取られる危険があります。
管理アカウントのrootユーザーへのログイン情報は、引き続き厳重に管理しましょう。

#### ポリシーが定義されていない操作
root権限で行える作業は、AWSが定義しているポリシーの範囲に限られます。
最新のポリシー一覧はこちらのURLで確認可能ですが、記載されていない操作を行いたい場合は、rootユーザーへログインできるよう再設定を行う必要があります。
https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user-privileged-task.html#root-user-privileged-task_action-cli

## 有効化手順（Organization管理アカウント）
有効化作業は全て、Organizationの管理アカウントで行います。
### 0. 移譲先の新規AWSアカウントを作成する
Root access managementは、移譲先のAWSアカウントを設定可能です。
AWS Organizationの管理アカウントの権限は強力ですので、特別な事情がない限りは移譲先のAWSアカウントを用意しましょう。
### 1. IAMの画面から、有効化画面を開く
IAMのメニュー内に`Root access management`が追加されています。
メニューからページを開き、右下の`Enable`をクリックします。
![スクリーンショット 2024-11-19 10.43.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468968/576eb604-c76f-10ab-4e50-ae4ebf47fcd4.png)

### 2. 有効化する項目と、移譲アカウントを設定する
遷移先のページでは、有効化する機能と、移譲先アカウントの設定が行えます。
基本的には、Capabilitiesは両方ともチェック入れたままでOKです。
また、後から片方だけ無効化することも可能です。
![スクリーンショット 2024-11-19 10.43.53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468968/221d8b09-c9c7-5ba5-00fd-87907ab05ad3.jpeg)

#### Root credentials management
rootユーザーでのログインを無効化できるようにします。
#### Privileged root actions in member accounts
root権限での一部作業を、管理アカウントもしくは移譲先アカウントで行えるようにします。

### 3. 有効化完了
有効化が完了したら、設定内容がIAMの`Account settings`画面に表示されます。
各機能の無効化や、移譲先アカウントの変更などもここから行えます。
![スクリーンショット 2024-11-27 15.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468968/74cad23b-b194-73d9-d73d-af1dfe433745.png)

## Root access managementの機能を使用する
APIとしては、`AssumeRoot`を使用しています。
この記事では、コンソール画面からの操作を説明します。
AWS CLIやAWS SDKでの操作を行う場合は、ドキュメントをご覧ください。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_root-user-privileged-task.html#root-user-privileged-task_action-cli

### rootユーザーへログインできないように設定する
機能の有効化が完了した後、IAMの`Root access management`メニューを再度開くと、Organization内のAWSアカウント一覧が表示されます。
各アカウントの情報として、rootユーザーへのログイン可否が表示されています。
- アクセスキー
- MFAの設定
- パスワード
- 署名証明書
![スクリーンショット 2024-11-19 10.58.37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468968/6d7429a8-145d-1739-54c9-3bd8b0c9798c.jpeg)

1. 対象のAWSアカウントのラジオボタンを選択して、右上の`Take privileged action`をクリック
1. 次の画面で`Delete root user credentials`を選択し、右下の`Disable root user credentials`をクリック
![スクリーンショット 2024-11-19 11.01.14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468968/2a4bf270-148f-7fee-c131-e801e50ca2b5.jpeg)

以上の手順を完了後、rootユーザーにアクセスしようとしたり、パスワードリセットを試みると、無事にエラーになってくれます。
![スクリーンショット 2024-11-19 11.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468968/af618055-bd39-f773-6e9d-e3296d0350ed.png)

# まとめ
AWSのrootユーザーが必要になる状況は少なく、ログイン情報の管理に苦労されている方も多いのではないでしょうか。
今回のリリースにより、rootユーザーを乗っ取られるリスクが大きく低減されました。
Organizationの管理アカウントだけは対象外ですので、引き続き管理アカウントのroot権限の管理・使用にはご注意ください。