【AWSサービス 基礎編】AWS KMS で暗号鍵を作成しデータを暗号化・復号する

目次

概要

AWS Key Management Service(AWS KMS)は、データの暗号化に使用する暗号鍵を作成・管理するためのマネージドサービスです。AWS のさまざまなサービスと統合されており、S3 のオブジェクト暗号化、EBS ボリュームの暗号化、RDS のデータベース暗号化など、幅広い場面で利用されています。

暗号鍵の管理は情報セキュリティの根幹です。鍵の作成・ローテーション・無効化・削除といったライフサイクル管理を適切に行わなければ、データ漏洩のリスクが高まります。AWS KMS を利用することで、これらの運用をマネージドサービスに委ねつつ、きめ細かいアクセス制御を実現できます。

本記事では、KMS でカスタマーマネージドキーを作成し、AWS CLI を使ってデータの暗号化・復号を体験します。

AWS KMS でカスタマーマネージドキーを作成し、データを暗号化・復号する流れの図解
AWS KMS でカスタマーマネージドキーを作成し、データを暗号化・復号する流れの図解

この記事のメリット

  • 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 では、大量のデータを効率的に暗号化するために「エンベロープ暗号化」という仕組みを使うんだ。流れはこうだよ。

  1. KMS にデータキーの生成をリクエストする
  2. KMS がデータキー(平文)とデータキー(暗号化済み)の 2 つを返す
  3. データキー(平文)を使ってデータを暗号化する
  4. 暗号化済みデータとデータキー(暗号化済み)を一緒に保存する
  5. 復号時は、データキー(暗号化済み)を KMS に送信して平文のデータキーを取得し、データを復号する
土肥

この仕組みのおかげで、大量のデータを KMS に送信する必要がなく、ネットワーク負荷を抑えられるんだ。

エンベロープ暗号化の仕組み(KMS キー → データキー生成 → データの暗号化・復号の流れ)
エンベロープ暗号化の仕組み(KMS キー → データキー生成 → データの暗号化・復号の流れ)
クラウドおさる

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

クラウドおさる

KMS キーへのアクセス制御はどうやるんですか?

土肥

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

クラウドおさる

キーポリシーを設定し忘れたらどうなるんですか?

土肥

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

クラウドおさる

なるほど、必ずポリシーが付くようになっているんですね。安心しました!

新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方を募集しています。プログラミング未経験から入社して活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

前提条件

  • リージョン: ap-northeast-1(東京)
  • KMS を操作できる IAM 権限があること
  • AWS CLI がインストール済みで、認証情報が設定されていること

作成するリソース一覧

リソース種別リソース名用途
KMS キー(対称)handson-kms-keyデータの暗号化・復号に使用するカスタマーマネージドキー

ステップ1: カスタマーマネージドキーの作成

AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。

上部の検索バーに KMS と入力し、表示された「Key Management Service」を選択します。

左側ナビゲーションの「カスタマー管理型のキー」を選択します。

右上の「キーの作成」をクリックします。キー作成ウィザードは 6 ステップ構成です。

ステップ1: キーを設定

  • キーのタイプ: 対称(デフォルト)
  • キーの使用法: 暗号化および復号化(デフォルト)
  • 「詳細オプション」は開かずデフォルトのままにします

「次へ」をクリックします。

KMS キー作成画面 — キータイプの選択
KMS キー作成画面 — キータイプの選択

ステップ2: ラベルを追加

  • エイリアス: handson-kms-key
  • 説明 – オプション: ハンズオン用の暗号化キー

「次へ」をクリックします。

ステップ3: キーの管理アクセス許可を定義(オプション)

「キー管理者」の検索ボックスに、現在ログインしている IAM ユーザー名(またはロール名)を入力して絞り込み、チェックボックスを選択します。「キーの削除」の「キーの管理者がこのキーを削除できるようにします。」はチェックが入ったままにします。

「次へ」をクリックします。

キー管理者の選択画面
キー管理者の選択画面

ステップ4: キーの使用法アクセス許可を定義(オプション)

「キーユーザー」でも同様に、現在ログインしている IAM ユーザーまたはロールを検索して選択します。

「次へ」をクリックします。

ステップ5: キーポリシーを編集(オプション)

ステップ 3・4 の選択内容を反映したキーポリシーの JSON が表示されます。ここでは変更せず「次へ」をクリックします。

ステップ6: 確認

キーの設定・エイリアス・キー管理者・キーユーザー・キーポリシーを確認し、「完了」をクリックします。

一覧画面の上部に「AWS KMS キーは、エイリアス handson-kms-key とキー ID xxxx で作成されました。」と表示され、一覧に handson-kms-key が 有効 で表示されます。

作成された handson-kms-key の詳細画面(キー ID とエイリアスが表示されている状態)
作成された handson-kms-key の詳細画面(キー ID とエイリアスが表示されている状態)

ステップ2: コンソールでキーの詳細を確認する

作成したキーのエイリアス handson-kms-key をクリックして詳細画面を開きます。

「一般設定」で以下の情報が確認できます。画面上部のキー ID は後の CLI 操作で使うので控えておきます。

  • キー ID: キーを一意に識別する UUID(画面タイトルにも表示されます)
  • ARN: キーの Amazon リソースネーム
  • 現在のキーマテリアル ID: 実際の暗号鍵(キーマテリアル)の識別子
  • ステータス: 有効 になっていること
  • 作成日: キーが作成された日時

「暗号化設定」タブでは、キーの仕様が SYMMETRIC_DEFAULT、キーの使用法が 暗号化および復号化 であることが確認できます。

「キーポリシー」タブはデフォルトでは「キー管理者」「キーユーザー」の一覧表示です。右側の「ポリシービューへの切り替え」をクリックすると、このキーに適用されているキーポリシーの JSON を確認できます。

キーポリシータブの JSON 表示
キーポリシータブの 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 種類がある
  • エンベロープ暗号化により、大量のデータを効率的に暗号化できる
  • キーポリシーにより、誰がキーを管理・使用できるかをきめ細かく制御できる
  • 自動キーローテーションを有効にすることで、定期的にキーマテリアルが更新される
  • キーの無効化・有効化により、一時的にキーの使用を停止できる

参照先

キャリア相談
クラウドおさる

独学の先に、AWS の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方を募集しています。プログラミング未経験から入社して活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次