#!/bin/bash # # SecuBox VM Creation Script # # Creates a SecuBox VM with MOCHAbin-like network topology. # # Prerequisites: # - Debian 12 (Bookworm) ISO or cloud image # - libvirt/QEMU installed # - Networks created (./setup-networks.sh create) # # Usage: # ./create-vm.sh # Interactive mode # ./create-vm.sh --iso /path/to.iso # Use ISO for installation # ./create-vm.sh --cloud # Use Debian cloud image # set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" VM_NAME="secubox-mochabin" VM_RAM="4096" # MB VM_CPUS="4" DISK_SIZE="40G" DATA_DISK_SIZE="20G" IMAGES_DIR="/var/lib/libvirt/images" SYSTEM_DISK="$IMAGES_DIR/${VM_NAME}.qcow2" DATA_DISK="$IMAGES_DIR/${VM_NAME}-data.qcow2" # Debian 12 cloud image URL CLOUD_IMAGE_URL="https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2" CLOUD_IMAGE_FILE="$IMAGES_DIR/debian-12-generic-amd64.qcow2" usage() { echo "Usage: $0 [OPTIONS]" echo "" echo "Options:" echo " --iso PATH Use ISO image for installation" echo " --cloud Use Debian cloud image (default)" echo " --ram MB RAM size in MB (default: 4096)" echo " --cpus N Number of CPUs (default: 4)" echo " --disk SIZE System disk size (default: 40G)" echo " --name NAME VM name (default: secubox-mochabin)" echo " --destroy Destroy existing VM first" echo " -h, --help Show this help" echo "" } # Parse arguments MODE="cloud" DESTROY=false while [[ $# -gt 0 ]]; do case $1 in --iso) MODE="iso" ISO_PATH="$2" shift 2 ;; --cloud) MODE="cloud" shift ;; --ram) VM_RAM="$2" shift 2 ;; --cpus) VM_CPUS="$2" shift 2 ;; --disk) DISK_SIZE="$2" shift 2 ;; --name) VM_NAME="$2" SYSTEM_DISK="$IMAGES_DIR/${VM_NAME}.qcow2" DATA_DISK="$IMAGES_DIR/${VM_NAME}-data.qcow2" shift 2 ;; --destroy) DESTROY=true shift ;; -h|--help) usage exit 0 ;; *) echo "Unknown option: $1" usage exit 1 ;; esac done # Check prerequisites check_prerequisites() { echo "Checking prerequisites..." if ! command -v virsh &>/dev/null; then echo "ERROR: libvirt (virsh) not found. Install with: apt install libvirt-daemon-system" exit 1 fi if ! command -v qemu-img &>/dev/null; then echo "ERROR: qemu-img not found. Install with: apt install qemu-utils" exit 1 fi # Check networks exist for net in secubox-wan secubox-lan secubox-switch; do if ! virsh net-info "$net" &>/dev/null; then echo "ERROR: Network '$net' not found. Run: ./setup-networks.sh create" exit 1 fi done echo "Prerequisites OK." } # Destroy existing VM destroy_vm() { if virsh dominfo "$VM_NAME" &>/dev/null; then echo "Destroying existing VM '$VM_NAME'..." virsh destroy "$VM_NAME" 2>/dev/null || true virsh undefine "$VM_NAME" --remove-all-storage 2>/dev/null || true fi } # Download cloud image download_cloud_image() { if [ ! -f "$CLOUD_IMAGE_FILE" ]; then echo "Downloading Debian 12 cloud image..." curl -L -o "$CLOUD_IMAGE_FILE" "$CLOUD_IMAGE_URL" else echo "Using existing cloud image: $CLOUD_IMAGE_FILE" fi } # Create disks create_disks() { echo "Creating VM disks..." if [ -f "$SYSTEM_DISK" ]; then if [ "$DESTROY" = true ]; then rm -f "$SYSTEM_DISK" else echo "ERROR: System disk exists: $SYSTEM_DISK" echo "Use --destroy to remove existing VM first" exit 1 fi fi if [ "$MODE" = "cloud" ]; then # Create disk from cloud image qemu-img create -f qcow2 -F qcow2 -b "$CLOUD_IMAGE_FILE" "$SYSTEM_DISK" "$DISK_SIZE" else # Create empty disk for ISO installation qemu-img create -f qcow2 "$SYSTEM_DISK" "$DISK_SIZE" fi # Create data disk if [ ! -f "$DATA_DISK" ] || [ "$DESTROY" = true ]; then qemu-img create -f qcow2 "$DATA_DISK" "$DATA_DISK_SIZE" fi echo "Disks created:" echo " System: $SYSTEM_DISK ($DISK_SIZE)" echo " Data: $DATA_DISK ($DATA_DISK_SIZE)" } # Create cloud-init ISO for initial configuration create_cloud_init() { echo "Creating cloud-init configuration..." CLOUD_INIT_DIR=$(mktemp -d) CLOUD_INIT_ISO="$IMAGES_DIR/${VM_NAME}-cloud-init.iso" # meta-data cat > "$CLOUD_INIT_DIR/meta-data" << EOF instance-id: ${VM_NAME} local-hostname: ${VM_NAME} EOF # user-data cat > "$CLOUD_INIT_DIR/user-data" << 'EOF' #cloud-config hostname: secubox fqdn: secubox.local manage_etc_hosts: true users: - name: secubox groups: sudo, adm, systemd-journal shell: /bin/bash sudo: ALL=(ALL) NOPASSWD:ALL lock_passwd: false # Password: secubox (change immediately!) passwd: $6$rounds=4096$saltsalt$aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789abcdefghijklmnopqrstuvwxyz ssh_pwauth: true disable_root: false # Network configuration will be done via netplan write_files: - path: /etc/netplan/50-secubox.yaml permissions: '0600' content: | # SecuBox Network Configuration - MOCHAbin Topology network: version: 2 renderer: networkd ethernets: # eth0: WAN Primary (10G equivalent) eth0: dhcp4: true dhcp6: true optional: true # eth1: Switch Uplink (internal) eth1: dhcp4: false optional: true # eth2: WAN Secondary / Management (NAT) eth2: dhcp4: true optional: true # eth3-eth6: LAN ports (will be bridged) eth3: dhcp4: false optional: true eth4: dhcp4: false optional: true eth5: dhcp4: false optional: true eth6: dhcp4: false optional: true bridges: # LAN bridge (equivalent to MOCHAbin DSA bridge) br-lan: interfaces: [eth3, eth4, eth5, eth6] addresses: - 10.55.1.1/24 dhcp4: false parameters: stp: false forward-delay: 0 - path: /etc/sysctl.d/99-secubox.conf content: | # Enable IP forwarding net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1 # Security hardening net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.tcp_syncookies = 1 runcmd: - netplan apply - sysctl --system - systemctl enable systemd-networkd - echo "SecuBox VM initialized at $(date)" >> /var/log/secubox-init.log final_message: | SecuBox VM initialization complete! Network Interfaces (MOCHAbin topology): eth0: WAN Primary (DHCP) eth1: Switch Uplink (internal) eth2: WAN Secondary (DHCP/NAT) eth3-eth6: LAN ports (bridged to br-lan) br-lan: 10.55.1.1/24 Login: secubox / secubox Next steps: 1. Change password: passwd 2. Install SecuBox packages 3. Configure services EOF # network-config (cloud-init v2 network config) cat > "$CLOUD_INIT_DIR/network-config" << 'EOF' version: 2 ethernets: eth0: dhcp4: true eth2: dhcp4: true EOF # Create ISO if command -v genisoimage &>/dev/null; then genisoimage -output "$CLOUD_INIT_ISO" -volid cidata -joliet -rock \ "$CLOUD_INIT_DIR/user-data" "$CLOUD_INIT_DIR/meta-data" "$CLOUD_INIT_DIR/network-config" elif command -v mkisofs &>/dev/null; then mkisofs -output "$CLOUD_INIT_ISO" -volid cidata -joliet -rock \ "$CLOUD_INIT_DIR/user-data" "$CLOUD_INIT_DIR/meta-data" "$CLOUD_INIT_DIR/network-config" else echo "WARNING: genisoimage/mkisofs not found, skipping cloud-init ISO" rm -rf "$CLOUD_INIT_DIR" return fi rm -rf "$CLOUD_INIT_DIR" echo "Cloud-init ISO created: $CLOUD_INIT_ISO" } # Define and start VM define_vm() { echo "Defining VM..." # Update domain XML with actual paths DOMAIN_XML=$(mktemp) sed -e "s|/var/lib/libvirt/images/secubox-mochabin.qcow2|$SYSTEM_DISK|g" \ -e "s|/var/lib/libvirt/images/secubox-mochabin-data.qcow2|$DATA_DISK|g" \ -e "s|secubox-mochabin|$VM_NAME|g" \ "$SCRIPT_DIR/secubox-mochabin.xml" > "$DOMAIN_XML" # Add cloud-init ISO if exists CLOUD_INIT_ISO="$IMAGES_DIR/${VM_NAME}-cloud-init.iso" if [ -f "$CLOUD_INIT_ISO" ]; then # Insert CD-ROM source sed -i "s||\n |" "$DOMAIN_XML" fi # Define the VM virsh define "$DOMAIN_XML" rm -f "$DOMAIN_XML" echo "VM '$VM_NAME' defined." } # Start VM start_vm() { echo "Starting VM..." virsh start "$VM_NAME" echo "" echo "==========================================" echo "SecuBox VM '$VM_NAME' is starting!" echo "==========================================" echo "" echo "Network Interfaces:" echo " eth0 (WAN): Connected to secubox-wan (NAT)" echo " eth1 (Switch): Connected to secubox-switch (isolated)" echo " eth2 (WAN2): Connected to default (NAT)" echo " eth3-6 (LAN): Connected to secubox-lan (isolated)" echo "" echo "Access:" echo " Console: virsh console $VM_NAME" echo " VNC: virt-viewer $VM_NAME" echo " SSH: ssh secubox@" echo "" echo "Default credentials: secubox / secubox" echo "" echo "Get IP address:" echo " virsh domifaddr $VM_NAME" echo "" } # Main main() { echo "========================================" echo "SecuBox VM Creation - MOCHAbin Topology" echo "========================================" echo "" check_prerequisites if [ "$DESTROY" = true ]; then destroy_vm fi if [ "$MODE" = "cloud" ]; then download_cloud_image fi create_disks if [ "$MODE" = "cloud" ]; then create_cloud_init fi define_vm start_vm } main