AWS Builder Labs (セルフペースラボ) の Introduction to AWS Key Management Service をやってみた

AWS Builder Labs (セルフペースラボ) で提供されている Introduction to AWS Key Management Service を実際にやってみました。
2023.04.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Builder Labs (セルフペースラボ) とは

AWS Builder Labs (セルフペースラボ) とは、AWS Skill Builder 内で提供されている AWS の学習コンテンツであり、以下の特徴があります。

  • ハンズオン形式で実践的な学習ができる
  • AWS のラボ環境が提供されるため、コストを気にせずに学習できる
  • オンデマンドで利用可能なため、時間や場所を問わずに学習できる

注意点として、AWS Builder Labs の利用には、個人またはチームのサブスクリプション契約が必要となります。

詳細は公式サイトをご参照ください。

Introduction to AWS Key Management Service とは

Introduction to AWS Key Management Service とは、AWS Builder Labs (セルフペースラボ) で提供されているコースの1つです。

コースの概要は公式サイトより引用いたします。

ラボの概要

このラボでは、Introduction to AWS Key Management Service セルフペースラボについて説明しています。AWS Key Management Service の基本を理解できます。Key Management Service の使用を開始し、キーを作成し、キーに管理および使用権限を割り当て、データを暗号化してキーのアクセスと使用をモニタリングするために必要な基本ステップを説明します。

取り上げるトピック

このラボを修了すると、次のことができるようになります。

  • 暗号化キーを作成する
  • CloudTrail のロギング機能を持つ S3 バケットを作成する
  • 暗号化キーを使用して、S3 バケットに保存されているデータを暗号化する
  • CloudTrail を使用して暗号化キーの使用状況をモニタリングする
  • ユーザーとロールのために暗号化キーを管理する

本コースの所要時間は約1時間です。
日本語版のコースも提供されています、今回は日本語版コースをやってみました。

コースの流れは以下です。

  1. KMS マスターキーを作成する
  2. CloudTrail を設定してログを S3 バケットに保存する
  3. イメージを S3 バケットにアップロードして暗号化する
  4. 暗号化イメージにアクセスする
  5. CloudTrail のログを使用して KMS アクティビティをモニタリングする
  6. 暗号化キーを管理する

やってみた

1. KMS マスターキーを作成する

ここでは KMS のマスターキーを作成していきます。
作成する KMS キーの概要は以下です。

設定
エイリアス myFirstKey
キータイプ 対称
キー管理者 AWSLabsUser-xxx (マネジメントコンソールにログイン中の IAM ロール)
キーユーザー AWSLabsUser-xxx (マネジメントコンソールにログイン中の IAM ロール)

ラボの指示に従って進めていけば、特につまずくことなく作成できるかと思います。

2. CloudTrail を設定してログを S3 バケットに保存する

ここでは CloudTrail を設定していきます。

myTrail という名前の証跡を作成していきましょう。
証跡ログの保存先となる S3 バケット mycloudtrailbucket20230419 もこちらであわせて作成します。

イベントタイプは、管理イベント、データイベント、Insight イベントの全てを選択しましょう。

証跡が作成できました。
こちらもラボの指示通りに設定すれば、特につまずくことなく進めることができると思います。

3. イメージを S3 バケットにアップロードして暗号化する

ここでは先ほど作成した S3 バケットに、イメージファイルを KMS の暗号化キーで暗号化してアップロードしていきます。
まずは自身でイメージファイルを用意しましょう、私は以下の introduction-to-kms-kuranyan-image.png を用意しました。

introduction-to-kms-kuranyan-image.png

サーバー側の暗号化セクションにて、先ほど作成した KMS キーを指定して暗号化の設定を行いましょう。

オブジェクトのアップロードが成功していることを確認できました。

4. 暗号化イメージにアクセスする

ここでは先ほど S3 バケットに暗号化してアップロードしたイメージファイルにアクセスしていきましょう。

まずはオブジェクトのページから「開く」ボタンを押下してアクセスしてみます。

エラーが発生することなくイメージファイルにアクセス可能であることを確認できました。

次にオブジェクト URL からアクセスしてみます。
まずは事前準備として、ブロックパブリックアクセスをオフに設定します。

続いて ACL 設定を変更してパブリック公開します。

オブジェクト URL にアクセスしてみましょう。

「Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.」エラーが発生してオブジェクトにアクセスできないことが確認できました。

KMS で暗号化したオブジェクトにアクセスする際は、AWS 署名バージョン 4 を使用する必要があります。
オブジェクト URL からアクセスした際は、AWS 署名バージョン 4 が使用されないため、エラーが発生しました。
AWS CLI や SDK を使用して AWS 署名バージョン 4 を使用したプログラムからオブジェクトへアクセスする必要があります。
(マネジメントコンソールの「開く」ボタンは、マネジメントコンソールにログインしている IAM ロールの権限を使用して、裏側で適切に AWS 署名バージョン 4 を使用していると思われます)

5. CloudTrail のログを使用して KMS アクティビティをモニタリングする

ここでは CloudTrail のログを確認して KMS のアクティビティを確認します。

以下はログファイルの抜粋となります。

KMS の GenerateDataKey アクションにて、作成した KMS のキーを使用してイメージファイルを暗号化していることを確認できました。

        {
            "eventVersion": "1.08",
            "userIdentity": {
                "type": "AssumedRole",
                "principalId": "AROAXXXXXXXXXXXX:926c2a59-c5bf-483e-a399-b56a1ace3487",
                "arn": "arn:aws:sts::012345678901:assumed-role/AWSLabsUser-xxx/926c2a59-c5bf-483e-a399-b56a1ace3487",
                "accountId": "012345678901",
                "accessKeyId": "ASIAXXXXXXXXXXXXX",
                "sessionContext": {
                    "sessionIssuer": {
                        "type": "Role",
                        "principalId": "AROAXXXXXXXXXXXX",
                        "arn": "arn:aws:iam::012345678901:role/AWSLabsUser-xxx",
                        "accountId": "012345678901",
                        "userName": "AWSLabsUser-xxx"
                    },
                    "webIdFederationData": {},
                    "attributes": {
                        "creationDate": "2023-04-19T00:56:10Z",
                        "mfaAuthenticated": "false"
                    }
                },
                "invokedBy": "AWS Internal"
            },
            "eventTime": "2023-04-19T06:31:10Z",
            "eventSource": "kms.amazonaws.com",
            "eventName": "GenerateDataKey",
            "awsRegion": "us-east-1",
            "sourceIPAddress": "AWS Internal",
            "userAgent": "AWS Internal",
            "requestParameters": {
                "keySpec": "AES_256",
                "encryptionContext": {
                    "aws:s3:arn": "arn:aws:s3:::mycloudtrailbucket20230419/introduction-to-kms-kuranyan-image.png"
                },
                "keyId": "arn:aws:kms:us-east-1:012345678901:key/95c307b5-a48b-4763-947a-468e5ba227ec"
            },
            "responseElements": null,
            "requestID": "b570ade9-050b-40c4-8da0-fdbd58acd3d3",
            "eventID": "282d5dee-6483-47a2-97c6-4eb555886a7f",
            "readOnly": true,
            "resources": [
                {
                    "accountId": "012345678901",
                    "type": "AWS::KMS::Key",
                    "ARN": "arn:aws:kms:us-east-1:012345678901:key/95c307b5-a48b-4763-947a-468e5ba227ec"
                }
            ],
            "eventType": "AwsApiCall",
            "managementEvent": true,
            "recipientAccountId": "012345678901",
            "eventCategory": "Management",
            "sessionCredentialFromConsole": "true"
        },

KMS の Decrypt アクションにて、イメージファイルを復号化していることを確認できました。

        {
            "eventVersion": "1.08",
            "userIdentity": {
                "type": "AssumedRole",
                "principalId": "AROAXXXXXXXXXXXX:926c2a59-c5bf-483e-a399-b56a1ace3487",
                "arn": "arn:aws:sts::012345678901:assumed-role/AWSLabsUser-gaJoixWAbWwngqoXUiAEd9/926c2a59-c5bf-483e-a399-b56a1ace3487",
                "accountId": "012345678901",
                "accessKeyId": "ASIAXXXXXXXXXXXXX",
                "sessionContext": {
                    "sessionIssuer": {
                        "type": "Role",
                        "principalId": "AROAXXXXXXXXXXXX",
                        "arn": "arn:aws:iam::012345678901:role/AWSLabsUser-gaJoixWAbWwngqoXUiAEd9",
                        "accountId": "012345678901",
                        "userName": "AWSLabsUser-gaJoixWAbWwngqoXUiAEd9"
                    },
                    "webIdFederationData": {},
                    "attributes": {
                        "creationDate": "2023-04-20T00:55:06Z",
                        "mfaAuthenticated": "false"
                    }
                },
                "invokedBy": "AWS Internal"
            },
            "eventTime": "2023-04-20T02:43:06Z",
            "eventSource": "kms.amazonaws.com",
            "eventName": "Decrypt",
            "awsRegion": "us-east-1",
            "sourceIPAddress": "AWS Internal",
            "userAgent": "AWS Internal",
            "requestParameters": {
                "encryptionContext": {
                    "aws:s3:arn": "arn:aws:s3:::mycloudtrailbucket20230419/introduction-to-kms-kuranyan-image.png"
                },
                "encryptionAlgorithm": "SYMMETRIC_DEFAULT"
            },
            "responseElements": null,
            "requestID": "ac3ddca0-9d36-4711-bf15-48cecfae2c19",
            "eventID": "04186532-4cb7-4662-98f5-138bb4a57df3",
            "readOnly": true,
            "resources": [
                {
                    "accountId": "012345678901",
                    "type": "AWS::KMS::Key",
                    "ARN": "arn:aws:kms:us-east-1:012345678901:key/95c307b5-a48b-4763-947a-468e5ba227ec"
                }
            ],
            "eventType": "AwsApiCall",
            "managementEvent": true,
            "recipientAccountId": "012345678901",
            "eventCategory": "Management",
            "sessionCredentialFromConsole": "true"
        },

6. 暗号化キーを管理する

ここではキーユーザーの追加・削除などの管理がマネジメントコンソールから実施可能であることを確認します。

まとめ

実際に本コースをやってみて、初めて KMS を触るという方には勉強になるコンテンツではないかと思いました。

ラボ側で詳細に手順を提示してくれるため、特につまずくことなく誰でもコースを完走することができるかと思います。
提示される手順と、実際のマネジメントコンソール画面にほとんど差異がないのが本当に良いですね。

今後も AWS Builder Labs のコンテンツを試してはブログ化していきたいと考えています。

最後までお読みいただき、ありがとうございました!