mirror of
https://github.com/Security-Onion-Solutions/securityonion.git
synced 2026-08-26 17:38:23 +02:00
The UEK8 rollout installs the new kernel and flips the boot default, but leaves the stock EL9 (RHCK) packages behind: disk in /boot and a stale GRUB entry on every upgraded node. They cannot be removed in the same pass that installs UEK8. dnf's protect_running_kernel refuses to erase the booted kernel-core, so the removal has to wait until the node has rebooted onto 6.x. Waiting is the safer sequencing anyway -- the node proves it comes up on UEK8 before its fallback is deleted -- so this does not remove RHCK from the uek7 branch either, where dnf would allow it. so-kernel-upgrade grows a --cleanup mode that does only the removal and no-ops (exit 0, with a log line) on a node not yet running UEK8. Its uek8 branch, which previously reported "nothing to do", now runs that cleanup along with set_default_kernel_conf -- which also closes a gap where a node that came up on UEK8 straight from a fresh install never had DEFAULTKERNEL=kernel-uek-core written. The common highstate calls --cleanup gated on the running kernel, so the cleanup lands grid-wide as each node reboots: fresh installs reboot at the end of setup, upgraded nodes whenever the admin schedules it. The rpm check inside the script is the idempotency guard, so subsequent highstates cost an rpm query rather than a dnf transaction, and the package list is not duplicated into the state where it could drift.
273 lines
6.2 KiB
YAML+Jinja
273 lines
6.2 KiB
YAML+Jinja
{% from 'allowed_states.map.jinja' import allowed_states %}
|
|
{% if sls in allowed_states %}
|
|
|
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
|
|
|
include:
|
|
- common.grains
|
|
- common.packages
|
|
{% if GLOBALS.role in GLOBALS.manager_roles %}
|
|
- manager.elasticsearch # needed for elastic_curl_config state
|
|
- manager.kibana
|
|
{% endif %}
|
|
|
|
net.core.wmem_default:
|
|
sysctl.present:
|
|
- value: 26214400
|
|
|
|
# Users are not a fan of console messages
|
|
kernel.printk:
|
|
sysctl.present:
|
|
- value: "3 4 1 3"
|
|
|
|
# Add socore Group
|
|
socoregroup:
|
|
group.present:
|
|
- name: socore
|
|
- gid: 939
|
|
|
|
# Add socore user
|
|
socore:
|
|
user.present:
|
|
- uid: 939
|
|
- gid: 939
|
|
- home: /opt/so
|
|
- createhome: True
|
|
- shell: /bin/bash
|
|
|
|
soconfperms:
|
|
file.directory:
|
|
- name: /opt/so/conf
|
|
- user: 939
|
|
- group: 939
|
|
- dir_mode: 770
|
|
|
|
sostatusconf:
|
|
file.directory:
|
|
- name: /opt/so/conf/so-status
|
|
- user: 939
|
|
- group: 939
|
|
- dir_mode: 770
|
|
|
|
so-status.conf:
|
|
file.touch:
|
|
- name: /opt/so/conf/so-status/so-status.conf
|
|
- unless: ls /opt/so/conf/so-status/so-status.conf
|
|
|
|
socore_opso_perms:
|
|
file.directory:
|
|
- name: /opt/so
|
|
- user: 939
|
|
- group: 939
|
|
|
|
so_log_perms:
|
|
file.directory:
|
|
- name: /opt/so/log
|
|
- dir_mode: 755
|
|
|
|
# Create a state directory
|
|
statedir:
|
|
file.directory:
|
|
- name: /opt/so/state
|
|
- user: 939
|
|
- group: 939
|
|
- makedirs: True
|
|
|
|
salttmp:
|
|
file.directory:
|
|
- name: /opt/so/tmp
|
|
- user: 939
|
|
- group: 939
|
|
- makedirs: True
|
|
|
|
# VIM config
|
|
vimconfig:
|
|
file.managed:
|
|
- name: /root/.vimrc
|
|
- source: salt://common/files/vimrc
|
|
- replace: False
|
|
|
|
# Always keep these packages up to date
|
|
|
|
alwaysupdated:
|
|
pkg.latest:
|
|
- pkgs:
|
|
- openssl
|
|
- openssh-server
|
|
- bash
|
|
- skip_suggestions: True
|
|
|
|
# Set time to UTC
|
|
Etc/UTC:
|
|
timezone.system
|
|
|
|
# Sync curl configuration for Elasticsearch authentication
|
|
{% if GLOBALS.is_manager or GLOBALS.role in ['so-heavynode', 'so-searchnode'] %}
|
|
elastic_curl_config:
|
|
file.managed:
|
|
- name: /opt/so/conf/elasticsearch/curl.config
|
|
- source: salt://elasticsearch/curl.config
|
|
- mode: 600
|
|
- show_changes: False
|
|
- makedirs: True
|
|
{% if GLOBALS.role in GLOBALS.manager_roles %}
|
|
- require:
|
|
- file: elastic_curl_config_distributed
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
|
|
common_sbin:
|
|
file.recurse:
|
|
- name: /usr/sbin
|
|
- source: salt://common/tools/sbin
|
|
- user: 939
|
|
- group: 939
|
|
- file_mode: 755
|
|
- show_changes: False
|
|
{% if GLOBALS.role == 'so-heavynode' %}
|
|
- exclude_pat:
|
|
- so-pcap-import
|
|
{% endif %}
|
|
|
|
# Pin physical NIC names by MAC (run-once) so a kernel upgrade can't renumber the
|
|
# interfaces SO binds by name. The marker keeps it a one-time setup; an admin can
|
|
# pre-create the marker to opt out.
|
|
pin_nic_names:
|
|
cmd.run:
|
|
- name: /usr/sbin/so-nic-pin
|
|
- unless: 'test -e /opt/so/state/nic_names_pinned'
|
|
- require:
|
|
- file: common_sbin
|
|
- file: statedir
|
|
|
|
# Once a node is actually running UEK8, the stock EL9 (RHCK) kernel packages are dead weight.
|
|
# They can't be removed any earlier -- dnf protects the running kernel -- so the cleanup waits
|
|
# for the reboot, which makes the highstate the natural place to catch it: fresh installs
|
|
# reboot at the end of setup, and upgraded nodes reboot whenever the admin schedules it.
|
|
# so-kernel-upgrade --cleanup checks rpm before touching dnf, so this costs an rpm query on
|
|
# every highstate after the first pass. The package list lives in the script only, so there
|
|
# is nothing here to drift out of sync with it.
|
|
remove_stock_kernel:
|
|
cmd.run:
|
|
- name: /usr/sbin/so-kernel-upgrade --cleanup
|
|
- onlyif: 'uname -r | grep -qE "^6\.[0-9]+.*uek"'
|
|
- require:
|
|
- file: common_sbin
|
|
|
|
common_sbin_jinja:
|
|
file.recurse:
|
|
- name: /usr/sbin
|
|
- source: salt://common/tools/sbin_jinja
|
|
- user: 939
|
|
- group: 939
|
|
- file_mode: 755
|
|
- template: jinja
|
|
- show_changes: False
|
|
{% if GLOBALS.role == 'so-heavynode' %}
|
|
- exclude_pat:
|
|
- so-import-pcap
|
|
{% endif %}
|
|
|
|
so-status_script:
|
|
file.managed:
|
|
- name: /usr/sbin/so-status
|
|
- source: salt://common/tools/sbin/so-status
|
|
- mode: 755
|
|
|
|
{% if GLOBALS.is_sensor %}
|
|
# Add sensor cleanup
|
|
so-sensor-clean:
|
|
cron.present:
|
|
- name: /usr/sbin/so-sensor-clean
|
|
- identifier: so-sensor-clean
|
|
- user: root
|
|
- minute: '*'
|
|
- hour: '*'
|
|
- daymonth: '*'
|
|
- month: '*'
|
|
- dayweek: '*'
|
|
{% endif %}
|
|
|
|
# Create the status directory
|
|
sostatusdir:
|
|
file.directory:
|
|
- name: /opt/so/log/sostatus
|
|
- user: 0
|
|
- group: 0
|
|
- makedirs: True
|
|
|
|
sostatus_log:
|
|
file.managed:
|
|
- name: /opt/so/log/sostatus/status.log
|
|
- mode: 644
|
|
- replace: False
|
|
|
|
# Install sostatus check cron. This is used to populate Grid.
|
|
so-status_check_cron:
|
|
cron.present:
|
|
- name: '/usr/sbin/so-status -j > /opt/so/log/sostatus/status.log 2>&1'
|
|
- identifier: so-status_check_cron
|
|
- user: root
|
|
- minute: '*/1'
|
|
- hour: '*'
|
|
- daymonth: '*'
|
|
- month: '*'
|
|
- dayweek: '*'
|
|
|
|
# This cronjob/script runs a check if the node needs restarted, but should be used for future status checks as well
|
|
common_status_check_cron:
|
|
cron.present:
|
|
- name: '/usr/sbin/so-common-status-check > /dev/null 2>&1'
|
|
- identifier: common_status_check
|
|
- user: root
|
|
- minute: '*/10'
|
|
|
|
remove_post_setup_cron:
|
|
cron.absent:
|
|
- name: 'PATH=$PATH:/usr/sbin salt-call state.highstate'
|
|
- identifier: post_setup_cron
|
|
|
|
{% if GLOBALS.role not in ['eval', 'manager', 'managersearch', 'standalone'] %}
|
|
|
|
soversionfile:
|
|
file.managed:
|
|
- name: /etc/soversion
|
|
- source: salt://common/files/soversion
|
|
- mode: 644
|
|
- template: jinja
|
|
|
|
{% endif %}
|
|
|
|
{% if GLOBALS.so_model and GLOBALS.so_model not in ['SO2AMI01', 'SO2AZI01', 'SO2GCI01'] %}
|
|
{% if GLOBALS.os == 'OEL' %}
|
|
# Install Raid tools
|
|
raidpkgs:
|
|
pkg.installed:
|
|
- skip_suggestions: True
|
|
- pkgs:
|
|
- securityonion-raidtools
|
|
- securityonion-megactl
|
|
{% endif %}
|
|
|
|
# Install raid check cron
|
|
so-raid-status:
|
|
cron.present:
|
|
- name: '/usr/sbin/so-raid-status > /dev/null 2>&1'
|
|
- identifier: so-raid-status
|
|
- user: root
|
|
- minute: '*/15'
|
|
- hour: '*'
|
|
- daymonth: '*'
|
|
- month: '*'
|
|
- dayweek: '*'
|
|
|
|
{% endif %}
|
|
{% else %}
|
|
|
|
{{sls}}_state_not_allowed:
|
|
test.fail_without_changes:
|
|
- name: {{sls}}_state_not_allowed
|
|
|
|
{% endif %}
|