AWSアカウントはIAMを使ってログインしよう!

AWSでルートユーザーはなるべく使うな!というのは常々言われていると思います。

私はめんどくさくてずっとルートユーザーでログインしていたのですが、流石にアンキュアすぎると感じたので今回はAWSでIAMユーザーを作りつつ、IAMってなんなのかを理解したいと思います。

# IAMとはなんなのか

`IAM(Identity and Access Managemet)`は、AWSにおいて下の赤いマークが特徴的なサービスの一つです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/7c27b879-2884-a2a3-733f-ee6ba884e9d0.png)

認証認可を行うサービスで、AWSリソースを安全に管理するサービスです。

:::note
### 認証認可とは
認証は、アクセスしてきたユーザ等に対して、誰なのかという身元確認を行うことです。
多くのウェブサイトではIDとパスワードでログインすると思うのですが、その際にIDとパスワードで身元確認を行なうベーシック認証というプロセスが行われています。

認可は、誰かに対してリソースへのアクセスを許可する権限を渡すことです。
違う言い方をするとアクセスレベルを決定することでもあります。
ウェブサイトにログインしても他のユーザーの個人情報とか見れないですよね。
ログインした際に、ここまでの権限しか使えないからねと権限を限定する際に認可が行われています。
:::

:::note
### AWSリソースとは
AWSリソースは、ユーザーが操作できるAWS内のエンティティ、別の言い方をすると使用されているAWSサービスのことを指します。
:::

ユーザーの権限管理やサービス同士でどのような連携を許可するかなどを設定することで、AWSサービスを安全に使用することができます。

IAMの主な構成要素として、`IAMポリシー`、`IAMユーザー(IAMグループ)`、`IAMロール`の3つがあります。

### `IAMポリシー`
AWSリソースに対してどのようなことをしてもいいのかというアクセス許可に関する権限を示したものをポリシーと言います。

これらを後述するIAMユーザーやIAMロールに紐づけることで、特定のAWS使用者やサービスに制限をかけることができ、安全なAWS運用ができるようになります。


### `IAMユーザー(グループ)`
AWSを利用する目的で、AWSアカウントを通して作成されたIAMエンティティのことです.

IAMユーザーは先述したIAMポリシーを紐づけることで、特定のユーザーに権限を割り振ることができます。

長期的な認証情報として使うことができて、アクセスキーとシークレットアクセスキーが発行されます。
そして、一人のユーザーもしくは一つのアプリケーションに紐づけることができます。

また、複数IAMユーザーに権限を割り振りたい時の仕組みとして、IAMグループというものもあります。

### `IAMロール`
こちらもIAMユーザーと一緒で、AWSを利用する目的でAWSアカウントを通して作成されたIAMエンティティです。

IAMユーザーと同じくIAMポリシーと結びつけることで、ユーザーに権限を割り振ることができます。

しかし、IAMロールはIAMユーザーとは異なり、認証情報は一時的であり、複数ユーザーや複数アプリケーションに割り振ることができます。

AWSのベストプラクティスとしては、IAMロールを使ってリソース操作されていることが推奨されており、STSにリクエストして一時的な認証情報)を受け取り、それを使ってリソースを操作します。

:::note
### STSとは
STS(Security Token Service)は、一時的な認証情報を発行してくれるサービスです。
:::

:::note
### 認証情報は一時的でも、何度も認証してもらうことができなくなるわけじゃない
IAMロールの使用許可をstsで発行されてからその認証情報が切れてしまうとリソース操作ができないのではないかと思われた方もいると思います。

認証情報が切れても、もう一度認証を受け取ることは可能なので、IAMユーザーでログインしっぱなしにするよりも安全に扱うことができます。

:::

IAMの構成要素は以下のようになっています。

|名称|特徴
|---|---
|IAMユーザー|長期的な認証情報、紐づけられる対象は一つ
|IAMロール|短期的な認証情報、紐づけられる対象は複数
|IAMポリシー|権限内容

# AWSのルートユーザーは基本的に使わない!

ルートユーザーとは、AWSアカウント作成時に作成されるユーザーのことです。

AWSでは、ルートユーザーは基本的に使わない方針としています。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_root-user.html

理由としては、権限の制限ができないという理由がとても大きいです。

- 個人使用の場合
個人使用の場合はルートユーザーでいいじゃないかと思われるかと思いますが、万が一ログイン用の認証情報やアクセスキーが悪意のある人物に漏れてしまうと、ルートユーザーの持つ全リソースにアクセスできてしまいます。
IAMユーザーを作成してそれを普段使いしておくと、万が一漏れても権限に制限があるのでリソースの悪用を制限することができます。

- 複数使用の場合
企業アカウントでは、一つのAWSアカウントを使って複数のIAMユーザーとプロジェクト毎に作成したIAMロール等を使用して作業を行います。
全社員がルートユーザーを使ってしまうと全社員がAWSアカウントの持つ全リソースにアクセスできるようになってしまうのでかなり問題があります。

これらのセキュリティ的な理由からルートユーザーは使わずにIAMユーザーを使ってログインすることをお勧めします。

# 設定してみる

## IAMユーザーを作成する
まずIAMユーザーを作成します。

下のように設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/f1d2aa44-a898-c924-82cd-306d190e6cfd.png)


## IAMグループを作成する
`IAMユーザー`への一括権限管理をしやすくするために、`IAMグループ`を作成します。

`IAMユーザー`を追加すると許可をどうするかを選択します。

許可オプションは`ユーザーをグループに追加`として、その下にある`グループを作成`というボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/30809305-677b-fbbc-b814-b0456aeee028.png)

グループの作成画面は下のようになっています。
今回は許可ポリシーをつけずに作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/96179545-ada1-4106-9b49-427b9a6f8ff3.png)

作成したグループを選択して、IAMユーザーを作成すると下のような画面になります。
このCSVファイルを一応ダウンロードしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/e2c72d74-ef60-d3d9-f5aa-5c6b4fe35aac.png)

# IAMグループ用のポリシーを選択する
先ほど作成した`IAMグループ`のポリシーを作成します。

`IAM`のサイドバーからユーザーグループを選択し、許可の欄から`インラインポリシー`の作成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/3b71e0ef-8aad-da0c-a6d8-faef297cdbcf.png)

下のような画面になるので、アクセス許可をJSONポリシーとして定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/e078c579-a23e-1a78-503d-6367a917caac.png)

今回は、IAMユーザーで行えてほしい最小限の構成として下のようにしてみました。
とりあえず、IAMユーザーをリストとして表示するのと、コスト関連が見れるようにしました。
```json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iam:ListUsers" //iamユーザーのリスト表示
			],
			"Resource": [
				"arn:aws:iam::*:*"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"aws-portal:ViewBilling", //コスト関連
				"aws-portal:ViewUsage",
				"ce:*"
			],
			"Resource": [
				"*"
			]
		}
	]
}
```

上のJSONを記述して`次へ`を押すことで下のようにポリシー名と許可されている項目が表示されるので、ポリシーの作成を選択します。そうすることで`IAMグループ`にポリシーがアタッチされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/f83f7aab-a99f-9bfa-c7f4-b81acf4f852a.png)


## IAMロールを作成する

次に`IAMロール`を作成します。
今回は管理者権限を持ったロールを作成します。

- ロール名の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/e49f981e-aee4-6e5b-bacd-f9e71f42b70f.png)

- 許可ポリシー
今回は`AdministratorAccess`を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/6859e363-ae3d-b9b3-c108-68a635eb1e2a.png)


- 信頼関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/2906126f-ad86-c8de-8cef-1f97bb26af53.png)
信頼関係をJSONで記述します。
こうすることで特定のアカウントがスイッチロールできるようになります。
```json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::[アカウントID]:user/test1"
			},
			"Action": "sts:AssumeRole",
			"Condition": {}
		}
	]
}
```

:::note
### AssumeRole

信頼関係に関連する話として`AssumeRole`があります。

AssumeRoleとは、IAMロールを引き受けてユーザーやリソースに一時的に権限を与える仕組みです。

これを使うことで一時的な認証情報を特定の相手のみに与えることができます。

:::

# サインインしてみる

awsのアカウント上部に表示されている`アカウントID`とcsvファイルに書かれいてる`ユーザー名`と`パスワード`をサインイン画面に入力します。

![スクリーンショット 2025-02-04 0.11.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/c018fd57-66cc-a36e-7128-4becca5cf413.png)


# スイッチロールしてみる
先ほど先述した通り、セキュアに使用するには`IAMユーザー`ではなく`IAMロール`に権限を与えて、そのロールを使用していきます。

なので`スイッチロール`をしていきます。

アカウント名が表示されている部分をクリックすると下の画像のような表示が出てきます。

`ロールの切り替え`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/2517fe3a-a827-3ede-1093-71e7e43f9dfc.png)


`IAMロール名`を先ほど作成したロール名にして、ロールの切り替えを作成します。

![Qiita Image 3766230のコピー.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/bce323fa-54c2-4f49-8165-72f521a511a1.jpeg)


アカウント名だった部分が`IAMロール名`になったら、そのIAMロールにスイッチロールできています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/a668134b-2a41-5e09-f884-c13993d299a1.png)


# 最後に
このような形でルートユーザーではなく、IAMユーザーでログイン、IAMロールでリソースを使っていくことで安全にAWSリソース運用ができます。

気になった方はぜひ運用してみてください!

# AWS関連の記事

https://qiita.com/maooz4426/items/43c05f14cae0d4753719