feat(nixos-laptop): SSH 鍵を TPM に封印する - #402
Open
gapul wants to merge 1 commit into
Open
Conversation
持ち出す機械なのに鍵がただのファイルだった。しかもラップトップは自分で証明書を 更新できない(署名できるのは Touch ID のある Mac だけ)ので、一番長い有効期限の 証明書を持つクライアントでもある。弱い鍵の置き場所と長い期限が同じ機械で重なる ので、ここを先に潰す。 ssh-tpm-agent は home-manager にモジュールがある(services.ssh-tpm-agent)。ただし sshAuthSock.initialization は bash / fish / nushell しか定義しておらず zsh が無い ので、SSH_AUTH_SOCK の export は自分で書いた。 ssh_config の IdentityAgent は Bitwarden のソケット直書きだったのをやめ、 IdentityAgent SSH_AUTH_SOCK に変えた。同じ ssh_config を Mac / ラップトップ / WSL に配っている以上、機械ごとに違う agent を指す必要がある。母艦で実際に ログインして等価であることを確認済み。 CI 用のラップトップ設定は home モジュールの一覧が本番と別で、この手の追加を 検証できていなかったので揃えた。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
なぜ
持ち出す機械なのにクライアント鍵がただのファイルだった。しかもラップトップは自分で証明書を更新できない(署名できるのは Touch ID のある Mac だけ)ので、一番長い有効期限の証明書を持つクライアントでもある。
弱い鍵の置き場所と長い有効期限が、同じ機械で重なっている。鍵ファイルと証明書を一緒に持ち出されれば残り期間ずっと入られるので、まずここを潰す。TPM に封印すれば鍵は取り出せず、端末ごと盗まれても証明書だけでは何もできない。
Mac の Secure Enclave 鍵の Linux 版にあたる。
モジュールはある(前言撤回)
services.ssh-tpm-agentが home-manager に入っている。NixOS 側のオプションしか見ずに「モジュールが無いので unit の手書きが要る」と書いたが、誤りだった。enable = trueで足りる。ただし home-manager の
sshAuthSock.initializationは bash / fish / nushell しか定義していない(modules/misc/ssh-auth-sock.nix)。zsh が無いのでSSH_AUTH_SOCKの export は自分で書いた。ここを踏むと agent は起動するのに ssh が見に行かない、という分かりにくい壊れ方をする。ssh_config の IdentityAgent
IdentityAgent ~/.bitwarden-ssh-agent.sockの直書きをやめ、IdentityAgent SSH_AUTH_SOCKに変えた(5箇所)。同じ ssh_config を sops で Mac / ラップトップ / WSL に配っている以上、機械ごとに違う agent を指す必要がある。
IdentityAgentはSSH_AUTH_SOCKより優先されるので、直書きのままだとラップトップで agent を立てても無視される。母艦で実際にログインして等価であることを確認済み。
書き換えは IdentityAgent 行以外が変化していないことを差分で検証してから適用した。
TPM へのアクセス権
security.tpm2.enableとtssグループが要る。モジュールが eval 時に assert してくれたので気付けた(実行時の permission error にならない)。LUKS の TPM スロットは initrd の root なのでこれを必要としないが、ssh-tpm-agent はユーザとして/dev/tpmrm0を触る。CI の穴
CI 用のラップトップ設定(
nixos-laptop-ci)は home モジュールの一覧が本番と別物で、ssh-tpm-agent.nixもrestic-backup-linux.nixもsecrets.nixも含んでいなかった。この手の追加を CI がまったく検証できていない状態だったので、今回のものは揃えた。残りは別途。確認
nixosConfigurations.nixos-laptop-ciの eval が通るssh-tpm-agentの systemd user unit があること、zsh の init に export が入ることを eval で確認nix fmt差分なし、just docs差分なし実機での作業
ラップトップは今オフラインなので未検証。起動したら鍵を作る。
ssh-tpm-keygen -C laptop # PIN を付けるなら --with-pinそのあと母艦から
just ssh-cert-host nixos-laptop(#401)で証明書を発行する。