KubernetesにおけるSecretの作成と活用方法

Secretは、Kubernetesクラスタ内で機密情報を安全に管理するためのネイティブリソースです。パスワード、APIトークン、TLS証明書など、平文で扱いたくないデータを、Base64エンコーディングを経て保存・配布できます。ただし、Secretは暗号化ストレージを提供するものではなく、アクセス制御とライフサイクル管理の基盤として設計されています。

Secretの生成手法

Secretは宣言的(YAML)および命令的(CLI)の両方の方法で作成可能です。

コマンドラインによる即時作成

以下のコマンドで、ユーザー名とパスワードを含むauth-credentialsというSecretを作成できます:

kubectl create secret generic auth-credentials \
  --from-literal=username=svc-admin \
  --from-literal=api-key=sk_live_8a9b7c1d2e3f4g5h

この操作により、Opaque型のSecretがデフォルト命名空間に生成され、各キーは自動的にBase64エンコードされます。

YAMLマニフェストによる定義

より再現性とバージョン管理を重視する場合は、以下のようなYAMLファイル(例:config-secret.yaml)を用意します:

apiVersion: v1
kind: Secret
metadata:
  name: config-secret
  labels:
    app: backend-service
type: Opaque
data:
  db-host: cHJvZC1kYi5jbHVzdGVyLmxvY2Fs
  db-port: NzMwMw==
  ssl-mode: cmVxdWlyZWQ=

上記のdataフィールドには事前にエンコード済みの値を指定します。エンコードは次のように実行可能です:

echo -n "prod-db.cluster.local" | base64
echo -n "7303" | base64
echo -n "required" | base64

適用はkubectl apply -f config-secret.yamlで行います。

Secretの確認と検証

作成後のSecretは以下のように確認できます:

  • 一覧表示:kubectl get secrets
  • 構造情報(エンコードされたキーのみ):kubectl describe secret auth-credentials
  • 生データのデコード(例):kubectl get secret auth-credentials -o jsonpath='{.data.username}' | base64 -d

Pod内での利用パターン

Secretは以下の3つの主要な方法でコンテナに提供されます:

1. ボリュームマウント(推奨)

Secretの全キーをファイルとしてマウントし、アプリケーションがファイルI/Oで読み込みます:

apiVersion: v1
kind: Pod
metadata:
  name: secure-app-pod
spec:
  containers:
  - name: app
    image: nginx:alpine
    volumeMounts:
    - name: creds-volume
      mountPath: /run/secrets
      readOnly: true
  volumes:
  - name: creds-volume
    secret:
      secretName: auth-credentials

この設定では、/run/secrets/username/run/secrets/api-keyが存在し、それぞれデコード済みの値を含みます。

2. 環境変数として注入

特定のキーだけを環境変数に展開する場合:

env:
- name: APP_USERNAME
  valueFrom:
    secretKeyRef:
      name: auth-credentials
      key: username
- name: APP_API_KEY
  valueFrom:
    secretKeyRef:
      name: auth-credentials
      key: api-key

3. イメージプル時の認証情報として使用

プライベートRegistryへのアクセスにはdocker-registry型のSecretが必要です:

kubectl create secret docker-registry regcred \
  --docker-server=https://index.docker.io/v1/ \
  --docker-username=your-name \
  --docker-password=your-pat \
  --docker-email=you@example.com

その後、Pod仕様にimagePullSecretsを追加して参照します。

運用上の留意点

  • SecretリソースはNamespaceスコープであり、他のNamespaceから直接参照できません。
  • etcd内ではBase64エンコードされた状態で保存されるため、静的暗号化(Encryption at Rest)を有効化することを強く推奨します。
  • RBACでsecretsリソースへのget/list権限を厳密に制御してください。
  • Secretの更新は、既存のPodに自動反映されません。新しいSecretを参照するには、Podの再起動またはローリングアップデートが必要です。

タグ: Kubernetes secret Base64 rbac etcd-encryption

7月4日 21:46 投稿