mirror of
https://github.com/Security-Onion-Solutions/securityonion.git
synced 2026-05-22 19:15:15 +02:00
add so-yaml dual-write to so_pillar.* + purge verb
Hooks every so-yaml.py write through a new so_yaml_postgres helper that mirrors disk YAML mutations into so_pillar.pillar_entry via docker exec psql. Disk remains canonical during the transition; PG mirror failures are logged only when a real write error occurs (skipped paths and postgres-unreachable cases stay silent so existing callers don't see new noise on stderr). Adds a `purge YAML_FILE` verb on so-yaml that deletes the file from disk and removes the matching pillar_entry rows. For minion files it also drops the so_pillar.minion row, which CASCADEs to pillar_entry + role_member. Designed for so-minion's delete path (replaces rm -f) so the audit log captures the deletion. setup/so-functions::generate_passwords + secrets_pillar generate secrets:pillar_master_pass and /opt/so/conf/postgres/so_pillar.key on fresh installs, and append the password to existing secrets.sls files on upgrade. - salt/manager/tools/sbin/so_yaml_postgres.py: locate(), write_yaml(), purge_yaml(), and a small CLI for diagnostics. Skips bootstrap and mine-driven paths via the same allowlist used by so-pillar-import. - salt/manager/tools/sbin/so-yaml.py: import the helper, hook writeYaml() to mirror after every disk write, add purgeFile() and the purge verb. - salt/manager/tools/sbin/so-yaml_test.py: 16 new tests covering the purge verb and the path-locator / write contract of so_yaml_postgres without contacting Postgres. All 91 tests pass. - setup/so-functions: generate_passwords adds PILLARMASTERPASS and SO_PILLAR_KEY; secrets_pillar writes pillar_master_pass and the pgcrypto master key file.
This commit is contained in:
@@ -1057,6 +1057,11 @@ generate_passwords(){
|
||||
POSTGRESPASS=$(get_random_value)
|
||||
SOCSRVKEY=$(get_random_value 64)
|
||||
IMPORTPASS=$(get_random_value)
|
||||
# postsalt: salt-master connects to so_pillar.* as so_pillar_master, and the
|
||||
# so-postgres container needs a symmetric key for pgcrypto-encrypted secrets.
|
||||
# Both are generated here so they survive reinstall like the other secrets.
|
||||
PILLARMASTERPASS=$(get_random_value)
|
||||
SO_PILLAR_KEY=$(get_random_value 64)
|
||||
}
|
||||
|
||||
generate_interface_vars() {
|
||||
@@ -1853,7 +1858,34 @@ secrets_pillar(){
|
||||
"secrets:"\
|
||||
" import_pass: $IMPORTPASS"\
|
||||
" influx_pass: $INFLUXPASS"\
|
||||
" pillar_master_pass: $PILLARMASTERPASS"\
|
||||
" postgres_pass: $POSTGRESPASS" > $local_salt_dir/pillar/secrets.sls
|
||||
elif ! grep -q '^[[:space:]]*pillar_master_pass:' $local_salt_dir/pillar/secrets.sls; then
|
||||
# Existing install pre-postsalt — append the new key without disturbing
|
||||
# the values already on disk. Keys we already wrote stay; only the new
|
||||
# pillar_master_pass is added.
|
||||
info "Appending pillar_master_pass to existing Secrets Pillar"
|
||||
if [ -z "$PILLARMASTERPASS" ]; then
|
||||
PILLARMASTERPASS=$(get_random_value)
|
||||
fi
|
||||
printf ' pillar_master_pass: %s\n' "$PILLARMASTERPASS" >> $local_salt_dir/pillar/secrets.sls
|
||||
fi
|
||||
|
||||
# postsalt: write the so_pillar pgcrypto master key to a 0400 file owned by
|
||||
# root. The key itself is never read by Salt — schema_pillar.sls loads it
|
||||
# into the so-postgres container via ALTER ROLE so_pillar_secret_owner SET
|
||||
# so_pillar.master_key = '<key>'; the file just lets the value survive
|
||||
# container restarts.
|
||||
if [ ! -f /opt/so/conf/postgres/so_pillar.key ]; then
|
||||
info "Generating so_pillar pgcrypto master key"
|
||||
mkdir -p /opt/so/conf/postgres
|
||||
if [ -z "$SO_PILLAR_KEY" ]; then
|
||||
SO_PILLAR_KEY=$(get_random_value 64)
|
||||
fi
|
||||
umask 077
|
||||
printf '%s' "$SO_PILLAR_KEY" > /opt/so/conf/postgres/so_pillar.key
|
||||
chmod 0400 /opt/so/conf/postgres/so_pillar.key
|
||||
chown root:root /opt/so/conf/postgres/so_pillar.key
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user