BETA

local開発用のAWS KMS local-kmsを使う

投稿日:2019-06-07
最終更新:2019-06-08

nlocal-kmsはAmazon KMSのように振る舞うダミーサーバーです。
local-kmsへ問い合わせるようにすることでAmazon KMSに問い合わせることなく開発が進められます。

local-kmsのDocker Imageをダウンロードします。

docker pull nsmithuk/local-kms  

dockerを用いてlocal-kmsを起動します。

docker run -p 8080:8080 -e REGION=ap-northeast-1 nsmithuk/local-kms  

KeyIdを発行します。

POST http://localhost:8080/  
X-Amz-Target: TrentService.CreateKey  
Content-Type: application/json; charset=utf-8  

{}  

結果::

{  
  "KeyMetadata": {  
    "AWSAccountId": "111122223333",  
    "Arn": "arn:aws:kms:ap-northeast-1:111122223333:key/834140e8-e12f-4047-a723-8261bd21c171",  
    "CreationDate": 1557292212,  
    "Enabled": true,  
    "KeyId": "834140e8-e12f-4047-a723-8261bd21c171",  
    "KeyManager": "CUSTOMER",  
    "KeyState": "Enabled",  
    "KeyUsage": "ENCRYPT_DECRYPT",  
    "Origin": "AWS_KMS"  
  }  
}  
// POST http://localhost:8080/  
// HTTP/1.1 200 OK  
// Content-Type: application/x-amz-json-1.1  
// Date: Wed, 08 May 2019 05:10:12 GMT  
// Content-Length: 317  
// Request duration: 0.021481s  

利用するkeyを登録します。Plaintextにはbase64でエンコードした値を設定します。

POST http://localhost:8080/  
Content-Type: application/json  
X-Amz-Target: TrentService.Encrypt  

{  
  "KeyId": "834140e8-e12f-4047-a723-8261bd21c171",  
  "Plaintext": "dGVzdA=="  
}  

結果::

{  
  "KeyId": "arn:aws:kms:ap-northeast-1:111122223333:key/834140e8-e12f-4047-a723-8261bd21c171",  
  "CiphertextBlob": "UGFybjphd3M6a21zOmFwLW5vcnRoZWFzdC0xOjExMTEyMjIyMzMzMzprZXkvODM0MTQwZTgtZTEyZi00MDQ3LWE3MjMtODI2MWJkMjFjMTcxAAAAAEb30YwGZIgUXvTlNpB3LLXl544WZucO+LzvlE3jgDCT"  
}  
// POST http://localhost:8080/  
// HTTP/1.1 200 OK  
// Content-Type: application/x-amz-json-1.1  
// Date: Wed, 08 May 2019 05:31:03 GMT  
// Content-Length: 268  
// Request duration: 0.015830s  

ここで取得したCiphertextBlobを使って実際にboto3.clientから鍵を取り出してみます。

環境変数にリージョンを設定します。この環境変数はboto3が参照します。

(setenv "AWS_DEFAULT_REGION" "ap-northeast-1")  

boto3.clientを使って鍵を取り出します。endpointurlにはlocal-kmsのURLを指定します。CiphertextBlobは先程鍵を保存したときのレスポンスのCiphertextBlobの値です。この値はbase64でエンコードされているので、その値をデコードしてclient.decryptメソッドに渡します。

import base64  
import boto3  
client = boto3.client('kms', endpoint_url='http://127.0.0.1:8080')  
res = client.decrypt(CiphertextBlob=base64.b64decode(  
    b"UGFybjphd3M6a21zOmFwLW5vcnRoZWFzdC0xOjExMTEyMjIyMzMzMzprZXkvODM0MTQwZTgtZTEyZi00MDQ3LWE3MjMtODI2MWJkMjFjMTcxAAAAAEb30YwGZIgUXvTlNpB3LLXl544WZucO+LzvlE3jgDCT"  
    ))  

return res  # for org-babel results  

結果::

{'KeyId': 'arn:aws:kms:ap-northeast-1:111122223333:key/834140e8-e12f-4047-a723-8261bd21c171', 'Plaintext': b'test', 'ResponseMetadata': {'HTTPStatusCode': 200, 'HTTPHeaders': {'content-type': 'application/x-amz-json-1.1', 'date': 'Wed, 08 May 2019 05:31:32 GMT', 'content-length': '115'}, 'RetryAttempts': 0}}  

Plaintextに test というバイト列が返されました。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

そして粛々と生きる

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!