LoginSignup
33
29

More than 1 year has passed since last update.

AWS KMS を awscli から利用してみる

Last updated at Posted at 2016-01-21

KMS

そのまま置いておきたくないデータを暗号化するとして、その暗号化に使う鍵をどうするかという問題がありますが、AWSがそれを持ってくれるというサービスです。

AWSが管理するキー(カスタマーマスターキー)はエクスポートすることが出来ないようになっていて、安全性が確保されています。
よって、暗号化、復号にはAWS KMS経由でやりとりすることが必須となります。この手順をawscliで試してみます。

暗号化する対象はデータサイズ制限があり、またさほど速度も出ないので処理ごとに暗号化/復号したりや大きなデータを対象とする場合には

  1. カスタマーマスターキーから、暗号化されたデータキーと平文のデータキーをもらう
  2. 平文のデータキーを使って任意の方法で暗号化したら平文のデータキーは即座に廃棄する
  3. 復号が必要になったら、暗号化されたデータキーから平文のデータキーを得て復号する。平文のデータキーはなるべく早く破棄する

といった手順になっています。

しかし、今回の目的はアプリケーションで使うパスワードやAPIキーの類を暗号化することなので、aws kms encryptを使って平文をカスタマーマスターキーから直接暗号化していくことにします。

Requirements

  1. awscli
    • pip install awscli
  2. awsのcredential。awsのインスタンスであればroleを割り当てるかIAMユーザのACCESS_KEYとSECRET_ACCESS_KEYをaws configureで設定済みであること

カスタマーマスターキー

cliからだとポリシーが面倒なのでWebのコンソールから作成しちゃいます。
IAMの「暗号化キー」から「キーの作成」です。
管理アクセスユーザと使用アクセスユーザは適切に割り当てましょう。
割り当てたユーザ側にも、使用するための権限が必要です。

aws kms encrypt

key-aliasに鍵を作った時のエイリアスを入れます。
暗号化の対象を--plaintextで渡せますが、ファイルなどで渡すこともできるので詳しくはaws kms encrypt helpを参照してください。

aws kms encrypt --key-id alias/key-alias --plaintext "apikey" --query CiphertextBlob --output text

これで暗号化された文字列を受け取ることが出来ました。

他に--encryption-contextを指定して暗号化することで対象の整合性を確認することができます。

aws kms decrypt

decryptの際にはkey-idは不要です。暗号化されたものに含まれているからです。

 aws kms decrypt --ciphertext-blob fileb://<(echo 'さっき受け取った文字列'|base64 -d) | jq .Plaintext --raw-output |base64 -d

これでapikeyという文字列が出てくるはずです。

33
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
29