Files
Pulse/scripts/secure-sensor-files.sh
rcourtman 524f42cc28 security: complete Phase 1 sensor proxy hardening
Implements comprehensive security hardening for pulse-sensor-proxy:
- Privilege drop from root to unprivileged user (UID 995)
- Hash-chained tamper-evident audit logging with remote forwarding
- Per-UID rate limiting (0.2 QPS, burst 2) with concurrency caps
- Enhanced command validation with 10+ attack pattern tests
- Fuzz testing (7M+ executions, 0 crashes)
- SSH hardening, AppArmor/seccomp profiles, operational runbooks

All 27 Phase 1 tasks complete. Ready for production deployment.
2025-10-20 15:13:37 +00:00

90 lines
2.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
if [[ $EUID -ne 0 ]]; then
echo "Run as root." >&2
exit 1
fi
SERVICE_USER="pulse-sensor"
SERVICE_GROUP="$SERVICE_USER"
HOME_DIR="/opt/pulse/sensor-proxy"
BIN_PATH="$HOME_DIR/bin/pulse-sensor-proxy"
SSH_DIR="$HOME_DIR/.ssh"
PRIVATE_KEY="$SSH_DIR/id_ed25519"
PUBLIC_KEY="$SSH_DIR/id_ed25519.pub"
KNOWN_HOSTS="$SSH_DIR/known_hosts"
LOG_DIR="/var/log/pulse/sensor-proxy"
LOG_FILE="$LOG_DIR/proxy.log"
AUDIT_LOG="$LOG_DIR/audit.log"
umask 077
install -d -o "$SERVICE_USER" -g "$SERVICE_GROUP" -m 0700 "$SSH_DIR"
if [[ ! -f "$PRIVATE_KEY" ]]; then
sudo -u "$SERVICE_USER" ssh-keygen -t ed25519 -N '' -C "pulse-sensor@$(hostname -f)" -f "$PRIVATE_KEY"
else
chown "$SERVICE_USER:$SERVICE_GROUP" "$PRIVATE_KEY"
chmod 0600 "$PRIVATE_KEY"
fi
chown "$SERVICE_USER:$SERVICE_GROUP" "$PRIVATE_KEY"
chmod 0600 "$PRIVATE_KEY"
if [[ -f "$PUBLIC_KEY" ]]; then
chown "$SERVICE_USER:$SERVICE_GROUP" "$PUBLIC_KEY"
chmod 0640 "$PUBLIC_KEY"
else
sudo -u "$SERVICE_USER" ssh-keygen -y -f "$PRIVATE_KEY" >"$PUBLIC_KEY"
chown "$SERVICE_USER:$SERVICE_GROUP" "$PUBLIC_KEY"
chmod 0640 "$PUBLIC_KEY"
fi
if [[ ! -f "$KNOWN_HOSTS" ]]; then
install -o "$SERVICE_USER" -g "$SERVICE_GROUP" -m 0640 /dev/null "$KNOWN_HOSTS"
else
chown "$SERVICE_USER:$SERVICE_GROUP" "$KNOWN_HOSTS"
chmod 0640 "$KNOWN_HOSTS"
fi
install -d -o "$SERVICE_USER" -g "$SERVICE_GROUP" -m 0750 "$LOG_DIR"
for log_path in "$LOG_FILE" "$AUDIT_LOG"; do
if [[ ! -f "$log_path" ]]; then
install -o "$SERVICE_USER" -g "$SERVICE_GROUP" -m 0640 /dev/null "$log_path"
else
chown "$SERVICE_USER:$SERVICE_GROUP" "$log_path"
chmod 0640 "$log_path"
fi
if command -v chattr >/dev/null 2>&1; then
if ! lsattr "$log_path" 2>/dev/null | grep -q 'a'; then
chattr +a "$log_path" || echo "Warning: could not set append-only attribute on $log_path" >&2
fi
else
echo "Warning: chattr not available; skipping append-only for $log_path." >&2
fi
done
if [[ -f "$BIN_PATH" ]]; then
chown root:"$SERVICE_GROUP" "$BIN_PATH"
chmod 0750 "$BIN_PATH"
fi
echo "SSH artifacts:"
ls -l "$PRIVATE_KEY" "$PUBLIC_KEY" "$KNOWN_HOSTS"
echo "Log files:"
ls -l "$LOG_FILE" "$AUDIT_LOG"
if command -v lsattr >/dev/null 2>&1; then
lsattr "$LOG_FILE" "$AUDIT_LOG" || true
fi
if [[ -f "$BIN_PATH" ]]; then
echo "Binary permissions:"
ls -l "$BIN_PATH"
fi
echo "sensor proxy file permissions secured."