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 第37章:JenkinsやGitHub ActionsからのKubernetesデプロイ例 ~CI/CDツールとKubernetesをつなげてみよう~

Kubernetes Learning 第36章:Argo CDとFluxの概要~Kubernetesの自動運用を支えるGitOpsツール~

You Missed

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第11章:Cloud Load Balancing:あなたのGCPリソースを「賢く振り分ける交通整理の達人」

  • 投稿者 mh
  • 6月 18, 2025
  • 9 views

Kubernetes Learning 第37章:JenkinsやGitHub ActionsからのKubernetesデプロイ例 ~CI/CDツールとKubernetesをつなげてみよう~

  • 投稿者 mh
  • 6月 17, 2025
  • 11 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第10章:Cloud DNS:インターネットの「電話帳」サービス

  • 投稿者 mh
  • 6月 16, 2025
  • 15 views

Kubernetes Learning 第36章:Argo CDとFluxの概要~Kubernetesの自動運用を支えるGitOpsツール~

  • 投稿者 mh
  • 6月 15, 2025
  • 30 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第9章:IPアドレス(外部IP、内部IP、静的IP):GCPリソースの「住所」と「電話番号」

  • 投稿者 mh
  • 6月 14, 2025
  • 28 views

Kubernetes Learning 第35章:GitOpsとは?~Kubernetes運用をもっとスマートにする考え方~

  • 投稿者 mh
  • 6月 13, 2025
  • 52 views