こんにちは!前回ConfigMapについてご紹介しましたが、今回はセキュリティが必要なデータを扱うSecret(シークレット)について見ていきましょう。パスワード、OAuthトークン、SSHキーのような機密情報をどのように管理すればよいでしょうか?

1. Secretとは何ですか? 🔒
Secretは、パスワード、トークン、キーなどの少量の機密データを保管・管理するためのオブジェクトです。ConfigMapと似ていますが、データをBase64でエンコードして保存する点が異なります。
💡 主要な要約– 効率性: Podが実行されるときにのみメモリにマウントされ、ディスクへの露出を最小限に抑えます。
– セキュリティ: 機密情報をアプリケーションイメージやYAMLファイルに露出させることなく注入できます。
2. Secretの作成 🛠️
シークレットもkubectlコマンドとYAMLファイルを通じて作成できます。
A. kubectlコマンドで作成
# ユーザー名とパスワードを含むシークレットを作成
kubectl create secret generic db-user-pass
--from-literal=username='admin'
--from-literal=password='S3cretP@ssw0rd'
B. YAMLファイルで定義
YAMLファイルを作成する際は、値が必ずBase64でエンコードされている必要があります。
- 例: admin → YWRtaW4=
- 例: S3cretP@ssw0rd → UzNjcmV0UEBzc3cwcmQ=
apiVersion: v1
kind: Secret
metadata:
name: db-user-pass
type: Opaque
data:
username: YWRtaW4=
password: UzNjcmV0UEBzc3cwcmQ=
3. Secretをコンテナに接続する 🔗
シークレットの使用方法はConfigMapとほぼ同じです。
① 環境変数として注入
spec:
containers:
- name: my-container
image: nginx
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-user-pass
key: password
② ボリュームとしてマウント(最も推奨される方法)
シークレットボリュームを使用すると、データがtmpfs(RAMベースのファイルシステム)に保存されるため、データがノードディスクに書き込まれず、より安全です。
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: db-user-pass
4. Kubernetes Secretの致命的な限界とその理由 ⚠️
多くの方が誤解されている点ですが、KubernetesのSecret機能だけでは完全なセキュリティを達成することは困難です。
なぜSecretだけでは不十分なのか?
- 単純なBase64エンコード: Secretデータは暗号化(Encryption)ではなく、エンコード(Encoding)されているだけです。つまり、誰でも
base64 -dコマンドで元の内容を見ることができます。 - etcd内での平文保存: 基本的にSecret情報はKubernetesのストレージであるetcdに暗号化されずに保存されます。etcdへのアクセス権を持つ人は、すべての秘密情報を盗み出すことができます。
- 権限管理の限界: RBACを通じてアクセスを制限できますが、Podを作成する権限がある場合、そのPodにSecretをマウントして内容を確認する裏技が可能です。
5. より安全な代替案: 外部Secret管理ツール 🛡️
専門的なセキュリティレベルを要求する環境では、Kubernetes Secretの代わりに(または組み合わせて)以下のソリューションを使用します。
- HashiCorp Vault: 業界標準のようなツールで、動的なパスワード生成と強力な暗号化機能を提供します。
- AWS Secrets Manager / Azure Key Vault: クラウドサービスが提供するマネージドセキュリティサービスです。
- External Secrets Operator (ESO): 外部ツール(Vault、AWSなど)の情報をKubernetes Secretに安全に同期させるオープンソースプロジェクトです。
まとめ 🎁
主君、Secretは便利ですが、「絶対的な金庫」ではありません。運用環境では、必ずetcdの暗号化(Encryption at Rest)を有効にするか、Vaultのような専門ツールを併用することをお勧めします。
コメントを残す