🔐 Kubernetes Secret: 機密情報を安全に管理する方法(とその限界)

こんにちは!前回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だけでは不十分なのか?

  1. 単純なBase64エンコード: Secretデータは暗号化(Encryption)ではなく、エンコード(Encoding)されているだけです。つまり、誰でもbase64 -dコマンドで元の内容を見ることができます。
  2. etcd内での平文保存: 基本的にSecret情報はKubernetesのストレージであるetcdに暗号化されずに保存されます。etcdへのアクセス権を持つ人は、すべての秘密情報を盗み出すことができます。
  3. 権限管理の限界: 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のような専門ツールを併用することをお勧めします。


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です