 065dddf8d5
			
		
	
	065dddf8d5
	
	
	
		
			
			- Add FUTURE_DEVELOPMENT.md with comprehensive v2 protocol specification - Add MCP integration design and implementation foundation - Add infrastructure and deployment configurations - Update system architecture for v2 evolution 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			675 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			675 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # BZZZ v2 Security Hardening Script
 | |
| # Applies comprehensive security configurations for the cluster
 | |
| 
 | |
| set -euo pipefail
 | |
| 
 | |
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 | |
| LOG_FILE="/var/log/bzzz-security-hardening-$(date +%Y%m%d-%H%M%S).log"
 | |
| 
 | |
| # Colors
 | |
| RED='\033[0;31m'
 | |
| GREEN='\033[0;32m'
 | |
| YELLOW='\033[1;33m'
 | |
| BLUE='\033[0;34m'
 | |
| NC='\033[0m'
 | |
| 
 | |
| log() {
 | |
|     echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
 | |
| }
 | |
| 
 | |
| error() {
 | |
|     echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE"
 | |
|     exit 1
 | |
| }
 | |
| 
 | |
| warn() {
 | |
|     echo -e "${YELLOW}[WARN]${NC} $1" | tee -a "$LOG_FILE"
 | |
| }
 | |
| 
 | |
| success() {
 | |
|     echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a "$LOG_FILE"
 | |
| }
 | |
| 
 | |
| check_root() {
 | |
|     if [[ $EUID -eq 0 ]]; then
 | |
|         error "This script should not be run as root. Run as tony user with sudo access."
 | |
|     fi
 | |
| }
 | |
| 
 | |
| configure_firewall() {
 | |
|     log "Configuring UFW firewall for BZZZ v2..."
 | |
|     
 | |
|     # Enable UFW if not enabled
 | |
|     sudo ufw --force enable
 | |
|     
 | |
|     # Default policies
 | |
|     sudo ufw default deny incoming
 | |
|     sudo ufw default allow outgoing
 | |
|     
 | |
|     # SSH access
 | |
|     sudo ufw allow ssh
 | |
|     
 | |
|     # Docker Swarm ports (internal cluster only)
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 2376 proto tcp comment "Docker daemon TLS"
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 2377 proto tcp comment "Docker Swarm management"
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 7946 proto tcp comment "Docker Swarm node communication"
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 7946 proto udp comment "Docker Swarm node communication"
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 4789 proto udp comment "Docker Swarm overlay networks"
 | |
|     
 | |
|     # BZZZ v2 P2P ports (internal cluster only)
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 9000:9300 proto tcp comment "BZZZ v2 P2P"
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 9000:9300 proto udp comment "BZZZ v2 P2P"
 | |
|     
 | |
|     # DHT bootstrap ports
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 9101:9103 proto tcp comment "BZZZ DHT Bootstrap"
 | |
|     
 | |
|     # mDNS discovery (local network only)
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 5353 proto udp comment "mDNS discovery"
 | |
|     
 | |
|     # HTTP/HTTPS through Traefik (external access)
 | |
|     sudo ufw allow 80/tcp comment "HTTP"
 | |
|     sudo ufw allow 443/tcp comment "HTTPS"
 | |
|     
 | |
|     # Internal service ports (cluster only)
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 3000:3100 proto tcp comment "BZZZ v2 services"
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 5432 proto tcp comment "PostgreSQL"
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 6379 proto tcp comment "Redis"
 | |
|     
 | |
|     # Monitoring ports (cluster only)
 | |
|     sudo ufw allow from 192.168.1.0/24 to any port 9090:9203 proto tcp comment "Monitoring"
 | |
|     
 | |
|     # Rate limiting rules
 | |
|     sudo ufw limit ssh comment "Rate limit SSH"
 | |
|     
 | |
|     # Log denied connections
 | |
|     sudo ufw logging on
 | |
|     
 | |
|     success "Firewall configured successfully"
 | |
| }
 | |
| 
 | |
| configure_docker_security() {
 | |
|     log "Configuring Docker security..."
 | |
|     
 | |
|     # Create Docker daemon configuration
 | |
|     sudo mkdir -p /etc/docker
 | |
|     
 | |
|     cat << 'EOF' | sudo tee /etc/docker/daemon.json > /dev/null
 | |
| {
 | |
|     "log-driver": "json-file",
 | |
|     "log-opts": {
 | |
|         "max-size": "100m",
 | |
|         "max-file": "3"
 | |
|     },
 | |
|     "live-restore": true,
 | |
|     "userland-proxy": false,
 | |
|     "icc": false,
 | |
|     "userns-remap": "default",
 | |
|     "no-new-privileges": true,
 | |
|     "seccomp-profile": "/etc/docker/seccomp-default.json",
 | |
|     "apparmor-profile": "docker-default",
 | |
|     "storage-driver": "overlay2",
 | |
|     "storage-opts": [
 | |
|         "overlay2.override_kernel_check=true"
 | |
|     ],
 | |
|     "default-ulimits": {
 | |
|         "nofile": {
 | |
|             "Name": "nofile",
 | |
|             "Hard": 65536,
 | |
|             "Soft": 65536
 | |
|         }
 | |
|     },
 | |
|     "registry-mirrors": ["https://registry.home.deepblack.cloud"],
 | |
|     "insecure-registries": ["registry.home.deepblack.cloud:5000"],
 | |
|     "features": {
 | |
|         "buildkit": true
 | |
|     }
 | |
| }
 | |
| EOF
 | |
|     
 | |
|     # Create custom seccomp profile
 | |
|     cat << 'EOF' | sudo tee /etc/docker/seccomp-default.json > /dev/null
 | |
| {
 | |
|     "defaultAction": "SCMP_ACT_ERRNO",
 | |
|     "architectures": [
 | |
|         "SCMP_ARCH_X86_64",
 | |
|         "SCMP_ARCH_X86",
 | |
|         "SCMP_ARCH_X32"
 | |
|     ],
 | |
|     "syscalls": [
 | |
|         {
 | |
|             "names": [
 | |
|                 "accept",
 | |
|                 "access",
 | |
|                 "arch_prctl",
 | |
|                 "bind",
 | |
|                 "brk",
 | |
|                 "chdir",
 | |
|                 "chmod",
 | |
|                 "chown",
 | |
|                 "clone",
 | |
|                 "close",
 | |
|                 "connect",
 | |
|                 "dup",
 | |
|                 "dup2",
 | |
|                 "epoll_create",
 | |
|                 "epoll_ctl",
 | |
|                 "epoll_wait",
 | |
|                 "execve",
 | |
|                 "exit",
 | |
|                 "exit_group",
 | |
|                 "fcntl",
 | |
|                 "fstat",
 | |
|                 "futex",
 | |
|                 "getcwd",
 | |
|                 "getdents",
 | |
|                 "getgid",
 | |
|                 "getpid",
 | |
|                 "getppid",
 | |
|                 "gettid",
 | |
|                 "getuid",
 | |
|                 "listen",
 | |
|                 "lstat",
 | |
|                 "mmap",
 | |
|                 "mprotect",
 | |
|                 "munmap",
 | |
|                 "nanosleep",
 | |
|                 "open",
 | |
|                 "openat",
 | |
|                 "pipe",
 | |
|                 "poll",
 | |
|                 "prctl",
 | |
|                 "read",
 | |
|                 "readlink",
 | |
|                 "recv",
 | |
|                 "recvfrom",
 | |
|                 "rt_sigaction",
 | |
|                 "rt_sigprocmask",
 | |
|                 "rt_sigreturn",
 | |
|                 "sched_yield",
 | |
|                 "send",
 | |
|                 "sendto",
 | |
|                 "set_robust_list",
 | |
|                 "setsockopt",
 | |
|                 "socket",
 | |
|                 "stat",
 | |
|                 "write"
 | |
|             ],
 | |
|             "action": "SCMP_ACT_ALLOW"
 | |
|         }
 | |
|     ]
 | |
| }
 | |
| EOF
 | |
|     
 | |
|     # Restart Docker to apply changes
 | |
|     sudo systemctl daemon-reload
 | |
|     sudo systemctl restart docker
 | |
|     
 | |
|     success "Docker security configuration applied"
 | |
| }
 | |
| 
 | |
| setup_tls_certificates() {
 | |
|     log "Setting up TLS certificates..."
 | |
|     
 | |
|     # Create certificates directory
 | |
|     mkdir -p /rust/bzzz-v2/config/tls/{ca,server,client}
 | |
|     
 | |
|     # Generate CA key and certificate
 | |
|     if [[ ! -f /rust/bzzz-v2/config/tls/ca/ca-key.pem ]]; then
 | |
|         openssl genrsa -out /rust/bzzz-v2/config/tls/ca/ca-key.pem 4096
 | |
|         openssl req -new -x509 -days 3650 -key /rust/bzzz-v2/config/tls/ca/ca-key.pem \
 | |
|             -out /rust/bzzz-v2/config/tls/ca/ca.pem \
 | |
|             -subj "/C=US/ST=Cloud/L=DeepBlack/O=BZZZ/CN=bzzz-ca"
 | |
|         
 | |
|         log "Generated new CA certificate"
 | |
|     fi
 | |
|     
 | |
|     # Generate server certificates for each node
 | |
|     local nodes=("walnut" "ironwood" "acacia")
 | |
|     for node in "${nodes[@]}"; do
 | |
|         if [[ ! -f "/rust/bzzz-v2/config/tls/server/${node}-key.pem" ]]; then
 | |
|             # Generate server key
 | |
|             openssl genrsa -out "/rust/bzzz-v2/config/tls/server/${node}-key.pem" 4096
 | |
|             
 | |
|             # Generate server certificate request
 | |
|             openssl req -new -key "/rust/bzzz-v2/config/tls/server/${node}-key.pem" \
 | |
|                 -out "/rust/bzzz-v2/config/tls/server/${node}.csr" \
 | |
|                 -subj "/C=US/ST=Cloud/L=DeepBlack/O=BZZZ/CN=${node}.deepblack.cloud"
 | |
|             
 | |
|             # Create extensions file
 | |
|             cat > "/rust/bzzz-v2/config/tls/server/${node}-ext.cnf" << EOF
 | |
| subjectAltName = DNS:${node}.deepblack.cloud,DNS:${node},DNS:localhost,IP:127.0.0.1,IP:192.168.1.27
 | |
| extendedKeyUsage = serverAuth,clientAuth
 | |
| EOF
 | |
|             
 | |
|             # Generate server certificate
 | |
|             openssl x509 -req -days 365 -in "/rust/bzzz-v2/config/tls/server/${node}.csr" \
 | |
|                 -CA /rust/bzzz-v2/config/tls/ca/ca.pem \
 | |
|                 -CAkey /rust/bzzz-v2/config/tls/ca/ca-key.pem \
 | |
|                 -out "/rust/bzzz-v2/config/tls/server/${node}.pem" \
 | |
|                 -extensions v3_req -extfile "/rust/bzzz-v2/config/tls/server/${node}-ext.cnf" \
 | |
|                 -CAcreateserial
 | |
|             
 | |
|             # Clean up CSR and extensions file
 | |
|             rm "/rust/bzzz-v2/config/tls/server/${node}.csr" "/rust/bzzz-v2/config/tls/server/${node}-ext.cnf"
 | |
|             
 | |
|             log "Generated TLS certificate for $node"
 | |
|         fi
 | |
|     done
 | |
|     
 | |
|     # Generate client certificates for inter-service communication
 | |
|     if [[ ! -f /rust/bzzz-v2/config/tls/client/client-key.pem ]]; then
 | |
|         openssl genrsa -out /rust/bzzz-v2/config/tls/client/client-key.pem 4096
 | |
|         openssl req -new -key /rust/bzzz-v2/config/tls/client/client-key.pem \
 | |
|             -out /rust/bzzz-v2/config/tls/client/client.csr \
 | |
|             -subj "/C=US/ST=Cloud/L=DeepBlack/O=BZZZ/CN=bzzz-client"
 | |
|         
 | |
|         openssl x509 -req -days 365 -in /rust/bzzz-v2/config/tls/client/client.csr \
 | |
|             -CA /rust/bzzz-v2/config/tls/ca/ca.pem \
 | |
|             -CAkey /rust/bzzz-v2/config/tls/ca/ca-key.pem \
 | |
|             -out /rust/bzzz-v2/config/tls/client/client.pem \
 | |
|             -CAcreateserial
 | |
|         
 | |
|         rm /rust/bzzz-v2/config/tls/client/client.csr
 | |
|         
 | |
|         log "Generated client certificate"
 | |
|     fi
 | |
|     
 | |
|     # Set appropriate permissions
 | |
|     chmod -R 600 /rust/bzzz-v2/config/tls
 | |
|     chmod 755 /rust/bzzz-v2/config/tls /rust/bzzz-v2/config/tls/{ca,server,client}
 | |
|     
 | |
|     success "TLS certificates configured"
 | |
| }
 | |
| 
 | |
| configure_secrets_management() {
 | |
|     log "Configuring secrets management..."
 | |
|     
 | |
|     # Create secrets directory with restricted permissions
 | |
|     mkdir -p /rust/bzzz-v2/config/secrets
 | |
|     chmod 700 /rust/bzzz-v2/config/secrets
 | |
|     
 | |
|     # Generate random secrets if they don't exist
 | |
|     local secrets=(
 | |
|         "postgres_password"
 | |
|         "redis_password"
 | |
|         "grafana_admin_password"
 | |
|         "prometheus_web_password"
 | |
|         "alertmanager_web_password"
 | |
|     )
 | |
|     
 | |
|     for secret in "${secrets[@]}"; do
 | |
|         local secret_file="/rust/bzzz-v2/config/secrets/${secret}"
 | |
|         if [[ ! -f "$secret_file" ]]; then
 | |
|             openssl rand -base64 32 > "$secret_file"
 | |
|             chmod 600 "$secret_file"
 | |
|             log "Generated secret: $secret"
 | |
|         fi
 | |
|     done
 | |
|     
 | |
|     # Create Docker secrets
 | |
|     for secret in "${secrets[@]}"; do
 | |
|         local secret_file="/rust/bzzz-v2/config/secrets/${secret}"
 | |
|         if docker secret inspect "bzzz_${secret}" >/dev/null 2>&1; then
 | |
|             log "Docker secret bzzz_${secret} already exists"
 | |
|         else
 | |
|             docker secret create "bzzz_${secret}" "$secret_file"
 | |
|             log "Created Docker secret: bzzz_${secret}"
 | |
|         fi
 | |
|     done
 | |
|     
 | |
|     # Handle OpenAI API key if it exists
 | |
|     local openai_key_file="/home/tony/chorus/business/secrets/openai-api-key"
 | |
|     if [[ -f "$openai_key_file" ]]; then
 | |
|         if ! docker secret inspect bzzz_openai_api_key >/dev/null 2>&1; then
 | |
|             docker secret create bzzz_openai_api_key "$openai_key_file"
 | |
|             log "Created OpenAI API key secret"
 | |
|         fi
 | |
|     else
 | |
|         warn "OpenAI API key not found at $openai_key_file"
 | |
|     fi
 | |
|     
 | |
|     success "Secrets management configured"
 | |
| }
 | |
| 
 | |
| setup_network_security() {
 | |
|     log "Setting up network security..."
 | |
|     
 | |
|     # Configure iptables rules for container isolation
 | |
|     cat << 'EOF' | sudo tee /etc/iptables/rules.v4 > /dev/null
 | |
| *filter
 | |
| :INPUT ACCEPT [0:0]
 | |
| :FORWARD DROP [0:0]
 | |
| :OUTPUT ACCEPT [0:0]
 | |
| :DOCKER-USER - [0:0]
 | |
| 
 | |
| # Allow established connections
 | |
| -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 | |
| 
 | |
| # Allow loopback
 | |
| -A INPUT -i lo -j ACCEPT
 | |
| 
 | |
| # Allow SSH (with rate limiting)
 | |
| -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
 | |
| -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
 | |
| -A INPUT -p tcp --dport 22 -j ACCEPT
 | |
| 
 | |
| # Allow HTTP/HTTPS
 | |
| -A INPUT -p tcp --dport 80 -j ACCEPT
 | |
| -A INPUT -p tcp --dport 443 -j ACCEPT
 | |
| 
 | |
| # Allow Docker Swarm (internal network only)
 | |
| -A INPUT -s 192.168.1.0/24 -p tcp --dport 2376 -j ACCEPT
 | |
| -A INPUT -s 192.168.1.0/24 -p tcp --dport 2377 -j ACCEPT
 | |
| -A INPUT -s 192.168.1.0/24 -p tcp --dport 7946 -j ACCEPT
 | |
| -A INPUT -s 192.168.1.0/24 -p udp --dport 7946 -j ACCEPT
 | |
| -A INPUT -s 192.168.1.0/24 -p udp --dport 4789 -j ACCEPT
 | |
| 
 | |
| # Allow BZZZ P2P (internal network only)
 | |
| -A INPUT -s 192.168.1.0/24 -p tcp --dport 9000:9300 -j ACCEPT
 | |
| -A INPUT -s 192.168.1.0/24 -p udp --dport 9000:9300 -j ACCEPT
 | |
| 
 | |
| # Block container-to-host access except for specific services
 | |
| -A DOCKER-USER -i docker_gwbridge -j ACCEPT
 | |
| -A DOCKER-USER -i docker0 -j ACCEPT
 | |
| -A DOCKER-USER -j DROP
 | |
| 
 | |
| # Drop everything else
 | |
| -A INPUT -j DROP
 | |
| 
 | |
| COMMIT
 | |
| EOF
 | |
|     
 | |
|     # Apply iptables rules
 | |
|     sudo iptables-restore < /etc/iptables/rules.v4
 | |
|     
 | |
|     # Enable IP forwarding for Docker
 | |
|     echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
 | |
|     echo 'net.ipv6.conf.all.forwarding=1' | sudo tee -a /etc/sysctl.conf
 | |
|     
 | |
|     # Kernel security parameters
 | |
|     cat << 'EOF' | sudo tee -a /etc/sysctl.conf > /dev/null
 | |
| 
 | |
| # BZZZ v2 Security Parameters
 | |
| net.ipv4.conf.all.rp_filter=1
 | |
| net.ipv4.conf.default.rp_filter=1
 | |
| net.ipv4.icmp_echo_ignore_broadcasts=1
 | |
| net.ipv4.icmp_ignore_bogus_error_responses=1
 | |
| net.ipv4.tcp_syncookies=1
 | |
| net.ipv4.conf.all.log_martians=1
 | |
| net.ipv4.conf.default.log_martians=1
 | |
| net.ipv4.conf.all.accept_source_route=0
 | |
| net.ipv4.conf.default.accept_source_route=0
 | |
| net.ipv6.conf.all.accept_source_route=0
 | |
| net.ipv6.conf.default.accept_source_route=0
 | |
| net.ipv4.conf.all.accept_redirects=0
 | |
| net.ipv4.conf.default.accept_redirects=0
 | |
| net.ipv6.conf.all.accept_redirects=0
 | |
| net.ipv6.conf.default.accept_redirects=0
 | |
| net.ipv4.conf.all.secure_redirects=0
 | |
| net.ipv4.conf.default.secure_redirects=0
 | |
| net.ipv4.conf.all.send_redirects=0
 | |
| net.ipv4.conf.default.send_redirects=0
 | |
| 
 | |
| # Kernel hardening
 | |
| kernel.dmesg_restrict=1
 | |
| kernel.kptr_restrict=2
 | |
| kernel.yama.ptrace_scope=1
 | |
| fs.suid_dumpable=0
 | |
| kernel.core_uses_pid=1
 | |
| EOF
 | |
|     
 | |
|     # Apply sysctl settings
 | |
|     sudo sysctl -p
 | |
|     
 | |
|     success "Network security configured"
 | |
| }
 | |
| 
 | |
| configure_audit_logging() {
 | |
|     log "Configuring audit logging..."
 | |
|     
 | |
|     # Install auditd if not present
 | |
|     if ! command -v auditctl &> /dev/null; then
 | |
|         sudo apt-get update
 | |
|         sudo apt-get install -y auditd audispd-plugins
 | |
|     fi
 | |
|     
 | |
|     # Configure audit rules
 | |
|     cat << 'EOF' | sudo tee /etc/audit/rules.d/bzzz-v2.rules > /dev/null
 | |
| # BZZZ v2 Audit Rules
 | |
| 
 | |
| # Monitor file changes in sensitive directories
 | |
| -w /etc/docker/ -p wa -k docker-config
 | |
| -w /rust/bzzz-v2/config/secrets/ -p wa -k bzzz-secrets
 | |
| -w /rust/bzzz-v2/config/tls/ -p wa -k bzzz-tls
 | |
| -w /etc/ssl/ -p wa -k ssl-config
 | |
| 
 | |
| # Monitor process execution
 | |
| -a always,exit -F arch=b64 -S execve -k process-execution
 | |
| -a always,exit -F arch=b32 -S execve -k process-execution
 | |
| 
 | |
| # Monitor network connections
 | |
| -a always,exit -F arch=b64 -S socket -k network-socket
 | |
| -a always,exit -F arch=b32 -S socket -k network-socket
 | |
| 
 | |
| # Monitor file permission changes
 | |
| -a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -k file-permissions
 | |
| -a always,exit -F arch=b32 -S chmod,fchmod,fchmodat -k file-permissions
 | |
| 
 | |
| # Monitor privilege escalation
 | |
| -w /usr/bin/sudo -p x -k privilege-escalation
 | |
| -w /bin/su -p x -k privilege-escalation
 | |
| 
 | |
| # Monitor Docker daemon
 | |
| -w /var/lib/docker/ -p wa -k docker-data
 | |
| -w /usr/bin/docker -p x -k docker-exec
 | |
| -w /usr/bin/dockerd -p x -k docker-daemon
 | |
| 
 | |
| # Make rules immutable
 | |
| -e 2
 | |
| EOF
 | |
|     
 | |
|     # Restart auditd to apply rules
 | |
|     sudo systemctl restart auditd
 | |
|     
 | |
|     # Configure log rotation for audit logs
 | |
|     cat << 'EOF' | sudo tee /etc/logrotate.d/bzzz-audit > /dev/null
 | |
| /var/log/audit/*.log {
 | |
|     daily
 | |
|     rotate 30
 | |
|     compress
 | |
|     delaycompress
 | |
|     missingok
 | |
|     notifempty
 | |
|     create 640 root adm
 | |
|     postrotate
 | |
|         /sbin/service auditd restart > /dev/null 2>&1 || true
 | |
|     endscript
 | |
| }
 | |
| EOF
 | |
|     
 | |
|     success "Audit logging configured"
 | |
| }
 | |
| 
 | |
| setup_intrusion_detection() {
 | |
|     log "Setting up intrusion detection..."
 | |
|     
 | |
|     # Install fail2ban if not present
 | |
|     if ! command -v fail2ban-server &> /dev/null; then
 | |
|         sudo apt-get update
 | |
|         sudo apt-get install -y fail2ban
 | |
|     fi
 | |
|     
 | |
|     # Configure fail2ban for BZZZ v2
 | |
|     cat << 'EOF' | sudo tee /etc/fail2ban/jail.d/bzzz-v2.conf > /dev/null
 | |
| [DEFAULT]
 | |
| bantime = 3600
 | |
| findtime = 600
 | |
| maxretry = 5
 | |
| backend = systemd
 | |
| 
 | |
| [sshd]
 | |
| enabled = true
 | |
| port = ssh
 | |
| filter = sshd
 | |
| logpath = /var/log/auth.log
 | |
| maxretry = 3
 | |
| bantime = 7200
 | |
| 
 | |
| [docker-auth]
 | |
| enabled = true
 | |
| port = 2376
 | |
| filter = docker-auth
 | |
| logpath = /var/log/audit/audit.log
 | |
| maxretry = 3
 | |
| bantime = 3600
 | |
| 
 | |
| [bzzz-p2p]
 | |
| enabled = true
 | |
| port = 9000:9300
 | |
| filter = bzzz-p2p
 | |
| logpath = /rust/bzzz-v2/logs/application/bzzz-agent.log
 | |
| maxretry = 10
 | |
| bantime = 1800
 | |
| 
 | |
| [traefik-auth]
 | |
| enabled = true
 | |
| port = http,https
 | |
| filter = traefik-auth
 | |
| logpath = /var/log/traefik/access.log
 | |
| maxretry = 5
 | |
| bantime = 3600
 | |
| EOF
 | |
|     
 | |
|     # Create custom fail2ban filters
 | |
|     cat << 'EOF' | sudo tee /etc/fail2ban/filter.d/docker-auth.conf > /dev/null
 | |
| [Definition]
 | |
| failregex = ^.*type=SYSCALL.*comm="dockerd".*res=failed.*$
 | |
| ignoreregex =
 | |
| EOF
 | |
|     
 | |
|     cat << 'EOF' | sudo tee /etc/fail2ban/filter.d/bzzz-p2p.conf > /dev/null
 | |
| [Definition]
 | |
| failregex = ^.*level=error.*msg="unauthorized connection attempt".*peer=<HOST>.*$
 | |
|             ^.*level=warn.*msg="rate limit exceeded".*source=<HOST>.*$
 | |
| ignoreregex =
 | |
| EOF
 | |
|     
 | |
|     cat << 'EOF' | sudo tee /etc/fail2ban/filter.d/traefik-auth.conf > /dev/null
 | |
| [Definition]
 | |
| failregex = ^<HOST>.*"(GET|POST|PUT|DELETE).*" (401|403) .*$
 | |
| ignoreregex =
 | |
| EOF
 | |
|     
 | |
|     # Start and enable fail2ban
 | |
|     sudo systemctl enable fail2ban
 | |
|     sudo systemctl start fail2ban
 | |
|     
 | |
|     success "Intrusion detection configured"
 | |
| }
 | |
| 
 | |
| configure_container_security() {
 | |
|     log "Configuring container security policies..."
 | |
|     
 | |
|     # Create AppArmor profile for BZZZ containers
 | |
|     cat << 'EOF' | sudo tee /etc/apparmor.d/bzzz-container > /dev/null
 | |
| #include <tunables/global>
 | |
| 
 | |
| profile bzzz-container flags=(attach_disconnected,mediate_deleted) {
 | |
|     #include <abstractions/base>
 | |
|     
 | |
|     capability,
 | |
|     file,
 | |
|     network,
 | |
|     
 | |
|     deny @{PROC}/* w,
 | |
|     deny @{PROC}/sys/fs/** w,
 | |
|     deny @{PROC}/sysrq-trigger rwklx,
 | |
|     deny @{PROC}/mem rwklx,
 | |
|     deny @{PROC}/kmem rwklx,
 | |
|     deny @{PROC}/sys/kernel/[^s][^h][^m]* w,
 | |
|     deny mount,
 | |
|     deny /sys/[^f]** wklx,
 | |
|     deny /sys/f[^s]** wklx,
 | |
|     deny /sys/fs/[^c]** wklx,
 | |
|     deny /sys/fs/c[^g]** wklx,
 | |
|     deny /sys/fs/cg[^r]** wklx,
 | |
|     deny /sys/firmware/** rwklx,
 | |
|     deny /sys/kernel/security/** rwklx,
 | |
|     
 | |
|     # Allow access to application directories
 | |
|     /app/** r,
 | |
|     /app/bzzz rix,
 | |
|     /data/** rw,
 | |
|     /config/** r,
 | |
|     
 | |
|     # Allow temporary files
 | |
|     /tmp/** rw,
 | |
|     
 | |
|     # Network access
 | |
|     network inet,
 | |
|     network inet6,
 | |
|     network unix,
 | |
| }
 | |
| EOF
 | |
|     
 | |
|     # Load AppArmor profile
 | |
|     sudo apparmor_parser -r /etc/apparmor.d/bzzz-container
 | |
|     
 | |
|     # Create seccomp profile for BZZZ containers
 | |
|     mkdir -p /rust/bzzz-v2/config/security
 | |
|     cat << 'EOF' > /rust/bzzz-v2/config/security/bzzz-seccomp.json
 | |
| {
 | |
|     "defaultAction": "SCMP_ACT_ERRNO",
 | |
|     "architectures": [
 | |
|         "SCMP_ARCH_X86_64",
 | |
|         "SCMP_ARCH_X86",
 | |
|         "SCMP_ARCH_X32"
 | |
|     ],
 | |
|     "syscalls": [
 | |
|         {
 | |
|             "names": [
 | |
|                 "accept", "access", "arch_prctl", "bind", "brk",
 | |
|                 "chdir", "chmod", "chown", "clone", "close",
 | |
|                 "connect", "dup", "dup2", "epoll_create", "epoll_ctl",
 | |
|                 "epoll_wait", "execve", "exit", "exit_group", "fcntl",
 | |
|                 "fstat", "futex", "getcwd", "getdents", "getgid",
 | |
|                 "getpid", "getppid", "gettid", "getuid", "listen",
 | |
|                 "lstat", "mmap", "mprotect", "munmap", "nanosleep",
 | |
|                 "open", "openat", "pipe", "poll", "prctl",
 | |
|                 "read", "readlink", "recv", "recvfrom", "rt_sigaction",
 | |
|                 "rt_sigprocmask", "rt_sigreturn", "sched_yield", "send",
 | |
|                 "sendto", "set_robust_list", "setsockopt", "socket",
 | |
|                 "stat", "write"
 | |
|             ],
 | |
|             "action": "SCMP_ACT_ALLOW"
 | |
|         }
 | |
|     ]
 | |
| }
 | |
| EOF
 | |
|     
 | |
|     success "Container security policies configured"
 | |
| }
 | |
| 
 | |
| main() {
 | |
|     log "Starting BZZZ v2 security hardening..."
 | |
|     
 | |
|     check_root
 | |
|     configure_firewall
 | |
|     configure_docker_security
 | |
|     setup_tls_certificates
 | |
|     configure_secrets_management
 | |
|     setup_network_security
 | |
|     configure_audit_logging
 | |
|     setup_intrusion_detection
 | |
|     configure_container_security
 | |
|     
 | |
|     success "BZZZ v2 security hardening completed successfully!"
 | |
|     log "Security configuration saved to: $LOG_FILE"
 | |
|     log "Review firewall rules: sudo ufw status verbose"
 | |
|     log "Check fail2ban status: sudo fail2ban-client status"
 | |
|     log "Verify audit rules: sudo auditctl -l"
 | |
| }
 | |
| 
 | |
| # Execute main function
 | |
| main "$@" |