mirror of
https://github.com/Security-Onion-Solutions/securityonion.git
synced 2025-12-11 11:42:50 +01:00
Merge pull request #1297 from Security-Onion-Solutions/experimental
Add Airgap code
This commit is contained in:
12
salt/airgap/files/yum.conf
Normal file
12
salt/airgap/files/yum.conf
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
[main]
|
||||||
|
cachedir=/var/cache/yum/$basearch/$releasever
|
||||||
|
keepcache=0
|
||||||
|
debuglevel=2
|
||||||
|
logfile=/var/log/yum.log
|
||||||
|
exactarch=1
|
||||||
|
obsoletes=1
|
||||||
|
gpgcheck=1
|
||||||
|
plugins=1
|
||||||
|
installonly_limit=2
|
||||||
|
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
|
||||||
|
distroverpkg=centos-release
|
||||||
55
salt/airgap/init.sls
Normal file
55
salt/airgap/init.sls
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
{% set MANAGER = salt['grains.get']('master') %}
|
||||||
|
airgapyum:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/yum/yum.conf
|
||||||
|
- source: salt://airgap/files/yum.conf
|
||||||
|
|
||||||
|
airgap.repo:
|
||||||
|
pkgrepo.managed:
|
||||||
|
- humanname: Airgap Repo
|
||||||
|
- baseurl: https://{{ MANAGER }}/repo
|
||||||
|
- gpgcheck: 0
|
||||||
|
|
||||||
|
agbase:
|
||||||
|
file.absent:
|
||||||
|
- name: /etc/yum.repos.d/CentOS-Base.repo
|
||||||
|
|
||||||
|
agcr:
|
||||||
|
file.absent:
|
||||||
|
- name: /etc/yum.repos.d/CentOS-CR.repo
|
||||||
|
|
||||||
|
agdebug:
|
||||||
|
file.absent:
|
||||||
|
- name: /etc/yum.repos.d/CentOS-Debuginfo.repo
|
||||||
|
|
||||||
|
agfasttrack:
|
||||||
|
file.absent:
|
||||||
|
- name: /etc/yum.repos.d/CentOS-fasttrack.repo
|
||||||
|
|
||||||
|
agmedia:
|
||||||
|
file.absent:
|
||||||
|
- name: /etc/yum.repos.d/CentOS-Media.repo
|
||||||
|
|
||||||
|
agsources:
|
||||||
|
file.absent:
|
||||||
|
- name: /etc/yum.repos.d/CentOS-Sources.repo
|
||||||
|
|
||||||
|
agvault:
|
||||||
|
file.absent:
|
||||||
|
- name: /etc/yum.repos.d/CentOS-Vault.repo
|
||||||
|
|
||||||
|
agkernel:
|
||||||
|
file.absent:
|
||||||
|
- name: /etc/yum.repos.d/CentOS-x86_64-kernel.repo
|
||||||
|
|
||||||
|
agepel:
|
||||||
|
file.absent:
|
||||||
|
- name: /etc/yum.repos.d/epel.repo
|
||||||
|
|
||||||
|
agtesting:
|
||||||
|
file.absent:
|
||||||
|
- name: /etc/yum.repos.d/epel-testing.repo
|
||||||
|
|
||||||
|
agssrepo:
|
||||||
|
file.absent:
|
||||||
|
- name: /etc/yum.repos.d/saltstack.repo
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
{%- set FLEET_MANAGER = salt['pillar.get']('global:fleet_manager') %}
|
{%- set FLEET_MANAGER = salt['pillar.get']('global:fleet_manager') %}
|
||||||
{%- set FLEET_NODE = salt['pillar.get']('global:fleet_node') %}
|
{%- set FLEET_NODE = salt['pillar.get']('global:fleet_node') %}
|
||||||
{%- set FLEET_IP = salt['pillar.get']('global:fleet_ip', None) %}
|
{%- set FLEET_IP = salt['pillar.get']('global:fleet_ip', None) %}
|
||||||
|
{%- set ISAIRGAP = salt['pillar.get']('global:airgap') %}
|
||||||
# For more information on configuration, see:
|
# For more information on configuration, see:
|
||||||
# * Official English Documentation: http://nginx.org/en/docs/
|
# * Official English Documentation: http://nginx.org/en/docs/
|
||||||
# * Official Russian Documentation: http://nginx.org/ru/docs/
|
# * Official Russian Documentation: http://nginx.org/ru/docs/
|
||||||
@@ -182,6 +183,20 @@ http {
|
|||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{%- if ISAIRGAP is sameas true %}
|
||||||
|
location /repo/ {
|
||||||
|
allow all;
|
||||||
|
sendfile on;
|
||||||
|
sendfile_max_chunk 1m;
|
||||||
|
autoindex on;
|
||||||
|
autoindex_exact_size off;
|
||||||
|
autoindex_format html;
|
||||||
|
autoindex_localtime on;
|
||||||
|
}
|
||||||
|
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
|
||||||
location /grafana/ {
|
location /grafana/ {
|
||||||
auth_request /auth/sessions/whoami;
|
auth_request /auth/sessions/whoami;
|
||||||
rewrite /grafana/(.*) /$1 break;
|
rewrite /grafana/(.*) /$1 break;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
{% set MANAGER = salt['grains.get']('master') %}
|
{% set MANAGER = salt['grains.get']('master') %}
|
||||||
{% set VERSION = salt['pillar.get']('global:soversion', 'HH1.2.2') %}
|
{% set VERSION = salt['pillar.get']('global:soversion', 'HH1.2.2') %}
|
||||||
{% set IMAGEREPO = salt['pillar.get']('global:imagerepo') %}
|
{% set IMAGEREPO = salt['pillar.get']('global:imagerepo') %}
|
||||||
|
{% set ISAIRGAP = salt['pillar.get']('global:airgap') %}
|
||||||
|
|
||||||
# Drop the correct nginx config based on role
|
# Drop the correct nginx config based on role
|
||||||
nginxconfdir:
|
nginxconfdir:
|
||||||
@@ -72,6 +73,9 @@ so-nginx:
|
|||||||
- /etc/pki/managerssl.crt:/etc/pki/nginx/server.crt:ro
|
- /etc/pki/managerssl.crt:/etc/pki/nginx/server.crt:ro
|
||||||
- /etc/pki/managerssl.key:/etc/pki/nginx/server.key:ro
|
- /etc/pki/managerssl.key:/etc/pki/nginx/server.key:ro
|
||||||
- /opt/so/conf/fleet/packages:/opt/socore/html/packages
|
- /opt/so/conf/fleet/packages:/opt/socore/html/packages
|
||||||
|
{% if ISAIRGAP is sameas true %}
|
||||||
|
- /nsm/repo:/opt/socore/html/repo:ro
|
||||||
|
{% endif %}
|
||||||
# ATT&CK Navigator binds
|
# ATT&CK Navigator binds
|
||||||
- /opt/so/conf/navigator/navigator_config.json:/opt/socore/html/navigator/assets/config.json:ro
|
- /opt/so/conf/navigator/navigator_config.json:/opt/socore/html/navigator/assets/config.json:ro
|
||||||
- /opt/so/conf/navigator/nav_layer_playbook.json:/opt/socore/html/navigator/assets/playbook.json:ro
|
- /opt/so/conf/navigator/nav_layer_playbook.json:/opt/socore/html/navigator/assets/playbook.json:ro
|
||||||
|
|||||||
@@ -9,17 +9,24 @@
|
|||||||
{%- set STRELKA = salt['pillar.get']('strelka:enabled', '0') -%}
|
{%- set STRELKA = salt['pillar.get']('strelka:enabled', '0') -%}
|
||||||
{% import_yaml 'salt/minion.defaults.yaml' as salt %}
|
{% import_yaml 'salt/minion.defaults.yaml' as salt %}
|
||||||
{% set saltversion = salt.salt.minion.version %}
|
{% set saltversion = salt.salt.minion.version %}
|
||||||
|
{% set ISAIRGAP = salt['pillar.get']('global:airgap') %}
|
||||||
|
|
||||||
base:
|
base:
|
||||||
|
|
||||||
'not G@saltversion:{{saltversion}}':
|
'not G@saltversion:{{saltversion}}':
|
||||||
- match: compound
|
- match: compound
|
||||||
|
{% if ISAIRGAP is sameas true %}
|
||||||
|
- airgap
|
||||||
|
{% endif %}
|
||||||
- salt.minion
|
- salt.minion
|
||||||
|
|
||||||
'G@os:CentOS and G@saltversion:{{saltversion}}':
|
'G@os:CentOS and G@saltversion:{{saltversion}}':
|
||||||
- match: compound
|
- match: compound
|
||||||
|
{% if ISAIRGAP is sameas true %}
|
||||||
|
- airgap
|
||||||
|
{% else %}
|
||||||
- yum
|
- yum
|
||||||
|
{% endif %}
|
||||||
- yum.packages
|
- yum.packages
|
||||||
|
|
||||||
'* and G@saltversion:{{saltversion}}':
|
'* and G@saltversion:{{saltversion}}':
|
||||||
|
|||||||
@@ -480,72 +480,6 @@ check_requirements() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_salt_master_config() {
|
|
||||||
|
|
||||||
# Copy the Salt master config template to the proper directory
|
|
||||||
if [ "$setup_type" = 'iso' ]; then
|
|
||||||
cp /root/SecurityOnion/files/master /etc/salt/master >> "$setup_log" 2>&1
|
|
||||||
else
|
|
||||||
cp ../files/master /etc/salt/master >> "$setup_log" 2>&1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Restart the service so it picks up the changes
|
|
||||||
systemctl restart salt-master >> "$setup_log" 2>&1
|
|
||||||
}
|
|
||||||
|
|
||||||
copy_minion_tmp_files() {
|
|
||||||
case "$install_type" in
|
|
||||||
'MANAGER' | 'EVAL' | 'HELIXSENSOR' | 'MANAGERSEARCH' | 'STANDALONE' | 'IMPORT')
|
|
||||||
echo "Copying pillar and salt files in $temp_install_dir to $local_salt_dir"
|
|
||||||
cp -Rv "$temp_install_dir"/pillar/ $local_salt_dir/ >> "$setup_log" 2>&1
|
|
||||||
if [ -d "$temp_install_dir"/salt ] ; then
|
|
||||||
cp -Rv "$temp_install_dir"/salt/ $local_salt_dir/ >> "$setup_log" 2>&1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
{
|
|
||||||
echo "scp pillar and salt files in $temp_install_dir to manager $local_salt_dir";
|
|
||||||
ssh -i /root/.ssh/so.key soremote@"$MSRV" mkdir -p /tmp/"$MINION_ID"/pillar;
|
|
||||||
ssh -i /root/.ssh/so.key soremote@"$MSRV" mkdir -p /tmp/"$MINION_ID"/schedules;
|
|
||||||
scp -prv -i /root/.ssh/so.key "$temp_install_dir"/pillar/minions/* soremote@"$MSRV":/tmp/"$MINION_ID"/pillar/;
|
|
||||||
if [ -d $temp_install_dir/salt/patch/os/schedules/ ]; then
|
|
||||||
if [ "$(ls -A $temp_install_dir/salt/patch/os/schedules/)" ]; then
|
|
||||||
scp -prv -i /root/.ssh/so.key $temp_install_dir/salt/patch/os/schedules/* soremote@$MSRV:/tmp/$MINION_ID/schedules;
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
ssh -i /root/.ssh/so.key soremote@"$MSRV" sudo $default_salt_dir/salt/manager/files/add_minion.sh "$MINION_ID";
|
|
||||||
} >> "$setup_log" 2>&1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
copy_ssh_key() {
|
|
||||||
|
|
||||||
echo "Generating SSH key"
|
|
||||||
# Generate SSH key
|
|
||||||
mkdir -p /root/.ssh
|
|
||||||
ssh-keygen -f /root/.ssh/so.key -t rsa -q -N "" < /dev/zero
|
|
||||||
chown -R "$SUDO_USER":"$SUDO_USER" /root/.ssh
|
|
||||||
echo "Copying the SSH key to the manager"
|
|
||||||
#Copy the key over to the manager
|
|
||||||
ssh-copy-id -f -i /root/.ssh/so.key soremote@"$MSRV"
|
|
||||||
}
|
|
||||||
|
|
||||||
create_local_directories() {
|
|
||||||
echo "Creating local pillar and salt directories"
|
|
||||||
PILLARSALTDIR=${SCRIPTDIR::-5}
|
|
||||||
for i in "pillar" "salt"; do
|
|
||||||
for d in $(find $PILLARSALTDIR/$i -type d); do
|
|
||||||
suffixdir=${d//$PILLARSALTDIR/}
|
|
||||||
if [ ! -d "$local_salt_dir/$suffixdir" ]; then
|
|
||||||
mkdir -v "$local_salt_dir$suffixdir" >> "$setup_log" 2>&1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
chown -R socore:socore "$local_salt_dir/$i"
|
|
||||||
done
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_network_sensor() {
|
configure_network_sensor() {
|
||||||
echo "Setting up sensor interface" >> "$setup_log" 2>&1
|
echo "Setting up sensor interface" >> "$setup_log" 2>&1
|
||||||
local nic_error=0
|
local nic_error=0
|
||||||
@@ -630,6 +564,77 @@ configure_network_sensor() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
copy_salt_master_config() {
|
||||||
|
|
||||||
|
# Copy the Salt master config template to the proper directory
|
||||||
|
if [ "$setup_type" = 'iso' ]; then
|
||||||
|
cp /root/SecurityOnion/files/master /etc/salt/master >> "$setup_log" 2>&1
|
||||||
|
else
|
||||||
|
cp ../files/master /etc/salt/master >> "$setup_log" 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Restart the service so it picks up the changes
|
||||||
|
systemctl restart salt-master >> "$setup_log" 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_minion_tmp_files() {
|
||||||
|
case "$install_type" in
|
||||||
|
'MANAGER' | 'EVAL' | 'HELIXSENSOR' | 'MANAGERSEARCH' | 'STANDALONE' | 'IMPORT')
|
||||||
|
echo "Copying pillar and salt files in $temp_install_dir to $local_salt_dir"
|
||||||
|
cp -Rv "$temp_install_dir"/pillar/ $local_salt_dir/ >> "$setup_log" 2>&1
|
||||||
|
if [ -d "$temp_install_dir"/salt ] ; then
|
||||||
|
cp -Rv "$temp_install_dir"/salt/ $local_salt_dir/ >> "$setup_log" 2>&1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
{
|
||||||
|
echo "scp pillar and salt files in $temp_install_dir to manager $local_salt_dir";
|
||||||
|
ssh -i /root/.ssh/so.key soremote@"$MSRV" mkdir -p /tmp/"$MINION_ID"/pillar;
|
||||||
|
ssh -i /root/.ssh/so.key soremote@"$MSRV" mkdir -p /tmp/"$MINION_ID"/schedules;
|
||||||
|
scp -prv -i /root/.ssh/so.key "$temp_install_dir"/pillar/minions/* soremote@"$MSRV":/tmp/"$MINION_ID"/pillar/;
|
||||||
|
if [ -d $temp_install_dir/salt/patch/os/schedules/ ]; then
|
||||||
|
if [ "$(ls -A $temp_install_dir/salt/patch/os/schedules/)" ]; then
|
||||||
|
scp -prv -i /root/.ssh/so.key $temp_install_dir/salt/patch/os/schedules/* soremote@$MSRV:/tmp/$MINION_ID/schedules;
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
ssh -i /root/.ssh/so.key soremote@"$MSRV" sudo $default_salt_dir/salt/manager/files/add_minion.sh "$MINION_ID";
|
||||||
|
} >> "$setup_log" 2>&1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_ssh_key() {
|
||||||
|
|
||||||
|
echo "Generating SSH key"
|
||||||
|
# Generate SSH key
|
||||||
|
mkdir -p /root/.ssh
|
||||||
|
ssh-keygen -f /root/.ssh/so.key -t rsa -q -N "" < /dev/zero
|
||||||
|
chown -R "$SUDO_USER":"$SUDO_USER" /root/.ssh
|
||||||
|
echo "Copying the SSH key to the manager"
|
||||||
|
#Copy the key over to the manager
|
||||||
|
ssh-copy-id -f -i /root/.ssh/so.key soremote@"$MSRV"
|
||||||
|
}
|
||||||
|
|
||||||
|
create_local_directories() {
|
||||||
|
echo "Creating local pillar and salt directories"
|
||||||
|
PILLARSALTDIR=${SCRIPTDIR::-5}
|
||||||
|
for i in "pillar" "salt"; do
|
||||||
|
for d in $(find $PILLARSALTDIR/$i -type d); do
|
||||||
|
suffixdir=${d//$PILLARSALTDIR/}
|
||||||
|
if [ ! -d "$local_salt_dir/$suffixdir" ]; then
|
||||||
|
mkdir -v "$local_salt_dir$suffixdir" >> "$setup_log" 2>&1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
chown -R socore:socore "$local_salt_dir/$i"
|
||||||
|
done
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
create_repo() {
|
||||||
|
# Create the repo for airgap
|
||||||
|
createrepo /nsm/repo
|
||||||
|
}
|
||||||
|
|
||||||
detect_cloud() {
|
detect_cloud() {
|
||||||
echo "Testing if setup is running on a cloud instance..." >> "$setup_log" 2>&1
|
echo "Testing if setup is running on a cloud instance..." >> "$setup_log" 2>&1
|
||||||
if ( curl --fail -s -m 5 http://169.254.169.254/latest/meta-data/instance-id > /dev/null ) || ( dmidecode -s bios-vendor | grep -q Google > /dev/null); then export is_cloud="true"; fi
|
if ( curl --fail -s -m 5 http://169.254.169.254/latest/meta-data/instance-id > /dev/null ) || ( dmidecode -s bios-vendor | grep -q Google > /dev/null); then export is_cloud="true"; fi
|
||||||
@@ -1096,6 +1101,14 @@ manager_global() {
|
|||||||
" ids: $NIDS"\
|
" ids: $NIDS"\
|
||||||
" url_base: $REDIRECTIT"\
|
" url_base: $REDIRECTIT"\
|
||||||
" managerip: $MAINIP" > "$global_pillar"
|
" managerip: $MAINIP" > "$global_pillar"
|
||||||
|
|
||||||
|
if [[ $is_airgap ]]; then
|
||||||
|
printf '%s\n'\
|
||||||
|
" airgap: True"\ >> "$global_pillar"
|
||||||
|
else
|
||||||
|
printf '%s\n'\
|
||||||
|
" airgap: False"\ >> "$global_pillar"
|
||||||
|
fi
|
||||||
|
|
||||||
# Check if TheHive is enabled. If so, add creds and other details
|
# Check if TheHive is enabled. If so, add creds and other details
|
||||||
if [[ "$THEHIVE" == "1" ]]; then
|
if [[ "$THEHIVE" == "1" ]]; then
|
||||||
@@ -1860,8 +1873,10 @@ set_redirect() {
|
|||||||
set_updates() {
|
set_updates() {
|
||||||
if [ "$MANAGERUPDATES" = '1' ]; then
|
if [ "$MANAGERUPDATES" = '1' ]; then
|
||||||
if [ "$OS" = 'centos' ]; then
|
if [ "$OS" = 'centos' ]; then
|
||||||
if ! grep -q "$MSRV" /etc/yum.conf; then
|
if [[ ! $is_airgap ]]; then
|
||||||
echo "proxy=http://$MSRV:3142" >> /etc/yum.conf
|
if ! grep -q "$MSRV" /etc/yum.conf; then
|
||||||
|
echo "proxy=http://$MSRV:3142" >> /etc/yum.conf
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# Set it up so the updates roll through the manager
|
# Set it up so the updates roll through the manager
|
||||||
|
|||||||
@@ -193,16 +193,16 @@ if [[ "$setup_type" == 'iso' ]]; then
|
|||||||
is_iso=true
|
is_iso=true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#Check if this is an airgap install
|
# Check if this is an airgap install
|
||||||
|
|
||||||
#if [[ $is_manager ]]; then
|
if [[ $is_manager ]]; then
|
||||||
# if [[ $is_iso ]]; then
|
if [[ $is_iso ]]; then
|
||||||
# whiptail_airgap
|
whiptail_airgap
|
||||||
# if [[ "$INTERWEBS" == 'AIRGAP' ]]; then
|
if [[ "$INTERWEBS" == 'AIRGAP' ]]; then
|
||||||
# is_airgap=true
|
is_airgap=true
|
||||||
# fi
|
fi
|
||||||
# fi
|
fi
|
||||||
#fi
|
fi
|
||||||
|
|
||||||
if [[ $is_manager && $is_sensor ]]; then
|
if [[ $is_manager && $is_sensor ]]; then
|
||||||
check_requirements "standalone"
|
check_requirements "standalone"
|
||||||
@@ -411,6 +411,8 @@ if [[ $is_manager || $is_import ]]; then whiptail_so_allow; fi
|
|||||||
|
|
||||||
whiptail_make_changes
|
whiptail_make_changes
|
||||||
|
|
||||||
|
# From here on changes will be made.
|
||||||
|
|
||||||
if [[ -n "$TURBO" ]]; then
|
if [[ -n "$TURBO" ]]; then
|
||||||
use_turbo_proxy
|
use_turbo_proxy
|
||||||
fi
|
fi
|
||||||
@@ -460,6 +462,11 @@ fi
|
|||||||
# Set initial percentage to 0
|
# Set initial percentage to 0
|
||||||
export percentage=0
|
export percentage=0
|
||||||
|
|
||||||
|
if [[ $is_manager && $is_airgap ]]; then
|
||||||
|
info "Creating airgap repo"
|
||||||
|
create_repo >> $setup_log 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ $is_minion ]]; then
|
if [[ $is_minion ]]; then
|
||||||
set_progress_str 1 'Configuring firewall'
|
set_progress_str 1 'Configuring firewall'
|
||||||
set_initial_firewall_policy >> $setup_log 2>&1
|
set_initial_firewall_policy >> $setup_log 2>&1
|
||||||
|
|||||||
Reference in New Issue
Block a user