[JAWS-UG CLI] Amazon KMS 入門 (5) カスタマーマスターキーの無効化と有効化

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

この手順は、[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'
ADMINS_PROFILE_NAME=${ADMIN_NAME}

USER_NAME='jawsug-cli-user'
USERS_PROFILE_NAME=${USER_NAME}

DATA_FILE='test.txt'
DOWNLOADED_DATA_FILE='test_downloaded.txt'
CIPHER_DATA_KEY_FILE_NAME='ciphertext_blob.txt'

AWS_ID=$(aws sts get-caller-identity \
    --query Account \
    --output text) \
    && echo ${AWS_ID}

BUCKET_NAME="kms-test-${AWS_ID}" \
    && echo ${BUCKET_NAME}

ALIAS="alias/cli-handson0815"

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


# 1. カスタマーマスターキーの無効化

## 1.1. ステータスの確認

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

```json:結果
{
    "KeyMetadata": {
        "KeyId": "********-****-****-****-************",
        "Description": "JAWS-UG CLI 58 KMS at Co-Edo",
        "Enabled": true,
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "CreationDate": 1470043623.442,
        "Arn": "arn:aws:kms:ap-northeast-1:************:key/********-****-****-****-************",
        "AWSAccountId": "************"
    }
}
```

## 1.2. 変数の確認

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

    KEY_ID: ${KEY_ID}

ETX
```

```text:結果

    KEY_ID: ********-****-****-****-************

```

## 1.3. カスタマーマスターキーの無効化

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

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

## 1.4. ステータスの確認

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

```json:結果
{
    "KeyMetadata": {
        "KeyId": "********-****-****-****-************",
        "Description": "JAWS-UG CLI 58 KMS at Co-Edo",
        "Enabled": false,
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Disabled",
        "CreationDate": 1470043623.442,
        "Arn": "arn:aws:kms:ap-northeast-1:************:key/********-****-****-****-************",
        "AWSAccountId": "************"
    }
}
```


# 2. データの復号化の試行

## 2.1. プロファイルの切り替え

CMKを無効化したことを確認するため、一般ユーザにプロファイルに切り替えます。

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

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

```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
```


## 2.3. データキーの復号化

カスタマーマスターキーが無効なため、復号化できません。

```bash:コマンド
aws kms decrypt \
    --ciphertext-blob fileb://${CIPHER_DATA_KEY_FILE_NAME} \
    --query Plaintext \
    --output text
```

```text:結果
An error occurred (DisabledException) when calling the Decrypt operation: arn:aws:kms:ap-northeast-1:************:key/********-****-****-****-************ is disabled.
```


# 3. S3からファイルのダウンロードを試行

カスタマーマスターキーが無効なため、ダウンロードできません。

## 3.1. S3からファイルのダウンロード

```bash:コマンド
aws s3 cp s3://${BUCKET_NAME}/${DATA_FILE} ${DOWNLOADED_DATA_FILE}
```

```text:結果
download failed: s3://kms-test-************/test.txt to ./test_downloaded.txt An error occurred (KMS.DisabledException) when calling the GetObject operation: arn:aws:kms:ap-northeast-1:************:key/********-****-****-****-************ is disabled.
```

# 4. カスタマーマスターキーの有効化

CMKを再度有効化し、データキーの復号化やS3からのダウンロードができるようになることを確認します。

## 4.1. プロファイルの切り替え

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


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

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

```text:結果
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile         jawsug-cli-admin           manual    --profile
access_key     ****************2RPA shared-credentials-file
secret_key     ****************cbKk shared-credentials-file
    region           ap-northeast-1              env    AWS_DEFAULT_REGION
```


## 4.3. ステータスの確認

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

```json:結果
{
    "KeyMetadata": {
        "KeyId": "********-****-****-****-************",
        "Description": "JAWS-UG CLI 58 KMS at Co-Edo",
        "Enabled": false,
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Disabled",
        "CreationDate": 1470540911.677,
        "Arn": "arn:aws:kms:ap-northeast-1:************:key/********-****-****-****-************",
        "AWSAccountId": "************"
    }
}
```

## 4.4. 変数の確認

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

    KEY_ID: ${KEY_ID}

ETX
```

```text:結果

    KEY_ID: ********-****-****-****-************

```

## 4.5. カスタマーマスターキーの有効化

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

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

## 4.6. ステータスの確認

反映に少し時間がかかるようです。

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

```json:結果
{
    "KeyMetadata": {
        "KeyId": "********-****-****-****-************",
        "Description": "JAWS-UG CLI 58 KMS at Co-Edo",
        "Enabled": true,
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "CreationDate": 1470540911.677,
        "Arn": "arn:aws:kms:ap-northeast-1:************:key/********-****-****-****-************",
        "AWSAccountId": "************"
    }
}
```


# 5. データの復号化の試行

## 5.1. プロファイルの切り替え

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


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

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

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


## 5.3. データキーの復号化

```bash:コマンド
aws kms decrypt \
    --ciphertext-blob fileb://${CIPHER_DATA_KEY_FILE_NAME}
```

```json:結果
{
    "Plaintext": "********************************************",
    "KeyId": "arn:aws:kms:ap-northeast-1:************:key/********-****-****-****-************"
}
```


# 6. S3からファイルのダウンロードを試行

## 6.1. S3からファイルのダウンロード

```bash:コマンド
aws s3 cp s3://${BUCKET_NAME}/${DATA_FILE} ${DOWNLOADED_DATA_FILE}
```

```text:結果
download: s3://kms-test-************/test.txt to ./test_downloaded.txt
```

以上