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まわすのには十分だと思います。
-
もちろん内部では復号しています。 ↩︎