mirror of
https://github.com/Security-Onion-Solutions/securityonion.git
synced 2025-12-14 13:12:49 +01:00
add preflight check to ensure repo connectivity prior to installing salt-minion with salt-cloud
This commit is contained in:
@@ -33,7 +33,7 @@ defaultsFilename = "/opt/so/saltstack/default/salt/firewall/defaults.yaml"
|
|||||||
def showUsage(options, args):
|
def showUsage(options, args):
|
||||||
usage = f'''Usage: {sys.argv[0]} [OPTIONS] <COMMAND> [ARGS...]
|
usage = f'''Usage: {sys.argv[0]} [OPTIONS] <COMMAND> [ARGS...]
|
||||||
Options:
|
Options:
|
||||||
--apply - After updating the firewall configuration files, apply the new firewall state
|
--apply - After updating the firewall configuration files, apply the new firewall state with queue=True
|
||||||
|
|
||||||
General commands:
|
General commands:
|
||||||
help - Prints this usage information.
|
help - Prints this usage information.
|
||||||
@@ -105,7 +105,8 @@ def includehost(options, args):
|
|||||||
|
|
||||||
def apply(options, args):
|
def apply(options, args):
|
||||||
logger.info("Applying firewall configuration changes")
|
logger.info("Applying firewall configuration changes")
|
||||||
proc = subprocess.run(['salt-call', 'state.apply', 'firewall', 'queue=True'])
|
salt_args = ['salt-call', 'state.apply', 'firewall', 'queue=True']
|
||||||
|
proc = subprocess.run(salt_args)
|
||||||
if proc.returncode != 0:
|
if proc.returncode != 0:
|
||||||
logger.error("Failed to apply firewall changes")
|
logger.error("Failed to apply firewall changes")
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ This script integrates multiple components to provide a streamlined VM deploymen
|
|||||||
|
|
||||||
4. Security Integration:
|
4. Security Integration:
|
||||||
- Automatic firewall rule configuration
|
- Automatic firewall rule configuration
|
||||||
- Integrates with so-firewall-minion for firewall setup on the manager
|
- Directly integrates with so-firewall for consistent VM management
|
||||||
|
- Configures role-based firewall rules for new VMs
|
||||||
|
- Uses same firewall integration approach for both adding and removing VMs
|
||||||
|
|
||||||
This script serves as the primary interface for VM deployment in Security Onion, coordinating
|
This script serves as the primary interface for VM deployment in Security Onion, coordinating
|
||||||
between salt-cloud, network configuration, hardware management, and security components to
|
between salt-cloud, network configuration, hardware management, and security components to
|
||||||
@@ -174,9 +176,9 @@ The so-salt-cloud script automates the provisioning and configuration of virtual
|
|||||||
4. Security Integration Phase:
|
4. Security Integration Phase:
|
||||||
- Monitors salt-cloud output for VM IP address assignment
|
- Monitors salt-cloud output for VM IP address assignment
|
||||||
- Extracts role information from VM name
|
- Extracts role information from VM name
|
||||||
- Launches so-firewall-minion in a separate thread for non-blocking operation
|
- Calls so-firewall directly to configure firewall rules
|
||||||
- Configures role-based firewall rules automatically
|
- Configures role-based firewall rules automatically
|
||||||
- Ensures security policies are in place before VM is accessible
|
- Ensures security policies are in place for VM access
|
||||||
- Logs all security-related operations for audit purposes
|
- Logs all security-related operations for audit purposes
|
||||||
|
|
||||||
The script implements extensive error handling and logging throughout each phase:
|
The script implements extensive error handling and logging throughout each phase:
|
||||||
@@ -190,7 +192,7 @@ The script implements extensive error handling and logging throughout each phase
|
|||||||
Integration points:
|
Integration points:
|
||||||
- Works with Security Onion's salt-cloud provider
|
- Works with Security Onion's salt-cloud provider
|
||||||
- Interfaces with qcow2 module for image and hardware management
|
- Interfaces with qcow2 module for image and hardware management
|
||||||
- Coordinates with so-firewall-minion for security configuration
|
- Directly integrates with so-firewall for security configuration
|
||||||
- Uses libvirt for VM management
|
- Uses libvirt for VM management
|
||||||
- Leverages SaltStack for distributed execution
|
- Leverages SaltStack for distributed execution
|
||||||
|
|
||||||
@@ -232,11 +234,21 @@ console_handler.setFormatter(formatter)
|
|||||||
logger.addHandler(file_handler)
|
logger.addHandler(file_handler)
|
||||||
logger.addHandler(console_handler)
|
logger.addHandler(console_handler)
|
||||||
|
|
||||||
def call_so_firewall_minion(ip, role):
|
def add_host_to_firewall(ip, role):
|
||||||
|
"""Configure firewall rules for a new VM.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ip (str): The IP address of the VM to add to the firewall
|
||||||
|
role (str): The role of the VM (e.g., 'sensor', 'manager', etc.)
|
||||||
|
|
||||||
|
This function calls so-firewall directly to configure firewall rules,
|
||||||
|
maintaining consistency with how firewall rules are managed during
|
||||||
|
VM deletion.
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
# Start so-firewall-minion as a subprocess
|
# Call so-firewall directly with --apply
|
||||||
process = subprocess.Popen(
|
process = subprocess.Popen(
|
||||||
['/usr/sbin/so-firewall-minion', f'--ip={ip}', f'--role={role}'],
|
['/usr/sbin/so-firewall', 'includehost', role.lower(), ip, '--apply'],
|
||||||
stdout=subprocess.PIPE,
|
stdout=subprocess.PIPE,
|
||||||
stderr=subprocess.STDOUT,
|
stderr=subprocess.STDOUT,
|
||||||
text=True
|
text=True
|
||||||
@@ -251,7 +263,7 @@ def call_so_firewall_minion(ip, role):
|
|||||||
process.wait()
|
process.wait()
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"An error occurred while calling so-firewall-minion: {e}")
|
logger.error(f"An error occurred while adding host to firewall: {e}")
|
||||||
|
|
||||||
def get_vm_ip(vm_name):
|
def get_vm_ip(vm_name):
|
||||||
"""Get IP address of VM before deletion"""
|
"""Get IP address of VM before deletion"""
|
||||||
@@ -366,8 +378,8 @@ def call_salt_cloud(profile, vm_name, destroy=False, assume_yes=False):
|
|||||||
if len(parts) > 1:
|
if len(parts) > 1:
|
||||||
ip_address = parts[1].strip()
|
ip_address = parts[1].strip()
|
||||||
logger.info(f"Extracted IP address: {ip_address}")
|
logger.info(f"Extracted IP address: {ip_address}")
|
||||||
# Create and start a thread to run so-firewall-minion
|
# Create and start a thread to add host to firewall
|
||||||
thread = threading.Thread(target=call_so_firewall_minion, args=(ip_address, role.upper()))
|
thread = threading.Thread(target=add_host_to_firewall, args=(ip_address, role))
|
||||||
thread.start()
|
thread.start()
|
||||||
else:
|
else:
|
||||||
logger.error("No IP address found.")
|
logger.error("No IP address found.")
|
||||||
|
|||||||
@@ -33,8 +33,11 @@ sool9-{{host}}:
|
|||||||
log_file: /opt/so/log/salt/minion
|
log_file: /opt/so/log/salt/minion
|
||||||
grains:
|
grains:
|
||||||
hypervisor_host: {{host ~ "_" ~ role}}
|
hypervisor_host: {{host ~ "_" ~ role}}
|
||||||
#preflight_cmds:
|
preflight_cmds:
|
||||||
# - echo "preflight_cmds"
|
- |
|
||||||
|
timeout 600 bash -c 'trap "echo \"Preflight Check: Failed to establish repo connectivity\"; exit 1" TERM; \
|
||||||
|
while ! dnf makecache --repoid=securityonion >/dev/null 2>&1; do echo "Preflight Check: Waiting for repo connectivity..."; \
|
||||||
|
sleep 5; done && echo "Preflight Check: Successfully connected to repo" || exit 1; [ $? -eq 0 ]'
|
||||||
# the destination directory will be created if it doesn't exist
|
# the destination directory will be created if it doesn't exist
|
||||||
#file_map:
|
#file_map:
|
||||||
# /opt/so/saltstack/default/salt/salt/mine_functions.sls: /opt/so/conf/salt/cloud_file_map/salt/salt/mine_functions.sls
|
# /opt/so/saltstack/default/salt/salt/mine_functions.sls: /opt/so/conf/salt/cloud_file_map/salt/salt/mine_functions.sls
|
||||||
|
|||||||
Reference in New Issue
Block a user