GCPのKMSを利用してファイルを暗号化する
Kubernetes(以下、K8s)を利用してサービスを運営していく上で、アーティスではGitOpsを取り入れています。
ここでは、GitOpsについて詳しく触れませんが、概要は、k8sのmanifestをCLIから適用せずに、Gitを通してパイプライン上から自動的にクラスタに適用させます。
その上で問題になるのが、機密情報を含んだSecretsの取り扱いです。
K8sで機密情報を扱うには、Secretsオブジェクトを利用することが基本となります。
しかし、manifest上ではBase64エンコードされているだけなので、下記の通り、Gitにコミットすると機密情報が漏洩します。
GitOpsで自動化するためには、機密情報をGitにコミットする必要があるので、なんらかの方法で暗号化する必要があります。
そこで、今回はGCPで提供されているCloud KMS(Key Management Service)を利用して、機密ファイルを暗号化してみます。
Cloud KMSとはなんのサービスなのか
ファイルを暗号化するときに使用する対称鍵をクラウド上(GCP)に保管できます。 つまり、KMSで管理されている鍵にアクセスできる状態だと、gcloudコマンドから鍵を指定して、一発でファイルを暗号化できます。
又、鍵はクラウド上に保管されているため、ローカルにダウンロードして紛失したり漏洩するリスクが低下します。 対称鍵はその性質上、鍵を持っている人が増えれば増えるほど、漏洩するリスクが高まるので、複数人でも低リスクで鍵が使えます。(鍵を使うための権限の管理はGCPに統合されています)
その他にも、鍵のローテーションや、鍵の遅延的な破棄など、運用面でも非常に便利な機能がそろっています。
KMSで対称鍵を作る
では、早速KMSで対称鍵を作っていきます。
以下のコマンドは、gcloudコマンドがインストールされている前提です。 インストールが終わってない場合は、下記のリンクを参考にしてインストールしてください。
対称鍵を作るには、キーリングを先に作る必要があります。
今回は、asia-northeast1のみで利用する予定なので、locationにasia-northeast1を指定しました。
gcloud kms keyrings create [KEYRING_NAME] --location [LOCATION]
ref: https://cloud.google.com/sdk/gcloud/reference/kms/keyrings/create
キーリングの命名が悩ましいですが、サービスやロールにあった適度な粒度の命名をしたいところです。
$ gcloud kms keyrings list --location asia-northeast1
NAME
projects/artis-*****/locations/asia-northeast1/keyRings/*****
キーリングが作成されていることが確認できます。
次に、対称鍵を作成します。
gcloud kms keys create [KEY_NAME] --location [LOCATION] \
--keyring [KEYRING_NAME] --purpose encryption
ref: https://cloud.google.com/sdk/gcloud/reference/kms/keys/create
KEYRING_NAMEに、先程作成したキーリング名を指定します。
purposeは、勝手に指定するのではなく、「asymmetric-encryption, asymmetric-signing, encryption」の中から1つ指定する必要があります。
今回は、対称鍵での暗号化なので、encryptionを指定します。
$ gcloud kms keys list --keyring projects/artis-*****/locations/asia-northeast1/keyRings/***** --location asia-northeast1
NAME PURPOSE ALGORITHM PROTECTION_LEVEL LABELS PRIMARY_ID PRIMARY_STATE
projects/artis-*****/locations/asia-northeast1/keyRings/*****/cryptoKeys/**** ENCRYPT_DECRYPT GOOGLE_SYMMETRIC_ENCRYPTION SOFTWARE 1 ENABLED
キーリング内に、対称鍵が作成されたことを確認できます。
ファイルを暗号化、復号化する
ここまでで、暗号化するための準備が完了したので、実際にファイルを暗号化してみます。
gcloud kms encrypt \
--location asia-northeast1 \
--keyring ***** \
--key ***** \
--plaintext-file secret.yaml \
--ciphertext-file secret.yaml.enc
ref: https://cloud.google.com/sdk/gcloud/reference/kms/encrypt
今回はsecret.yamlを暗号化して、secret.yaml.encに書き出します。 暗号化されたファイルの内容を確認すると、暗号化されている事が確認できます。
次は、暗号化したファイルを復号化してみます。
gcloud kms decrypt \
--location asia-northeast1 \
--keyring ***** \
--key ***** \
--ciphertext-file secret.yaml.enc \
--plaintext-file secret.yaml
ref: https://cloud.google.com/sdk/gcloud/reference/kms/decrypt
復号化されたファイルの内容を確認すると、暗号化前の内容に戻っていることが確認できます。
まとめ
Cloud KMSで対称鍵を作って、ファイルを暗号化、復号化することができました。
これで、Gitに機密ファイルをコミットすることができるので、GitOpsにて自動的にSecretを作成することができます。
GCPには、さまざまなサービスが用意されているので、それぞれのサービスを使うために多少の学習が必要になります。
Cloud KMSのように非常に便利で、生産性が上がり、リスクが下がるサービスが多いので、学習にコストをかける十分な理由があります。
補遺
- なぜ、Kubesecを使わなかったの?
アーティスでは、CI/CDにCloud Buildを利用していて、Kubesecのカスタムドライバを見つけることができなかったので、直接KMSを利用しています。
この記事を書いた人
-
2008年にアーティスへ入社。
システムエンジニアとして、SI案件のシステム開発に携わる。
その後、事業開発部の立ち上げから自社サービスの開発、保守をメインに従事。
ドメイン駆動設計(DDD)を中心にドメインを重視しながら、保守可能なソフトウェア開発を探求している。
この執筆者の最新記事
関連記事
最新記事
FOLLOW US
最新の情報をお届けします
- facebookでフォロー
- Twitterでフォロー
- Feedlyでフォロー