Phase 08+ scope: integrate 2× YubiKey into platform auth chain (6 roles) #181
Labels
No labels
W6d-automerge-calibration
agent/claude-code
agent/codex
agent/hermes
agent/iskra
agent/ollama
agent/patchwarden
automerge-candidate
class/security-sensitive
cutover-gate
dependency/blocked
dependency/blocks-others
dependency/cross-repo
dependency/needs-confirmation
domain:agents
domain:ci
domain:docs
domain:forgejo
domain:infra
domain:memory
domain:runtime
domain:signal
domain:ux
flow/architecture
flow/blocked
flow/deployed
flow/done
flow/implementation
flow/intake
flow/maintained
flow/observed
flow/ready
flow/refining
flow/retired
flow/review
iterating
judge/codex-candidate
judge/hermes-candidate
judge/low-confidence
judge/needs-refinement
judge/operator-needed
judge/p0
judge/p1
judge/p2
judge/p3
judge/park
judge/patchwarden-candidate
judge/stale-priority
kind/adr
kind/bug
kind/chore
kind/feature
kind/infra
kind/ops
kind/refactor
kind/research
large-impact
merge/auto
merge/manual
merge/manual-dependency-conflict
merge/manual-failing-tests
merge/manual-merge-conflict
merge/manual-missing-review
merge/manual-operator-preference
merge/manual-red-zone
merge/manual-security-sensitive
merge/manual-unclear-scope
merge/manual-unknown
meta
mode:operator-only
mode:patchwarden-iskra-approved
mode:safe-auto
needs-operator-decision
needs-triage
not-ready
observed/erroring
observed/needs-followup
observed/pending
observed/retire-candidate
observed/unused
observed/used
operator-emotional
owner-attention
phase/02
phase/03
priority:p0
priority:p1
priority:p2
priority:p3
proposed
ready-for-agent
ready-for-operator
recovery
review:claude-reviewed
review:codex-reviewed
review:dziadek-reviewed
review:needs-human
risk/exposure
risk/process
risk/product
risk/runtime
safety:external-write
safety:no-prod-mutation
safety:prod-impact
safety:secret-touch
size/large
size/medium
size/small
size/tiny
size/unknown
source/adr
source/agent-generated
source/manual
source/operator-chat
source/voice-note
status:blocked
status:codex-ready
status:merged:pending-evidence
status:needs-evidence
status:operator-needed
status:parked
tier/full
tier/lite
tier/stacked
tier:0-platform-substrate
tier:1-iskra-value-layer
tier:2-tools-products-modules
type:bug
type:chore
type:docs
type:feat
type:policy
type:research
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
pdurlej/platform#181
Loading…
Add table
Add a link
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?
Context
Per operator voice-note 2026-05-11 ~07:55 + issue #180 comment 3890: operator has 2× YubiKey in physical possession. Previously not in any platform inventory.
YubiKey is FIDO2/U2F/PIV/OpenPGP-capable hardware security key. With 2 in hand, operator can adopt hardware-tier auth across multiple platform surfaces. This issue enumerates the 6 viable roles and proposes adoption sequence.
Hardware inventory addition
Why 2× matters: one as primary, one as backup. Standard YubiKey best-practice — losing single hardware key shouldn't lock operator out. This permits real adoption (vs. single-key = scared to enable).
6 viable roles for the 2× YubiKey
Role 1 — Synology DSM 2FA (FIDO2/WebAuthn)
Purpose: 2-factor auth for Synology DSM admin login. Protects the future Tier 2 backup target (per issue #180 Q1: Synology will host encrypted IronKey-content backup).
Implementation: Synology DSM 7+ supports FIDO2 hardware keys. Operator goes to DSM → Control Panel → User → Advanced → Sign-in Method → Hardware Security Key → register both YubiKeys.
Priority: HIGH (gates Tier 2 backup security).
Dependencies: Synology DSM ≥ 7.0 (operator confirms version).
Operator effort: ~5 min setup.
Role 2 — SSH key storage (PIV slot)
Purpose: SSH private keys stored on YubiKey PIV slot; SSH connections to RS2000/VPS1000/kip use hardware-resident key. Eliminates plaintext
~/.ssh/id_*files on M1 disk for production-tier auth.Implementation:
ykman piv keys generate→ store SSH key on YubiKey →ssh -I /usr/lib/ssh-keychain.dylib root@rs2000(or similar PKCS#11 path).Priority: HIGH (defense-in-depth for production SSH; M1 compromise no longer exposes SSH key).
Dependencies:
yubikey-manager(ykman) on M1 (brew install ykman)Operator effort: ~30 min initial setup + ~5 min per host migration.
Role 3 — age key co-storage (via age-plugin-yubikey)
Purpose: Per ADR-0013 4th replica, age encryption key currently at
~/.config/iskra-baseline/age-key.txt. Move to YubiKey viaage-plugin-yubikey. Encryption now requires hardware presence (touch YubiKey to decrypt).Implementation:
Priority: MEDIUM (current age key on M1 disk is already protected by FileVault; this adds hardware-presence requirement on top).
Dependencies:
Operator effort: ~20 min including key rotation from existing setup.
Trade-off: encrypted-Dropbox decryption now requires PHYSICAL YubiKey touch. Operator must travel with YubiKey to access encrypted backup. For backup-against-fire-burglary scenario, ensure 2nd YubiKey is not in same physical location as 1st.
Role 4 — GitHub/Forgejo SSH key (PIV slot)
Purpose: per-actor PATs currently in BW custom field (per AGENTS.md §Identity-isolation). Augment with YubiKey-resident SSH keys for git push. PAT for API operations; YubiKey-SSH for git operations.
Implementation: same as Role 2 PIV slot, but separate slot for git-only key. Or reuse Role 2 key with
~/.ssh/configHost alias.Priority: MEDIUM (current PAT-only flow is already operator-isolated per AGENTS.md; YubiKey adds hardware-presence for push).
Dependencies: Role 2 setup or independent PIV slot.
Operator effort: ~10 min after Role 2.
Role 5 — IronKey PIN-recovery factor (indirect)
Purpose: PIN recovery for IronKey Keypad 200C is not directly possible via YubiKey (IronKey PIN is on-device only, not cryptographic). BUT YubiKey-protected Synology backup of IronKey content (Role 1 + Role 3 combined) gives operator a recovery path: "if I forget IronKey PIN → restore from Synology requires YubiKey presence."
Implementation: not a direct YubiKey action; just the combined effect of Roles 1+3 protecting the Tier 2 backup.
Priority: emerges from Role 1 + Role 3.
Dependencies: Roles 1 + 3 implemented.
Operator effort: 0 (emergent).
Role 6 — macOS FileVault / login (future, optional)
Purpose: YubiKey as Touch-ID-alternative for M1 boot / unlock. macOS supports smartcard login via PIV.
Implementation:
sc_auth pair -u $USERwith YubiKey PIV cert.Priority: LOW (Touch-ID + strong FileVault password is already good; YubiKey adds friction without major security gain for solo-laptop scenario).
Dependencies: PIV setup on YubiKey.
Operator effort: ~15 min; reversible.
Recommendation: defer until operator has 30 days operational experience with Roles 1-4.
Proposed adoption sequence
Per operator's North Star (family-time + bandwidth-constrained), staged adoption:
Backup key handling (critical)
Operator MUST:
Operator MUST NOT:
Hardware lifecycle
YubiKey 5 series typical lifecycle: 5+ years; FIDO2 spec is stable; PIV is standardized. Re-evaluate at 3-year mark.
What this issue does NOT do
Phase
Phase 08+ scope (no implementation blocker for Phase 07 work; YubiKey integration is post-Phase 07).
Could start sooner: Role 1 (Synology 2FA) is a 5-min operator-self-serve action; no platform code needed. Operator can do it any time.
Acceptance criteria
Refs
Coordination
Role: advisor (claude)
Lane: Phase 08+ hardware-auth scope
Inspired by: operator's casual mention "mam YubiKey, a też 2 YubiKey, więc to też można tutaj jakoś to pewnie włączyć" — capturing before it falls out of context.
W4d handoff note — 2026-05-24
Role: executor
Intent: handoff
Needs owner: no
Opened #442 to record that the 2x YubiKey hardware-auth adoption sequence stays follow-up milestone work, not W4 runtime work. W4 closeout should leave this issue open for the future operator-presence/hardware-auth lane.
Runtime: none.
M10 disposition: moved to
10 - Improvements.What this is: 2x YubiKey auth-chain integration.
Why parked here: Parked in M10 because it is broad hardware-auth adoption across roles; this should be split later after the narrower destructive-action use case is decided.
This preserves the idea without letting it block M02/M03/M04 closeout. Before reactivation, split it into a narrow issue or PR with concrete acceptance criteria.
Role 7 (nowa) — YubiKey jako periodic presence gate dla agent sessions
Z sesji audytu MacBooka 2026-05-30 (security-stack review + werdykt Oracle GPT-5.5 Pro). Operator dorzuca siódmą rolę do katalogu — uzupełnia event-driven gate'y (#132, #567) o wymiar czasowy/obecnościowy.
Pomysł operatora (voice-note 2026-05-30)
YubiKey musi być fizycznie obecny / dotknięty w trzech momentach:
Czemu to inny kształt niż #132 / #567
Dlaczego to ma sens teraz (Oracle verdict)
Oracle wskazał AI-agents-executing-code jako najsłabszy punkt całego stacku (ControlD+LittleSnitch+Bitdefender+Tailscale mocne na sieć, słabe na autonomiczne wykonanie kodu z dostępem do $HOME/sekretów). Periodic presence gate to tani sposób na ograniczenie blast-radius porwanej/zostawionej-bez-nadzoru sesji bez psucia produktywności (nie pyta o każdy krok — tylko "czy człowiek wciąż tu jest").
Open questions
pam_u2f(touch do sudo/unlock) vs custom platformctl challenge vsssh-keygen -t ed25519-sk verify-requiredjako proxy obecności?Refs
claude/spec/yubikey-platform-integration-v0(476 linii, P1-P8)security-stack.mdParked (p3, M10 closure plan #653 + Judging Claw priority). Reactivate when 2x YubiKey auth-chain integration is scheduled.
{
"confidence": 5,
"effort_hint": "large",
"escalation": {
"kind": "operator",
"reason": "YubiKey adoption changes account recovery, hardware custody, and authentication policy."
},
"evidence_refs": [
{
"note": "Issue scopes integration of two YubiKeys into the platform authentication chain across six roles.",
"type": "forgejo",
"value": "issue-title-body-labels-and-target-snapshot"
},
{
"note": "Body states two hardware keys enable primary plus backup adoption instead of single-key lockout risk.",
"type": "forgejo",
"value": "issue-body-hardware-inventory"
},
{
"note": "Snapshot labels mark the work as priority p3 and parked.",
"type": "snapshot",
"value": "target-snapshot-labels"
}
],
"impact": 4,
"judge_actor": {
"name": "iskra",
"runtime": "openclaw"
},
"judged_at": "2026-06-09T01:03:00Z",
"labels_to_apply": [
"judge/p2",
"judge/operator-needed"
],
"piotr_fit": "high",
"priority": "p2",
"rationale_summary": "This is P2 operator-shaped security architecture because YubiKey rollout can harden auth only with deliberate recovery, custody, and sequencing decisions.",
"reach": 4,
"recommended_next_action": "operator_needed",
"rerun_reason": "no_prior_judgment",
"schema": "openclaw.judge.v0",
"target": {
"kind": "issue",
"number": 181,
"repo": "pdurlej/platform"
},
"target_snapshot": {
"body_hash": "sha256:f6973984ee9f2968e2677089bc841ff2c8f8c3e3eac32948f6edbb3e997c1827",
"commit_count": null,
"evidence_hash": "sha256:274b578d096aef76bc08058811c72239040329a54c30380fca68d1efbf75f608",
"head_sha": null,
"labels": [
"agent/claude-code",
"priority:p3",
"status:parked"
],
"labels_hash": "sha256:9e8ed9cb7b1b30f4dcf389e2b3d1f8e66c19eb940504926be5872a601be5b3ab",
"state": "open",
"title_hash": "sha256:d229fc420e35e68bd2d92f5b2bd14fd607d081f42a3d7418ee717f6022c08534",
"updated_at": "2026-06-01T08:53:16+02:00"
},
"top_caveat": "Do not enable hardware-key requirements until backup-key enrollment, recovery paths, and lockout drills are explicit."
}