KubernetsのSecretのYAMLを暗号化したりするツールを作った

Contents
  1. モチベーション
  2. できること
  3. デモ
  4. インストール
  5. 使い方
  6. 暗号化
  7. 復号
  8. 新規作成
  9. 編集
  10. おわりに

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

Footnotes

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