mirror of
https://github.com/openglow-org/forgefirm.git
synced 2026-09-27 16:51:12 -07:00
commissioning: the layer, the acceptance tests, the harness rule, the docs, and the bench drills
meta-forgefirm: the forgefirm-users init replays the account at boot; sshd refuses root and empty passwords and runs only while the panel turns it on; the release image keeps an empty root password for the console; the console banner; avahi announces forgefirm.local; https in libmicrohttpd and ulfius; the panel on 80 and 443; the license bundle on the rootfs; release.sh checks the root policy on the built rootfs. forgetest: the commission suites (commission, commission_dark, commission_sheet: 23 cases); the runner turns cloud mode on with the typed phrase for a test that declares it; the baseline's motor_lock is 0; the log-export test checks the bundle for the camera key; the record helpers write bytes as given and join the daemon's paths as POSIX. The stream harness gains rule 24: a hold verdict is held again after a resume. Bench drills: lens_travel.py and lens_stop_accel.py. Docs: BRINGUP carries the present state; CAMPAIGN-LOG carries the dated record.
This commit is contained in:
+21
-10
@@ -180,16 +180,27 @@ else
|
||||
echo "acceptance gate OK ($ART)"
|
||||
fi
|
||||
|
||||
# Back-door gate: the release image must not ship a passwordless root. A
|
||||
# debug-tweaks image sets root's password field empty (root::...); a
|
||||
# hardened image leaves it locked (root:*: / root:!:) or hashed. Read the
|
||||
# actual built shadow file - this catches the flag however it slipped in
|
||||
# (recipe, local.conf, an inherited class).
|
||||
ROOT_PW=$(debugfs -R "cat /etc/shadow" "$EXT4" 2>/dev/null \
|
||||
| awk -F: '$1=="root"{print $2; exit}')
|
||||
[ -n "$ROOT_PW" ] \
|
||||
|| die "release rootfs has a passwordless root (debug-tweaks leaked into forgefirm-image?)"
|
||||
echo "root login gate OK (root password field is not empty)"
|
||||
# Root policy gate. The release image ships root WITHOUT a password (the
|
||||
# serial console is the recovery path) and sshd refuses root and empty
|
||||
# passwords: PermitRootLogin no and PermitEmptyPasswords no must be
|
||||
# active (uncommented) in the built sshd_config, and root's shadow field
|
||||
# must be empty. Read the built files, not the recipes: this catches a
|
||||
# drift however it got in (recipe, local.conf, an inherited class).
|
||||
SSHD_CONFIG=$(debugfs -R "cat /etc/ssh/sshd_config" "$EXT4" 2>/dev/null)
|
||||
[ -n "$SSHD_CONFIG" ] \
|
||||
|| die "release rootfs carries no /etc/ssh/sshd_config"
|
||||
printf '%s\n' "$SSHD_CONFIG" | grep -Eq '^PermitRootLogin[[:space:]]+no[[:space:]]*$' \
|
||||
|| die "release sshd_config has no active 'PermitRootLogin no' (recipes-connectivity/openssh drift?)"
|
||||
printf '%s\n' "$SSHD_CONFIG" | grep -Eq '^PermitEmptyPasswords[[:space:]]+no[[:space:]]*$' \
|
||||
|| die "release sshd_config has no active 'PermitEmptyPasswords no' (recipes-connectivity/openssh drift?)"
|
||||
ROOT_SHADOW=$(debugfs -R "cat /etc/shadow" "$EXT4" 2>/dev/null \
|
||||
| awk -F: '$1=="root"{print; exit}')
|
||||
[ -n "$ROOT_SHADOW" ] \
|
||||
|| die "release rootfs has no root entry in /etc/shadow"
|
||||
ROOT_PW=$(printf '%s\n' "$ROOT_SHADOW" | awk -F: '{print $2}')
|
||||
[ -z "$ROOT_PW" ] \
|
||||
|| die "release rootfs has a non-empty root password field: the policy is an empty field (empty-root-password in forgefirm-image.bb); a build drift"
|
||||
echo "root policy gate OK (root field empty; sshd refuses root and empty passwords)"
|
||||
|
||||
# Config-level guard: debug-tweaks must not sit in the shared kas config,
|
||||
# where it would apply to every target including the release image.
|
||||
|
||||
Reference in New Issue
Block a user