Skip to content

feat(sops): 秘密をホスト単位のファイルに分割する - #393

Merged
gapul merged 1 commit into
mainfrom
feat/sops-per-host
Aug 21, 2026
Merged

feat(sops): 秘密をホスト単位のファイルに分割する#393
gapul merged 1 commit into
mainfrom
feat/sops-per-host

Conversation

@gapul

@gapul gapul commented Aug 20, 2026

Copy link
Copy Markdown
Owner

なぜ

secrets/secrets.yaml 1本を mac / laptop / WSL の3ホストが同じ home/secrets.nix 経由で読んでいた。結果として Linux 側のリビルドでも、Xcode の Apple ID と keystats の macOS 署名鍵がディスクに書き出されていた。そこでは使い道のない資格情報が、ただ露出面として増えていた状態。

変更

common / darwin / homelab の3ファイルに分け、.sops.yamlファイルごとに受信者を変えた

ファイル 受信者 中身
secrets/common.yaml me, recovery, mac, macmini PII / ssh_config / ssh_authorized_keys / VPN / rclone / restic / attic / Claude OAuth / ntfy
secrets/darwin.yaml me, recovery, mac xcodes, keystats 署名鍵2つ, ytmusic, listenbrainz
secrets/homelab.yaml me, recovery zaim, cloudflare, radicale, unified_calendar の残り

home/secrets.nix は common 専用になり、mac 固有分は新しい home/secrets-darwin.nix に移して macWorkstation ロールだけが読む。home/mopidy.nix の2つは sopsFile で darwin.yaml を指す。

分割はモジュールの import だけでなく 受信者そのもので担保されている。laptop で secrets/darwin.yaml を開こうとしても鍵が無い。

分割の検証

「元ファイルの全リーフパスが、出力3ファイルのどれかにちょうど1回だけ現れる」ことを機械的に確認してから書き出した。欠落・重複・存在しないパスの捏造をそれぞれ別に検出する。

leaf paths:       80 in,       80 out, no loss and no overlap

実際にこのチェックが2件拾っている。unified_calendar/admin_token の振り分け漏れと、後述の radicale。

ホスト鍵についての注意

.sops.yaml には mac と macmini のホスト鍵 (SSH ホスト鍵から ssh-to-age で導出) を受信者として入れたが、この PR ではまだ使っていない

home-manager の sops はユーザ権限で動くのに対し /etc/ssh/ssh_host_ed25519_key0600 root:wheel なので、ホスト鍵での復号はシステム側 (nix-darwin / NixOS) の sops でないと届かない。受信者を先に入れてあるのは、後から足すと秘密ファイルを再暗号化することになり、そのたびに平文を触る手数が増えるため。次の PR でシステム側に配線する。

radicale について

作業ツリーに未コミットで残っていた radicale: {username, password} を取り込んだ。同じ差分にあった rclone_conf の再暗号化も一緒に入っている。

open な #375 が持っている平たい radicale_password はこれに置き換わるので、#375 は rebase して secrets.nix の参照を radicale/usernameradicale/password に直す必要がある#375 側の secrets/secrets.yaml への変更は、このファイルが無くなるため破棄でよい。

マージ後にローカルでやること

~/.dotfiles の作業ツリーに secrets/secrets.yaml の変更が残っている。中身はこの PR に取り込み済みなので、pull の前に捨てる。

git -C ~/.dotfiles checkout -- secrets/secrets.yaml

確認

  • darwinConfigurations.{gapul,macmini}, homeConfigurations.gapul, nixosConfigurations.{homeserver,nixos-laptop-ci,wsl} すべて eval が通る
  • 各ファイルの受信者数を暗号文のメタデータで確認 (common 4 / darwin 3 / homelab 2)
  • nix fmt 差分なし、just docs 差分なし

これまで secrets/secrets.yaml 1本を mac / laptop / WSL の3ホストが同じ
secrets.nix 経由で読んでいたため、Linux 側のリビルドでも Xcode の Apple ID と
keystats の署名鍵がディスクに書き出されていた。どちらもそこでは使えない資格情報。

common / darwin / homelab の3ファイルに分け、.sops.yaml でファイルごとに受信者を
変えた。darwin.yaml は mac のホスト鍵まで、homelab.yaml は人間の鍵だけが開ける。
分割は「元ファイルの全リーフパスが出力のどれかにちょうど1回現れる」ことを検証して
から実施した (unified_calendar/admin_token の振り分け漏れをこれで検出)。

ホスト鍵は .sops.yaml に受信者として入れてあるが、この PR ではまだ使わない。
home-manager の sops はユーザ権限で動き、/etc/ssh/ssh_host_ed25519_key は
0600 root:wheel なので、ホスト鍵での復号はシステム側 sops でないと届かない。

radicale (username/password) は作業ツリーに未コミットで残っていたものを取り込んだ。
PR #375 の平たい radicale_password はこれに置き換わる。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant