AWS IAM に入門する

# はじめに
本稿は、[金沢工業大学 Advent Calender](https://qiita.com/advent-calendar/2023/kit-calendar)の4日目の記事になります。

## この記事について

以前から AWS に対して興味はありましたが、『不正アクセスや設定ミスで○○万円の請求』などの記事を見る度に怖気づいてしまい、敬遠していました。
しかし、インターン先で AWS を触らせていただける機会があり、「もっと AWS 使いこなせるようになりたい！！」という憧憬に似た何かが僕を突き動かし、アカウント作成に至りました。単純ですね。

しかし、相変わらず心配性の身であるため、セキュリティに不安しかありません。
そこで、まずはAWSのアクセス権限について学び始めました。

本稿では、その備忘録として **AWS IAM** の基礎や、最低限の初期設定について説明していきます。

## この記事の対象者
- AWS に興味があるが、手が出せていない人
- AWS 始めたての人
- AWS IAM なんもわからん の人

# アカウントの作成
AWSに登録して、ルートユーザーを作成します。
作成できたら AWSコンソールにサインインします。必要に応じて、右上のメニューバーからリージョンを東京(ap-northeast-1)に変更します。

## ルート (root) ユーザーについて
ルートユーザーは最も権限が強く、全てのAWSサービスとリソースにアクセス可能であることに加えて、お金に関する情報へのアクセスやアカウントの停止など、すべての操作が可能です。**ルートユーザーを乗っ取られたらこの世の終わり**だと思いましょう。
乗っ取られないためには、[公式によるベストプラクティス](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/root-user-best-practices.html)が提示されているため、従っていきましょう。一部企業向けのトピックについては説明を割愛します。

> - ルートユーザーの認証情報を保護して不正使用を防止する
> - アクセスを保護するために、強度の高いルートユーザーパスワードを設定します
> - 多要素認証 (MFA) でルートユーザーのサインインを保護する
> - ルートユーザーのアクセスキーは作成しないでください
> - アカウント回復メカニズムへのアクセスを制限する
> - アクセスおよび使用状況をモニタリングする

### ルートユーザーの認証情報を保護して不正使用を防止する
ルートユーザーは、[ルートユーザーでしかできないタスク](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/root-user-tasks.html)がある場合にのみ使用し、日常的には使わないようにしましょう。普段は後述するIAMユーザーを使用します。

また、当然のことですが、パスワードや証明書、アクセスキーなどは誰にも共有しないでください。よくあるケースとして、『GitHubのパブリックリポジトリに公開されていた』『スクリプトにベタ書きされていた』などがあります。認証情報は細心の注意を払って取り扱いましょう。
AWSに関わらず、[パスワードリスト攻撃](https://e-words.jp/w/%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%83%AA%E3%82%B9%E3%83%88%E6%94%BB%E6%92%83.html)を回避できるように、他のサービスと同じパスワードを使い回さないようにしましょう。

### アクセスを保護するために、強度の高いルートユーザーパスワードを設定します

強度については、以下の様に書かれています。
> - 8～128 文字で構成されていること。
> - 英字の大文字と小文字、数字、および `! @ # $ % ^ & * () <> [] {} | _+-=` の記号を含める必要があります。
> - AWS アカウント アカウント名またはメールアドレスと同じでないこと。

### [重要] 多要素認証 (MFA) でルートユーザーのサインインを保護する
MFA (Multi-Factor Authentication, 多要素認証) とは、ユーザー名とパスワードに加えて、追加の認証を行うものです。

https://aws.amazon.com/jp/iam/features/mfa/?audit=2019q1

今回は、仮想認証アプリから TOTP (Time-Based One-Time Password) を発行します。仮想認証アプリには、 Authy や Microsoft Authenticator, Google Authenticator などがあります。

#### 手順
1. AWSコンソール > 右上ユーザータブ > セキュリティ認証情報 
1. 多要素認証 (MFA) > 「MFA デバイスの割り当て」
1. デバイス名を設定し、「Authenticator app」 を選択
1. 手元のデバイスで、仮想認証アプリを開き、QRコードを読み取る
1. 仮想認証アプリのコードを、「MFA コード1」に入力する
1. 時間でコードが切り替わるので、次に表示されたものを、「MFA コード2」に入力する。

確認のため、一度AWS側でサインアウトし、再度サインインすると、MFAコードの入力を求められるようになっていることがわかります。画像のように表示されれば設定完了です。

![mfa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621356/b85a8a69-f120-5676-0e2d-e60b5b9211ec.png)

#### 結果

このMFAの設定によって、ルートユーザーにアクセスできるのは、

- AWSのユーザー名、パスワードを知っている
- スマホの認証を突破できる ← New!
- 仮想認証アプリの認証を突破できる ← New!

を全て満たす人となりました。これで比較的安心ですね。

### ルートユーザーのアクセスキーは作成しないでください
デフォルトでは作成されていないので、新しくアカウントを作成された場合は特にすることはありません。既に作ってしまっていた場合は、速やかに削除するよう動いてください。
ルートユーザーのアクセストークンが漏洩した場合、先ほど作成したMFAも意味を成しません。**メールアドレスもパスワードも変えられ、完全に乗っ取られてしまいます。**
下記の記事にもありますが、**存在しないものは漏洩しようがありません。** そのため、作らないことがベストプラクティスとなります。 
もし、アクセストークンを必要とする場合には、適切なロールを振ったIAMユーザーで行いましょう。もちろん、その場合にはアクセスキーを外部に公開しないよう、念入りに管理しましょう。

https://dev.classmethod.jp/articles/delete-root-accesskey/

<!--

### [企業向け] 可能な場合、ルートユーザーのサインインには複数人による承認を求る

個人の場合は、まず分身することが必要となります。
冗談はさておき、企業の場合は『パスワードを管理する人とMFAを管理する人で分かれて、ルートユーザーにアクセスするには両者の認証を得なければならない』、といった手法を用いることでセキュリティを向上させているそうです。

### [企業向け] ルートユーザーの認証情報にグループ E メールアドレスを使用する

これも企業向けの内容になります。
AWSからの重要な通知や警告は、ルートユーザーのメールアドレスに送信されますが、個人宛のメールアドレスを使用していた場合、その個人が不在の際に **通知を見逃す** リスクがあります。

そこで、共有メールアドレス（グループEメールアドレス）を使用すると、他のメンバーもAWSからの通知を受け取ることができます。
これにより、担当者が休暇中や病欠、あるいは退職していたとしても、他のメンバーが対応できるようになり、応答の遅延を防ぐことができます。

-->

### アカウント回復メカニズムへのアクセスを制限する

普段使わないルートユーザー、パスワードを忘れがちなのではないでしょうか。緊急時にアクセスできるように以下の点を確認しておきましょう。
- ルートユーザーのパスワードを忘れたり、紛失したりした場合に備えて、パスワードリセット用のEメールにアクセスできる。
- MFAデバイスにアクセスできなくなった場合に備えて、登録された電話番号とEメールアドレスの両方を使用できる。


<!--
## [企業向け] Organizations アカウントのルートユーザー認証情報を保護する
-->

### アクセスおよび使用状況をモニタリングする

AWSが提供しているサービスを利用することで、リソースへのアクセス状況や使用状況などを監視することができます。

| サービス名 | できること |
|---|---|
| Amazon CloudWatch | ルートユーザーの認証情報の使用を検出 |
| Amazon CloudTrail | マネジメントコンソールやプログラムからの操作、AWSサービスにより実行されるアクションすべてを記録し蓄積 |
| GuardDuty | 機械学習による通常動作からの逸脱の異常検知 <br> アカウントおよびリソースに対する不審なアクティビティの検出 など |

# IAMユーザーの設定

ルートユーザーの設定は終わりました。

前述したようにルートユーザーを日常的に使用するのはよくありません。
そのために、IAMユーザーを作成します。

まずは、**IAM** とは何かを理解していきましょう。

## IAMとは

「Identity and Access Management」の略であり、「**誰**」が「**どのような条件**」で「**どのリソースやサービス**」にアクセスできるかを管理するサービスです。非常にざっくり言うと、権限を管理するためのサービスです。
IAMの読み方は、日本では「アイアム」、英語圏では「アイエーエム」が主流のようです。

IAMで抑えるべきポイントは「ポリシー」「ユーザー」「グループ」「ロール」がそれぞれどのように機能しているかを理解することです。ざっくりと説明していきます。

### IAM ポリシー

IAM ポリシー (Policy)は、「できること、できないこと」を定義するものです。

ポリシーは、公式が提供しているものが多く、基本的にはここから使用することになります。
要件によって必要な場合には、カスタマイズすることもできます。

`Statement`で、以下の項目を記載することで定義できます。

| 項目 | 内容 |
|---|---|
| Effect | "Allow" もしくは "Deny" <br> 許可か拒否かを指定する |
| Action | 何の操作かを指定する |
| Resource | 操作する対象を指定する |
| Condition | いつ行うかを指定する |

### ユーザー

ユーザー (User)は、最も基本となる管理対象です。
ポリシーを紐付けて、ユーザーに権限を付与することもできますが、個々での設定は行わず、次の「グループ」を使って権限を付与していきます。

### ユーザーグループ

ユーザーグループ (UserGroup)は、ユーザーをグループに紐付けることができます。
そして、グループにポリシーを紐づけることで、**そのグループに所属しているユーザー全員に権限を付与することができます。** 

基本的に、ユーザーにはポリシーを紐づけず、この「グループ」にポリシーを紐付けます。
ユーザー数が増えてきた場合に、設定の抜け漏れを防止し、管理が容易になります。

### ロール

ロール (Role)は、ポリシーを紐付けて、特定のアクセス権を定義します。
また、Security Token Serivce (STS) による **AssumeRole** という機能を用いて、**許可されているユーザーが、一時的にロールのポリシーを引き受ける** ことができます。

AssumeRoleについては、以下の記事が参考になると思います。

https://dev.classmethod.jp/articles/iam-role-and-assumerole/

## IAM ユーザーの作成

基本的な概念を抑えたところで、実際にユーザーを作成しましょう。

まず、ルートユーザーの代わりに使用する、フルアクセス権限を持つ管理者ユーザーを作成します。

### 管理者ユーザーの作成
1. IAM > ユーザー > ユーザーを作成
1. ユーザー名を入力します。
1. 「AWSマネジメントコンソールへのユーザーアクセスを提供する」にチェックを付けます。
1. 「IAMユーザーを作成します」を選択します。
1. 「カスタムパスワード」を選択し、パスワードを入力します。
1. 「次回サインイン時にパスワード更新」のチェックを外します。
1. 入力内容を確認して「次へ」を押します。

![create-admin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621356/869df12a-3f99-4cb2-797b-53b5199f17c2.png)

ポリシーを割り当てるため、ユーザーグループを作成します。
8. 「グループを作成する」から以下の画面に遷移します。
9. ユーザーグループ名を入力します。
10. `AdministratorAccess`のポリシーを選択します。
11. 「ユーザーグループの作成」を押します。

![create-admin-group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621356/3f7a90ab-afc2-50fa-2c8c-a7fc66eb3068.png)

ユーザーグループに「AdministratorGroup」が作成されているため、選択し、「次へ」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621356/f122879b-8c4a-998b-98ea-67168c472dcf.png)
 
最後に内容を確認し、問題なければ「ユーザーの作成」を押します。

問題なく作成できれば以下のような画面になります。この画面を離れるとパスワードを確認できなくなります。忘れずに保存しましょう。右下の「.csvファイルをダウンロード」がオススメです。

![create-admin-c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621356/e66c1d7a-ae2c-3e04-338c-2f2ee5295595.png)

コンソールサインインURLから、管理者ユーザーとしてサインインしましょう。
サインインできたら、[先ほどと同様の手順](#重要-多要素認証-mfa-でルートユーザーのサインインを保護する)でMFAを設定します。

これで、管理者ユーザーの作成は完了です。

# 終わりに

ルートユーザーの設定と、IAMユーザーの作成を行いました。

今回は、IAMユーザーとして管理者ユーザーの作成を行いましたが、管理者も強大なアクセス権限を持っています。最小アクセス権限の原則に従うのであれば、もっと範囲を狭めたユーザーを別で作成すべきでしょう。
今後はその点も含めて、ユーザーの運用方法について探っていきたいですね。

それでは、ご高覧いただきありがとうございました！