mirror of
https://github.com/Security-Onion-Solutions/securityonion.git
synced 2025-12-06 17:22:49 +01:00
Merge branch 'dev' of https://github.com/Security-Onion-Solutions/securityonion into dev
This commit is contained in:
@@ -19,6 +19,8 @@
|
|||||||
/opt/so/log/telegraf/*.log
|
/opt/so/log/telegraf/*.log
|
||||||
/opt/so/log/redis/*.log
|
/opt/so/log/redis/*.log
|
||||||
/opt/so/log/salt/so-salt-minion-check
|
/opt/so/log/salt/so-salt-minion-check
|
||||||
|
/opt/so/log/salt/minion
|
||||||
|
/opt/so/log/salt/master
|
||||||
{
|
{
|
||||||
{{ logrotate_conf | indent(width=4) }}
|
{{ logrotate_conf | indent(width=4) }}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,9 +24,70 @@ fi
|
|||||||
# Define a banner to separate sections
|
# Define a banner to separate sections
|
||||||
banner="========================================================================="
|
banner="========================================================================="
|
||||||
|
|
||||||
|
add_interface_bond0() {
|
||||||
|
local BNIC=$1
|
||||||
|
if [[ -z $MTU ]]; then
|
||||||
|
local MTU
|
||||||
|
MTU=$(lookup_pillar "mtu" "sensor")
|
||||||
|
fi
|
||||||
|
local nic_error=0
|
||||||
|
|
||||||
|
# Check if specific offload features are able to be disabled
|
||||||
|
for string in "generic-segmentation-offload" "generic-receive-offload" "tcp-segmentation-offload"; do
|
||||||
|
if ethtool -k "$BNIC" | grep $string | grep -q "on [fixed]"; then
|
||||||
|
echo "The hardware or driver for interface ${BNIC} is not supported, packet capture may not work as expected."
|
||||||
|
((nic_error++))
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
case "$2" in
|
||||||
|
-v|--verbose)
|
||||||
|
local verbose=true
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
for i in rx tx sg tso ufo gso gro lro; do
|
||||||
|
if [[ $verbose != true ]]; then
|
||||||
|
ethtool -K "$BNIC" $i off
|
||||||
|
else
|
||||||
|
ethtool -K "$BNIC" $i off &>/dev/null
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
# Check if the bond slave connection has already been created
|
||||||
|
nmcli -f name,uuid -p con | grep -q "bond0-slave-$BNIC"
|
||||||
|
local found_int=$?
|
||||||
|
|
||||||
|
if [[ $found_int != 0 ]]; then
|
||||||
|
# Create the slave interface and assign it to the bond
|
||||||
|
nmcli con add type ethernet ifname "$BNIC" con-name "bond0-slave-$BNIC" master bond0 -- \
|
||||||
|
ethernet.mtu "$MTU" \
|
||||||
|
connection.autoconnect "yes"
|
||||||
|
else
|
||||||
|
local int_uuid
|
||||||
|
int_uuid=$(nmcli -f name,uuid -p con | sed -n "s/bond0-slave-$BNIC //p" | tr -d ' ')
|
||||||
|
|
||||||
|
nmcli con mod "$int_uuid" \
|
||||||
|
ethernet.mtu "$MTU" \
|
||||||
|
connection.autoconnect "yes"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ip link set dev "$BNIC" arp off multicast off allmulticast off promisc on
|
||||||
|
|
||||||
|
# Bring the slave interface up
|
||||||
|
if [[ $verbose != true ]]; then
|
||||||
|
nmcli con up "bond0-slave-$BNIC"
|
||||||
|
else
|
||||||
|
nmcli con up "bond0-slave-$BNIC" &>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$nic_error" != 0 ]; then
|
||||||
|
return "$nic_error"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
header() {
|
header() {
|
||||||
echo
|
printf '%s\n' "" "$banner" " $*" "$banner"
|
||||||
printf '%s\n' "$banner" "$*" "$banner"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lookup_salt_value() {
|
lookup_salt_value() {
|
||||||
@@ -111,7 +172,7 @@ set_version() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
require_manager() {
|
require_manager() {
|
||||||
if is_manager; then
|
if is_manager_node; then
|
||||||
echo "This is a manager, We can proceed."
|
echo "This is a manager, We can proceed."
|
||||||
else
|
else
|
||||||
echo "Please run this command on the manager; the manager controls the grid."
|
echo "Please run this command on the manager; the manager controls the grid."
|
||||||
@@ -119,7 +180,7 @@ require_manager() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
is_manager() {
|
is_manager_node() {
|
||||||
# Check to see if this is a manager node
|
# Check to see if this is a manager node
|
||||||
role=$(lookup_role)
|
role=$(lookup_role)
|
||||||
is_single_node_grid && return 0
|
is_single_node_grid && return 0
|
||||||
@@ -129,7 +190,7 @@ is_manager() {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
is_sensor() {
|
is_sensor_node() {
|
||||||
# Check to see if this is a sensor (forward) node
|
# Check to see if this is a sensor (forward) node
|
||||||
role=$(lookup_role)
|
role=$(lookup_role)
|
||||||
is_single_node_grid && return 0
|
is_single_node_grid && return 0
|
||||||
@@ -232,6 +293,93 @@ __check_apt_lock() {
|
|||||||
return $lock
|
return $lock
|
||||||
}
|
}
|
||||||
|
|
||||||
|
valid_cidr() {
|
||||||
|
# Verify there is a backslash in the string
|
||||||
|
echo "$1" | grep -qP "^[^/]+/[^/]+$" || return 1
|
||||||
|
|
||||||
|
local cidr
|
||||||
|
local ip
|
||||||
|
|
||||||
|
cidr=$(echo "$1" | sed 's/.*\///')
|
||||||
|
ip=$(echo "$1" | sed 's/\/.*//' )
|
||||||
|
|
||||||
|
if valid_ip4 "$ip"; then
|
||||||
|
[[ $cidr =~ ([0-9]|[1-2][0-9]|3[0-2]) ]] && return 0 || return 1
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
valid_cidr_list() {
|
||||||
|
local all_valid=0
|
||||||
|
|
||||||
|
IFS="," read -r -a net_arr <<< "$1"
|
||||||
|
|
||||||
|
for net in "${net_arr[@]}"; do
|
||||||
|
valid_cidr "$net" || all_valid=1
|
||||||
|
done
|
||||||
|
|
||||||
|
return $all_valid
|
||||||
|
}
|
||||||
|
|
||||||
|
valid_dns_list() {
|
||||||
|
local all_valid=0
|
||||||
|
|
||||||
|
IFS="," read -r -a dns_arr <<< "$1"
|
||||||
|
|
||||||
|
for addr in "${dns_arr[@]}"; do
|
||||||
|
valid_ip4 "$addr" || all_valid=1
|
||||||
|
done
|
||||||
|
|
||||||
|
return $all_valid
|
||||||
|
}
|
||||||
|
|
||||||
|
valid_fqdn() {
|
||||||
|
local fqdn=$1
|
||||||
|
|
||||||
|
echo "$fqdn" | grep -qP '(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$)' \
|
||||||
|
&& return 0 \
|
||||||
|
|| return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
valid_hostname() {
|
||||||
|
local hostname=$1
|
||||||
|
|
||||||
|
[[ $hostname =~ ^[a-zA-Z0-9\-]+$ ]] && [[ $hostname != 'localhost' ]] && return 0 || return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
valid_ip4() {
|
||||||
|
local ip=$1
|
||||||
|
|
||||||
|
echo "$ip" | grep -qP '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' && return 0 || return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
valid_int() {
|
||||||
|
local num=$1
|
||||||
|
local min=${2:-1}
|
||||||
|
local max=${3:-1000}
|
||||||
|
|
||||||
|
[[ $num =~ ^[0-9]*$ ]] && [[ $num -ge $min ]] && [[ $num -le $max ]] && return 0 || return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# {% raw %}
|
||||||
|
|
||||||
|
valid_string() {
|
||||||
|
local str=$1
|
||||||
|
local min_length=${2:-1}
|
||||||
|
local max_length=${3:-64}
|
||||||
|
|
||||||
|
echo "$str" | grep -qP '^\S+$' && [[ ${#str} -ge $min_length ]] && [[ ${#str} -le $max_length ]] && return 0 || return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# {% endraw %}
|
||||||
|
|
||||||
|
valid_username() {
|
||||||
|
local user=$1
|
||||||
|
|
||||||
|
echo "$user" | grep -qP '^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$' && return 0 || return 1
|
||||||
|
}
|
||||||
|
|
||||||
wait_for_web_response() {
|
wait_for_web_response() {
|
||||||
url=$1
|
url=$1
|
||||||
expected=$2
|
expected=$2
|
||||||
|
|||||||
7
salt/common/tools/sbin/so-monitor-add
Normal file
7
salt/common/tools/sbin/so-monitor-add
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
add_interface_bond0 "$1"
|
||||||
@@ -47,25 +47,25 @@ if ! docker ps | grep -q so-tcpreplay; then
|
|||||||
echo "Replay functionality not enabled; attempting to enable now (may require Internet access)..."
|
echo "Replay functionality not enabled; attempting to enable now (may require Internet access)..."
|
||||||
echo
|
echo
|
||||||
|
|
||||||
if is_manager; then
|
if is_manager_node; then
|
||||||
TRUSTED_CONTAINERS=("so-tcpreplay")
|
TRUSTED_CONTAINERS=("so-tcpreplay")
|
||||||
mkdir -p /opt/so/log/tcpreplay
|
mkdir -p /opt/so/log/tcpreplay
|
||||||
update_docker_containers "tcpreplay" "" "" "/opt/so/log/tcpreplay/init.log"
|
update_docker_containers "tcpreplay" "" "" "/opt/so/log/tcpreplay/init.log"
|
||||||
fi
|
fi
|
||||||
if is_sensor; then
|
if is_sensor_node; then
|
||||||
if ! is_manager; then
|
if ! is_manager_node; then
|
||||||
echo "Attempting to start replay container. If this fails then you may need to run this command on the manager first."
|
echo "Attempting to start replay container. If this fails then you may need to run this command on the manager first."
|
||||||
fi
|
fi
|
||||||
so-tcpreplay-start || fail "Unable to initialize tcpreplay"
|
so-tcpreplay-start || fail "Unable to initialize tcpreplay"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if is_sensor; then
|
if is_sensor_node; then
|
||||||
echo "Replaying PCAP(s) at ${REPLAYSPEED} Mbps on interface ${REPLAYIFACE}..."
|
echo "Replaying PCAP(s) at ${REPLAYSPEED} Mbps on interface ${REPLAYIFACE}..."
|
||||||
docker exec so-tcpreplay /usr/bin/bash -c "/usr/local/bin/tcpreplay -i ${REPLAYIFACE} -M${REPLAYSPEED} $@"
|
docker exec so-tcpreplay /usr/bin/bash -c "/usr/local/bin/tcpreplay -i ${REPLAYIFACE} -M${REPLAYSPEED} $@"
|
||||||
|
|
||||||
echo "Replay completed. Warnings shown above are typically expected."
|
echo "Replay completed. Warnings shown above are typically expected."
|
||||||
elif is_manager; then
|
elif is_manager_node; then
|
||||||
echo "The sensor nodes in this grid can now replay traffic."
|
echo "The sensor nodes in this grid can now replay traffic."
|
||||||
else
|
else
|
||||||
echo "Unable to replay traffic since this node is not a sensor node."
|
echo "Unable to replay traffic since this node is not a sensor node."
|
||||||
|
|||||||
@@ -356,18 +356,14 @@ clear_manager() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
collect_soremote_inputs() {
|
|
||||||
whiptail_create_soremote_user
|
|
||||||
SCMATCH=no
|
|
||||||
while [[ $SCMATCH != yes ]]; do
|
|
||||||
whiptail_create_soremote_user_password1
|
|
||||||
whiptail_create_soremote_user_password2
|
|
||||||
check_soremote_pass
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
collect_adminuser_inputs() {
|
collect_adminuser_inputs() {
|
||||||
whiptail_create_admin_user
|
whiptail_create_admin_user
|
||||||
|
|
||||||
|
while ! valid_username "$ADMINUSER"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_create_admin_user
|
||||||
|
done
|
||||||
|
|
||||||
APMATCH=no
|
APMATCH=no
|
||||||
while [[ $APMATCH != yes ]]; do
|
while [[ $APMATCH != yes ]]; do
|
||||||
whiptail_create_admin_user_password1
|
whiptail_create_admin_user_password1
|
||||||
@@ -376,8 +372,73 @@ collect_adminuser_inputs() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
collect_cur_close_days() {
|
||||||
|
whiptail_cur_close_days
|
||||||
|
|
||||||
|
while ! valid_int "$CURCLOSEDAYS" "1"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_cur_close_days
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_dns() {
|
||||||
|
whiptail_management_interface_dns
|
||||||
|
|
||||||
|
while ! valid_dns_list "$MDNS"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_management_interface_dns
|
||||||
|
done
|
||||||
|
|
||||||
|
MDNS=$(echo "$MDNS" | tr -s "," " ") # MDNS needs to be space separated, we prompt for comma separated for consistency
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_dns_domain() {
|
||||||
|
whiptail_management_interface_dns_search
|
||||||
|
|
||||||
|
while ! valid_fqdn "$MSEARCH"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_management_interface_dns_search
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_dockernet() {
|
||||||
|
if ! whiptail_dockernet_check; then
|
||||||
|
whiptail_dockernet_net
|
||||||
|
|
||||||
|
while ! valid_ip4 "$DOCKERNET"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_dockernet_net
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_es_cluster_name() {
|
||||||
|
if whiptail_manager_adv_escluster; then
|
||||||
|
whiptail_manager_adv_escluster_name
|
||||||
|
|
||||||
|
while ! valid_string "$ESCLUSTERNAME"; do
|
||||||
|
whiptail_invalid_string "ES cluster name"
|
||||||
|
whiptail_manager_adv_escluster_name
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_es_space_limit() {
|
||||||
|
whiptail_log_size_limit
|
||||||
|
|
||||||
|
while ! valid_int "$log_size_limit" "1"; do # Upper/lower bounds?
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_log_size_limit
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
collect_fleet_custom_hostname_inputs() {
|
collect_fleet_custom_hostname_inputs() {
|
||||||
whiptail_fleet_custom_hostname
|
whiptail_fleet_custom_hostname
|
||||||
|
|
||||||
|
while ! valid_fqdn "$FLEETCUSTOMHOSTNAME" || [[ $FLEETCUSTOMHOSTNAME != "" ]]; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_fleet_custom_hostname
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
collect_fleetuser_inputs() {
|
collect_fleetuser_inputs() {
|
||||||
@@ -404,6 +465,218 @@ collect_fleetuser_inputs() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
collect_gateway() {
|
||||||
|
whiptail_management_interface_gateway
|
||||||
|
|
||||||
|
while ! valid_ip4 "$MGATEWAY"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_management_interface_gateway
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_helix_key() {
|
||||||
|
whiptail_helix_apikey # validate?
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_homenet_mngr() {
|
||||||
|
whiptail_homenet_manager
|
||||||
|
|
||||||
|
while ! valid_cidr_list "$HNMANAGER"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_homenet_manager
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_homenet_snsr() {
|
||||||
|
if whiptail_homenet_sensor_inherit; then
|
||||||
|
export HNSENSOR=inherit
|
||||||
|
else
|
||||||
|
whiptail_homenet_sensor
|
||||||
|
|
||||||
|
while ! valid_cidr_list "$HNSENSOR"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_homenet_sensor
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_hostname() {
|
||||||
|
HOSTNAME=$(cat /etc/hostname)
|
||||||
|
if [[ "$HOSTNAME" == *'localhost'* ]]; then HOSTNAME=securityonion; fi
|
||||||
|
|
||||||
|
whiptail_set_hostname
|
||||||
|
|
||||||
|
while ! valid_hostname "$HOSTNAME"; do
|
||||||
|
whiptail_invalid_hostname
|
||||||
|
whiptail_set_hostname
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_int_ip_mask() {
|
||||||
|
whiptail_management_interface_ip_mask
|
||||||
|
|
||||||
|
while ! valid_cidr "$manager_ip_mask"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_management_interface_ip_mask
|
||||||
|
done
|
||||||
|
|
||||||
|
MIP=$(echo "$manager_ip_mask" | sed 's/\/.*//' )
|
||||||
|
MMASK=$(echo "$manager_ip_mask" | sed 's/.*\///')
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_mngr_hostname() {
|
||||||
|
whiptail_management_server
|
||||||
|
|
||||||
|
while ! valid_hostname "$MSRV"; do
|
||||||
|
whiptail_invalid_hostname
|
||||||
|
whiptail_management_server
|
||||||
|
done
|
||||||
|
|
||||||
|
if ! getent hosts "$MSRV"; then
|
||||||
|
add_manager_hostfile
|
||||||
|
else
|
||||||
|
MSRVIP=$(getent hosts "$MSRV" | awk 'NR==1{print $1}')
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_mtu() {
|
||||||
|
whiptail_bond_nics_mtu
|
||||||
|
|
||||||
|
while ! valid_int "$MTU" "68"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_bond_nics_mtu
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_node_es_heap() {
|
||||||
|
whiptail_node_es_heap
|
||||||
|
|
||||||
|
while ! valid_int "$NODE_ES_HEAP_SIZE"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_node_es_heap
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_node_ls_heap() {
|
||||||
|
whiptail_node_ls_heap
|
||||||
|
|
||||||
|
while ! valid_int "$NODE_LS_HEAP_SIZE"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_node_ls_heap
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_node_ls_input() {
|
||||||
|
whiptail_node_ls_input_threads
|
||||||
|
while ! valid_int "$LSINPUTTHREADS"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_node_ls_input_threads
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_node_ls_pipeline_batch_size() {
|
||||||
|
whiptail_node_ls_pipline_batchsize
|
||||||
|
|
||||||
|
while ! valid_int "$LSPIPELINEBATCH"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_node_ls_pipline_batchsize
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_node_ls_pipeline_worker_count() {
|
||||||
|
whiptail_node_ls_pipeline_worker
|
||||||
|
|
||||||
|
while ! valid_int "$LSPIPELINEWORKERS"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_node_ls_pipeline_worker
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_oinkcode() {
|
||||||
|
whiptail_oinkcode
|
||||||
|
while ! valid_string "$OINKCODE" "" "128"; do #TODO: verify max length here
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_oinkcode
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_patch_schedule() {
|
||||||
|
whiptail_patch_schedule
|
||||||
|
|
||||||
|
case "$patch_schedule" in
|
||||||
|
'New Schedule')
|
||||||
|
whiptail_patch_schedule_select_days
|
||||||
|
whiptail_patch_schedule_select_hours
|
||||||
|
collect_patch_schedule_name_new
|
||||||
|
patch_schedule_os_new
|
||||||
|
;;
|
||||||
|
'Import Schedule')
|
||||||
|
collect_patch_schedule_name_import
|
||||||
|
;;
|
||||||
|
'Automatic')
|
||||||
|
PATCHSCHEDULENAME='auto'
|
||||||
|
;;
|
||||||
|
'Manual')
|
||||||
|
PATCHSCHEDULENAME='manual'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_patch_schedule_name_new() {
|
||||||
|
whiptail_patch_name_new_schedule
|
||||||
|
|
||||||
|
while ! valid_string "$PATCHSCHEDULENAME"; do
|
||||||
|
whiptail_invalid_string "schedule name"
|
||||||
|
whiptail_patch_name_new_schedule
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_patch_schedule_name_import() {
|
||||||
|
whiptail_patch_schedule_import
|
||||||
|
|
||||||
|
while ! valid_string "$PATCHSCHEDULENAME"; do
|
||||||
|
whiptail_invalid_string "schedule name"
|
||||||
|
whiptail_patch_schedule_import
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_redirect_host() {
|
||||||
|
whiptail_set_redirect_host
|
||||||
|
|
||||||
|
while ! valid_ip4 "$REDIRECTHOST" && ! valid_hostname "$REDIRECTHOST" && ! valid_fqdn "$REDIRECTHOST"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_set_redirect_host
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_so_allow() {
|
||||||
|
if whiptail_so_allow_yesno; then
|
||||||
|
whiptail_so_allow
|
||||||
|
while ! valid_cidr "$ALLOW_CIDR" && ! valid_ip4 "$ALLOW_CIDR"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_so_allow
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_soremote_inputs() {
|
||||||
|
whiptail_create_soremote_user
|
||||||
|
SCMATCH=no
|
||||||
|
while [[ $SCMATCH != yes ]]; do
|
||||||
|
whiptail_create_soremote_user_password1
|
||||||
|
whiptail_create_soremote_user_password2
|
||||||
|
check_soremote_pass
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_suri() {
|
||||||
|
whiptail_basic_suri
|
||||||
|
|
||||||
|
while ! valid_int "$BASICSURI"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_basic_suri
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
collect_webuser_inputs() {
|
collect_webuser_inputs() {
|
||||||
# Get a password for the web admin user
|
# Get a password for the web admin user
|
||||||
@@ -421,9 +694,9 @@ collect_webuser_inputs() {
|
|||||||
while [[ $WPMATCH != yes ]]; do
|
while [[ $WPMATCH != yes ]]; do
|
||||||
whiptail_create_web_user_password1
|
whiptail_create_web_user_password1
|
||||||
while ! check_password "$WEBPASSWD1"; do
|
while ! check_password "$WEBPASSWD1"; do
|
||||||
whiptail_invalid_pass_characters_warning
|
whiptail_invalid_pass_characters_warning
|
||||||
whiptail_create_web_user_password1
|
whiptail_create_web_user_password1
|
||||||
done
|
done
|
||||||
if echo "$WEBPASSWD1" | so-user valpass >> "$setup_log" 2>&1; then
|
if echo "$WEBPASSWD1" | so-user valpass >> "$setup_log" 2>&1; then
|
||||||
whiptail_create_web_user_password2
|
whiptail_create_web_user_password2
|
||||||
check_web_pass
|
check_web_pass
|
||||||
@@ -433,6 +706,15 @@ collect_webuser_inputs() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
collect_zeek() {
|
||||||
|
whiptail_basic_zeek
|
||||||
|
|
||||||
|
while ! valid_int "$BASICZEEK"; do
|
||||||
|
whiptail_invalid_input
|
||||||
|
whiptail_basic_zeek
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
configure_minion() {
|
configure_minion() {
|
||||||
local minion_type=$1
|
local minion_type=$1
|
||||||
echo "Configuring minion type as $minion_type" >> "$setup_log" 2>&1
|
echo "Configuring minion type as $minion_type" >> "$setup_log" 2>&1
|
||||||
@@ -570,31 +852,22 @@ compare_versions() {
|
|||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
# Set the MTU
|
|
||||||
if [[ $NSMSETUP != 'ADVANCED' ]]; then
|
|
||||||
if [[ $is_cloud ]]; then MTU=1575; else MTU=1500; fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $is_cloud ]]; then
|
if [[ $is_cloud ]]; then
|
||||||
INTERFACE=${BNICS[0]}
|
local nmcli_con_args=( "type" "ethernet" )
|
||||||
local nmcli_con_arg="type ethernet"
|
|
||||||
else
|
else
|
||||||
INTERFACE='bond0'
|
local nmcli_con_args=( "type" "bond" "mode" "0" )
|
||||||
local nmcli_con_arg="type bond mode 0"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Create the bond interface only if it doesn't already exist
|
# Create the bond interface only if it doesn't already exist
|
||||||
|
|
||||||
nmcli -f name,uuid -p con | grep -q "$INTERFACE" >> "$setup_log" 2>&1
|
nmcli -f name,uuid -p con | grep -q "$INTERFACE" >> "$setup_log" 2>&1
|
||||||
local found_int=$?
|
local found_int=$?
|
||||||
|
|
||||||
if [[ $found_int != 0 ]]; then
|
if [[ $found_int != 0 ]]; then
|
||||||
nmcli con add ifname "$INTERFACE" con-name "$INTERFACE" $nmcli_con_arg -- \
|
nmcli con add ifname "$INTERFACE" con-name "$INTERFACE" "${nmcli_con_args[@]}" -- \
|
||||||
ipv4.method disabled \
|
ipv4.method disabled \
|
||||||
ipv6.method ignore \
|
ipv6.method ignore \
|
||||||
ethernet.mtu $MTU \
|
ethernet.mtu "$MTU" \
|
||||||
connection.autoconnect "yes" >> "$setup_log" 2>&1
|
connection.autoconnect "yes" >> "$setup_log" 2>&1
|
||||||
else
|
else
|
||||||
local int_uuid
|
local int_uuid
|
||||||
@@ -603,53 +876,17 @@ configure_network_sensor() {
|
|||||||
nmcli con mod "$int_uuid" \
|
nmcli con mod "$int_uuid" \
|
||||||
ipv4.method disabled \
|
ipv4.method disabled \
|
||||||
ipv6.method ignore \
|
ipv6.method ignore \
|
||||||
ethernet.mtu $MTU \
|
ethernet.mtu "$MTU" \
|
||||||
connection.autoconnect "yes" >> "$setup_log" 2>&1
|
connection.autoconnect "yes" >> "$setup_log" 2>&1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
local err=0
|
||||||
for BNIC in "${BNICS[@]}"; do
|
for BNIC in "${BNICS[@]}"; do
|
||||||
# Check if specific offload features are able to be disabled
|
add_interface_bond0 "$BNIC" --verbose >> "$setup_log" 2>&1
|
||||||
for string in "generic-segmentation-offload" "generic-receive-offload" "tcp-segmentation-offload"; do
|
local ret=$?
|
||||||
if ethtool -k "$BNIC" | grep $string | grep -q "on [fixed]"; then
|
[[ $ret -eq 0 ]] || err=$ret
|
||||||
echo "The hardware or driver for interface ${BNIC} is not supported, packet capture may not work as expected." >> "$setup_log" 2>&1
|
|
||||||
nic_error=1
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Turn off various offloading settings for the interface
|
|
||||||
for i in rx tx sg tso ufo gso gro lro; do
|
|
||||||
ethtool -K "$BNIC" $i off >> "$setup_log" 2>&1
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ $is_cloud ]]; then
|
|
||||||
nmcli con up "$BNIC" >> "$setup_log" 2>&1
|
|
||||||
else
|
|
||||||
# Check if the bond slave connection has already been created
|
|
||||||
nmcli -f name,uuid -p con | grep -q "bond0-slave-$BNIC" >> "$setup_log" 2>&1
|
|
||||||
local found_int=$?
|
|
||||||
|
|
||||||
if [[ $found_int != 0 ]]; then
|
|
||||||
# Create the slave interface and assign it to the bond
|
|
||||||
nmcli con add type ethernet ifname "$BNIC" con-name "bond0-slave-$BNIC" master bond0 -- \
|
|
||||||
ethernet.mtu $MTU \
|
|
||||||
connection.autoconnect "yes" >> "$setup_log" 2>&1
|
|
||||||
else
|
|
||||||
local int_uuid
|
|
||||||
int_uuid=$(nmcli -f name,uuid -p con | sed -n "s/bond0-slave-$BNIC //p" | tr -d ' ')
|
|
||||||
|
|
||||||
nmcli con mod "$int_uuid" \
|
|
||||||
ethernet.mtu $MTU \
|
|
||||||
connection.autoconnect "yes" >> "$setup_log" 2>&1
|
|
||||||
fi
|
|
||||||
|
|
||||||
nmcli con up "bond0-slave-$BNIC" >> "$setup_log" 2>&1 # Bring the slave interface up
|
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
|
return $err
|
||||||
if [ $nic_error != 0 ]; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_salt_master_config() {
|
copy_salt_master_config() {
|
||||||
@@ -974,12 +1211,20 @@ docker_seed_registry() {
|
|||||||
|
|
||||||
download_repo_tarball() {
|
download_repo_tarball() {
|
||||||
|
|
||||||
mkdir -p /root/manager_setup/securityonion
|
mkdir -p /root/manager_setup
|
||||||
{
|
|
||||||
local manager_ver
|
local manager_ver
|
||||||
manager_ver=$($sshcmd -i /root/.ssh/so.key soremote@"$MSRV" cat /etc/soversion)
|
manager_ver=$($sshcmd -i /root/.ssh/so.key soremote@"$MSRV" cat /etc/soversion) >> "$setup_log" 2>&1
|
||||||
$scpcmd -i /root/.ssh/so.key soremote@"$MSRV":/opt/so/repo/"$manager_ver".tar.gz /root/manager_setup
|
|
||||||
} >> "$setup_log" 2>&1
|
# Fail if we can't determine the version
|
||||||
|
if [[ $manager_ver == '' ]]; then
|
||||||
|
rm /root/install_opt
|
||||||
|
local message="Could not determine the version of Security Onion running on the manager, please check your network settings."
|
||||||
|
echo "$message" | tee -a "$setup_log"
|
||||||
|
kill -SIGUSR1 "$(ps --pid $$ -oppid=)"; exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
$scpcmd -i /root/.ssh/so.key soremote@"$MSRV":/opt/so/repo/"$manager_ver".tar.gz /root/manager_setup >> "$setup_log" 2>&1
|
||||||
|
|
||||||
# Fail if the file doesn't download
|
# Fail if the file doesn't download
|
||||||
if ! [ -f /root/manager_setup/"$manager_ver".tar.gz ]; then
|
if ! [ -f /root/manager_setup/"$manager_ver".tar.gz ]; then
|
||||||
@@ -988,7 +1233,8 @@ download_repo_tarball() {
|
|||||||
echo "$message" | tee -a "$setup_log"
|
echo "$message" | tee -a "$setup_log"
|
||||||
kill -SIGUSR1 "$(ps --pid $$ -oppid=)"; exit 1
|
kill -SIGUSR1 "$(ps --pid $$ -oppid=)"; exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
mkdir -p /root/manager_setup/securityonion
|
||||||
{
|
{
|
||||||
tar -xzf /root/manager_setup/"$manager_ver".tar.gz -C /root/manager_setup/securityonion
|
tar -xzf /root/manager_setup/"$manager_ver".tar.gz -C /root/manager_setup/securityonion
|
||||||
rm -rf /root/manager_setup/"$manager_ver".tar.gz
|
rm -rf /root/manager_setup/"$manager_ver".tar.gz
|
||||||
@@ -1059,10 +1305,26 @@ generate_repo_tarball() {
|
|||||||
tar -czf /opt/so/repo/"$SOVERSION".tar.gz ../.
|
tar -czf /opt/so/repo/"$SOVERSION".tar.gz ../.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
generate_sensor_vars() {
|
||||||
|
# Set the MTU
|
||||||
|
if [[ $NSMSETUP != 'ADVANCED' ]]; then
|
||||||
|
if [[ $is_cloud ]]; then MTU=1575; else MTU=1500; fi
|
||||||
|
fi
|
||||||
|
export MTU
|
||||||
|
|
||||||
|
# Set interface variable
|
||||||
|
if [[ $is_cloud ]]; then
|
||||||
|
INTERFACE=${BNICS[0]}
|
||||||
|
else
|
||||||
|
INTERFACE='bond0'
|
||||||
|
fi
|
||||||
|
export INTERFACE
|
||||||
|
}
|
||||||
|
|
||||||
get_redirect() {
|
get_redirect() {
|
||||||
whiptail_set_redirect
|
whiptail_set_redirect
|
||||||
if [ "$REDIRECTINFO" = "OTHER" ]; then
|
if [ "$REDIRECTINFO" = "OTHER" ]; then
|
||||||
whiptail_set_redirect_host
|
collect_redirect_host
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1388,22 +1650,21 @@ network_init() {
|
|||||||
network_init_whiptail() {
|
network_init_whiptail() {
|
||||||
case "$setup_type" in
|
case "$setup_type" in
|
||||||
'iso')
|
'iso')
|
||||||
whiptail_set_hostname
|
collect_hostname
|
||||||
whiptail_management_nic
|
whiptail_management_nic
|
||||||
whiptail_dhcp_or_static
|
whiptail_dhcp_or_static
|
||||||
|
|
||||||
if [ "$address_type" != 'DHCP' ]; then
|
if [ "$address_type" != 'DHCP' ]; then
|
||||||
whiptail_management_interface_ip
|
collect_int_ip_mask
|
||||||
whiptail_management_interface_mask
|
collect_gateway
|
||||||
whiptail_management_interface_gateway
|
collect_dns
|
||||||
whiptail_management_interface_dns
|
collect_dns_domain
|
||||||
whiptail_management_interface_dns_search
|
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
'network')
|
'network')
|
||||||
whiptail_network_notice
|
whiptail_network_notice
|
||||||
whiptail_dhcp_warn
|
whiptail_dhcp_warn
|
||||||
whiptail_set_hostname
|
collect_hostname
|
||||||
whiptail_management_nic
|
whiptail_management_nic
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -2028,6 +2289,7 @@ sensor_pillar() {
|
|||||||
if [ "$HNSENSOR" != 'inherit' ]; then
|
if [ "$HNSENSOR" != 'inherit' ]; then
|
||||||
echo " hnsensor: $HNSENSOR" >> "$pillar_file"
|
echo " hnsensor: $HNSENSOR" >> "$pillar_file"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set_default_log_size() {
|
set_default_log_size() {
|
||||||
|
|||||||
@@ -277,10 +277,10 @@ if ! [[ -f $install_opt_file ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $is_minion ]]; then
|
if [[ $is_minion ]]; then
|
||||||
whiptail_management_server
|
collect_mngr_hostname
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $is_minion ]] || [[ $reinit_networking ]] || ! [[ -f $net_init_file ]]; then
|
if [[ $is_minion ]] || [[ $reinit_networking ]] || [[ $is_iso ]] && ! [[ -f $net_init_file ]]; then
|
||||||
whiptail_management_interface_setup
|
whiptail_management_interface_setup
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -379,6 +379,10 @@ fi
|
|||||||
|
|
||||||
# Start user prompts
|
# Start user prompts
|
||||||
|
|
||||||
|
if [[ $is_helix ]]; then
|
||||||
|
collect_helix_key
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ $is_helix || $is_sensor ]]; then
|
if [[ $is_helix || $is_sensor ]]; then
|
||||||
whiptail_sensor_nics
|
whiptail_sensor_nics
|
||||||
fi
|
fi
|
||||||
@@ -388,10 +392,10 @@ if [[ $is_helix || $is_sensor || $is_import ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! $is_import ]]; then
|
if [[ ! $is_import ]]; then
|
||||||
whiptail_patch_schedule
|
collect_patch_schedule
|
||||||
fi
|
fi
|
||||||
|
|
||||||
whiptail_homenet_manager
|
collect_homenet_mngr
|
||||||
|
|
||||||
if [[ $is_helix || $is_manager || $is_node || $is_import ]]; then
|
if [[ $is_helix || $is_manager || $is_node || $is_import ]]; then
|
||||||
set_base_heapsizes
|
set_base_heapsizes
|
||||||
@@ -401,22 +405,22 @@ if [[ $is_manager && ! $is_eval ]]; then
|
|||||||
whiptail_manager_adv
|
whiptail_manager_adv
|
||||||
if [ "$MANAGERADV" = 'ADVANCED' ]; then
|
if [ "$MANAGERADV" = 'ADVANCED' ]; then
|
||||||
if [ "$install_type" = 'MANAGER' ] || [ "$install_type" = 'MANAGERSEARCH' ]; then
|
if [ "$install_type" = 'MANAGER' ] || [ "$install_type" = 'MANAGERSEARCH' ]; then
|
||||||
whiptail_manager_adv_escluster
|
collect_es_cluster_name
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
whiptail_metadata_tool
|
whiptail_metadata_tool
|
||||||
if [ "$MANAGERADV" = 'ADVANCED' ] && [ "$ZEEKVERSION" != 'SURICATA' ]; then
|
|
||||||
whiptail_manager_adv_service_zeeklogs
|
[[ $MANAGERADV == "ADVANCED" ]] && [[ $ZEEKVERSION == "ZEEK" ]] && whiptail_manager_adv_service_zeeklogs
|
||||||
fi
|
|
||||||
# Don't run this function for now since Snort is not yet supported
|
# Don't run this function for now since Snort is not yet supported
|
||||||
# whiptail_nids
|
# whiptail_nids
|
||||||
NIDS=Suricata
|
NIDS=Suricata
|
||||||
whiptail_rule_setup
|
whiptail_rule_setup
|
||||||
|
|
||||||
if [ "$RULESETUP" != 'ETOPEN' ]; then
|
if [ "$RULESETUP" != 'ETOPEN' ]; then
|
||||||
whiptail_oinkcode
|
collect_oinkcode
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $is_manager ]]; then
|
if [[ $is_manager ]]; then
|
||||||
@@ -430,7 +434,7 @@ if [[ $is_manager ]]; then
|
|||||||
info "Disabling Strelka rules: STRELKA='$STRELKA'"
|
info "Disabling Strelka rules: STRELKA='$STRELKA'"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
whiptail_dockernet_check
|
collect_dockernet
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $is_manager || $is_import ]]; then
|
if [[ $is_manager || $is_import ]]; then
|
||||||
@@ -450,28 +454,28 @@ if [[ $is_distmanager ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $is_sensor && ! $is_eval ]]; then
|
if [[ $is_sensor && ! $is_eval ]]; then
|
||||||
whiptail_homenet_sensor
|
collect_homenet_snsr
|
||||||
whiptail_sensor_config
|
whiptail_sensor_config
|
||||||
if [ $NSMSETUP == 'ADVANCED' ]; then
|
if [ $NSMSETUP == 'ADVANCED' ]; then
|
||||||
whiptail_zeek_pins
|
[[ $ZEEKVERSION == "ZEEK" ]] && whiptail_zeek_pins
|
||||||
whiptail_suricata_pins
|
whiptail_suricata_pins
|
||||||
whiptail_bond_nics_mtu
|
collect_mtu
|
||||||
else
|
else
|
||||||
whiptail_basic_zeek
|
[[ $ZEEKVERSION == "ZEEK" ]] && collect_zeek
|
||||||
whiptail_basic_suri
|
collect_suri
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $is_node && ! $is_eval ]]; then
|
if [[ $is_node && ! $is_eval ]]; then
|
||||||
whiptail_node_advanced
|
whiptail_node_advanced
|
||||||
if [ "$NODESETUP" == 'NODEADVANCED' ]; then
|
if [ "$NODESETUP" == 'NODEADVANCED' ]; then
|
||||||
whiptail_node_es_heap
|
collect_node_es_heap
|
||||||
whiptail_node_ls_heap
|
collect_node_ls_heap
|
||||||
whiptail_node_ls_pipeline_worker
|
collect_node_ls_pipeline_worker_count
|
||||||
whiptail_node_ls_pipline_batchsize
|
collect_node_ls_pipeline_batch_size
|
||||||
whiptail_node_ls_input_threads
|
collect_node_ls_input
|
||||||
whiptail_cur_close_days
|
collect_cur_close_days
|
||||||
whiptail_log_size_limit
|
collect_es_space_limit
|
||||||
else
|
else
|
||||||
NODE_ES_HEAP_SIZE=$ES_HEAP_SIZE
|
NODE_ES_HEAP_SIZE=$ES_HEAP_SIZE
|
||||||
NODE_LS_HEAP_SIZE=$LS_HEAP_SIZE
|
NODE_LS_HEAP_SIZE=$LS_HEAP_SIZE
|
||||||
@@ -490,7 +494,7 @@ else
|
|||||||
FLEETNODEPASSWD1=$WEBPASSWD1
|
FLEETNODEPASSWD1=$WEBPASSWD1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $is_manager || $is_import ]]; then whiptail_so_allow; fi
|
if [[ $is_manager || $is_import ]]; then collect_so_allow; fi
|
||||||
|
|
||||||
whiptail_make_changes
|
whiptail_make_changes
|
||||||
|
|
||||||
@@ -569,19 +573,20 @@ set_redirect >> $setup_log 2>&1
|
|||||||
set_progress_str 2 'Updating packages'
|
set_progress_str 2 'Updating packages'
|
||||||
update_packages >> $setup_log 2>&1
|
update_packages >> $setup_log 2>&1
|
||||||
|
|
||||||
if [[ $is_sensor || $is_helix ]]; then
|
|
||||||
set_progress_str 3 'Configuring sensor interface'
|
|
||||||
configure_network_sensor >> $setup_log 2>&1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $is_sensor || $is_helix || $is_import ]]; then
|
if [[ $is_sensor || $is_helix || $is_import ]]; then
|
||||||
set_progress_str 4 'Generating sensor pillar'
|
set_progress_str 3 'Generating sensor pillar'
|
||||||
|
generate_sensor_vars
|
||||||
sensor_pillar >> $setup_log 2>&1
|
sensor_pillar >> $setup_log 2>&1
|
||||||
if [[ $is_sensor || $is_helix ]]; then
|
if [[ $is_sensor || $is_helix ]]; then
|
||||||
steno_pillar >> $setup_log
|
steno_pillar >> $setup_log
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ $is_sensor || $is_helix ]]; then
|
||||||
|
set_progress_str 4 'Configuring sensor interface'
|
||||||
|
configure_network_sensor >> $setup_log 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
set_progress_str 5 'Installing Salt and dependencies'
|
set_progress_str 5 'Installing Salt and dependencies'
|
||||||
saltify 2>> $setup_log
|
saltify 2>> $setup_log
|
||||||
|
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ whiptail_basic_zeek() {
|
|||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
whiptail_bond_nics_mtu() {
|
whiptail_bond_nics_mtu() {
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
@@ -76,7 +75,6 @@ whiptail_bond_nics_mtu() {
|
|||||||
|
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_cancel() {
|
whiptail_cancel() {
|
||||||
@@ -121,6 +119,8 @@ whiptail_create_admin_user() {
|
|||||||
ADMINUSER=$(whiptail --title "Security Onion Install" --inputbox \
|
ADMINUSER=$(whiptail --title "Security Onion Install" --inputbox \
|
||||||
"Please enter a username for a new system admin user: \nThe local onion account will be disabled during this install" 10 60 3>&1 1>&2 2>&3)
|
"Please enter a username for a new system admin user: \nThe local onion account will be disabled during this install" 10 60 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
|
local exitstatus=$?
|
||||||
|
whiptail_check_exitstatus $exitstatus
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_create_admin_user_password1() {
|
whiptail_create_admin_user_password1() {
|
||||||
@@ -244,17 +244,6 @@ whiptail_create_web_user_password2() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_fleet_custom_hostname() {
|
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
|
||||||
|
|
||||||
FLEETCUSTOMHOSTNAME=$(whiptail --title "Security Onion Install" --inputbox \
|
|
||||||
"What FQDN should osquery clients use for connections to this Fleet node? Leave blank if the local system hostname will be used." 10 60 3>&1 1>&2 2>&3)
|
|
||||||
|
|
||||||
local exitstatus=$?
|
|
||||||
whiptail_check_exitstatus $exitstatus
|
|
||||||
}
|
|
||||||
|
|
||||||
whiptail_requirements_error() {
|
whiptail_requirements_error() {
|
||||||
|
|
||||||
local requirement_needed=$1
|
local requirement_needed=$1
|
||||||
@@ -312,20 +301,6 @@ whiptail_storage_requirements() {
|
|||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_invalid_pass_warning() {
|
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
|
||||||
|
|
||||||
whiptail --title "Security Onion Setup" --msgbox "Please choose a more secure password." 8 75
|
|
||||||
}
|
|
||||||
|
|
||||||
whiptail_invalid_pass_characters_warning() {
|
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
|
||||||
|
|
||||||
whiptail --title "Security Onion Setup" --msgbox "Password is invalid. Please exclude single quotes, double quotes, dollar signs, and backslashes from the password." 8 75
|
|
||||||
}
|
|
||||||
|
|
||||||
whiptail_cur_close_days() {
|
whiptail_cur_close_days() {
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
@@ -403,11 +378,6 @@ whiptail_dockernet_check(){
|
|||||||
whiptail --title "Security Onion Setup" --yesno \
|
whiptail --title "Security Onion Setup" --yesno \
|
||||||
"Do you want to keep the default Docker IP range? \n \n(Choose yes if you don't know what this means)" 10 75
|
"Do you want to keep the default Docker IP range? \n \n(Choose yes if you don't know what this means)" 10 75
|
||||||
|
|
||||||
local exitstatus=$?
|
|
||||||
|
|
||||||
if [[ $exitstatus == 1 ]]; then
|
|
||||||
whiptail_dockernet_net
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_dockernet_net() {
|
whiptail_dockernet_net() {
|
||||||
@@ -500,37 +470,36 @@ whiptail_helix_apikey() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#TODO: Combine these two functions
|
||||||
|
|
||||||
whiptail_homenet_manager() {
|
whiptail_homenet_manager() {
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
HNMANAGER=$(whiptail --title "Security Onion Setup" --inputbox \
|
HNMANAGER=$(whiptail --title "Security Onion Setup" --inputbox \
|
||||||
"Enter your HOME_NET, separating CIDR blocks with a comma (,):" 10 75 10.0.0.0/8,192.168.0.0/16,172.16.0.0/12 3>&1 1>&2 2>&3)
|
"Enter your home network(s), separating CIDR blocks with a comma (,):" 10 75 "10.0.0.0/8,192.168.0.0/16,172.16.0.0/12" 3>&1 1>&2 2>&3)
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
|
|
||||||
export HNMANAGER
|
export HNMANAGER
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_homenet_sensor() {
|
whiptail_homenet_sensor_inherit() {
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
# Ask to inherit from manager
|
# Ask to inherit from manager
|
||||||
whiptail --title "Security Onion Setup" --yesno "Do you want to inherit the HOME_NET from the Manager?" 8 75
|
whiptail --title "Security Onion Setup" --yesno "Do you want to inherit the HOME_NET from the Manager?" 8 75
|
||||||
|
}
|
||||||
|
|
||||||
|
whiptail_homenet_sensor() {
|
||||||
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
|
HNSENSOR=$(whiptail --title "Security Onion Setup" --inputbox \
|
||||||
|
"Enter your home network(s), separating CIDR blocks with a comma (,):" 10 75 "10.0.0.0/8,192.168.0.0/16,172.16.0.0/12" 3>&1 1>&2 2>&3)
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
|
whiptail_check_exitstatus $exitstatus
|
||||||
|
|
||||||
if [ $exitstatus == 0 ]; then
|
export HNSENSOR
|
||||||
export HNSENSOR=inherit
|
|
||||||
else
|
|
||||||
HNSENSOR=$(whiptail --title "Security Onion Setup" --inputbox \
|
|
||||||
"Enter your HOME_NET, separating CIDR blocks with a comma (,):" 10 75 10.0.0.0/8,192.168.0.0/16,172.16.0.0/12 3>&1 1>&2 2>&3)
|
|
||||||
local exitstatus=$?
|
|
||||||
whiptail_check_exitstatus $exitstatus
|
|
||||||
|
|
||||||
export HNSENSOR
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_install_type() {
|
whiptail_install_type() {
|
||||||
@@ -612,6 +581,20 @@ whiptail_install_type_other() {
|
|||||||
export install_type
|
export install_type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
whiptail_invalid_input() { # TODO: This should accept a list of arguments to specify what general pattern the input should follow
|
||||||
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
|
whiptail --title "Security Onion Setup" --msgbox " Invalid input, please try again." 7 40
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
whiptail_invalid_string() {
|
||||||
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
|
whiptail --title "Security Onion Setup" --msgbox "Invalid input, please try again.\n\nThe $1 cannot contain spaces." 9 45
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
whiptail_invalid_pass_characters_warning() {
|
whiptail_invalid_pass_characters_warning() {
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
@@ -633,6 +616,18 @@ whiptail_invalid_user_warning() {
|
|||||||
whiptail --title "Security Onion Setup" --msgbox "Please enter a valid email address." 8 75
|
whiptail --title "Security Onion Setup" --msgbox "Please enter a valid email address." 8 75
|
||||||
}
|
}
|
||||||
|
|
||||||
|
whiptail_invalid_hostname() {
|
||||||
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
|
local error_message
|
||||||
|
error_message=$(echo "Please choose a valid hostname. It cannot be localhost; and must contain only \
|
||||||
|
the ASCII letters 'A-Z' and 'a-z' (case-sensitive), the digits '0' through '9', \
|
||||||
|
and hyphen ('-')" | tr -d '\t')
|
||||||
|
|
||||||
|
whiptail --title "Security Onion Setup" \
|
||||||
|
--msgbox "$error_message" 10 75
|
||||||
|
}
|
||||||
|
|
||||||
whiptail_log_size_limit() {
|
whiptail_log_size_limit() {
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
@@ -651,8 +646,8 @@ whiptail_first_menu_iso() {
|
|||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
option=$(whiptail --title "Security Onion Setup" --menu "Select an option" 10 75 2 \
|
option=$(whiptail --title "Security Onion Setup" --menu "Select an option" 10 75 2 \
|
||||||
"Security Onion Installer" "Run the standard Security Onion installation " \
|
"Install " "Run the standard Security Onion installation " \
|
||||||
"Configure Network" "Configure networking only " \
|
"Configure Network " "Configure networking only " \
|
||||||
3>&1 1>&2 2>&3
|
3>&1 1>&2 2>&3
|
||||||
)
|
)
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
@@ -674,10 +669,11 @@ whiptail_management_interface_dns() {
|
|||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
MDNS=$(whiptail --title "Security Onion Setup" --inputbox \
|
MDNS=$(whiptail --title "Security Onion Setup" --inputbox \
|
||||||
"Enter your DNS servers separated by a space:" 10 60 8.8.8.8 8.8.4.4 3>&1 1>&2 2>&3)
|
"Enter your DNS servers separated by commas:" 10 60 "8.8.8.8,8.8.4.4" 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_management_interface_dns_search() {
|
whiptail_management_interface_dns_search() {
|
||||||
@@ -696,7 +692,17 @@ whiptail_management_interface_gateway() {
|
|||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
MGATEWAY=$(whiptail --title "Security Onion Setup" --inputbox \
|
MGATEWAY=$(whiptail --title "Security Onion Setup" --inputbox \
|
||||||
"Enter your gateway:" 10 60 X.X.X.X 3>&1 1>&2 2>&3)
|
"Enter your gateway's IPv4 address:" 10 60 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
|
local exitstatus=$?
|
||||||
|
whiptail_check_exitstatus $exitstatus
|
||||||
|
}
|
||||||
|
|
||||||
|
whiptail_management_interface_ip_mask() {
|
||||||
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
|
manager_ip_mask=$(whiptail --title "Security Onion Setup" --inputbox \
|
||||||
|
"Enter your IPv4 address with CIDR mask (e.g. 192.168.1.2/24):" 10 60 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
@@ -791,7 +797,6 @@ whiptail_net_setup_complete() {
|
|||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
whiptail_management_server() {
|
whiptail_management_server() {
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
@@ -802,28 +807,6 @@ whiptail_management_server() {
|
|||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
|
|
||||||
while [[ $MSRV == *'localhost'* || ! ( $MSRV =~ ^[a-zA-Z0-9\-]*$ ) ]] ; do
|
|
||||||
local error_message
|
|
||||||
error_message=$(echo "Please choose a valid hostname. It cannot contain localhost; and must contain only \
|
|
||||||
the ASCII letters 'A-Z' and 'a-z' (case-sensitive), the digits '0' through '9', \
|
|
||||||
and hyphen ('-')" | tr -d '\t')
|
|
||||||
|
|
||||||
whiptail --title "Security Onion Setup" \
|
|
||||||
--msgbox "$error_message" 10 75
|
|
||||||
|
|
||||||
MSRV=$(whiptail --title "Security Onion Setup" --inputbox \
|
|
||||||
"Enter your Manager Server hostname. It is CASE SENSITIVE!" 10 75 XXXX 3>&1 1>&2 2>&3)
|
|
||||||
|
|
||||||
local exitstatus=$?
|
|
||||||
whiptail_check_exitstatus $exitstatus
|
|
||||||
done
|
|
||||||
|
|
||||||
if ! getent hosts "$MSRV"; then
|
|
||||||
add_manager_hostfile
|
|
||||||
else
|
|
||||||
MSRVIP=$(getent hosts "$MSRV" | awk 'NR==1{print $1}')
|
|
||||||
fi
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ask if you want to do advanced setup of the Manager
|
# Ask if you want to do advanced setup of the Manager
|
||||||
@@ -849,11 +832,6 @@ whiptail_manager_adv_escluster(){
|
|||||||
whiptail --title "Security Onion Setup" --yesno \
|
whiptail --title "Security Onion Setup" --yesno \
|
||||||
"Do you want to set up a traditional ES cluster for using replicas and/or Hot-Warm indices? Recommended only for those who have experience with ES clustering! " 12 75
|
"Do you want to set up a traditional ES cluster for using replicas and/or Hot-Warm indices? Recommended only for those who have experience with ES clustering! " 12 75
|
||||||
|
|
||||||
local exitstatus=$?
|
|
||||||
|
|
||||||
if [[ $exitstatus == 0 ]]; then
|
|
||||||
whiptail_manager_adv_escluster_name
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Get a cluster name
|
# Get a cluster name
|
||||||
@@ -957,13 +935,13 @@ whiptail_metadata_tool() {
|
|||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
|
# Legacy variable naming
|
||||||
ZEEKVERSION=$(whiptail --title "Security Onion Setup" --radiolist "What tool would you like to use to generate metadata?" 20 75 4 \
|
ZEEKVERSION=$(whiptail --title "Security Onion Setup" --radiolist "What tool would you like to use to generate metadata?" 20 75 4 \
|
||||||
"ZEEK" "Zeek (formerly known as Bro)" ON \
|
"ZEEK" "Zeek (formerly known as Bro)" ON \
|
||||||
"SURICATA" "Suricata" OFF 3>&1 1>&2 2>&3)
|
"SURICATA" "Suricata" OFF 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_nids() {
|
whiptail_nids() {
|
||||||
@@ -1016,7 +994,7 @@ whiptail_node_es_heap() {
|
|||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
NODE_ES_HEAP_SIZE=$(whiptail --title "Security Onion Setup" --inputbox \
|
NODE_ES_HEAP_SIZE=$(whiptail --title "Security Onion Setup" --inputbox \
|
||||||
"\nEnter ES Heap Size: \n \n(Recommended value is pre-populated)" 10 75 $ES_HEAP_SIZE 3>&1 1>&2 2>&3)
|
"\nEnter ES heap size: \n \n(Recommended value is pre-populated)" 10 75 $ES_HEAP_SIZE 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
@@ -1028,19 +1006,7 @@ whiptail_node_ls_heap() {
|
|||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
NODE_LS_HEAP_SIZE=$(whiptail --title "Security Onion Setup" --inputbox \
|
NODE_LS_HEAP_SIZE=$(whiptail --title "Security Onion Setup" --inputbox \
|
||||||
"\nEnter LogStash Heap Size: \n \n(Recommended value is pre-populated)" 10 75 $LS_HEAP_SIZE 3>&1 1>&2 2>&3)
|
"\nEnter Logstash heap size: \n \n(Recommended value is pre-populated)" 10 75 $LS_HEAP_SIZE 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
local exitstatus=$?
|
|
||||||
whiptail_check_exitstatus $exitstatus
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
whiptail_node_ls_pipeline_worker() {
|
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
|
||||||
|
|
||||||
LSPIPELINEWORKERS=$(whiptail --title "Security Onion Setup" --inputbox \
|
|
||||||
"\nEnter LogStash Pipeline Workers: \n \n(Recommended value is pre-populated)" 10 75 "$num_cpu_cores" 3>&1 1>&2 2>&3)
|
|
||||||
|
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
@@ -1052,7 +1018,19 @@ whiptail_node_ls_pipline_batchsize() {
|
|||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
LSPIPELINEBATCH=$(whiptail --title "Security Onion Setup" --inputbox \
|
LSPIPELINEBATCH=$(whiptail --title "Security Onion Setup" --inputbox \
|
||||||
"\nEnter LogStash Pipeline Batch Size: \n \n(Default value is pre-populated)" 10 75 125 3>&1 1>&2 2>&3)
|
"\nEnter Logstash pipeline batch size: \n \n(Default value is pre-populated)" 10 75 125 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
|
local exitstatus=$?
|
||||||
|
whiptail_check_exitstatus $exitstatus
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
whiptail_node_ls_pipeline_worker() {
|
||||||
|
|
||||||
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
|
LSPIPELINEWORKERS=$(whiptail --title "Security Onion Setup" --inputbox \
|
||||||
|
"\nEnter number of Logstash pipeline workers: \n \n(Recommended value is pre-populated)" 10 75 "$num_cpu_cores" 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
@@ -1064,7 +1042,7 @@ whiptail_node_ls_input_threads() {
|
|||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
LSINPUTTHREADS=$(whiptail --title "Security Onion Setup" --inputbox \
|
LSINPUTTHREADS=$(whiptail --title "Security Onion Setup" --inputbox \
|
||||||
"\nEnter LogStash Input Threads: \n \n(Default value is pre-populated)" 10 75 1 3>&1 1>&2 2>&3)
|
"\nEnter number of Logstash input threads: \n \n(Default value is pre-populated)" 10 75 1 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
@@ -1101,53 +1079,21 @@ whiptail_patch_name_new_schedule() {
|
|||||||
|
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
|
|
||||||
while [[ -z "$PATCHSCHEDULENAME" ]]; do
|
|
||||||
whiptail --title "Security Onion Setup" --msgbox "Please enter a name for this OS patch schedule." 8 75
|
|
||||||
PATCHSCHEDULENAME=$(whiptail --title "Security Onion Setup" --inputbox \
|
|
||||||
"What name do you want to give this OS patch schedule? This schedule needs to be named uniquely. Available schedules can be found on the manager under /opt/so/salt/patch/os/schedules/<schedulename>.yml" 10 75 3>&1 1>&2 2>&3)
|
|
||||||
local exitstatus=$?
|
|
||||||
whiptail_check_exitstatus $exitstatus
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_patch_schedule() {
|
whiptail_patch_schedule() {
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
local patch_schedule
|
|
||||||
patch_schedule=$(whiptail --title "Security Onion Setup" --radiolist \
|
patch_schedule=$(whiptail --title "Security Onion Setup" --radiolist \
|
||||||
"Choose OS patch schedule: \nThis will NOT update Security Onion related tools such as Zeek, Elasticsearch, Kibana, SaltStack, etc." 15 75 5 \
|
"Choose OS patch schedule: \nThis will NOT update Security Onion related tools such as Zeek, Elasticsearch, Kibana, SaltStack, etc." 15 75 5 \
|
||||||
"Automatic" "Updates installed every 8 hours if available" ON \
|
"Automatic" "Updates installed every 8 hours if available" ON \
|
||||||
"Manual" "Updates will be installed manually" OFF \
|
"Manual" "Updates will be installed manually" OFF \
|
||||||
"Import Schedule" "Import named schedule on following screen" OFF \
|
"Import Schedule" "Import named schedule on following screen" OFF \
|
||||||
"New Schedule" "Configure and name new schedule on next screen" OFF 3>&1 1>&2 2>&3 )
|
"New Schedule" "Configure and name new schedule on next screen" OFF 3>&1 1>&2 2>&3 )
|
||||||
|
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
|
|
||||||
|
|
||||||
case $patch_schedule in
|
|
||||||
'New Schedule')
|
|
||||||
whiptail_patch_schedule_select_days
|
|
||||||
whiptail_patch_schedule_select_hours
|
|
||||||
whiptail_patch_name_new_schedule
|
|
||||||
patch_schedule_os_new
|
|
||||||
;;
|
|
||||||
'Import Schedule')
|
|
||||||
whiptail_patch_schedule_import
|
|
||||||
;;
|
|
||||||
'Automatic')
|
|
||||||
PATCHSCHEDULENAME='auto'
|
|
||||||
;;
|
|
||||||
'Manual')
|
|
||||||
PATCHSCHEDULENAME='manual'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_patch_schedule_import() {
|
whiptail_patch_schedule_import() {
|
||||||
@@ -1327,32 +1273,11 @@ whiptail_set_hostname() {
|
|||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
HOSTNAME=$(cat /etc/hostname)
|
|
||||||
|
|
||||||
if [[ "$HOSTNAME" == *'localhost'* ]]; then HOSTNAME=securityonion; fi
|
|
||||||
|
|
||||||
HOSTNAME=$(whiptail --title "Security Onion Setup" --inputbox \
|
HOSTNAME=$(whiptail --title "Security Onion Setup" --inputbox \
|
||||||
"Enter the hostname (not FQDN) you would like to set:" 10 75 "$HOSTNAME" 3>&1 1>&2 2>&3)
|
"Enter the hostname (not FQDN) you would like to set:" 10 75 "$HOSTNAME" 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
|
|
||||||
while [[ $HOSTNAME == *'localhost'* || ! ( $HOSTNAME =~ ^[a-zA-Z0-9\-]*$ ) ]] ; do
|
|
||||||
local error_message
|
|
||||||
error_message=$(echo "Please choose a valid hostname. It cannot contain localhost; and must contain only \
|
|
||||||
the ASCII letters 'a' through 'z' (case-insensitive), the digits '0' through '9', \
|
|
||||||
and hyphen ('-')" | tr -d '\t')
|
|
||||||
|
|
||||||
whiptail --title "Security Onion Setup" \
|
|
||||||
--msgbox "$error_message" 10 75
|
|
||||||
|
|
||||||
HOSTNAME=$(whiptail --title "Security Onion Setup" --inputbox \
|
|
||||||
"Enter the hostname (not FQDN) you would like to set:" 10 75 "$HOSTNAME" 3>&1 1>&2 2>&3)
|
|
||||||
|
|
||||||
local exitstatus=$?
|
|
||||||
whiptail_check_exitstatus $exitstatus
|
|
||||||
done
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_set_redirect() {
|
whiptail_set_redirect() {
|
||||||
@@ -1373,7 +1298,7 @@ whiptail_set_redirect_host() {
|
|||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
REDIRECTHOST=$(whiptail --title "Security Onion Setup" --inputbox \
|
REDIRECTHOST=$(whiptail --title "Security Onion Setup" --inputbox \
|
||||||
"Enter the Hostname or IP you would like to use for the web interface:" 10 75 "$HOSTNAME" 3>&1 1>&2 2>&3)
|
"Enter the Hostname, IP, or FQDN you would like to use for the web interface:" 10 75 "$HOSTNAME" 3>&1 1>&2 2>&3)
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
whiptail_check_exitstatus $exitstatus
|
whiptail_check_exitstatus $exitstatus
|
||||||
}
|
}
|
||||||
@@ -1423,37 +1348,25 @@ whiptail_setup_failed() {
|
|||||||
whiptail --title "Security Onion Setup" --msgbox "$message" $height 75
|
whiptail --title "Security Onion Setup" --msgbox "$message" $height 75
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_shard_count() {
|
whiptail_so_allow_yesno() {
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
SHARDCOUNT=$(whiptail --title "Security Onion Setup" --inputbox \
|
whiptail --title "Security Onion Setup" \
|
||||||
"\nEnter ES Shard Count: \n \n(Default value is pre-populated)" 10 75 125 3>&1 1>&2 2>&3)
|
--yesno "Do you want to run so-allow to allow access to the web tools?" \
|
||||||
|
8 75
|
||||||
local exitstatus=$?
|
|
||||||
whiptail_check_exitstatus $exitstatus
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_so_allow() {
|
whiptail_so_allow() {
|
||||||
|
|
||||||
[ -n "$TESTING" ] && return
|
[ -n "$TESTING" ] && return
|
||||||
|
|
||||||
whiptail --title "Security Onion Setup" \
|
ALLOW_CIDR=$(whiptail --title "Security Onion Setup" \
|
||||||
--yesno "Do you want to run so-allow to allow access to the web tools?" \
|
|
||||||
8 75
|
|
||||||
|
|
||||||
local exitstatus=$?
|
|
||||||
|
|
||||||
if [[ $exitstatus == 0 ]]; then
|
|
||||||
ALLOW_CIDR=$(whiptail --title "Security Onion Setup" \
|
|
||||||
--inputbox "Enter a single IP address or an IP range, in CIDR notation, to allow:" \
|
--inputbox "Enter a single IP address or an IP range, in CIDR notation, to allow:" \
|
||||||
10 75 3>&1 1>&2 2>&3)
|
10 75 3>&1 1>&2 2>&3)
|
||||||
local exitstatus=$?
|
local exitstatus=$?
|
||||||
|
|
||||||
export ALLOW_ROLE='a'
|
export ALLOW_ROLE='a'
|
||||||
export ALLOW_CIDR
|
export ALLOW_CIDR
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
whiptail_storage_requirements() {
|
whiptail_storage_requirements() {
|
||||||
|
|||||||
187
tests/validation.sh
Normal file
187
tests/validation.sh
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
. ../salt/common/tools/sbin/so-common
|
||||||
|
|
||||||
|
script_ret=0
|
||||||
|
|
||||||
|
GREEN="\e[1;32m"
|
||||||
|
RED="\e[1;31m"
|
||||||
|
RESET="\e[0m"
|
||||||
|
|
||||||
|
test_fun() {
|
||||||
|
local expected_result=$1
|
||||||
|
shift
|
||||||
|
|
||||||
|
local fun=$1
|
||||||
|
shift
|
||||||
|
|
||||||
|
$fun "$@"
|
||||||
|
local ret=$?
|
||||||
|
[[ $ret -eq 0 ]] && res="O" || res="X"
|
||||||
|
|
||||||
|
[[ $ret -ne $expected_result ]] && script_ret=1
|
||||||
|
|
||||||
|
local prefix=$1
|
||||||
|
[[ -n $2 ]] && prefix="$prefix, min=$2"
|
||||||
|
[[ -n $3 ]] && prefix="$prefix, max=$3"
|
||||||
|
|
||||||
|
[[ $prefix == "" ]] && prefix="[EMPTY]"
|
||||||
|
|
||||||
|
[[ $ret -eq $expected_result ]] \
|
||||||
|
&& printf "${GREEN}%b${RESET}" " $res" \
|
||||||
|
|| printf "${RED}%b${RESET}" " $res"
|
||||||
|
|
||||||
|
printf "%s\n" " - $prefix"
|
||||||
|
}
|
||||||
|
|
||||||
|
header "FQDN"
|
||||||
|
|
||||||
|
test_fun 0 valid_fqdn "rwwiv.com"
|
||||||
|
|
||||||
|
test_fun 0 valid_fqdn "ddns.rwwiv.com"
|
||||||
|
|
||||||
|
test_fun 1 valid_fqdn ".com"
|
||||||
|
|
||||||
|
test_fun 1 valid_fqdn "rwwiv."
|
||||||
|
|
||||||
|
test_fun 1 valid_fqdn ""
|
||||||
|
|
||||||
|
sleep 0.15s
|
||||||
|
|
||||||
|
header "ip4"
|
||||||
|
|
||||||
|
test_fun 0 valid_ip4 "192.168.1.1"
|
||||||
|
|
||||||
|
test_fun 0 valid_ip4 "192.168.1.255"
|
||||||
|
|
||||||
|
test_fun 1 valid_ip4 "192.168.1.256"
|
||||||
|
|
||||||
|
test_fun 1 valid_ip4 "192.168..1"
|
||||||
|
|
||||||
|
test_fun 1 valid_ip4 "192.168.1.1."
|
||||||
|
|
||||||
|
test_fun 1 valid_ip4 ""
|
||||||
|
|
||||||
|
sleep 0.15s
|
||||||
|
|
||||||
|
header "CIDR (ipv4)"
|
||||||
|
|
||||||
|
test_fun 0 valid_cidr "192.168.1.0/24"
|
||||||
|
|
||||||
|
test_fun 0 valid_cidr "192.168.1.0/12"
|
||||||
|
|
||||||
|
test_fun 1 valid_cidr "192.168.1.0"
|
||||||
|
|
||||||
|
test_fun 1 valid_ip4 "192.168.1.0/"
|
||||||
|
|
||||||
|
test_fun 1 valid_ip4 "/24"
|
||||||
|
|
||||||
|
test_fun 1 valid_cidr ""
|
||||||
|
|
||||||
|
sleep 0.15s
|
||||||
|
|
||||||
|
header "CIDR list"
|
||||||
|
|
||||||
|
test_fun 0 valid_cidr_list "10.0.0.0/8,192.168.0.0/16,172.16.0.0/12"
|
||||||
|
|
||||||
|
test_fun 0 valid_cidr_list "10.0.0.0/8"
|
||||||
|
|
||||||
|
test_fun 1 valid_cidr_list "10.0.0.0/8,192.168.0.0/16172.16.0.0/12"
|
||||||
|
|
||||||
|
test_fun 1 valid_cidr_list "10.0.0.0"
|
||||||
|
|
||||||
|
sleep 0.15s
|
||||||
|
|
||||||
|
header "DNS"
|
||||||
|
|
||||||
|
test_fun 0 valid_dns_list "8.8.8.8,8.8.4.4"
|
||||||
|
|
||||||
|
test_fun 0 valid_dns_list "8.8.8.8"
|
||||||
|
|
||||||
|
test_fun 1 valid_dns_list "8.8.8.8 8.8.4.4"
|
||||||
|
|
||||||
|
test_fun 1 valid_dns_list "8.8.8.,8.8.4.4"
|
||||||
|
|
||||||
|
test_fun 1 valid_dns_list "192.168.9."
|
||||||
|
|
||||||
|
sleep 0.15s
|
||||||
|
|
||||||
|
header "int (default min: 1, default max: 1000)"
|
||||||
|
|
||||||
|
test_fun 0 valid_int "24"
|
||||||
|
|
||||||
|
test_fun 0 valid_int "1"
|
||||||
|
|
||||||
|
test_fun 0 valid_int "2" "2"
|
||||||
|
|
||||||
|
test_fun 0 valid_int "1000"
|
||||||
|
|
||||||
|
test_fun 1 valid_int "10001"
|
||||||
|
|
||||||
|
test_fun 1 valid_int "24" "" "20"
|
||||||
|
|
||||||
|
test_fun 1 valid_int "-1"
|
||||||
|
|
||||||
|
test_fun 1 valid_int "1" "2"
|
||||||
|
|
||||||
|
test_fun 1 valid_int "257" "" "256"
|
||||||
|
|
||||||
|
test_fun 1 valid_int "not_a_num"
|
||||||
|
|
||||||
|
test_fun 1 valid_int ""
|
||||||
|
|
||||||
|
sleep 0.15s
|
||||||
|
|
||||||
|
header "hostname"
|
||||||
|
|
||||||
|
test_fun 0 valid_hostname "so-sensor01"
|
||||||
|
|
||||||
|
test_fun 0 valid_hostname "so"
|
||||||
|
|
||||||
|
test_fun 1 valid_hostname "so_sensor01"
|
||||||
|
|
||||||
|
test_fun 1 valid_hostname "so.sensor01"
|
||||||
|
|
||||||
|
test_fun 1 valid_hostname "localhost"
|
||||||
|
|
||||||
|
test_fun 1 valid_hostname ""
|
||||||
|
|
||||||
|
sleep 0.15s
|
||||||
|
|
||||||
|
header "string (default min_length: 1, default max_length: 64)"
|
||||||
|
|
||||||
|
test_fun 0 valid_string "string"
|
||||||
|
|
||||||
|
test_fun 0 valid_string "s"
|
||||||
|
|
||||||
|
test_fun 0 valid_string "very_long_string_64_sdhkjashasdfkajjagskfjhgkslfkjhlaskfhlaskjhf"
|
||||||
|
|
||||||
|
test_fun 0 valid_string "12"
|
||||||
|
|
||||||
|
test_fun 1 valid_string "string with spaces"
|
||||||
|
|
||||||
|
test_fun 1 valid_string "very_long_string_<64_sdhflkjashasdfkajshfgkjsahgfkjagskfjhgkslfkjhlaskfhlaskjhf"
|
||||||
|
|
||||||
|
test_fun 1 valid_string "too_short" "12"
|
||||||
|
|
||||||
|
test_fun 1 valid_string "too_long" "" "4"
|
||||||
|
|
||||||
|
test_fun 1 valid_string ""
|
||||||
|
|
||||||
|
sleep 0.15s
|
||||||
|
|
||||||
|
header "Linux user"
|
||||||
|
|
||||||
|
test_fun 0 valid_username "so_user_01"
|
||||||
|
|
||||||
|
test_fun 0 valid_username "onionuser"
|
||||||
|
|
||||||
|
test_fun 1 valid_username "12fa"
|
||||||
|
|
||||||
|
test_fun 1 valid_username "so.user.01"
|
||||||
|
|
||||||
|
test_fun 1 valid_username "very_long_username_asdflashfsafasdfasdfkahsgkjahfdkjhsg"
|
||||||
|
|
||||||
|
echo
|
||||||
|
|
||||||
|
exit $script_ret
|
||||||
Reference in New Issue
Block a user