Kubernetes Learning 第21章:Secretの暗号化とマウント方法 〜機密情報を安全に扱うKubernetesの基本〜

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 に保存します。これを安全にするために、次のような仕組みがあります:

  1. etcd データの暗号化を有効にする(Encryption at Rest)
    • kube-apiserver の設定で暗号化プロバイダ(AES-GCMなど)を有効にします。
  2. 通信の暗号化
    • Secretの送受信には TLS が使われているので、通信路上では秘匿性が保たれます。
  3. RBACでアクセス制限
    • Secretへのアクセスを RoleClusterRole でしっかり制限しましょう。

🛠️ 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(読み取り専用)になっており、安全です。


👮 安全に使うためのベストプラクティス

項目説明
RBACSecretへのアクセス権限を厳しく制限
etcd暗号化kube-apiserver で保存データの暗号化を有効化
Gitに載せないYAMLに直接書く場合は、Gitなどに絶対に載せない
イメージと分離Secretの情報は必ずコンテナイメージ外で管理
自動更新の考慮cert-managerなどを使って証明書Secretを自動更新可能

✅ まとめ

項目説明
用途パスワード、APIキーなどの機密情報の管理
作成方法CLI推奨。YAMLではBase64エンコードが必要
Podへの渡し方環境変数 or ファイルマウント
セキュリティ対策etcd暗号化、RBAC制限、Git非公開などを徹底

mh

Related Posts

Kubernetes Learning 第20章:ConfigMapの詳細 〜アプリケーション設定をKubernetesで管理する〜

Kubernetesでアプリケーションを運用していると、「環…

Kubernetes Learning 第19章:ローカルストレージとクラウドストレージ(EBS, NFSなど)

Kubernetesではアプリケーションにストレージを提供す…

You Missed

Kubernetes Learning 第21章:Secretの暗号化とマウント方法 〜機密情報を安全に扱うKubernetesの基本〜

  • 投稿者 mh
  • 5月 25, 2025
  • 6 views

Android application development 第25章:Androidアプリ開発における単体テスト(JUnit)

  • 投稿者 mh
  • 5月 25, 2025
  • 5 views

Kubernetes Learning 第20章:ConfigMapの詳細 〜アプリケーション設定をKubernetesで管理する〜

  • 投稿者 mh
  • 5月 24, 2025
  • 18 views

Android application development 第24章:HiltによるDI導入とその注意点

  • 投稿者 mh
  • 5月 24, 2025
  • 19 views

Kubernetes Learning 第19章:ローカルストレージとクラウドストレージ(EBS, NFSなど)

  • 投稿者 mh
  • 5月 23, 2025
  • 35 views

Android application development 第23章:Javaエンジニアに向けたDIの復習

  • 投稿者 mh
  • 5月 23, 2025
  • 29 views