AWSを安全に利用するために - ルートユーザー利用禁止、IAMを使う

#1. はじめに
* AWS を安全に利用するためには、AWSアカウントを発行してすぐに何かを始める前に、まずは　[IAM のドキュメント](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction.html) をよく読んでおく必要がある。
* しかし、ドキュメントは文量が多いので、個人用に概要と最低限設定しておくべきことをまとめておく。
* ちなみに、AWSのセキュリティに関する責任分界点は、[責任共有モデル](https://aws.amazon.com/jp/compliance/shared-responsibility-model/)にある。AWS利用者（お客様）がIAMを適切に設定・運用・管理する必要がある。

#2. 関連用語と、AWS推奨設定
##2.1 [ルートユーザー](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_root-user.html)（または root アカウント, ルートID, root ID） 
* AWSアカウントを作成するときに使用した Eメールアドレスとパスワードの組み合わせを、ルートユーザー認証情報という。
* この ルートユーザー認証情報を使用して AWSマネジメントコンソールにサインインすると、そのAWSアカウントのすべてのリソースへの完全かつ無制限なアクセスが可能になる。
* ルートユーザーに付与されたアクセス権限を制限することはできない。
* IAMドキュメントでは、ルートユーザーに関して、次のように推奨している。
<dl>
[初回アクセスのみ: ルートユーザー認証情報](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction_identity-management.html#intro-identity-first-time-access)
<br>- 日常のアクセスには ルートユーザー認証情報を使用しないことをお勧めします。</br>
<br>- ルートユーザー認証情報はだれとも共有しないことを特にお勧めします。</br>
</dl>
<dl>
[AWS アカウント（ルート）のアクセスキーをロックする](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#lock-away-credentials)
<br>- AWS アカウント（ルート）のアクセスキーを使用しないでください。</br>
<br>- ご自身の AWS アカウントのパスワードやアクセスキーを決して他者に開示しないでください。クレジットカード番号や他の機密情報を保護するのと同じように保護してください。
<br>- 強度の高いパスワードを設定する。</br>
<br>- AWS アカウントの AWS 多要素認証（MFA）を有効にします。</br>
</dl>
<dl>
[個々の IAM ユーザーを作成する](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#create-iam-users)
<br>- AWS にアクセスするのに、お客様の AWS ルートユーザー認証情報を使用しないでください。また、他の誰にもご自身の認証情報を譲渡しないでください。代わりに、AWS アカウントへのアクセスが必要な人用に個別のユーザーを作成します。</br>
</dl>
<dl>
[AWS アカウントのアクティビティの監視](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#keep-a-log)
<br>- [AWS CloudTrail による IAM イベントのログ記録](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/cloudtrail-integration.html)</br>
</dl>

##2.2 IAM: Identity and Access Management
* AWS へのアクセスを安全に制御するための仕組み。
* IAM の利用自体が課金対象になることはありません。
* Identity and Access Management の "Identity(ID)" の側面は、"そのユーザーはだれか" という質問に答えるために役立ち、**認証**と呼ばれることがよくあります。
* Identity and Access Management の "Access Management" の側面は、"私のアカウントでユーザーが実行を許可されているアクションは何か" という質問に答えるために役立ち、**承認**と呼ばれることがよくあります。
* IAM により、どのユーザーがお客様の AWS リソースを使用できるか（認証）、それらのユーザーがどのリソースをどのような方法で使用できるか（承認）を制御できます。
* 参考
<br>[IAM とは](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction.html)</br>
<br>[IAMユーザー](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction_identity-management.html#intro-identity-users)</br>
<br>[アクセス管理の概要: アクセス許可とポリシー](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction_access-management.html)</br>

##2.3 IAMユーザー
* IAM ユーザーは、AWS を操作するために IAM ユーザーを使用する人物またはサービスを表します。
* IAM ユーザーは主に、ユーザーが対話型タスクを実行するために AWS マネジメントコンソールにサインインする場合や、API または CLI を使用して AWS サービスに対しプログラムによるリクエストを行う場合に使用します。
* IAM ユーザーは、個別のアカウントではなく、お客様のアカウントのユーザーです。各ユーザーには、AWS マネジメントコンソール にアクセスするための、独自のパスワードを割り当てることができます。また各ユーザーには、お客様のアカウントのリソースをプログラムによりリクエストできるように、個別のアクセスキーを作成できます。
* IAM ユーザーは実際の人でなくてもかまいません。AWS へのアクセスを必要とするアプリケーションのアクセスキーを生成するために、IAM ユーザーを作成できます。
* IAMドキュメントでは、IAMユーザに関して、次のように推奨している。
<dl>
[ユーザーのために強度の高いパスワードポリシーを設定する](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#configure-strong-password-policy)
<br>- ユーザーが各自のパスワードを変更できるようにする場合は、強力なパスワードを作成し、パスワードを定期的に変更するようユーザーに要求します。</br>
<br>- [IAM ユーザー用のアカウントパスワードポリシーの設定](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html)</br>
</dl>
* 参考
<br>
[ID（ユーザー、グループ、ロール）](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id.html)</br>
<br>
[IAM ユーザー](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users.html)
<br>
[ID 管理の概要: ユーザー: IAMユーザー](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction_identity-management.html#intro-identity-users)</br><p />
* AWS Config ルール<br>
・ AWS Config のマネージドルール [iam-user-no-policies-check](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/iam-user-no-policies-check.html)では、次のことを推奨している。これを満たしていないと、非準拠となる。<br />「いずれの IAM ユーザーにもポリシーがアタッチされていないことを確認します。IAM ユーザーは、IAM グループまたはロールからアクセス許可を継承する必要があります。」<p />
・ AWS Config のマネージドルール [iam-user-group-membership-check](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/iam-user-group-membership-check.html)では、次のことを推奨している。これを満たしていないと、非準拠となる。<br />「IAM ユーザーが少なくとも 1 つの IAM グループのメンバーであるかどうかを確認します。」

##2.4 IAMグループ
* IAM グループとは、IAM ユーザーの集合です。
* グループを使用して、ユーザーの集合に対してアクセス権限を指定でき、ユーザーのアクセス権限を容易に管理することができます。
* 例えば、Admins と呼ばれるグループを作成し、管理者が一般的に必要とするようなアクセス権限を、そのグループに与えることができます。そのグループのすべてのユーザーは、そのグループに割り当てられたアクセス権限を自動的に取得します。管理者権限を必要とする新しいユーザーが組織に参加した場合、そのユーザーを Admins グループに追加することで、適切な権限を割り当てることができます。 
* グループを入れ子形式にすることはできません。グループにはユーザーのみを含めることができ、他のグループを含めることはできません。
* IAMドキュメントでは、IAMグループに関して、次のように推奨している。
<dl>
[IAM ユーザーへのアクセス許可を割り当てるためにグループを使います。](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#use-groups-for-permissions)
<br>- 個々の IAM ユーザーに対してアクセス許可を定義するよりも、ジョブ機能に関連のあるグループを作成し（管理者、開発者、経理部など）、各グループに関連のあるアクセス許可を定義して、IAM ユーザーをそれらのグループに割り当てる方が便利です。</br>
</dl>
* 参考
<br>
[IAM グループ](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_groups.html)</br>

##2.5 ポリシー
* ポリシーは、ユーザーが実行できるアクションと、アクションが影響を与えることができるリソースを登録したドキュメントです。
* IAM ユーザーを IAM グループにまとめ、そのグループにポリシーをアタッチできます。そのグループのすべてのユーザーは、グループにアタッチされているポリシーの内容通りのアクセス許可を持っています。
* IAMドキュメントでは、ポリシーに関して次のように推奨している。
<dl>
[AWS 定義のポリシーを使用して可能な限り権限を割り当てる](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#bp-use-aws-defined-policies)
<br>- 可能な限り権限を付与するには、AWS によって作成および保守されている管理ポリシーを使用することをお勧めします。これらのポリシーを使用する主な利点は、新しいサービスとして AWS によってこれらの保守や更新が行われる、あるいは新しいAPIが導入されることです。</br>
</dl>
<dl>
[最小限の特権を認める](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)
<br>- IAM ポリシーを作成するとき、最小限の特権を認めるという標準的なセキュリティアドバイスに従いましょう。そうすれば、タスクを実行するというリクエストのアクセス許可のみを認めることができます。</br>
<br>- ユーザーが何をする必要があるのかを決定し、それから各ユーザーに見合ったポリシーを作成します。そうすることにより、ユーザーは、それらのタスクのみを実行します。</br>
</dl>
* 参考
<br>
[アクセス管理の概要: アクセス許可とポリシー](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction_access-management.html)</br>
<br>
[IAM ポリシーの概要](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies.html)</br>

#3. AWSアカウント作成後に行うべきこと
##3.1 [ルートユーザーのアクセスキーの対応](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#lock-away-credentials)
* ご自身の AWS ルートユーザーに対するアクセスキーをまだお持ちでない場合、絶対に必要でない限りは作成しないようにしてください。
* すでにご自身の AWS ルートユーザーに対するアクセスキーをお持ちの場合は、削除してください。それを保持する必要がある場合は、アクセスキーを定期的にローテーション（変更）してください。

##3.2 ルートユーザーのパスワードを強度なものへ再設定する
1. [安全性の高いパスワードの作成](https://support.kaspersky.co.jp/common/windows/3730)
2. [パスワードチェッカー](https://password.kaspersky.com/jp/)
3. [AWS アカウント（「ルート」）パスワードの変更](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_passwords_change-root.html)
4. パスワードを厳重に保管する

##3.3 アカウントの AWS 多要素認証（MFA）を有効にする
* 今回は、[多要素認証（MFA）仮想デバイスの有効化](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html)を行う。
 * 仮想 MFA デバイスとは、6 桁の認証コードを作成するソフトウェアアプリケーションで、〜略〜　スマートフォンを含め、モバイルハードウェアデバイス上で動作できます。
 * AWS アカウントユーザーまたは IAM ユーザー1人あたりに有効にできる MFA デバイスは 1 つのみで、デバイスは指定されたユーザーのみが使用できます。一部の仮想 MFA ソフトウェアアプリケーションでは複数のアカウントがサポートされているようですが、追加する各アカウントは単一の仮想 MFA デバイスに対応しており、単一の仮想デバイスを関連付けることができるのは 1 つのアカウントまたはユーザーのみであることに留意ください。
 * スマートフォンおよびタブレット（Google Android、Apple iPhone および iPad、Windows Phone など）で使用できる仮想 MFA アプリの一覧については、http://aws.amazon.com/iam/details/mfa/ の「仮想 MFA アプリケーション」を参照してください。AWS では、6 桁の OTP を生成する仮想 MFA アプリが必要です。
* 手順

>1) スマートフォンに MFA アプリをインストールする
>>・ 私の使用しているスマートフォンは Android なので、Google Play から 「Google 認証システム」アプリをインストールする。
>><font color="Red">＜2019/12/13 追記＞
現在は、[Authy](https://authy.com/)を使っています([参考](https://qiita.com/garakutayama/items/33f78c932e817bcb8b22))。
Authy インストール後の MFA 設定は基本的に下記の Google 認証アプリの場合と同じです。</font>


>2) AWSマネジメントコンソールから 仮想 MFA デバイスの設定

>>・ AWSマネジメントコンソールからIAMサービスへ**ルートユーザー**でサインインする
　 https://console.aws.amazon.com/iam/

>>・ ダッシュボード ⇒　ルートユーザーの MFA を有効化　⇒ MFA の管理
>>>・ 仮想 MFA デバイス を選択　⇒ 次のステップ
>>>・ MFA アプリインストール済みなのでそのまま ⇒ 次のステップ
>>>・ MFA アプリをインストールしたスマートフォンでQRコードをスキャン
>>>　　※「Google 認証システム」アプリ内からバーコードをスキャンできる
>>>・ URLを開く
>>>・ MFAアプリに６桁の数字が表示される　⇒ 認証コード1 に 6桁の数字を入力
>>>・ しばらくするとMFAアプリに違う６桁の数字が表示される ⇒ 認証コード2 に 6桁の数字を入力
>>>・ 認証コード１、２にそれぞれ６桁の数字の入力が完了したら、「仮想 MFA の有効化」
>>>・ MFA デバイスは正常に関連付けられました。

>3) AWS 多要素認証（MFA）を使用して、ルートユーザーでAWSマネジメントコンソールへサインインする
>>・ [IAM のサインインページでの MFA デバイスの使用](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/console_sign-in-mfa.html)

##3.4 [パスワードポリシーを設定する](IAM ユーザー用のアカウントパスワードポリシーの設定)
* IAM ユーザーのパスワードの複雑な要件や必須のローテーション期間を指定するパスワードポリシーを、AWS アカウントに設定することができます。
* 手順

>1) AWSマネジメントコンソールからIAMサービスへ**ルートユーザー**でサインインする
　 https://console.aws.amazon.com/iam/

>>・ ダッシュボード ⇒ IAM パスワードポリシーの適用
>>・ パスワードポリシーの管理

>2) パスワードポリシー

>・ 設定例
>>パスワードの最小長: 12
>>少なくとも 1 つの大文字が必要 ⇒ チェック
>>少なくとも 1 つの小文字が必要 ⇒ チェック 
>>少なくとも 1 つの数字が必要 ⇒ チェック
>>少なくとも 1 つの英数字以外の文字が必要 ⇒ チェック
>>ユーザーにパスワードの変更を許可 ⇒ チェック
>>パスワードの失効を許可 ⇒ チェック
>>パスワードの有効期間（日数）: 30
>>パスワードの再利用を禁止 ⇒ チェック
>>記憶するパスワードの数: 12
>>パスワードの有効期限で管理者のリセットが必要 ⇒ チェック

>・ パスワードポリシーの適用

##3.5 [IAM 管理者のユーザーおよびグループの作成](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/getting-started_create-admin-group.html)
* [AWS アカウントに管理者グループを作成することは必須ではありませんが、強く推奨します。](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/getting-started.html)
* 手順

>1) AWSマネジメントコンソールからIAMサービスへ**ルートユーザー**でサインインする
　 https://console.aws.amazon.com/iam/

>2) 管理者グループを作成する
>>・ グループ ⇒ 新しいグループの作成
>>>グループ名:　Administrators

>>・ ポリシーのアタッチ
>>>・ AWS定義のポリシーである、AdministratorAccess　ポリシーにチェックを入れる
※AdministratorAccessポリシーの内容
<pre>
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*" 
    }
  ]
}
</pre>

>>・ グループ作成

>3) IAMユーザーを作成する
>>・ ユーザー ⇒ ユーザーを追加
>>>ユーザー名： toru-nishimura
>>>アクセスの種類： AWS マネジメントコンソールへのアクセス
>>>コンソールのパスワード： 自動生成パスワード
>>>パスワードのリセットが必要： チェックを入れる

>>・ グループに追加
>>> 先ほど作成した、Administrators グループにチェックを入れる

>>・ ユーザーの作成

>>・ ユーザーの作成に成功したら、パスワードを表示して、メモっておく

>4) 3)で作成した IAMユーザーを使用して、AWSマネジメントコンソールへサインインする

>>・ サインインするURLは、
<pre>
https://AWSアカウントID.signin.aws.amazon.com/console
</pre>

>>・ 新しいパスワードの入力ページとなる。
>>>1. [安全性の高いパスワードの作成](https://www.microsoft.com/ja-jp/safety/online-privacy/passwords-create.aspx)
>>>2. [パスワードチェッカー](https://www.microsoft.com/ja-jp/safety/pc-security/password-checker.aspx)
>>>3. 新しいパスワードを登録

>>・ 注意点
>>>・ サインイン認証ページのリージョンは、URLに「us-east-1.signin.aws.amazon.com」とある通り、必ずバージニア北部となる（サインイン後のリージョンは、サインアウト前に設定したリージョンに切り替わる)。そのため、CloudTrailでログを記録している場合、サインイン時のコンソールログインのログは、バージニア北部リージョンの CloudTrail の API アクティビティ履歴 に表示される。

>5) 3)で作成した IAMユーザーに 多要素認証（MFA） 設定を行う

>>・ ユーザー ⇒ 3)で作成したIAMユーザーを選択
>>・ 認証情報 ⇒ MFA デバイスを割り当てました ⇒ 編集
>>>・ 仮想 MFA デバイス を選択　⇒ 次のステップ
>>>・ MFA アプリインストール済みなのでそのまま ⇒ 次のステップ
>>>・ MFA アプリをインストールしたスマートフォンでQRコードをスキャン
>>>　　※「Google 認証システム」アプリ内からバーコードをスキャンできる
>>>・ URLを開く
>>>・ MFAアプリに６桁の数字が表示される　⇒ 認証コード1 に 6桁の数字を入力
>>>・ しばらくするとMFAアプリに違う６桁の数字が表示される ⇒ 認証コード2 に 6桁の数字を入力
>>>・ 認証コード１、２にそれぞれ６桁の数字の入力が完了したら、「仮想 MFA の有効化」
>>>・ MFA デバイスは正常に関連付けられました。

##3.6 AWS CloudTrail によるログ記録を On にする
* 後々になって何かおかしなことが起きたときの調査用途や監査用途としてIAMイベントログ（証跡情報）を残しておくために、AWS CloudTrail で IAMイベントログを S3へ記録する。
* 参考：[AWS CloudTrail による IAM イベントのログ記録](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/cloudtrail-integration.html)
* [AWS ルートユーザーが使用されたことを通知する監視設定](https://qiita.com/tonishy/items/024ec90dc9b75f22e8e9)


#４. アクセスアドバイザー
* IAM コンソールでは、IAM ユーザーとロールが最後に AWS サービスにアクセスを試みたときの情報が表示されます。この情報は、サービスの最終アクセス時間データと呼ばれます。このデータは、不要なアクセス許可を識別し、IAM ポリシーを最小権限の原則により良く準拠し、特定のタスクを実行するのに必要な最小限のアクセス許可を付与するよう調整するのに役立ちます。
* 参考
<br>
[アクセスアドバイザー](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_access-advisor.html)
</br>

#5. IAMベストプラクティスにほぼほぼ準拠したIAMユーザ・グループ作成について
https://qiita.com/tonishy/items/f9cdacd1a51b92724d15