概要
AWS Key Management Service(AWS KMS)は、データの暗号化に使用する暗号鍵を作成・管理するためのマネージドサービスです。AWS のさまざまなサービスと統合されており、S3 のオブジェクト暗号化、EBS ボリュームの暗号化、RDS のデータベース暗号化など、幅広い場面で利用されています。
暗号鍵の管理は情報セキュリティの根幹です。鍵の作成・ローテーション・無効化・削除といったライフサイクル管理を適切に行わなければ、データ漏洩のリスクが高まります。AWS KMS を利用することで、これらの運用をマネージドサービスに委ねつつ、きめ細かいアクセス制御を実現できます。
本記事では、KMS でカスタマーマネージドキーを作成し、AWS CLI を使ってデータの暗号化・復号を体験します。

この記事のメリット
- AWS KMS の基本的な仕組みとユースケースを理解できる
- カスタマーマネージドキーの作成手順を習得できる
- KMS を使ったデータの暗号化・復号の流れを体験できる
- キーポリシーによるアクセス制御の基本を把握できる
- エンベロープ暗号化の概念を理解できる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。

クラウドおさる
クラウドおさるはじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。



基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説



とひさん、今回は AWS KMS について教えてください!暗号鍵を管理するサービスだと聞いたんですが、具体的にどういうものなんですか?
AWS KMS は、暗号鍵の作成・保管・管理を行うマネージドサービスだよ。FIPS 140-3 セキュリティレベル 3 の検証済みハードウェアセキュリティモジュール(HSM)で鍵を保護しているから、とても高いセキュリティレベルを提供してくれるんだ。



HSM で保護されているんですね!他の AWS サービスとも連携できるんですか?
そうだよ。KMS は 100 以上の AWS サービスと統合されていて、数クリックで既存のサービスにおけるデータ暗号化を有効化できるんだ。



100 以上!すごいですね。KMS のキーにはどんな種類があるんですか?
KMS キーには大きく 3 つの種類があるよ。表にまとめるとこんな感じだね。
| 種類 | 説明 | 管理者 |
|---|---|---|
| AWS マネージドキー | AWS サービスが自動的に作成・管理するキー(aws/s3、aws/ebs など) | AWS |
| カスタマーマネージドキー | ユーザーが作成・管理するキー。キーポリシーやローテーション設定を自由にカスタマイズ可能 | ユーザー |
| AWS 所有キー | AWS が内部的に使用するキー。ユーザーのアカウントには表示されない | AWS |



カスタマーマネージドキーが一番自由に設定できるんですね。
その通り。今回の実践では、もっとも柔軟にコントロールできるカスタマーマネージドキーを作成して使うよ。



キーを作成するときに選ぶ設定とかもあるんですか?
あるよ。KMS キーを作成する際に、用途に応じてキーの仕様を選択するんだ。
| 用途 | キーの仕様 | 説明 |
|---|---|---|
| 暗号化と復号 | 対称キー(SYMMETRIC_DEFAULT) | もっとも一般的。AWS サービスとの統合に使用 |
| 署名と検証 | RSA、ECC などの非対称キー | デジタル署名の作成・検証に使用 |
| HMAC の生成と検証 | HMAC キー | メッセージ認証コードの生成・検証に使用 |
AWS サービスとの統合(S3、EBS など)には対称キーが使われるよ。



なるほど、基本は対称キーを選べばいいんですね。



ところで、大量のデータを暗号化するときって、全部 KMS に送らないといけないんですか?それだと大変そうなんですが…。
いい質問だね。実は KMS では、大量のデータを効率的に暗号化するために「エンベロープ暗号化」という仕組みを使うんだ。流れはこうだよ。
- KMS にデータキーの生成をリクエストする
- KMS がデータキー(平文)とデータキー(暗号化済み)の 2 つを返す
- データキー(平文)を使ってデータを暗号化する
- 暗号化済みデータとデータキー(暗号化済み)を一緒に保存する
- 復号時は、データキー(暗号化済み)を KMS に送信して平文のデータキーを取得し、データを復号する
この仕組みのおかげで、大量のデータを KMS に送信する必要がなく、ネットワーク負荷を抑えられるんだ。





そういうことですか!データ本体じゃなくて「鍵」だけを KMS とやり取りするんですね。賢い仕組みですね!



KMS キーへのアクセス制御はどうやるんですか?
KMS キーへのアクセスは、キーポリシーで制御するんだ。キーポリシーは IAM ポリシーと同様の JSON 形式で記述して、誰がそのキーに対してどの操作を実行できるかを定義するよ。



キーポリシーを設定し忘れたらどうなるんですか?
実はすべての KMS キーにはキーポリシーが必須で、キーポリシーのないキーは存在できないんだ。キー作成時にポリシーを指定しない場合は、デフォルトのキーポリシーが自動的に適用されるから安心してね。



なるほど、必ずポリシーが付くようになっているんですね。安心しました!
実践
前提条件
- リージョン:
ap-northeast-1(東京) - KMS を操作できる IAM 権限があること
- AWS CLI がインストール済みで、認証情報が設定されていること
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| KMS キー(対称) | handson-kms-key | データの暗号化・復号に使用するカスタマーマネージドキー |
ステップ1: カスタマーマネージドキーの作成
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。
上部の検索バーに KMS と入力し、表示された「Key Management Service」を選択します。
左側ナビゲーションの「カスタマー管理型のキー」を選択します。
右上の「キーの作成」をクリックします。キー作成ウィザードは 6 ステップ構成です。
ステップ1: キーを設定
- キーのタイプ:
対称(デフォルト) - キーの使用法:
暗号化および復号化(デフォルト) - 「詳細オプション」は開かずデフォルトのままにします
「次へ」をクリックします。


ステップ2: ラベルを追加
- エイリアス:
handson-kms-key - 説明 – オプション:
ハンズオン用の暗号化キー
「次へ」をクリックします。
ステップ3: キーの管理アクセス許可を定義(オプション)
「キー管理者」の検索ボックスに、現在ログインしている IAM ユーザー名(またはロール名)を入力して絞り込み、チェックボックスを選択します。「キーの削除」の「キーの管理者がこのキーを削除できるようにします。」はチェックが入ったままにします。
「次へ」をクリックします。


ステップ4: キーの使用法アクセス許可を定義(オプション)
「キーユーザー」でも同様に、現在ログインしている IAM ユーザーまたはロールを検索して選択します。
「次へ」をクリックします。
ステップ5: キーポリシーを編集(オプション)
ステップ 3・4 の選択内容を反映したキーポリシーの JSON が表示されます。ここでは変更せず「次へ」をクリックします。
ステップ6: 確認
キーの設定・エイリアス・キー管理者・キーユーザー・キーポリシーを確認し、「完了」をクリックします。
一覧画面の上部に「AWS KMS キーは、エイリアス handson-kms-key とキー ID xxxx で作成されました。」と表示され、一覧に handson-kms-key が 有効 で表示されます。


ステップ2: コンソールでキーの詳細を確認する
作成したキーのエイリアス handson-kms-key をクリックして詳細画面を開きます。
「一般設定」で以下の情報が確認できます。画面上部のキー ID は後の CLI 操作で使うので控えておきます。
- キー ID: キーを一意に識別する UUID(画面タイトルにも表示されます)
- ARN: キーの Amazon リソースネーム
- 現在のキーマテリアル ID: 実際の暗号鍵(キーマテリアル)の識別子
- ステータス:
有効になっていること - 作成日: キーが作成された日時
「暗号化設定」タブでは、キーの仕様が SYMMETRIC_DEFAULT、キーの使用法が 暗号化および復号化 であることが確認できます。
「キーポリシー」タブはデフォルトでは「キー管理者」「キーユーザー」の一覧表示です。右側の「ポリシービューへの切り替え」をクリックすると、このキーに適用されているキーポリシーの JSON を確認できます。


ステップ3: AWS CLI でデータを暗号化する
AWS CLI を使って、KMS キーでテキストデータを暗号化します。
以下のコマンドを実行します。<キーID> は、ステップ2で確認したキー ID に置き換えてください。
aws kms encrypt \
--key-id <キーID> \
--plaintext "Hello, KMS!" \
--cli-binary-format raw-in-base64-out \
--query CiphertextBlob \
--output text \
--region ap-northeast-1 > encrypted.txt
AWS CLI v2 では --plaintext に渡した文字列が Base64 として解釈されるため、--cli-binary-format raw-in-base64-out を付けて文字列をそのまま平文として扱わせます(このオプションがないと、復号しても元の文字列に戻りません)。
encrypted.txt に Base64 エンコードされた暗号文が保存されます。
ファイルの内容を確認します。
cat encrypted.txt
元のテキストとはまったく異なる文字列が表示されます。これが暗号化されたデータです。
ステップ4: 暗号化されたデータを復号する
暗号化したデータを KMS で復号します。
aws kms decrypt \
--ciphertext-blob fileb://<(echo $(cat encrypted.txt) | base64 --decode) \
--query Plaintext \
--output text \
--region ap-northeast-1 | base64 --decode
Hello, KMS! と表示されれば、復号に成功しています。
KMS は暗号文のメタデータからどのキーで暗号化されたかを判別するため、復号時にキー ID を指定する必要はありません。
ステップ5: データキーの生成(エンベロープ暗号化の体験)
エンベロープ暗号化で使用するデータキーを生成します。
aws kms generate-data-key \
--key-id <キーID> \
--key-spec AES_256 \
--region ap-northeast-1
以下のようなレスポンスが返ります。
{
"CiphertextBlob": "AQIDAHi...(暗号化されたデータキー)...",
"Plaintext": "abc123...(平文のデータキー)...",
"KeyId": "arn:aws:kms:ap-northeast-1:123456789012:key/<キーID>",
"KeyMaterialId": "e8af3f...(キーマテリアル ID)..."
}
Plaintext: データの暗号化に使用する平文のデータキー(使用後すぐにメモリから削除する)CiphertextBlob: KMS キーで暗号化されたデータキー(暗号化済みデータとともに保存する)
実際のアプリケーションでは、Plaintext でデータを暗号化した後、Plaintext をメモリから削除し、CiphertextBlob を暗号化済みデータとともに保存します。
ステップ6: キーのローテーション設定を確認する
作成したキーの詳細画面で「キーマテリアルとローテーション」タブを選択します。
「自動キーローテーション」のステータス(初期状態は 無効)と、「キーマテリアル」の一覧(現在のキーマテリアル ID が 1 件)が確認できます。カスタマーマネージドキーでは、自動ローテーションを有効にすると、指定したローテーション期間(デフォルト 365 日、90〜2,560 日で指定可能)ごとに新しいキーマテリアルが自動生成されます。
- 「自動キーローテーション」の「編集」をクリックします
- 「自動キーローテーションを編集」画面で、キーローテーション:
有効を選択します - ローテーション期間 (日):
365(デフォルトのまま) - 「保存」をクリックします


保存後、「自動キーローテーション」のステータスが 有効、ローテーション期間が 365 日 になり、次のローテーション日が表示されます。
ローテーション後も、古いキーマテリアルで暗号化されたデータは引き続き復号可能です。KMS が過去のキーマテリアルを保持しているためです。なお、同じタブの「今すぐローテーション」からオンデマンドでローテーションすることもできます(最大 25 回)。
ステップ7: キーの無効化と有効化
キーのライフサイクル管理として、キーの無効化と有効化を体験します。
キーの詳細画面右上の「キーのアクション」ドロップダウンから「無効」を選択します。
「キーを無効化」ダイアログが表示されるので、「このキーを無効にすることを確認します。」にチェックを入れ「キーを無効化」をクリックします。
画面上部に「キー無効」と表示され、「一般設定」のステータスが 無効 に変わります。


キーが無効化された状態で、先ほどの暗号化コマンドを実行すると、DisabledException エラーが発生し、キーが使用できないことを確認できます。
aws kms encrypt \
--key-id <キーID> \
--plaintext "test" \
--cli-binary-format raw-in-base64-out \
--region ap-northeast-1
再度キーを有効にするには、「キーのアクション」→「有効」を選択します。
まとめ
- AWS KMS は暗号鍵の作成・管理を行うマネージドサービスで、FIPS 140-2 検証済み HSM で鍵を保護する
- KMS キーにはカスタマーマネージドキー、AWS マネージドキー、AWS 所有キーの 3 種類がある
- エンベロープ暗号化により、大量のデータを効率的に暗号化できる
- キーポリシーにより、誰がキーを管理・使用できるかをきめ細かく制御できる
- 自動キーローテーションを有効にすることで、定期的にキーマテリアルが更新される
- キーの無効化・有効化により、一時的にキーの使用を停止できる










