機密データ(Secret)を扱う
Kubernetes は標準機能として、Secrets を提供しています。
Secret は機密データを管理するためのリソースですが、API やマニフェストでは base64 エンコードされたデータとして扱われます。このデータは暗号化されておらず、簡単に平文に戻せるという問題があります。一般的に、Kubernetes リソースのマニフェストはGitOpsやInfrastructure as Code (IaC) 手法を使用し、YAML 形式で git リポジトリに管理します。しかし、Secret のデータは簡単に平文に戻せるため、そのまま git リポジトリに保存することは不適切です。
PFCP では、機密データを通常の Kubernetes マニフェストと一緒に GitOps 方式で管理できるように、機密データを暗号化する SealedSecret を提供します。
概要
SealedSecretは暗号化された機密データが含まれるリソースです。gitリポジトリに保存できます。
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: mysecret
namespace: mynamespace
spec:
encryptedData:
foo: AgBy3i4OJSWK+PiTySYZZA9rO43cGDEq..... # 暗号化された機密データ
このSealedSecretリソースはクラスタに適用された際、クラスタ内の鍵で復号され、通常のSecretリソースに展開されます。
apiVersion: v1
kind: Secret
metadata:
name: mysecret
namespace: mynamespace
data:
foo: YmFy # base64でエンコードされた"bar"
SealedSecretを作成する
SealedSecret を作成するには、kubeseal コマンドを利用します。kubeseal をインストールするには幾つかの方法があります。詳しくは sealed-secrets のドキュメントをご参照ください。Bitnami がメンテナンスするリリースを利用することを推奨します。
まずは、通常の Kubernetes Secret を作成し、ファイルに保存します。kubectl コマンドで作成できます。
echo -n secret-data | kubectl create secret generic mysecret \
--dry-run=client \
--from-file=secret-name=/dev/stdin \
-o yaml >secret.yaml
このようなファイルができます。
apiVersion: v1
kind: Secret
metadata:
name: mysecret
data:
secret-name: c2VjcmV0LWRhdGE=
次に、kubeseal コマンドで、SealedSecret を作成します。kubeseal はクラスタ内の sealed-secrets コントローラから公開鍵(証明書)を取得し、取得した公開鍵でSecretを暗号化し、SealedSecretを出力します。
kubeseal \
--controller-namespace sealed-secrets-org-<組織名> \
-f secret.yaml \
-o yaml > sealedsecret.yaml
このようなファイルができます。
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: mysecret
spec:
encryptedData:
secret-name: "AgBy3i4OJSWK+PiTySYZZA9rO43cGDEq....."
この sealedsecret.yamlファイルをgitリポジトリに保存できます。
Note
secret.yamlには暗号化されていない機密データが含まれるため、決してgitリポジトリに保存しないでください。
git add sealedsecret.yaml
git commit -m "add new secret"
SealedSecretをクラスタに適用するとクラスタ側で自動的に展開され、通常の Kubernetes Secret と同様に利用できます。詳しくは Kubernetes ドキュメントをご参照ください。
公開鍵、秘密鍵の扱い
機密データを暗号化、復号するためのキーペア(公開鍵、秘密鍵)は組織専用で、原則 PFCP で管理します。ユーザ側で管理する必要はありません。公開鍵と秘密鍵は自動的に、定期的にローテーションされます。秘密鍵はクラスタ内にしか存在しないので、ご安心ください。