見出し画像

【GCP】KMSを使ってシークレットを管理する方法のお勉強

以前ワーッて納期に追われながら実装して、全然覚えていなかったので一度まとめておこうと思いまして。

KMSって何

key management system。キーをマネジメントするシステム。秘匿したい情報をの暗号化⇔復号化をやってくれて、暗号鍵の管理をしてくれる。

使い方のイメージ

【パスワードなどの暗号化したい情報】→平文で保存しておきたくないじゃん。

保存するときは【秘密情報】→【kmsが発行した鍵】を使って暗号化→【暗号化した秘密情報】をファイルとして保存しておく

使う時は、【暗号化した秘密情報ファイル】をプログラムから呼び出し→kmsにファイルから読み出した【暗号化した秘密情報】を投げる→【秘密情報】が戻ってくるので、それを使う

鍵の発行

GCPの管理画面>セキュリティ>暗号鍵を選んでキーリング(鍵の束)と鍵を発行する
画面の指示に従って作れば作れる。
(コマンドラインからでも出来るけど、GUI使った方がわかりやすいので)

暗号化

まず、暗号化したい情報を一旦平文で保存しておく。(GoogleCloudSDKは入っているものとする)

$gcloud auth login

しておいて、

$ gcloud kms encrypt --location global \
 --keyring YOUR_KEYRING --key YOUR_KEY \
 --plaintext-file hoge/kms/seacret/plaintext.txt \
 --ciphertext-file hoge/kms/key/seacret_encrypted

YOUR_KEYRINGとYOUR_KEYには先ほど発行したキーリングと鍵の名前を入れる。plaintext-fileには平文のファイルパスを、ciphertext-fileには暗号化後の任意のファイル名を入力。

で、出力されたバイナリファイルを保存しておく。

復号化

pythonの場合

from google.cloud import kms_v1

def __decript():
   cipherTextFile = "hoge/kms/key/seacret_encrypted"
   client = kms_v1.KeyManagementServiceClient()
   with open(cipherTextFile,"rb") as f:
       ciphertext = f.read()
   name = client.crypto_key_path_path("encryptionkeys", "global", YOUR_KEYRING,YOUR_KEY)
   response = client.decrypt(name, ciphertext)
   encordtext = response.plaintext.decode("UTF-8")
   return(encordtext)

で、平文が取得できる

色々細かいところが抜けている気はするけど、とりあえず最低限これでなんとかなるはず

この記事が気に入ったらサポートをしてみませんか?