Kubernetesでは、**機密性の高い情報(パスワード、APIキー、証明書など)**を安全に管理するために、**Secret(シークレット)**というリソースが用意されています。
ConfigMapと似ていますが、Secretは**「セキュリティが求められる情報」**を扱うため、より慎重な設計と使い方が求められます。
この章では、Secretの基本から、暗号化の仕組み、Podへの渡し方までを解説します。
🔐 Secretとは?
Secretは、機密性のある設定情報をBase64でエンコードして保存するリソースです。Kubernetesでは、Pod内に直接値を埋め込まず、Secretを経由して値を渡すことで、セキュアな運用を実現します。
☑ 主な用途
- データベースのパスワード
- 外部サービスのAPIキー
- TLS証明書/鍵ペア
⚠️ Base64は「暗号化」ではない!
Secretの値はYAMLファイル上ではBase64でエンコードされていますが、これはただの文字コード変換です。誰でもデコードできます。
例:
data:
password: cGFzc3dvcmQxMjM=
上記のBase64文字列は password123
という平文になります。
したがって、KubernetesのSecretの保存先や通信経路を安全に保つことが重要です。
🔒 Secretの暗号化(Etcd上での保護)
Kubernetesは、Secretなどのリソースを etcd
に保存します。これを安全にするために、次のような仕組みがあります:
- etcd データの暗号化を有効にする(Encryption at Rest)
- kube-apiserver の設定で暗号化プロバイダ(AES-GCMなど)を有効にします。
- 通信の暗号化
- Secretの送受信には TLS が使われているので、通信路上では秘匿性が保たれます。
- RBACでアクセス制限
- Secretへのアクセスを
Role
やClusterRole
でしっかり制限しましょう。
- Secretへのアクセスを
🛠️ Secretの作成方法
① CLIで作成(推奨)
kubectl create secret generic my-secret \
--from-literal=username=admin \
--from-literal=password=pa$$w0rd
② YAMLで作成(注意:Base64手動エンコード)
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: YWRtaW4= # admin
password: cGEkJHcwcmQ= # pa$$w0rd
エンコード例:
echo -n 'admin' | base64
📦 Podへの渡し方
SecretはPod内に以下の2通りで渡せます。
① 環境変数として渡す
env:
- name: DB_USER
valueFrom:
secretKeyRef:
name: my-secret
key: username
アプリケーション側が環境変数から読み取る構成になります。
② ファイルとしてマウント
volumes:
- name: secret-volume
secret:
secretName: my-secret
volumeMounts:
- name: secret-volume
mountPath: "/etc/secret"
readOnly: true
これにより /etc/secret/username
というファイルに値が書き込まれ、Pod内から読み取れるようになります。
📌 ファイルのパーミッションはデフォルトで
0400
(読み取り専用)になっており、安全です。
👮 安全に使うためのベストプラクティス
項目 | 説明 |
---|---|
RBAC | Secretへのアクセス権限を厳しく制限 |
etcd暗号化 | kube-apiserver で保存データの暗号化を有効化 |
Gitに載せない | YAMLに直接書く場合は、Gitなどに絶対に載せない |
イメージと分離 | Secretの情報は必ずコンテナイメージ外で管理 |
自動更新の考慮 | cert-managerなどを使って証明書Secretを自動更新可能 |
✅ まとめ
項目 | 説明 |
---|---|
用途 | パスワード、APIキーなどの機密情報の管理 |
作成方法 | CLI推奨。YAMLではBase64エンコードが必要 |
Podへの渡し方 | 環境変数 or ファイルマウント |
セキュリティ対策 | etcd暗号化、RBAC制限、Git非公開などを徹底 |