Skip to content

feat(macmini): システム側 sops をホスト鍵で開く - #395

Open
gapul wants to merge 1 commit into
mainfrom
feat/macmini-sops-hostkey
Open

feat(macmini): システム側 sops をホスト鍵で開く#395
gapul wants to merge 1 commit into
mainfrom
feat/macmini-sops-hostkey

Conversation

@gapul

@gapul gapul commented Aug 21, 2026

Copy link
Copy Markdown
Owner

#393 で入れたホスト鍵の受信者を、実際に使う最初の PR。

なぜ

macmini はこれまで sops を持っていなかった。理由は flake に書いてあるとおり「人間の age マスター鍵を macmini に持ち込まない」方針で、これ自体は正しい判断だった。あの鍵1つでリポジトリの全秘密が開くので、誰も見ていない無人機に置くのは筋が悪い。

代償として、restic のパスワードと ntfy の資格情報が手置きファイルとして宣言の外に residing していた。再インストールのたびに手作業が要るし、何が置いてあるべきかがコードから読めない。

どう解決したか

ホスト鍵で開けばトレードオフが消える。

  • /etc/ssh/ssh_host_ed25519_key元からこの機械にある。新しく運び込む鍵はゼロ。
  • そのホスト鍵から導出した age 受信者は secrets/common.yaml にしか入っていない。darwin.yamlhomelab.yaml は開けない。
  • つまり macmini は「自分に必要な分だけを自力で開ける」状態になり、元の方針の意図はそのまま守られる。

なぜシステム側なのか

sops.age.sshKeyPaths が読む先は 0600 root:wheel で、home-manager の sops はユーザ権限で動くので届かない。nix-darwin の activation は root で走るため、システム側に置くのが唯一の方法になる。#393 の PR 本文で「次はシステム側」と書いたのはこれのこと。

置き場所

restic-common.nix の既定パス(=手置きだった場所と同じ)にそのまま置いた。owner を明示してユーザ所有にしている(バックアップは root ではなくログインユーザで走るため)。

restic_password              -> /Users/gapul/.config/restic/password   (gapul, 0400)
unified_calendar/ntfy_url    -> /Users/gapul/.config/ntfy/url          (gapul, 0400)
unified_calendar/ntfy_token  -> /Users/gapul/.config/ntfy/token        (gapul, 0400)

場所が変わらないので home/macmini-backup.nix は誰が置いたかを知らずに済む。変更はコメントの更新だけ。

確認

  • darwinConfigurations.macmini の eval が通る
  • 解決後の secrets を eval して path / owner / mode が上表のとおりになることを確認
  • macmini の実機のホスト鍵から age 受信者を導出し直して照合: common.yaml にあり、darwin.yamlhomelab.yaml には無い
  • nix fmt 差分なし、just docs 差分なし

マージ後

macmini で darwin-rebuild switch すると、activation が3つのファイルを上書きする。中身は手置きしてあったものと同じはずだが、もし ntfy のトークンを手元で更新していて sops 側が古いなら、そちらが巻き戻る。先に照合したほうが安全。

macmini はこれまで sops を持たず、restic のパスワードと ntfy の資格情報を
手置きファイルとして宣言の外に置いていた。理由は「人間の age マスター鍵を
無人機に持ち込まない」方針で、これ自体は正しい。あの鍵1つで全秘密が開く。

ホスト鍵での復号はこのトレードオフを消す。/etc/ssh/ssh_host_ed25519_key は
元からこの機械にあり、外に出ず、その age 受信者は secrets/common.yaml にしか
入っていない。必要な分だけ自力で開けて、鍵は1本も運んでいない。

activation は root で走るのでホスト鍵(0600 root:wheel)が読める。home-manager
側では届かないので、システム側に置くのが唯一の方法になる。

置き場所は共通ライブラリの既定パス(手置きだった場所と同じ)なので、
home/macmini-backup.nix は誰が置いたかを知らずに済む。
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