[JAWS-UG CLI] IAM:#2 IAMグループとIAMユーザの作成 (管理者)

http://jawsug-cli.doorkeeper.jp/events/13796 でのハンズオン資料です。

このハンズオンでは、AWSの管理者として、IAMグループとIAMユーザを作成するために、下記の作業を行います。

* IAMグループの作成
* グループポリシーの作成
* IAMユーザの作成
* IAMユーザの初期パスワード設定
* IAMユーザのIAMグループへの追加

前提条件
========

* IAMへのフルアクセス権限


1. IAMグループの作成
===================

まず最初に、IAMグループを作成します。

IAMでは、管理を楽にするために、まずグループ設計を行い、個別のユーザを各グループに所属させるようにしましょう。


1.1. IAMグループの作成
-----------------------

例として、'operators'グループを作成します。

```bash:コマンド:
IAM_GROUP_NAME=operators
```

```bash:コマンド:
aws iam create-group \
  --group-name ${IAM_GROUP_NAME}
```

```json:結果(例)
   {
       "Group": {
           "Path": "/", 
           "CreateDate": "2014-09-07T08:52:09.308Z", 
           "GroupId": "AGPAI5KIHK7xxxxxxxxxx", 
           "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/operators", 
           "GroupName": "operators"
       }
   }
```


1.2. IAMグループの一覧
-----------------------

operatorsグループが存在することを確認します。

```bash:コマンド:
aws iam list-groups
```

```json:結果(例)
   {
       "Groups": [
           {
               "Path": "/", 
               "CreateDate": "2014-09-07T08:52:09Z", 
               "GroupId": "AGPAI5KIHK7xxxxxxxxxx", 
               "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/operators", 
               "GroupName": "operators"
           }, 
           {
               "Path": "/", 
               "CreateDate": "2014-09-07T03:37:40Z", 
               "GroupId": "AGPAJYZGCT6xxxxxxxxxx", 
               "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/admin", 
               "GroupName": "admin"
           }
       ]
   }
```




1.3. IAMグループの詳細確認
-------------------------

get系コマンドでは、その対象の詳細情報を確認することができます。

```bash:コマンド:
aws iam get-group \
  --group-name ${IAM_GROUP_NAME}
```

```json:結果(例)
   {
       "Group": {
           "Path": "/", 
           "CreateDate": "2014-09-07T08:52:09Z", 
           "GroupId": "AGPAI5KIHK7xxxxxxxxxx", 
           "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/operators", 
           "GroupName": "operators"
       }, 
       "Users": []
   }
```


2. グループポリシーの作成
=========================

IAMグループを作成したら、グループ設計に従い、IAMグループのポリシーを設定します。

ここでは、S3へのフルアクセス権限をoperatorsグループに対して付与します。


2.1. グループポリシーが未適応(初期状態)であることを確認
------------------------------------------------

IAMグループは、作成直後はグループポリシーが空になっています。
(何の権限も持ちません。)

```bash:コマンド:
aws iam list-group-policies \
  --group-name ${IAM_GROUP_NAME}
```

```json:結果(例)
   {
       "PolicyNames": []
   }
```


2.2. グループポリシーの作成
---------------------------

グループポリシーは、IAMポリシードキュメントの仕様に従って、JSON形式で記述します。

- ポリシーシミュレータ: https://policysim.aws.amazon.com/home/index.jsp?#

グループポリシーの設定は、適用対象となるIAMグループとJSONファイルを指定して行います。

```bash:変数の設定:
IAM_GP_NAME='s3-full'
IAM_GP_FILE=group-policy.json
```


```json:group-policy.json:
   {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "s3:*",
         "Resource": "*"
       }
     ]
   }
```

[注意] ブラケット({}や[])のインデント位置が開きと閉じで同じでない場合、下記のエラーが出るようです。

```text:エラーメッセージ例:
A client error (MalformedPolicyDocument) occurred when calling the PutGroupPolicy operation: The policy is not in the valid JSON format.
```

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

```bash:command:
cat ${IAM_GP_FILE} | json_verify
```

```text:result:
JSON is valid
```


```bash:コマンド:
aws iam put-group-policy \
  --group-name ${IAM_GROUP_NAME} \
  --policy-name "${IAM_GP_NAME}" \
  --policy-document file://${IAM_GP_FILE}
```

```text:結果:
(戻り値なし)
```


2.3. グループポリシーの一覧
--------------------------

operatorsグループにs3-fullポリシーが適用されたことを確認しましょう。

```bash:コマンド:
aws iam list-group-policies \
  --group-name ${IAM_GROUP_NAME}
```

```json:結果(例)
   {
       "PolicyNames": [
           "s3-full"
       ]
   }
```


2.4. グループポリシーの詳細確認
-----------------------------

get系コマンドでは、その対象の詳細情報を確認することができます。

```bash:コマンド:
aws iam get-group-policy \
  --group-name ${IAM_GROUP_NAME} \
  --policy-name ${IAM_GP_NAME}
```

```json:結果(例)
   {
       "GroupName": "operators", 
       "PolicyDocument": {
           "Version": "2012-10-17", 
           "Statement": [
               {
                   "Action": "s3:*", 
                   "Resource": "*", 
                   "Effect": "Allow"
               }
           ]
       }, 
       "PolicyName": "s3-full"
   }
```

ここまでで、IAMグループの作成と設定は完了です。


3. IAMユーザの作成
==================

次に、Operatorsグループに所属するメンバーのIAMユーザを作成します。

今回は、'taro'さん一人だけがOperatorsグループのメンバーだとします。


3.1. IAMユーザの作成
--------------------

taroさんのIAMユーザを作成します。

```bash:コマンド:
IAM_USER_NAME='taro'
```

```bash:コマンド:
aws iam create-user \
  --user-name ${IAM_USER_NAME}
```

```json:結果(例)
   {
       "User": {
           "UserName": "taro", 
           "Path": "/", 
           "CreateDate": "2014-09-07T11:01:01.687Z", 
           "UserId": "AIDAJMUDSVOxxxxxxxxxx", 
           "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/taro"
       }
   }
```


3.2. IAMユーザの一覧
---------------------

IAMユーザの一覧にtaroユーザが存在することを確認します。

```bash:コマンド:
aws iam list-users
```

```json:結果(抜粋例)
   {
       "Users": [
           {
               "UserName": "taro", 
               "Path": "/", 
               "CreateDate": "2014-09-07T11:01:01Z", 
               "UserId": "AIDAJMUDSVOxxxxxxxxxx",
               "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/taro"
           }
       ]
   }
```


3.3. IAMユーザの詳細確認
------------------------

get系コマンドでは、その対象の詳細情報を確認することができます。


```bash:コマンド:
aws iam get-user \
  --user-name ${IAM_USER_NAME}
```

```json:結果(例)
   {
       "User": {
           "UserName": "taro", 
           "Path": "/", 
           "CreateDate": "2014-09-07T11:01:01Z", 
           "UserId": "AIDAJMUDSVOxxxxxxxxxx", 
           "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/taro"
       }
   }
```


4. IAMユーザのパスワード設定
===========================

作成したIAMユーザがマネジメントコンソールからアクセスする場合は、IAMユーザのパスワード設定が必要です。
(AWS APIしか利用しない場合は、この作業は不要です。パスワード設定をしないことで、マネジメントコンソールからのログインを防止することができます。)


4.1. IAMユーザのパスワード設定
-----------------------------

taroユーザのパスワードを設定します。

```bash:コマンド:
IAM_PASSWORD_NEW='#userPass123'
```

```bash:コマンド:
aws iam create-login-profile \
  --user-name ${IAM_USER_NAME} \
  --password ${IAM_PASSWORD_NEW}
```

```json:結果(例)
   {
       "LoginProfile": {
           "UserName": "taro", 
           "CreateDate": "2014-09-07T12:01:53.109Z", 
           "PasswordResetRequired": false
       }
   }
```


4.2. IAMユーザのパスワード設定状況確認
------------------------------------

get系コマンドでは、その対象の詳細情報を確認することができます。


```bash:コマンド:
aws iam get-login-profile \
  --user-name ${IAM_USER_NAME}
```

```json:結果(例)
   {
       "LoginProfile": {
           "UserName": "taro", 
           "CreateDate": "2014-09-07T12:01:53Z", 
           "PasswordResetRequired": false
       }
   }
```


5. IAMユーザのIAMグループへの追加
===============================

IAMユーザは、初期状態でどのIAMグループにも属していません。
(何の権限も持ちません。)

IAMグループと同様に、IAMユーザにもポリシーを設定することが可能ですが、管理をシンプルにするために、ユーザポリシーは極力使わず、適切なIAMグループに所属させるようにしましょう。

ここでは、taroユーザをOperatorsグループに所属させます。


5.1. IAMユーザがどのIAMグループにも所属していないこと(初期値)を表示
-------------------------------------------------------------

まず、taroユーザがどのIAMグループにも所属していないことを確認します。

```bash:コマンド:
aws iam list-groups-for-user \
  --user-name ${IAM_USER_NAME}
```

```json:結果(例)
   {
       "Groups": []
   }
```

5.2. IAMユーザのIAMグループへの追加
----------------------------------

taroユーザをOperatorsグループに所属させます。

```bash:コマンド:
aws iam add-user-to-group \
  --group-name ${IAM_GROUP_NAME} \
  --user-name ${IAM_USER_NAME}
```

```text:結果:
(戻り値なし)
```


5.3. IAMユーザの所属するIAMグループを表示
--------------------------------------

taroユーザが所属するIAMグループの一覧を表示してみましょう。

```bash:コマンド:
aws iam list-groups-for-user \
  --user-name ${IAM_USER_NAME}
```

```json:結果(例)
   {
       "Groups": [
           {
               "Path": "/", 
               "CreateDate": "2014-09-07T08:52:09Z", 
               "GroupId": "AGPAI5KIHK7xxxxxxxxxx", 
               "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/operators", 
               "GroupName": "operators"
           }
       ]
   }
```


以上で、IAMユーザの作成と、IAMグループへの登録は完了です。