[JAWS-UG CLI] Amazon KMS 入門 (4) カスタマーマスターキーのローテーション

# このハンズオンについて

この手順は、[JAWS-UG CLI専門支部 #58 KMS入門](https://manage.doorkeeper.jp/groups/jawsug-cli/events/41911)で実施したものです。


# 前提条件

## 必要な権限

作業にあたっては、以下の権限を有したIAMユーザもしくはIAMロールを利用してください。

- KMSに対するフルコントロール権限
- S3に関するフルコントロール権限
- STSに関するフルコントロール権限
- IAMに関するフルコントロール権限


# 0. 準備

## 0.1. リージョンを指定

```bash:コマンド
export AWS_DEFAULT_REGION='ap-northeast-1'
```

## 0.2. 資格情報を確認


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

インスタンスプロファイルを設定したEC2インスタンスでアクセスキーを設定せずに実行した場合、以下のようになります。

```text:結果
Name                    Value             Type    Location
----                    -----             ----    --------
profile                <not set>             None    None
access_key     ****************RDPA         iam-role
secret_key     ****************9GA8         iam-role
region           ap-northeast-1              env    AWS_DEFAULT_REGION
```

## 0.3. バージョン確認

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

```text:結果
aws-cli/1.10.56 Python/2.7.10 Linux/4.4.15-25.57.amzn1.x86_64 botocore/1.4.46
```

## 0.4. バージョンアップ（必要に応じて）

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

## 0.5. 変数の設定

```bash:コマンド
ADMIN_NAME='jawsug-cli-admin'

ALIAS="alias/cli-handson0815"

KEY_ID=$(aws kms list-aliases \
    --query "Aliases[?AliasName == \`${ALIAS}\`].TargetKeyId" \
    --output text) \
    && echo ${KEY_ID}
```

# 1. 管理者情報の認証情報取得

管理者ユーザの認証情報を生成し、プロファイルとして設定します。

## 1.0 ユーザの切り替え

ここで、最初に利用していた認証情報に切り替えます。

インスタンスプロファイルを利用していた場合は、環境変数をリセットしてください。

```bash:コマンド
unset AWS_DEFAULT_PROFILE
```

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

```text:結果
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************EPRQ         iam-role
secret_key     ****************RQyb         iam-role
    region           ap-northeast-1              env    AWS_DEFAULT_REGION
```


別のプロファイルを利用していた場合には、プロファイルを切り替えてください。

```bash:コマンド
export AWS_DEFAULT_PROFILE='（切り替え前のプロファイル名）'
```

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

## 1.1. access keyの作成と取得

### 変数の確認

```bash:コマンド
cat << ETX

    ADMIN_NAME: ${ADMIN_NAME}

ETX
```

```text:結果

    ADMIN_NAME: jawsug-cli-admin

```

### access keyの作成と取得

```bash:コマンド
aws iam create-access-key \
    --user-name ${ADMIN_NAME} \
    > ${ADMIN_NAME}.json \
    && cat ${ADMIN_NAME}.json
```

```json:結果:
{
    "AccessKey": {
        "UserName": "jawsug-cli-admin",
        "Status": "Active",
        "CreateDate": "2016-08-06T05:55:49.222Z",
        "SecretAccessKey": "****************************************",
        "AccessKeyId": "********************"
    }
}
```

### アクセスキーの抽出

```bash:コマンド
ADMIN_ACCESS_KEY=$( \
    cat ${ADMIN_NAME}.json \
    | jp.py 'AccessKey.AccessKeyId' \
    | sed 's/"//g') \
    && echo ${ADMIN_ACCESS_KEY}

ADMIN_SECRET_ACCESS_KEY=$( \
    cat ${ADMIN_NAME}.json \
    | jp.py 'AccessKey.SecretAccessKey' \
    | sed 's/"//g') \
    && echo ${ADMIN_SECRET_ACCESS_KEY}
```


## 1.2. プロファイル名の指定

同じ名前のプロファイルを使用していないことを確認してください。

```bash:コマンド
ADMINS_PROFILE_NAME=${ADMIN_NAME}
```

## 1.3. プロファイルの確認

プロファイル名が未使用であることを確認します。

```bash:コマンド
aws configure get aws_access_key_id \
    --profile ${ADMINS_PROFILE_NAME}
```

```text:結果
The config profile (jawsug-cli-admin) could not be found
```


```bash:コマンド
aws configure get aws_secret_access_key \
    --profile ${ADMINS_PROFILE_NAME}
```

```text:結果
The config profile (jawsug-cli-admin) could not be found
```


```bash:コマンド
aws configure get region \
    --profile ${ADMINS_PROFILE_NAME}
```

```text:結果
The config profile (jawsug-cli-admin) could not be found
```


## 1.4. プロファイルの作成

### 変数の確認

```bash:コマンド
cat << ETX

    ADMIN_NAME: ${ADMIN_NAME}
    ACCESS_KEY: ${ADMIN_ACCESS_KEY}
    SECRET_ACCESS_KEY: ${ADMIN_SECRET_ACCESS_KEY}
    REGION: ${AWS_DEFAULT_REGION}

ETX
```

```text:結果

    ADMIN_NAME: jawsug-cli-admin
    ACCESS_KEY: ********************
    SECRET_ACCESS_KEY: ***********************************
    REGION: ap-northeast-1

```


### プロファイルの作成

```bash:コマンド
aws configure set aws_access_key_id ${ADMIN_ACCESS_KEY} \
    --profile ${ADMINS_PROFILE_NAME}
```

```text:結果
（戻り値無し）
```

```bash:コマンド
aws configure set aws_secret_access_key ${ADMIN_SECRET_ACCESS_KEY} \
    --profile ${ADMINS_PROFILE_NAME}
```

```text:結果
（戻り値無し）
```

```bash:コマンド
aws configure set region ${AWS_DEFAULT_REGION} \
    --profile ${ADMINS_PROFILE_NAME}
```

```text:結果
（戻り値無し）
```

## 1.5. 認証情報の確認（.aws/credentials）

```bash:コマンド
cat ~/.aws/credentials
```

```text:結果（例）
[jawsug-cli-user]
aws_access_key_id = ********************
aws_secret_access_key = ***********************************
[jawsug-cli-admin]
aws_access_key_id = ********************
aws_secret_access_key = ***********************************
```

## 1.6. 認証情報の確認（.aws/config）

```bash:コマンド
cat ~/.aws/config
```

```text:結果（例）
[profile jawsug-cli-user]
region = ap-northeast-1
s3 =
    signature_version = s3v4
[profile jawsug-cli-admin]
region = ap-northeast-1
```


# 2. ユーザの切り替え

## 2.1. 現在のユーザの確認

あとで現在の状態に戻るため、結果を控えておいてください。（以下の結果は、インスタンスプロファイルを利用している場合）

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

```text:結果（例）
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************CIIA         iam-role
secret_key     ****************wGIk         iam-role
    region           ap-northeast-1              env    AWS_DEFAULT_REGION
```


## 2.2. 切替後ユーザの確認

```bash:コマンド
cat << ETX

    ADMINS_PROFILE_NAME: ${ADMINS_PROFILE_NAME}

ETX
```

```text:結果

    ADMINS_PROFILE_NAME: jawsug-cli-admin

```


## 2.3. ユーザの切り替え

```bash:コマンド
export AWS_DEFAULT_PROFILE=${ADMINS_PROFILE_NAME}
```

## 2.4. 認証情報の確認

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

```text:結果
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile          jawsug-cli-user           manual    --profile
access_key     ****************QNVA shared-credentials-file
secret_key     ****************fTJ+ shared-credentials-file
    region           ap-northeast-1              env    AWS_DEFAULT_REGION
```


# 3. キーのローテーション

任意の周期でローテーションさせることはできないようです。

## 3.1. 設定の確認

```bash:コマンド
aws kms get-key-rotation-status \
    --key-id ${KEY_ID}
```

```json:結果
{
    "KeyRotationEnabled": false
}
```

## 3.2. ローテーションの有効化


```bash:コマンド
aws kms enable-key-rotation \
    --key-id  ${KEY_ID}
```

```text:結果
（戻り値無し）
```


## 3.3. 設定の確認

```bash:コマンド
aws kms get-key-rotation-status \
    --key-id ${KEY_ID}
```

```json:結果
{
    "KeyRotationEnabled": true
}
```

以上です。