node-002 dashboard is still on first-boot default credentials #1
Open
opened 2026-08-19 22:06:55 -04:00 by logan
·
3 comments
No Branch/Tag Specified
main
feat/45-trunk-recorder
fix/44-upload-spool
feat/41-disk-reporting
fix/41-updater-prune
fix/discord-voice-join
fix/updater-safe-directory
fix/28-amd64-images
fix/18-install-token-argv
fix/19-image-tag-skew
feat/discord-system
feat/24-p25-conventional
feat/local-ui-usable
fix/14-15-provision-ota
feat/sdr-pins
feat/secondary-sdr-priority
feat/second-sdr-adsb-ais
feat/publish-public-images
fix/install-rerun-pickup
pulse-recorder
v1.1.0
v1
Labels
Clear labels
area/ai-pipeline
area/auth
area/billing
area/correlation
area/discord
area/frontend
area/governance
area/growth
area/infra-deploy
area/legal
area/map
area/mqtt
area/node-ota
area/osint
area/recording-audio
area/sdr-radio
area/transcription
board
board:agenda
Scene/entity extraction, summarizer, AI providers, embeddings
AuthN/Z, roles, tenancy/org scoping, API keys, credentials
Plans, entitlements, AI spend accounting and caps
Incident correlation, linking, lifecycle, severity, corr_debug
Discord bot, radio bots, voice streams, bot tokens, webhooks
Web UI: Next.js app and the edge-node local dashboard
Board process, minutes, unattended runner, agent tooling
Go-to-market, outreach, cold email, discovery conversations
CI/CD, VM, registry, Firestore rules/indexes deploy, Terraform/Caddy
ToS, retention, licences/DAAs, CAN-SPAM, E&O, name suppression
Live map: pins, paths, tiles, legend, geocoding
Node-C2 MQTT, checkins, commands, node sweeper, dynsec
Node install, enrollment, OTA updater, image skew
External feeds: cameras, 511, ADS-B, AIS, outages, and their licences
Call capture, boundaries, PulseAudio, ring buffer, trimming, attribution
OP25 decode, SDR hardware/tuning, conventional, second SDR, mesh radio
STT, transcript correction, place verification, name accuracy
Board process: minutes and board-filed items
Needs board scoping at the next sitting; CEO removes the label once scoped
kind
behavior-bug
Wrong product behavior; the instrument reads it correctly
kind
measurement-bug
Corrupts the recording/instrument (debug data, evals, health checks), not behavior
priority
p0
Drop everything: prod broken, live exposure, or owner-ruled P0
priority
p1
Next up: blocks a gate, a customer, or core incident quality
priority
p2
Normal: real defect or planned work, schedule in turn
priority
p3
Low: minor, cosmetic, or someday
status
blocked
Waiting on an external party, spend, or another issue
status
in-progress
Branch or PR open against it
status
needs-decision
Waiting on an owner or board ruling before work
status
needs-info
Root cause or repro unknown; needs a reading first
type
bug
Something built is wrong: code, data, or a measurement
type
chore
Maintenance, refactor, tests, pinning, cleanup: no user-visible change
type
decision
A ruling to make or record: board minutes, owner calls, legal reviews
type
docs
Docs, runbooks, CLAUDE.md, skills, SOPs
type
feature
New capability or an extension of an existing one
type
security
Security, privacy, credential or tenant-isolation exposure
type
tracking
Tracker, checklist, initiative or punch-list spanning several changes
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: logan/node-26#1
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The edge node's local dashboard is still using its first-boot default username and password.
The node containers run with
network_mode: host, and the op25 container isprivileged: truewith/devmounted. Anything reachable through that dashboard is effectively host-level access on the node, so a default credential is not a minor issue there.Needs real local auth on the node dashboard plus a first-boot flow that forces a credential change, rather than shipping a known default and relying on nobody looking.
Re-scoping: the code side is done. What remains is operational.
drb-edge-node/app/internal/auth.pyimplements exactly what this issue asked for — username/password fromDASHBOARD_USERNAME/DASHBOARD_PASSWORD, scrypt-hashed with a salt persisted bycredentials.py, compared withhmac.compare_digest, and two accepted auth paths (a signed session cookie fromPOST /login, or HTTP Basic for machine callers).warn_if_default_password()is called from thelifespanstartup inmain.py, so a node still on the default logs a warning every boot.So the remaining work is not code: node-002's
.envin the field still needsDASHBOARD_USERNAME/DASHBOARD_PASSWORDset to something other thanadmin/CHANGE-ME-drb-default. Until that happens the node is still open to anyone on its LAN, and since the containers runnetwork_mode: hostwith op25privileged: trueand/devmounted, that is host-level exposure.Two known gaps that could reasonably fold into this issue rather than get their own:
auth.py's module docstring says the call site is "in main.py" viais_using_default_password(); the real call iswarn_if_default_password(). Cosmetic, but it cost a grep.Also worth noting while in this file: the node dashboard is plain HTTP on :80, so the session cookie and Basic credentials both travel unencrypted on the LAN.
auth.pyis upfront about this. Auth here stops a passerby, not a sniffer.Ruled by board minutes #62 (2026-08-24): P0, ahead of the Gate A/B backlog. Label
board:agendaremoved. Owner: CTO.COO (#58) and CTO (#60) both refused to defer this and CISO (#61) named the fix. A dashboard on first-boot default credentials, on a node running
network_mode: hostbeside a privilegedop25container with/devmounted, is host-level exposure - on hardware already in friends-and-family hands today. It is independent of Gate A and Gate B and does not wait for either.Ruling: force credential rotation on first boot. No default that survives the first successful login.
This becomes the next single engineering issue the unattended runner picks up.
One explicit instruction: check first whether it is fixable over the existing MQTT/WireGuard remote access. If it genuinely needs hands on the device, say so in a comment and log a physical-visit date - it does not get silently reclassified as a normal code fix and left to age.
Refs server-26#62.
Board ruling — server-26 FINAL MINUTES #97, 2026-09-01. Escalated to the exclusive next engineering slot.
Minutes #62 ruled this P0 on 2026-08-24 and said it becomes the next single engineering issue the unattended runner picks up. Seven days later
Client/drb-edge-node/app/internal/auth.pyandcredentials.pywere last touched before that ruling and no forced-rotation flow ships. It has been silently outranked every night by non-P0 work — including by server-26#64, which could never have consumed an engineering slot at all because its remaining work is owner-gated.Ruling (#97 D6): this takes the next unattended engineering slot, exclusively. No other engineering item preempts it until it lands. Owner: CTO.
Three things belong to that slot:
Separately, a stopgap that does not wait for the code: setting
DASHBOARD_USERNAME/DASHBOARD_PASSWORDon node-002 off the shipped defaults is task 3 of a batched ~30-minute owner credential session on 2026-09-02 (#97 D4). That closes today's live exposure; the code fix closes it for every future node.