【AWS】IAMについて説明～作成までする

# はじめに
AWSで色々試すために、まずは基本的なIAMを触りました。
以下まとめましたが、わかりづらいところ、間違っているところあったらすみません。。

# AWS IAMについて
AWS IAM（Identity Access Management)は、AWSのサービスやリソースへのアクセスを管理するサービスです。ほぼすべてのAWSサービスにおいて、アクセス権限の管理はIAMで行われます。

IAMを使用して以下が実施できます。
- **IAMユーザー**/**IAMロール**を使用することで、AWSリソースへのアクセスが可能になります。
- IAMユーザーは**IAMグループ**でグルーピングが可能です。
- IAMユーザー、IAMロール、IAMグループにIAMポリシーをアタッチすることで、アクセス制御をします。

:::note
IAMロールは、STS（Security Token Service）から一時的な認証情報を入手してAWSリソースにアクセスするため、情報流出のリスクが少なく利用を推奨されています。
:::


IAMおよびSTSの利用料金は無料です。







# ユーザーについて
AWSのリソースは、ルートユーザーまたはAWS IAMユーザーで操作します。

**ルートユーザー**とは、AWSに登録したときに作成される最初のユーザーのことです。Eメールアドレスでログインし、アカウントの契約の変更や解約等が行える、強い権限を持っています。
誤操作を防ぐため、**原則ルートユーザーは使用せず、IAMユーザーを使う**ことがAWSでのベストプラクティスになります。






# IAMユーザー
IAMユーザーは、AWSアカウント内で作成できるユーザーです。これを使用するとAWSの各種リソースを操作することができます。
しかし、IAMユーザーで操作できる内容は、IAMユーザーに紐づけられるIAMポリシーに依存します。






# IAMポリシー
IAMポリシーとは、AWSリソースへのアクセスの権限を制御する機能です。IAMユーザーやIAMグループにIAMポリシーを紐づけ、どのサービスのどのリソースをだれが実行するか、等を細かく制御します。
IAMポリシーは**JSON形式**で記述します。以下に例を記載します。

```ruby:AmazonEC2ReadOnlyAccess
{
    "Version": "2012-10-17", #IAMポリシーの書式のバージョン（固定値）
    "Statement": [ #実際に付与する権限と条件を記述。{}で囲まれたものはステートメントブロックという
        {
            "Sid": "WorkerNodePermissions", #IAMポリシー作成時に任意で決められる識別子
            "Effect": "Allow", #後述のActionに記述した内容の許可/拒否の決定
            "Action": [ #実際に制御したい操作を記述する
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceTypes",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVolumes",
                "ec2:DescribeVolumesModifications",
                "ec2:DescribeVpcs",
                "eks:DescribeCluster",
                "eks-auth:AssumeRoleForPodIdentity"
            ],
            "Resource": "*" #制御するリソースの対象をARN形式で指定する
            "Condition": { #制御を行う際の条件を記述できる、オプション機能
              "ec2;ResourceTag/Name": "Sample"
            }
        }
    ]
}
```
- **Version**：IAMポリシーの書式のバージョンで、値は固定値です。
- **Statement**：実際に付与する権限と条件を記述。{}で囲まれたものはステートメントブロックです。またステートメントブロックは、ステートメント内に複数記述ができます。
- **Statement Block**：ステートメント内に{}で囲まれたものをステートブロックといいます。実勢に制御する権限と条件を記述します。
- **Sid**：ユーザがIAMポリシー作成時に任意で決められる識別子です。IAMポリシーがこの値を使用することはありません。
- **Effect**：Actionに記述した内容を許可(Allow)するか拒否(Deny)するか記述しています。
- **Action**：実際に制御したい操作を記述します。複数のアクションを含めたり、ワイルドカード(*)を使用することができます。（例：ec2:\\\* )
- **Resource**：制御するリソースの対象をARN形式で指定できます。またワイルドカード(*)を使用することができます。
- **Condition**：オプションです。制御を行う際の条件を記述することができます。





# IAMグループ
IAMグループは、IAMユーザーをグループ分けします。IAMユーザーは複数のIAMグループに所属でき、それぞれのIAMグループには複数のIAMポリシーをアタッチできます。
そして、IAMグループにアタッチされたIAMポリシーと、IAMユーザーにアタッチされたIAMポリシー**両方の権限が付与**されます。

なお、IAMユーザーに複数のIAMポリシーをアタッチするのは管理が煩雑となるため、IAMポリシーをアタッチさせた**IAMグループにIAMユーザーを所属させる**ことで権限管理をすることが推奨されています。







# IAMロール
IAMロールは、AWSリソースに紐づけられる役割です。ちなみに、IAMロールにもIAMポリシーをアタッチすることが出来ます。IAMロールは、各リソースに対して１つ割り当てられます。

AWSリソースはIAMロールを使用することが一般的です。







# STS(AWS Srcurity Token Service)
STS(AWS Srcurity Token Service)は、AWSリソースや、IAMユーザーを持っていないユーザーやアプリケーションに対して、一時的に利用できるにんしょうけんげん（IAMロールの一時的なアクセスキー）を付与する機能です。この一時的な認証情報を請求する操作を「**AssumeRole**」（ロールの引継ぎ）と呼びます。

STSを使用することでIAMユーザーを作る必要がなくなり、IAMユーザーごとに作成されるアクセスキーの管理が不要になります。

STSの代表的な使用例として、異なるAWSアカウントによるAWSリソースの操作（**クロスアカウントアクセス**）があります。
A社のAWSアカウントがB社のAWSアカウントに存在するAWSサービスにアクセス・操作したい場合、B社にて事前に**AssumeRole**を対象のアカウント、ロールに許可するよう設定を行います。そうすることで、以下の流れでA社はB社のAWSサービスを利用することができます。
1. A社からB社にAssumeRoleを要求
1. B社のSTSが一時認証情報をA社に送付
1. A社が一時認証情報を使用して、B社の対象のIAMロールとしてアクセス







# AWSリソースへのアクセス
以下のような流れでAWS各種リソースへアクセスします。

1. AWSリソースへアクセスする**プリンシパル**（ユーザーやアプリケーション)が、IAMユーザーやIAMロールを使用して認証を行う。
1. 前項の認証後、IAMユーザーまたはIAMロールを使用して、AWSリソースにリクエストを送る。
1. IAMユーザーやIAMロールにアタッチされたIAMポリシーに基づき、リソースの捜査権限の有無を評価する。ここで権限がない場合には、リソースの操作に失敗する。






# IAMユーザーの作成（手順）
AWSを利用するにあたり、IAMユーザーが推奨されているので作成します！！！
IAMユーザーはまだひとつも作成していないため、まずはIAMユーザーの王様、フルコン権限を持つAdministratorユーザーを作成します。
・・の前に、IAMユーザー作成時にIAMグループをアタッチする箇所があるので、先にIAMグループを作成してしまいます。

1. ルートユーザーでログイン
1. Administrator用のIAMグループの作成
1. Administrator権限を持つIAMユーザーの作成
1. IAMユーザーでログインする




## ルートユーザーでログイン
1. AWSマネジメントコンソールにログインします。
https://aws.amazon.com/jp/console/
1. ルートユーザーでログインします。
1. AWSマネジメントコンソール画面から`IAM`を検索し、選択します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/e7ac1461-682f-0e5a-2bd7-972587d2dd24.png)










## Administrator用のIAMグループの作成
1. IAM画面にて「ユーザーグループ」を選択し、`グループを作成`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/33eeb687-012c-71d8-891b-75385203f9c6.png)










1. 以下の設定を実施し、`ユーザーグループを追加`を押下します。
    - ユーザーグループ名：任意のグループ名（今回は`Admin-group`）
    - ユーザーをグループに追加：必要なユーザーを追加（今回はまだユーザーを作成していないので空白）
    - 許可ポリシーを添付：適切なポリシーをチェックする（今回は`AdministratorAccess`を付与)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/064f0bc4-4d45-02e5-9711-0245ee74cfd2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/08401dce-1010-ab52-741b-0b63bff75d7b.png)







































1. 対象のグループが作成されたことを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/3ee2eb9d-c52c-ecaa-2671-cf3585b4ac8f.png)





## Administrator権限を持つIAMユーザーの作成
1. IAM画面にて「ユーザー」を選択し、`ユーザーの作成`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/8bbe5eb5-8604-d2ca-197c-96b47b0a3656.png)










1. 以下の設定を実施し、`次へ`を押下します。
    - ユーザー名：任意のユーザー名（今回は`Administrator`）
    - AWSマネジメントコンソールへのユーザーアクセスを提供する：チェックをつける
    - ユーザータイプ：IAMユーザーを作成
    - コンソールパスワード：カスタムパスワード
    - ユーザーは次回のサインイン時に新しいパスワードを作成する必要があります（推奨）：チェックをつける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/b1bc0e0f-f36f-860e-8e6c-dbdfea8ca88c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/1e92fd47-bd97-8df8-7859-b766371dd31e.png)






























1. 以下の設定を実施し、`次へ`を押下します。
    - 許可のオプション：`ユーザーをグループに追加`を選択
    - ユーザーグループ：任意のグループにチェックをつける（今回は`Admin-group`）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/23dfeeb7-d0a3-9398-72f4-84cfd5d76837.png)




















1. 以下の設定を確認し、`ユーザーの作成`を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/7718aebd-d3b1-4dde-0d5e-721b206c89f7.png)

























1. パスワードを取得画面にて、コンソールサインインの詳細情報を取得します。
`.csvファイルをダウンロード`を押下すれば、ログイン情報が記載されているファイルをダウンロードできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/520597f6-a384-f2fa-c613-70d7a305933c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/f8d0efcb-d083-2704-ca01-f0fab5cf1ca1.png)



























## IAMユーザーでログインする
1. AWSマネジメントコンソールにログインします。
https://aws.amazon.com/jp/console/

1. 以下のログイン情報を記入し、`Sign in`を押下します。
    - Account ID：先ほど取得したコンソールサインインURLに含まれている12桁の数字を記入します。不明な場合は、再度ルートユーザーにログインしてアカウントIDを確認します。
    - IAM Username：先ほど作成したIAMのユーザー名を記入
    - Password：先ほど作成（取得）したパスワードを記入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/a0562e15-d18a-2475-d1b8-f293b6e54b72.png)

























1. パスワード変更画面に遷移するので、新しいパスワードを作成します。
1. コンソール画面が表示されれば、ログインに成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817308/a738048d-4c19-b67e-25e0-7409baab8f70.png)