AWS KMSを使って秘密鍵を管理する

     - セキュリティ  


本記事は2017年3月1日時点での情報です。正確かつ最新の情報は公式ドキュメントをご参照ください。

はじめに

秘密鍵,APIトークン,パスワードなどはたとえ社内公開・プライベートであってもGitリポジトリに含めたくない情報です。では,どのように管理すればよいでしょうか? 少し前の本ブログの記事 でもAWSのKey管理に 1.環境変数に設定する, 2. .aws/credentials にもたせておく, 3. コードに直接もたせる という3つの方法が提示されていました。しかし環境変数に設定する場合やGit管理していない外部ファイルで管理する場合,以下のような可能性があります。

  • バージョン管理されていないので変更に気づけない
  • 誤って鍵を保存している環境変数やファイルを削除してしまう
  • 開発者個人の環境に鍵が残ってしまう

こうした問題に対応するためAudienceOne開発チームではAWS Key Management Service (KMS)を利用しています。AWS KMSを利用することで,暗号化した鍵をGitリポジトリに保存し,バージョン管理が可能になります。またAWS KMSなら誤ってマスターキーを削除してしまうこともありません。またKMS APIの利用範囲はAWS IAMでポリシーを設定でき,APIの利用履歴も残ります。

本記事ではAWS KMSの概要と,その利用手順を記述します。

AWS KMSを使った暗号化/復号のおおまかな流れ

概念については公式ドキュメントを参考にしてください。
AWS Key Management Service の概念 (日本語): https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/concepts.html

上記の概念を踏まえ,AWS KMSを利用して,あるデータを暗号化し,後に復号する際の流れを説明します。

  • データを暗号化したいとき
  1. AWS KMSでCMK(Master key)を作成します
  2. Data key作成APIを叩きます
  3. 平文Data key(Data key)と暗号化されたData key(Encrypted data key)が返ってきます
  4. 平文Data keyを使って暗号化したいデータ(Plaintext data)を暗号化します
  5. セキュリティのため平文Data keyを削除します
  6. 暗号化されたData keyと暗号化されたデータ(Encrypted data)を同一箇所で保存します
  • データを復号したいとき
  1. 復号APIを使って,暗号化されたData keyを平文Data keyに戻します
  2. 平文Data keyで暗号化されたデータを復号します
  3. セキュリティのため平文Data keyを削除します

AWS CLIを使ったKMS利用手順例

AWS CLIを使ってデータの暗号化と復号の手順です。

CMKを作成する

出典 : http://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html

  • aws consoleで IAM > 暗号化キー > キーの作成 を選択します。
  • 手順に従い,何の鍵なのかをわかるようエイリアスと説明をつけ,鍵を管理できる&鍵で暗号化/復号できるIAMユーザー(orロール)を決め,CMKを作成します。

IAMユーザー(orロール)のポリシーを設定する

  • AWSKeyManagementServicePowerUser などKMSの諸権限のポリシーをIAMユーザー(orロール)に設定します。
  • aws kms list-keys で作成したCMK一覧を取得できます。

データを暗号化する

  • 暗号化したいデータを準備します。 今回は data.txt というファイルを暗号化したいと思います。

  • 先程作成したCMKを使って,DataKeyを作成します。

  • Plaintext は平文DataKeyです。データを暗号化するのに使用します。
  • CiphertextBlob は暗号化されたDataKeyです。
  • Plaintext をファイルに保存します。

  • encrypted-data-key はCMKがなければ復号できないので,Gitリポジトリで管理しても問題ありません。 CiphertextBlob はbase64でデコードしてからファイルに保存しておきます。

  • plaintext-data-key を使ってデータを暗号化します。
  • 暗号化したデータは,ファイルやDBなど用途に応じて好きな場所に保存してください。ここでは encrypted-data.txt に保存することとします。

  • 【重要】 データの暗号化ができたら, plaintext-data-key は必要ないので必ず削除しておきましょう。
  • data.txt も不要になったら削除しておきます。

データを復号する

  • CMKと暗号化されたDataKeyを使って,平文DataKeyを取得します。 plaintext-data-key と一致することがわかります。

  • この平文DataKeyを使ってデータの復号を行いましょう。 data.txt と一致することがわかります。

  • 【重要】 データの復号ができたら,必ず decrypted-data-key を削除しておきましょう。

Node.js AWS SDKを使って復号する

  • 復号のサンプルコード(JavaScript)です。
  • 復号した平文Data Keyをファイルに書き出す,ということはしていません。

もとのデータに復号できたことを確認しました。

まとめ

以上,AWS KMSを使った鍵の管理でした。


DACエンジニア採用情報

  関連記事

関連記事はありませんでした