グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



GCPのKMSを利用してファイルを暗号化する

Kubernetes(以下、K8s)を利用してサービスを運営していく上で、アーティスではGitOpsを取り入れています。

ここでは、GitOpsについて詳しく触れませんが、概要は、k8sのmanifestをCLIから適用せずに、Gitを通してパイプライン上から自動的にクラスタに適用させます。

その上で問題になるのが、機密情報を含んだSecretsの取り扱いです。

K8sで機密情報を扱うには、Secretsオブジェクトを利用することが基本となります。
しかし、manifest上ではBase64エンコードされているだけなので、下記の通り、Gitにコミットすると機密情報が漏洩します。

If you configure the secret through a manifest (JSON or YAML) file which has the secret data encoded as base64, sharing this file or checking it in to a source repository means the secret is compromised. Base64 encoding is not an encryption method and is considered the same as plain text.Secrets - Kubernetes

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を利用しています。

この記事を書いた人

tkr2f
tkr2f事業開発部 web application engineer
2008年にアーティスへ入社。
システムエンジニアとして、SI案件のシステム開発に携わる。
その後、事業開発部の立ち上げから自社サービスの開発、保守をメインに従事。
ドメイン駆動設計(DDD)を中心にドメインを重視しながら、保守可能なソフトウェア開発を探求している。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします