[v0.1/SSH Review] SSH_AUTH_SOCK 間接化とエージェント可観測性の欠如 #40
Labels
No labels
priority/P0
priority/P1
priority/P2
release/v0.1.0
status/blocked
status/planned
type/bug
type/design
type/test-gap
type/tracker
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
natsukium/felis#40
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
現状
SSH_AUTH_SOCKを<socket>.agent(socket と同ディレクトリの symlink)に間接化している(crates/felis-daemon/src/serve.rsのSSH_AUTH_SOCK処理、relay.rsの carrier block)。relay が持つSSH_AUTH_SOCK(sshd が forward したもの)を daemon が symlink 先に付け替える。途中切断中は agent 不在、次のfelis --hostで修復される(how-to/attach-over-ssh.md"Your SSH agent survives it too")。daemon statusに現れない。複数 window が異なるssh -A接続で繋いだとき最後に dial したものが勝つ(last-wins)。どちらが勝ったかログにも出ない。serve.rsにハードコード。SSH_AUTH_SOCK以外の forwarded env(DISPLAY,XDG_RUNTIME_DIR等)は間接化されないが、relay の carrier block はstd::env::vars_os()全量(4096 entries / 1MiB cap)を送る。daemon はSpawnArgs.env_baseと合わせて解決するが、agent 以外の値は捨てられる。問い(1.0 でしか変えられない)
この agent 間接化を暗黙の symlink として凍結するか? 明示的な control surface(config /
daemon status/ ログ)に昇格させるか?破壊的変更案
daemon statusのresourcesまたは新agent行でagent_symlink -> /tmp/.../agent.123の有無と指し先を報告。tracing::infoで symlink 更新時にログ。docs/reference/cli.mddaemon status 表にagent行を追加。config.tomlまたは daemon 起動引数でforward_agent = true|falseを持たせ、false ではSSH_AUTH_SOCKをそのまま子に渡す(切断で失われるが明示的)。デフォルト true で現行互換だが、1.0 でキー名を決めておくことで将来無効化できる。felis agentverb にする。felis --host remote sessions実行時に毎回SSH_AUTH_SOCKを再配布するのではなく、ユーザがfelis agent forwardを打ったときのみ daemon の symlink を更新。暗黙の last-wins をなくす。判定基準
how-to/attach-over-ssh.mdの "Your SSH agent survives it too" がreference/cli.mdのdaemon statusとreference/ipc.mdの carrier block 記述と矛盾しないこと(現状 status に agent が出ない)。ForwardAgent yesを~/.ssh/configに書いたユーザが、git pushが一度切断しても次のfelis --hostで直ることをdaemon statusやログで確認できること。対象ファイル
crates/felis-daemon/src/serve.rs(SSH_AUTH_SOCK解決),crates/felis-daemon/src/relay.rs(capture_environment),crates/felis-transport/src/preface.rs(CarrierBlock),docs/how-to/attach-over-ssh.md,docs/reference/cli.md(daemon status),docs/reference/ipc.md(FRLY block),docs/explanation/architecture/ipc.mdcc @natsukium
Triaged as resolved by the existing design record.
docs/explanation/security-model.mdalready specifies the daemon-owned stable agent path, newest-live/restore behavior, same-UID trust boundary, rejected alternatives, and revisit trigger. No observed operator failure currently earns another config or IPC surface. If #26 finds that admission refusals cannot be diagnosed without agent state, that concrete status requirement can be added there; the speculative surface does not remain separate.