sops
概要
- ファイルの暗号化と復号を行うオープンソースツール
- 2015年にMozillaで開始されたプロジェクトで、2023年にCNCF(Sandbox)へ寄贈され、現在は getsops コミュニティが開発している
- YAML、JSON、ENV、INI、バイナリ等のフォーマットに対応しており、値のみを暗号化してキーを平文のまま残すことができるため、Git等のバージョン管理と相性が良い
- 暗号化の鍵として、AWS KMS、GCP KMS、Azure Key Vault、HashiCorp Vault等のクラウドKMSのほか、ageやPGP等のローカル鍵を使用できる
インストール
GitHub Releasesからバイナリを取得する場合
$ curl -LO https://github.com/getsops/sops/releases/download/v3.13.1/sops-v3.13.1.linux.amd64
$ chmod +x sops-v3.13.1.linux.amd64
$ sudo mv sops-v3.13.1.linux.amd64 /usr/local/bin/sops
Homebrewを使用する場合
$ brew install sops
鍵(Key Provider)の準備
ageを使用する場合
ここではローカルで手軽に利用できるageを用いたセットアップ手順を示す
ageのインストールと鍵作成
$ brew install age
$ age-keygen -o key.txt
# 作成された公開鍵と秘密鍵を確認する
$ cat key.txt
# public key: age1...
環境変数の設定
# 復号時に秘密鍵を参照するための環境変数
$ export SOPS_AGE_KEY_FILE=$(pwd)/key.txt
GCP KMSを使用する場合
必要な権限
- 実行元のアカウント(ユーザーやサービスアカウント)に対象キーへの
roles/cloudkms.cryptoKeyEncrypterDecrypterロールが必要
基本的な使い方
ageを使用する場合
暗号化
公開鍵を指定してファイルを暗号化する
$ sops -e --age age1... secrets.yaml > secrets.enc.yaml
復号
環境変数に秘密鍵が設定されていれば、自動的に鍵を検出して復号が行われる
$ sops -d secrets.enc.yaml > secrets.dec.yaml
GCP KMSを使用する場合
暗号化
対象キーのリソースパスを指定して暗号化する
$ sops --gcp-kms projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY] -e secrets.yaml > secrets.enc.yaml
復号
暗号化ファイル内のメタデータに鍵情報が記録されているため、復号時にキーを指定する必要はない 実行環境に対象キーの復号権限を持つ認証情報(Application Default Credentials等)があれば、そのまま復号できる
$ sops -d secrets.enc.yaml > secrets.dec.yaml
インプレース編集
暗号化されたファイルを直接テキストエディタで開き、保存時に自動で再暗号化する
$ sops secrets.enc.yaml
- 環境変数
$EDITORで指定されたエディタが起動する
設定ファイル(.sops.yaml)の利用
プロジェクトのルートディレクトリに .sops.yaml を配置することで、暗号化時に使用する鍵のルールを自動化できる
creation_rules:
# .enc.yaml で終わるファイルに適用するルール
- path_regex: \.enc\.yaml$
age: age1...
# 特定のディレクトリ配下のファイルをGCP KMSで暗号化するルール
- path_regex: prod/.*
gcp_kms: projects/my-project/locations/global/keyRings/my-keyring/cryptoKeys/my-key
設定ファイルがある場合、個別にオプションで鍵を指定せずに暗号化を実行できる
$ sops -e secrets.enc.yaml
Gitとの連携
暗号化したファイルをリポジトリで管理する際、Gitの差分表示(git diff)で平文の差分を確認できるようにする
gitattributesの設定
プロジェクトルートの .gitattributes に以下を記述する
*.enc.yaml diff=sopsdiffer
git configの設定
sopsを差分表示ツールとして登録する
$ git config diff.sopsdiffer.textconv "sops -d"
- この設定により、
git diffを実行した際に対象の暗号化ファイルが一時的に復号され、平文の差分が表示される