.envファイルを暗号化して管理する (SOPS + AGE)

概要

codex等のAIエージェントを使うときに、APIキーの扱いに困るケースがある。
例)AIエージェントにAPIキー渡してしまうと、場合によっては勝手に使われてしまう可能性もあるので、出来れば直接渡したくない。

そういったケースの場合に、SOPSというツールが使用できる。このツールは、設定ファイル(jsonやyaml等)やdotenvファイル .env の暗号化・復号化・編集・一時的に復号して実行等に対応したツールである。

SOPSの特徴として、暗号化の際、ファイル内のキーは暗号化せず、それ以外(値やコメント)を暗号化するので、差分管理がしやすい。したがって、gitのリポジトリに暗号化したファイルをコミットして管理するのが基本となる。
似たツールには、1 Password CLI や Infisical、 cyberark/summonがある。いずれも、アカウントに紐づくクラウドサービスや、バックエンドとなるパスワードマネージャーでまとめて管理する中央集権な仕組みとなっているため、その点がSOPSとは大きく異なる。

また、SOPS自身は、実は暗号化・復号化そのものをおこなう仕組みは持っていない。暗号化・復号化をのために、外部のコマンドを使う形になる。SOPSと連携させるコマンドとして、代表的なものが age である。ageコマンドは、公開鍵を用いたファイル暗号化ツールであり、シンプルで扱いやすいのが特徴である。

ここでは、Linux環境に SOPS + age の組み合わせで環境を構築し、暗号化した .env ファイルを用いて、スクリプトを実行するまでを整理する。

手順

SOPS, ageのインストール

環境によりこの辺りは異なるので、公式サイトを参照すること。
以下は、Debian 13 + miseインストール済みの環境の場合。

mise use -g sops
sudo apt install age

SOPS向けにageの秘密鍵を生成

Linuxの場合は、公式ドキュメントの記載によると、

  • $XDG_CONFIG_HOME/sops/age/keys.txt ($XDG_CONFIG_HOMEが設定済)
  • $HOME/.config/sops/age/keys.txt ($XDG_CONFIG_HOMEが未設定)
    に秘密鍵を配置する必要がある。

秘密鍵の生成には age-keygen が使える。$XDG_CONFIG_HOMEが未設定であれば、以下のようなコマンドになる。

mkdir -p $HOME/.config/sops/age/
age-keygen | tee -a $HOME/.config/sops/age/keys.txt
chmod 600 $HOME/.config/sops/age/keys.txt

このコマンドを実行すると、公開鍵が表示される Public key: age1e3n7qsujqx... のでメモしておく。

Hint

ここで生成した秘密鍵は、対象のリポジトリを扱う全ての人に別途安全な手段で共有が必要。 共有された秘密鍵は、↑のファイルの末尾に追記すれば良い。

リポジトリにSOPSの設定

リポジトリのルートに .sops.yamlを作成し、以下のように記述する。
なお、age1e3n7qsujqx...の部分は、先ほど秘密鍵を生成した時にメモした公開鍵。

creation_rules:
    - age:
          - age1e3n7qsujqx...

このファイルに書かれた公開鍵で、dotenvファイルは暗号化される。
公開鍵による暗号化のため、このファイルはコミットしても問題無い。

暗号化されたdotenvファイルの作成・編集

暗号化したdotenvファイルを作成するには、以下のコマンドを実行する。
このとき、 .enc.env は、暗号化したdotenvのファイル名。ファイル名は好きなもので良いが、末尾は .env としておくのが望ましい。

コマンドを実行するとエディタが開く。このエディタ上で、通常のdotenvファイルと同様に、環境変数の定義を記述する。保存して終了すると、暗号化されたdotenvファイル( 今回の例だと、.enc.env)が作成される。

sops edit .enc.env
Hint

既に .envファイルが存在する場合は以下のコマンドで変換することも可能。 変換後は、.envファイルを削除するのをお忘れなく。

sops encrypt .env | tee .enc.env

dotenvファイルを一時的に復号化して環境変数に反映してコマンドを実行

exec-envサブコマンドを使うことで、dotenvファイルを復号化して、環境変数としてセットした状態でコマンドを実行できる。例えば、暗号化したdotenvのファイルが.enc.env で、bashを起動したいなら、以下のようになる。

sops exec-env .enc.env 'bash -l'

dotenvファイルを一時的にファイルに復号化してコマンドを実行

exec-fileサブコマンドを使うことで、dotenvファイルを一時ファイルに復号化して何らかの処理が出来る。dotenvファイルだとあまり使う機会は無いと思うが、設定ファイル系は便利かも。

コマンドの実行方法は、exec-envサブコマンドとほぼ同じ。ちがいは、実行したいコマンドの {} をプレースホルダとして、復号化された一時ファイルのパスが入る。

sops exec-file .enc.env 'TEMP_ENV_FILE={} bash -l'

なお、通常は FIFO が使われるため、一度しかファイルは読み取り出来ない。通常の一時ファイルが良い場合や、FIFO未対応のWindows環境では、--no-fifo のオプション指定が必要。

参考