AWS Identity and Access Management （IAM）

# 概要
* AWSでIAM管理に最低限必要な知識をざっくりと解説
* 対象読者はIAM入門者向けとなっています

# ルートユーザー
* ルートユーザーはemailとパスワードでログインでき、全てのAWSサービスとリソースにアクセスできる
* 日々のタスクをルートユーザですることは推奨されない
* ルートユーザを作成した後は、[個人用のIAMアドミンユーザとグループを作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)することが推奨される
* AWSアカウントのルートユーザーのアクセスキーは作成、更新、無効化、削除できる
* パスワードを変更することもできる
* ルートユーザーの認証情報を持っていれば、誰でも請求情報を含むアカウントの全てのリソースに無制限にアクセスできる
* アクセスキーを作成するときは、アクセスキーIDとシークレットアクセスキーをセットで作成する
* シークレットアクセスキーの表示およびダウンロードは一回のみ
* IAMユーザもルートユーザも最大2つのアクセスキーを割り当てることができる
* アクセスキーを無効にした場合、APIコールに使用することはできず、無効なキーは制限に対してカウントされる
* 一度アクセスキーを削除した場合、永久に削除されて、回復することはできない

# ルートアカウントのMFAを有効化
* ルートユーザーのMFAを有効にすると、ルートユーザー認証情報のみが影響を受ける
* アカウントのIAMユーザーは固有の認証情報を持つ独立したIDであり、各IDには固有のMFA設定がある
* MFAの認証方法は「仮想MFAデバイス」「U2Fセキュリティキー」「ハードウェアMFAデバイス」「SMSテキストメッセージベースMFA」の[4種類](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa.html#id_credentials_mfa-what-is-mfa)がある
* SMS MFAのサポートはまもなく終了

# IAMユーザー
* Identity and Access Management (IAM) ユーザーはAWSとやり取りするために使用するユーザーまたはアプリケーションを表す
* AWSのユーザは名前と認証情報で構成される

## IAMの識別
* ユーザーのフレンドリ名（AWS マネジメントコンソール に表示される名前）
* ユーザーの Amazonリソースネーム（ARN）（AWS全体でユーザーを一意に識別する必要がある場合は、ARNを使用）

## ユーザーと認証情報
* AWS には、ユーザーの認証情報に応じてさまざまな方法（[コンソールパスワード](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_passwords.html),[アクセスキー](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html),[CodeCommitで使用するSSHキー](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_ssh-keys.html),[サーバー証明書](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_server-certs.html)）でアクセスできる
* AWSマネジメントコンソールを使用してユーザーを作成するときは、少なくともコンソールパスワードまたはアクセスキーを含める選択をする必要がある
* デフォルトでは、AWS CLIまたはAWS APIを使用して作成された新しいIAMユーザーには、どのような種類の認証情報も提供されていない
* パスワード、アクセスキー、およびMFAデバイスを管理するために、次のオプションが重要
	* IAMユーザーの[パスワード管理](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_passwords.html)
	* IAMユーザーの[アクセスキー管理](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html)
	* 認証情報のセキュリティ強化のための[MFAの有効化](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa.html)
	* [使用されていないパスワードおよびアクセスキーの発見](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_finding-unused.html)
	* [アカウント認証情報レポートのダウンロード](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_getting-report.html)

## ユーザーとアクセス許可
* デフォルトでは、新しいIAMユーザーには、[アクセス許可](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access.html)がない
* IAMユーザーを持つ利点は、アクセス許可を各ユーザーに個別に割り当てることができること

## ユーザーとアカウント
* 各IAMユーザーが関連付けられるAWSアカウントは1つだけ
* AWS アカウントに作成できるIAMユーザーの数には[制限](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_iam-limits.html)がある

## ユーザーとサービスアカウント
* 認証情報を使用してAWSリクエストを行う人物またはアプリケーションをサービスアカウントと呼ぶ
* [アプリケーションコードに直接アクセスキーを埋め込んではいけない](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-access-keys-best-practices.html#iam-user-access-keys)
* ベストプラクティスとして、[長期的なアクセスキーの代わりに一時的な認証情報（IAMロール）](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-access-keys-best-practices.html#use-roles)を使用することが推奨される

#  IAMユーザーの作成
1. [AWSマネジメントコンソール](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)、[AWS CLI](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html#id_users_create_cliwpsapi)、Tools for Windows PowerShell、または[AWS API](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html#id_users_create_api)オペレーションを使用してユーザーを作成
	* AWSマネジメントコンソールでユーザーを作成する場合は、選択内容に基づいてステップ1～4が自動的に処理される
2. ユーザーに必要なアクセスのタイプに応じてユーザーの認証情報を作成
	1. プログラムによるアクセス（API コール、AWS CLI、Tools for Windows PowerShellのいずれか）
	2. AWSマネジメントコンソールアクセス（[該当ユーザーのパスワード作成](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_passwords_admin-change-user.html)）
3. ユーザーを1つ以上のグループに追加することで、必要なタスクを実行するアクセス権限を付与
	* ユーザーをグループに配置し、アクセス権限の管理は、グループにアタッチされているポリシーを通して行うことが推奨される
	* [アクセス許可の境界](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_boundaries.html)を利用してユーザのアクセス許可を制限できる（これは一般的ではない）
4. タグをアタッチして、[メタデータをユーザーに追加](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_tags.html)（オプション）
5. 必要な[サインイン情報をユーザーに提供](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_sign-in.html)（オプション）
6. ユーザーの[MFA](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa.html)を設定（オプション）
7. ユーザーに[自分の認証情報を管理する権限を与える](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_passwords_enable-user-change.html)（オプション）

# IAMグループ
[IAMグループ](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_groups.html)
* IAMユーザーの集合
* 複数のユーザーに対してアクセス許可を指定でき、それらのユーザーのアクセス許可を容易に管理することができる
* グループとIAMユーザーの関係は多対多
* グループ同士はネストできない
* デフォルトのグループは存在しない（作成が必要）
* 1人のIAMユーザーが持てるグループの数、および1つのグループが持てるユーザーの数には[制限](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_iam-limits.html)がある

# パスワードポリシーの設定
[IAM ユーザー用のアカウントパスワードポリシーの設定](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html)
* パスワードの最小の長さを設定できる
* 大文字、小文字、数値、およびアルファベット以外の文字を含む特定の文字型を要求できる
* すべてのIAMユーザーが自分のパスワードを変更できるようにできる
* 期間を指定し、IAMユーザーにパスワードを変更するように要求できる
* IAMユーザーが（1~24回前までの）以前のパスワードを再利用できないようにできる
* IAMユーザーがパスワードの失効を許可したときに、アカウント管理者への連絡を強制できる