Back

/ 3 min read

miseとsopsとkmsでシークレット管理

今までアプリケーションで利用している各secret値はSOPS + GCP KSM + Secret Managerで管理していた。ただし、ローカルでインフラの設定値などでもこの値を取得したい場面があり、ローカル環境でどのように値を設定するかを思案していた。 自分の環境ではmiseを使ってdev toolの設定をしているが、ちょうどdirenvに近い環境変数の設定方法があったのでこれを使うようにした。

Secretのファイルの作成

プロジェクトのルートディレクトリにsecretを記載したファイルを作成する。自分の場合は .env.yaml の名称で作成する。このファイルは.gitignoreに追加してgithubにpushされないようにしておく。

GITHUB_PAT: foo
...

ファイルの暗号化

SOPSでファイルの内容を暗号化する。暗号化にはGCP KMSで作成した鍵を用いる。

Terminal window
sops --encrypt --gcp-kms YOUR_CRYPT_KEY .env.yaml > .env.yaml.enc

.env.yaml.encにsecret値が暗号化されたyamlファイルが生成され、これをgit管理する。 SOPSでは例えばageを使うことでシンプルに暗号化できるが、複数のマシンで復号することがあったり、復号するマシンはVMなので作ったり壊したりで鍵を紛失しそうなので今回はKMSの鍵を利用した。

miseで環境変数として読み込み

プロジェクトのルートディレクトリの.mise.tomlに以下のように記載する。

[env]
_.file = ".env.yaml"

これによってプロジェクト内のディレクトリにいるときは環境変数にsecret値が設定される。 2024/12/26時点では、miseのexperimentalな機能としてsopsで暗号化されたファイルから自動で設定を読み出す機能がある (参考)。 今回は復号化されたファイルが元々存在する前提の運用なのでこの機能は使わずそのまま環境変数として読み込む形にした。