KubernetesのSecretのYAMLを暗号化したり、暗号化されたYAMLを編集したりするsekretというツールを作りました。

nownabe/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まわすのには十分だと思います。


  1. もちろん内部では復号しています。