KubernetsのSecretのYAMLを暗号化したりするツールを作った
Kubernetes の Secret の YAML を暗号化したり、暗号化された YAML を編集したりする sekret というツールを作りました。
Kubernetes 側の Secret 暗号化の話ではなく、あくまでも YAML の暗号化の話です。
モチベーション
- Secret も他のリソースと同じように YAML でバージョン管理したい
- 暗号化してコミットしたい
- 暗号化された YAML を手軽に編集したい
- 簡単に復号して
kubectl apply -fしたい
できること
- 既存の YAML を暗号化する
- 暗号化された YAML を復号する
- 新しく暗号化 YAML を作成する
- 暗号化 YAML を編集する
デモ
インストール
go get か GitHub リリースからバイナリをダウンロードする感じです。
go get github.com/nownabe/sekret
curl -sSL -o /path/to/sekret https://github.com/nownabe/sekret/releases/download/v1.1.0/sekret_linux_amd64
chmod +x /path/to/sekret
使い方
こんな感じの sekret コマンドを実行します。
sekret command [options] file
サブコマンドとして enc/dec/new/edit があります。
全コマンド共通で ENCRYPTION_KEY 環境変数で暗号キーを指定します。
new と edit は EDITOR 環境変数でエディタを指定します。
これらはオプションでも指定できます。
暗号キーは 16 バイト又は 32 バイトです。
暗号化
暗号化してコミットするときはこんな感じです。enc コマンドを使います。
export ENCRYPTION_KEY=$(cat /dev/urandom | base64 | fold -32 | head -1)
sekret enc secret.yaml > secret.yaml.enc
git add secret.yaml.enc
git commit
復号
復号して apply するときはこんな感じです。dec コマンドを使います。
sekret dec secret.yaml.enc | kubectl apply -f -
新規作成
新しく暗号化された Secret の YAML を作成するときは new コマンドを使います。
export EDITOR=vim
sekret new secret.yaml.enc
指定したエディタが開き、こんな感じのテンプレートが表示されます。
apiVersion: v1
data:
Key: Value
kind: Secret
metadata:
creationTimestamp: null
name: new-secret
type: Opaque
Secret の data の値は Base64 でエンコードされている必要がありますが、sekret が自動でやってくれるので編集時は普通に書けば OK です。
値がバイナリとかで Base64 で編集したい場合は --decode-base64=false オプションをつけます。
保存前に Secret が正しいかどうかの Validation を行うので、Invalid な YAML だった場合は保存しません。
編集
暗号化 YAML を復号せず1に編集するには edit コマンドを使います。
sekret edit secret.yaml.enc
復号され Base64 デコードされた Secret の YAML が指定したエディタで開きます。
エディタを閉じれば再度 Base64 エンコード、暗号化を行い保存されます。
保存前に new と同様に validation も行われます。
おわりに
必要最低限という感じですが、Git で Secret を管理して CI まわすのには十分だと思います。
Footnotes
-
もちろん内部では復号しています。 ↩