[JAWS-UG CLI] IAM #43 IAMユーザの作成 (CodeCommitへのSSHアクセス用)

AWS CLIを利用して、CodeCommitへのSSHアクセス用のIAMユーザを作成してみます。


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


IAMへの権限
-----------

- IAMに対してフル権限があること。

IAMに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.11.2

```bash:コマンド:
aws --version
```

```text:結果(例):
      aws-cli/1.11.2 Python/2.7.11 Darwin/15.6.0 botocore/1.4.60
```

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


0.1. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         iamFull-prjZ-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         us-east-1  env    AWS_DEFAULT_REGION
```

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 それ以外のときにprofileが '<not set>' と表示される場合は、以下を実行してください。

```bash:変数の設定:
         export AWS_DEFAULT_PROFILE=<IAMユーザ名>
```


0.2. IAMグループの決定
----------------------

```bash:コマンド:
aws iam list-groups \
        --query 'Groups[].GroupName'
```

```bash:変数の設定
IAM_GROUP_NAME="AWSCodeCommitPowerUser"
```


0.3. IAMグループポリシーの確認
------------------------------

IAMグループのグループポリシーを確認します。

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

```json:結果(例):
      {
        "AttachedPolicies": [
          {
              "PolicyName": "AWSCodeCommitPowerUser",
              "PolicyArn": "arn:aws:iam::aws:policy/AWSCodeCommitPowerUser"
          }
        ]
      }
```


0.4. SSH鍵の作成 (存在しない場合)
---------------------------------

```bash:コマンド:
ls ~/.ssh/
```

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

鍵(id_rsa, id_rsa.pubなど)が表示された場合は、以下の作業は不要です。

```bash:コマンド:
ssh-keygen -t rsa -b 2048
```

パスフレーズの設定は任意です。


0.5. SSH鍵の指定
----------------

使用するSSH秘密鍵を指定します。

```text:コマンド(例):
FILE_SSH_KEY='id_rsa'
```

使用するSSH公開鍵を指定します。

```bash:コマンド:
FILE_SSH_PUBLICKEY="${FILE_SSH_KEY}.pub" \
        && echo ${FILE_SSH_PUBLICKEY}
```


1. 事前作業
===========


IAMユーザ名の決定
------------------------------

今回のハンズオンでは、IAMユーザ名は作業マシンのローカルユーザと同じ名前のIAMユーザを作成します。

```bash:コマンド:
IAM_USER_NAME=${USER} \
        && echo ${IAM_USER_NAME}
```

同じ名前のIAMユーザが存在しないことを確認します。

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

```text:結果(例):
      A client error (NoSuchEntity) occurred when calling the GetUser operation: The user with name taro cannot be found.
```


2. ユーザの作成
===============


2.1. 作成
---------

IAMユーザを作成します。

```bash:変数の確認
cat << ETX

        IAM_USER_NAME: ${IAM_USER_NAME}

ETX
```

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

```json:結果(例):
      {
        "User": {
          "UserName": "taro",
          "Path": "/",
          "CreateDate": "2016-10-10T12:34:56.012Z",
          "UserId": "AIDAXXXXXXXXXXXXXXXXX",
          "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/taro"
        }
      }
```


2.2. IAMユーザの確認
--------------------

作成したIAMユーザが存在することを確認します。

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

```json:結果(例):
      {
        "User": {
          "UserName": "taro",
          "Path": "/",
          "CreateDate": "2016-10-10T01:23:45Z",
          "UserId": "AIDAXXXXXXXXXXXXXXXXX",
          "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/taro"
        }
      }
```


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


3.1. 追加
---------

IAMユーザに権限を付与するために、IAMグループに追加します。

```bash:変数の確認
cat << ETX

          IAM_GROUP_NAME: ${IAM_GROUP_NAME}
          IAM_USER_NAME:  ${IAM_USER_NAME}

ETX
```

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

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


3.2. ユーザのグループ所属確認
-----------------------------

IAMユーザが、IAMグループに所属していることを確認します。

```bash:コマンド:
aws iam list-groups-for-user \
        --user-name ${IAM_USER_NAME} \
        --query 'Groups[].GroupName'
```

```json:結果(例):
      {
        "GroupName": "AWSCodeCommitPowerUser"
      }
```


3.3. グループへのユーザ所属確認
-------------------------------

IAMグループにIAMユーザが所属していることを確認します。

```bash:コマンド:
aws iam get-group \
        --group-name ${IAM_GROUP_NAME} \
        --query "Users[?UserName==\`${IAM_USER_NAME}\`]"
```

```json:結果(例):
      {
        "UserName": "taro",
        "Path": "/",
        "CreateDate": "2016-10-10T01:23:45Z",
        "UserId": "AIDAxxxxxxxxxxxxxxxxx",
        "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/taro"
      }
```


4. SSH公開鍵の登録
==================


4.1. SSH公開鍵の登録
--------------------

```bash:変数の確認
cat << ETX

        IAM_USER_NAME:      ${IAM_USER_NAME}
        FILE_SSH_PUBLICKEY: ${FILE_SSH_PUBLICKEY}

ETX
```

```bash:コマンド:
pushd ${HOME}/.ssh/
```

```bash:コマンド:
aws iam upload-ssh-public-key \
        --user-name ${IAM_USER_NAME} \
        --ssh-public-key-body file://${FILE_SSH_PUBLICKEY}
```

```json:結果(例):
      {
        "SSHPublicKey": {
          "UserName": "lab-office",
          "Status": "Active",
          "SSHPublicKeyBody": "ssh-rsa AAAABxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx taro@hostname.localn",
          "UploadDate": "2016-10-10T01:23:45.678Z",
          "Fingerprint": "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx",
          "SSHPublicKeyId": "APKAXXXXXXXXXXXXXXXX"
        }
      }
```

```bash:コマンド:
popd
```


4.2. SSH公開鍵IDの取得
----------------------

```bash:コマンド:
IAM_SSH_PUBLIC_KEY_ID=$( \
        aws iam list-ssh-public-keys \
          --user-name $IAM_USER_NAME \
          --query "SSHPublicKeys[?UserName == \`${IAM_USER_NAME}\`].SSHPublicKeyId" \
          --output text \
      ) \
        && echo ${IAM_SSH_PUBLIC_KEY_ID}
```

```text:結果(例):
      APKAXXXXXXXXXXXXXXXX
```


5. sshの設定
============


```bash:変数の確認
cat << ETX

        IAM_SSH_PUBLIC_KEY_ID:  ${IAM_SSH_PUBLIC_KEY_ID}
        FILE_SSH_KEY:           ${FILE_SSH_KEY}

ETX
```

```bash:コマンド:
cat << EOF >> ~/.ssh/config
Host git-codecommit.*.amazonaws.com
  User ${IAM_SSH_PUBLIC_KEY_ID}
  IdentityFile ~/.ssh/${FILE_SSH_KEY}
EOF

cat ~/.ssh/config
```

```bash:コマンド:
chmod 600 ~/.ssh/config
```


6. CodeCommitへのアクセス確認
=============================

```bash:コマンド:
ssh git-codecommit.us-east-1.amazonaws.com
```

```text:結果(例):
      The authenticity of host 'git-codecommit.us-east-1.amazonaws.com (xxx.xxx.xxx.xxx)' can't be established.
      RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
      Are you sure you want to continue connecting (yes/no)?
```

```text:入力:
      yes
```

```text:結果(例):
      You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit. Interactive shells are not supported.Connection to git-codecommit.us-east-1.amazonaws.com closed by remote host.
      Connection to git-codecommit.us-east-1.amazonaws.com closed.
```


完了
====