ハラミTech

技術系ブログです

秘密鍵を安全に保存・取得するコマンド「cloudkms」を作った

GCPには秘密鍵を暗号化するサービス「Cloud KMS」というものがあります。
それを利用し、暗号化した秘密鍵などをGCSに保存すると、鍵をクラウドストレージ上に保存することができます。

しかし、そのGCSに置くときや取得するとき、正直めんどくさいです。
それを簡単にするために、「cloudkms」というコマンドを作りました!

https://github.com/morix1500/go-cloudkms

cloudkmsとは?

cloudkmsは、CloudKMSを使って秘密鍵を暗号化・GCSに置くまでをいい感じにやってくれます。
また、cloudkmsでGCSに配置した秘密鍵を、簡単に復号化しつつ取得することもできます。

使用例

使用例を見ていただければ使い方はわかるとおもいます。

# Login is required at gcloud
$ gcloud auth application-default login

# create sample key file
echo "xxxxxxxxxxxxxxxxx" > api_key.txt

# put key file
$ cloudkms put api_key.txt \
               --bucket keyfiles-gcs-bucket \
               --project sample-111 \
               --keyring sample-keyring \
               --keyname sample-keyring-key
Upload api_key.txt

$ rm -f api_key.txt

# get key list
$ cloudkms list --bucket keyfiles-gcs-bucket
service-account-key.json
api_key.txt

# Confirm the contents of the file encrypted by Cloud KMS
$ gsutil cat gs://keyfiles-gcs-bucket/kms-keys/api_key.txt.encrypted
CiQAPX9xtlnCmxixrQipWt2XixqCrMGUaW3caVkEe1QIdRg2Fj0SOwBYHqWMJ0orj3JXWu6203bHHu3cfXPW+dve3zIPlDzzbDrdMv70Q6cRorwAZrY8TY0VdZcXpt3BW6qY%

# get key file
$ export KMS_GCS_BUCKET=keyfiles-gcs-bucket
$ export KMS_PROJECT=sample-111
$ export KMS_KEYRING=sample-keyring
$ export KMS_KEYNAME=sample-keyring-key

$ cloudkms get api_key.txt
Download api_key.txt

$ cat api_key.txt
xxxxxxxxxxxxxxxxx

例の通り、GCSのバケットを指定したりCloud KMSの鍵名を指定したりといろいろやる必要があります。
このへんはコマンド引数でも環境変数でも指定できるようにしてます。

またこのコマンドを使う際は

  • 鍵を保存するためのGCSバケット
    • バケット配下に「kms-keys」というフォルダを作り、そこに鍵を保管します
  • Cloud KMSのKeyringとその鍵

が必要になってきます。

インストール方法

golangで作ってるので、1バイナリ置くだけでインストール完了です。
詳しいインストール方法はGitHubをご覧ください。

最後に

このコマンドのおかげでだいぶお手軽にCloudKMSを利用した暗号化・復号化ができるようになりました。
業務で使いそうなので、ちょいちょい機能は使っていこうと思います。

個人的に悔やまれるのは、テストコードの書き方です。
GCPのGCSやCloud KMSをテストコードを書くときどうすればいいか答えが出ず、
テストのときも実際にGCPを利用することにしました。

MockやStubを作ればよかったんでしょうが、使うサービスも多かったので諦めました。
この辺こうやればいいよ!っていうのあったらぜひおしえてください!

では!