Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

機密データ(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 で管理します。ユーザ側で管理する必要はありません。公開鍵と秘密鍵は自動的に、定期的にローテーションされます。秘密鍵はクラスタ内にしか存在しないので、ご安心ください。