AWS KMSとAWS CLIを使ってファイルの暗号化と復号を行う

2020年7月17日

AWS KMS

前回は OpenSSL を使ってファイルを暗号化する方法を紹介しました。

OpenSSL
OpenSSLでファイルの暗号化と復号を行う

OpenSSL によるファイルの暗号化・復号を行う機会があったのでメモ。重要な情報が記録されたファイルを保存するときに、 ...

続きを見る

今回は AWS Key Management Service (KMS) と AWS CLI を使ってファイルを暗号化する方法を紹介します。

KMS は、データの暗号化に用いられる暗号鍵の作成、管理、運用のためのマネージドサービスです。KMS は、AWS のさまざまなサービスと統合されていて、各種ストレージやデータベース上のデータの暗号化を簡単に実現できます。今回は AWS CLI から KMS の API を利用してファイルの暗号化を行う方法を紹介します。

目次

  1. KMS の暗号化 API
  2. AWS CLI で暗号化する
  3. AWS CLI で復号する
  4. KMS の暗号化・復号 API はもともと、データキーを暗号化・復号するために作られたもの

KMS の暗号化 API

KMS の API ドキュメントは Actions - AWS Key Management Service にあります。この中にある Encrypt API を使うことで暗号化ができます。この記事を書いた 2020 年 7 月時点では英語のドキュメントしかないのですが、ユースケースのひとつに以下のように書かれています。

You can encrypt small amounts of arbitrary data, such as a personal identifier or database password, or other sensitive information.
個人識別子やデータベースパスワード、その他の機密情報など、少量の任意のデータを暗号化できます。

「少量の任意のデータ」とありますが、暗号化できるデータの容量はカスタマーマスターキー(CMK)とアルゴリズムによって違います。デフォルトは Symmetric CMKs(対称カスタマーマスターキー) で、4096 bytes までのデータを暗号化できます。詳細は Encrypt - AWS Key Management Service を参照。

AWS CLI で暗号化する

AWS CLI から API を実行してファイルを暗号化してみましょう。AWS CLI の encrypt コマンドのドキュメント を見ながら進めます。

aws kms encrypt コマンドの必須パラメータは以下の通り。

aws kms encrypt --key-id <value> --plaintext <value>

--key-id オプションにはカスタマーマスターキーを渡します。キーの作成 - AWS Key Management Service を参考に AWS マネジメントコンソールからカスタマーマスターキーを作成しておきます。今回は東京リージョンに alias/my-key を作成しました。

--plaintext には暗号化をしたいテキスト情報を渡します。以下のようにテキストファイルを準備します。

echo 'Hello World' > plain.txt

AWS KMS での IAM ポリシーの使用 - AWS Key Management Service を参考に CLI を実行する IAM ユーザーもしくはロールに KMS の暗号化と復号化の権限を付与しておきます。

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Encrypt",
      "kms:Decrypt"
    ],
    "Resource": "arn:aws:kms:*:111122223333:key/*"
  }
}

準備ができました。コマンドを実行してみましょう。encrypt Examples を参考にします。

aws kms encrypt \
    --key-id alias/my-key \
    --plaintext fileb://plain.txt \
    --output text \
    --region ap-northeast-1 \
    --query CiphertextBlob | base64 --decode > encrypted.txt

ファイルは fileb:// スキーマでバイナリデータとして渡して、ファイルに書き出す前に base64 でデコードします。詳しくは Examples の後半の説明を確認してください。

コマンドを実行すると encrypted.txt という暗号化されたファイルができます。バイナリデータになっていて、中身は確認ができません。

AWS CLI で復号する

暗号化したファイルを AWS CLI で復号してみます。詳しくは decrypt — AWS CLI 2 Command Reference を参照。

aws kms decrypt \
    --ciphertext-blob fileb://encrypted.txt \
    --output text \
    --region ap-northeast-1 \
    --query Plaintext | base64 --decode > decoded-plain.txt

decoded-plain.txt が作成されるので、中身を見てみます。

cat decoded-plain.txt

Hello World

暗号化前の状態に戻すことができました。ちなみに、復号するときは --key-id オプションは不要です。復号するときの --query Plaintext オプションを省略すると出てきますが、ファイルの中にどの鍵を使って暗号化されたか記録されています。

KMS の暗号化・復号 API はもともと、データキーを暗号化・復号するために作られたもの

AWS Key Management Service の概念 - AWS Key Management Service を読みながら想像した内容になりますが、おそらく KMS の暗号化・復号 API はもともと、データキーを暗号化・復号するためにつくられたものと思われます。より大きな情報や多くの情報を暗号化するには、データキーを使った暗号化が適しています。

データキーを使った暗号化は AWS 暗号化 SDK コマンドラインインターフェイス - AWS 暗号化 SDK を使って行うことができそうです。これはまた試す機会があれば紹介したいと思います。

おわりに

AWS Key Management Service と AWS CLI でファイルを暗号化する方法を紹介しました。小さいファイルしか暗号化ができず、カスタマーマスターキーの料金がかかりますが、AWS KMS の API にアクセスができる環境であれば手軽に暗号化・復号を行うことができます。覚えておくと役に立つことがあるかもしれません。

-技術ブログ
-