--- # Copyright (c) 2025 Gravitino LLC # MIT License # OpenSSH Server Configuration with Security Best Practices # Supported distributions # Debian: Stretch (9) through Forky (testing) # Ubuntu LTS: 16.04 (Xenial) through 24.04 (Noble) with ESM support # Ubuntu Non-LTS: 24.10 (Oracular), 25.04 (Plucky), 25.10 (Questing) - current only # Note: EOL non-LTS releases (16.10-23.10) are NOT supported openssh_supported_distributions: - Debian - Ubuntu # Package state openssh_server_state: present # Service management openssh_service_enabled: true openssh_service_state: started # Security settings openssh_permit_root_login: "prohibit-password" # no, prohibit-password, or yes openssh_password_authentication: false openssh_pubkey_authentication: true openssh_permit_empty_passwords: false openssh_challenge_response_auth: false # Network settings openssh_port: 22 openssh_listen_addresses: - "0.0.0.0" - "::" # Protocol and crypto settings (Mozilla Modern Profile + OpenSSH 10.0 Preferences) # Cipher preference order: AEAD (ChaCha20, AES-GCM) over CTR mode openssh_protocol: 2 openssh_ciphers: - chacha20-poly1305@openssh.com # AEAD - highest priority - aes256-gcm@openssh.com # AEAD - preferred in OpenSSH 10.0 - aes128-gcm@openssh.com # AEAD - aes256-ctr # Fallback - ANSSI/BSI approved - aes192-ctr # Fallback - aes128-ctr # Fallback openssh_kex_algorithms: - curve25519-sha256 - curve25519-sha256@libssh.org - ecdh-sha2-nistp521 - ecdh-sha2-nistp384 - ecdh-sha2-nistp256 - diffie-hellman-group-exchange-sha256 - diffie-hellman-group16-sha512 - diffie-hellman-group18-sha512 openssh_macs: - hmac-sha2-512-etm@openssh.com - hmac-sha2-256-etm@openssh.com - umac-128-etm@openssh.com - hmac-sha2-512 - hmac-sha2-256 - umac-128@openssh.com # Host keys openssh_host_keys: - /etc/ssh/ssh_host_ed25519_key - /etc/ssh/ssh_host_rsa_key # Login settings openssh_login_grace_time: "30s" openssh_max_auth_tries: 3 openssh_max_sessions: 10 openssh_max_startups: "10:30:60" # Logging openssh_log_level: "VERBOSE" # QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG openssh_syslog_facility: "AUTH" # Additional security openssh_use_pam: true openssh_use_dns: false openssh_x11_forwarding: false openssh_print_motd: false openssh_print_last_log: true openssh_tcp_keep_alive: true openssh_client_alive_interval: 300 openssh_client_alive_count_max: 2 # Allow/Deny settings (empty by default) openssh_allow_users: [] openssh_deny_users: [] openssh_allow_groups: [] openssh_deny_groups: [] # Banner openssh_banner: "none" # Path to banner file or "none" # Subsystems # Path is distribution-aware: Ubuntu uses /usr/lib/openssh/, Debian uses /usr/lib/ openssh_subsystems: - name: sftp command: >- {%- if ansible_os_family == 'RedHat' -%} /usr/libexec/openssh/sftp-server {%- elif ansible_distribution == 'Ubuntu' -%} /usr/lib/openssh/sftp-server {%- else -%} /usr/lib/sftp-server {%- endif -%} # ============================================================================ # Advanced Security Features (Version-Dependent) # ============================================================================ # PerSourcePenalties - Automatic rate limiting (OpenSSH 9.8+) # Automatically enabled if supported by detected OpenSSH version openssh_enable_persourcepenalties: true openssh_persource_authfail_penalty: "5s" # Penalty for auth failures openssh_persource_noauth_penalty: "1s" # Penalty for connections without auth openssh_persource_crash_penalty: "90s" # Penalty for crashes openssh_persource_maxstartups: "10:30:60" # Per-source connection limits openssh_persource_netblock_ipv4: 32 # IPv4 netblock size for penalties openssh_persource_netblock_ipv6: 128 # IPv6 netblock size for penalties # ML-KEM Post-Quantum Key Exchange (OpenSSH 9.9+) # Automatically prepended to KEX list if supported openssh_enable_mlkem: true # RequiredRSASize - Minimum RSA key size (OpenSSH 9.3+, NSA/CISA compliant) openssh_required_rsa_size: 3072 # Enhanced Logging with LogVerbose (OpenSSH 8.5+) openssh_enable_verbose_logging: true openssh_log_verbose_subsystems: - "kex.c:*" - "key.c:*" - "auth*.c:*" # FIDO2/Security Key Support (OpenSSH 8.2+) # Enable to support hardware security keys like YubiKey openssh_enable_security_keys: false # Conservative default, opt-in openssh_pubkey_accepted_key_types: - sk-ssh-ed25519@openssh.com - ssh-ed25519 - sk-ecdsa-sha2-nistp256@openssh.com - rsa-sha2-512 - rsa-sha2-256 openssh_host_key_algorithms: - sk-ssh-ed25519-cert-v01@openssh.com - ssh-ed25519-cert-v01@openssh.com - ssh-ed25519 - rsa-sha2-512 - rsa-sha2-256 # Certificate Authority (CA) Support # Enable to use SSH certificates for authentication openssh_enable_ca: false openssh_trusted_user_ca_keys: [] # List of CA public key file paths openssh_host_certificate: "" # Path to host certificate file openssh_ca_signature_algorithms: - sk-ssh-ed25519@openssh.com - ssh-ed25519 - rsa-sha2-512 - rsa-sha2-256 # Additional Hardening (All versions) openssh_disable_forwarding: false # Set true to disable all forwarding openssh_disable_forwarding_comprehensive: false # Use DisableForwarding directive (7.4+) openssh_disable_tcp_forwarding: false # Disable TCP forwarding openssh_disable_x11_forwarding: true # Already set above, kept for clarity openssh_disable_agent_forwarding: false # Disable SSH agent forwarding openssh_disable_tunneling: false # Disable tunnel device forwarding openssh_disable_stream_local_forwarding: false # Disable Unix domain socket forwarding # Session Re-keying (CCCS ITSP.40.062 Requirement) # Format: data_limit time_limit (e.g., "1G 1h" = 1GB or 1 hour, whichever comes first) openssh_rekey_limit: "1G 1h" # Host Key DNS Verification (CVE-2025-26465 mitigation) openssh_verify_host_key_dns: false # Disabled by default due to security vulnerability # Security validation and verification openssh_verify_moduli: true # Verify DH moduli are 3072-bit minimum openssh_verify_host_keys: true # Validate host key strengths # Host key permissions openssh_hostkey_permissions: "0600" openssh_hostkey_owner: root openssh_hostkey_group: root