概要
Kubernetes の Secret 機能はそのまま使用しても大丈夫か
Kubernetes の Secret とは?
種々の秘匿情報を保持する機能です。
デフォルトだとBase64エンコードされます。
例えば公式ドキュメントにもある例ですが、
# Create files needed for rest of example.
echo -n 'admin' > ./username.txt
echo -n '1f2d1e2e67df' > ./password.txt
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
とすると
apiVersion: v1
kind: Secret
metadata:
name: db-user-pass
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
こんな感じのyamlができます。
k8sのpodにファイルとしてマウントしたり、pod起動時の環境変数に値を渡したりできます。
k8sのSecretの問題点
こんな感じでパスワードや証明書、SSH公開鍵等を管理するのに便利なSecretですが何点か気になる点があります。
- k8sで強い権限を持っている管理者から見えてしまう
- base64エンコードなので中身が見えたら簡単にデコードできる。
果たして皆さん、k8sの強権限者はアプリの強権限者と同じでしょうか?
見えなくていい人からアプリのシークレットが見えてませんか?
Base64エンコードで大丈夫でしょうか?
やりようはない?
一案としてですが HashiCorp Vault というのがあります。
詳細は省きますが、様々なSecret情報を管理してくれるOSSです。
エンタープライズ版もあります。
これを使うことでk8sのSecret情報をVault内部に隠してしまうことができます。
また、中間認証局としても振る舞えるらしいです。※あんまり調べてない
まとめ
生で使うのはやめて Vault などの Secret 管理ツールを使いましょう。