dev-sec.ssh-hardening

ssh-härtung (Ansible Rolle)

Achtung: Diese Rolle wurde in unsere Härtungs-Kollektion verschoben:

Bitte eröffnen Sie dort alle Probleme und Pull-Anfragen!

Anforderungen

  • Ansible > 2.5

Rollenvorlagen

  • network_ipv6_enable
    • Standard: false
    • Beschreibung: true, wenn IPv6 benötigt wird. ssh_listen_to muss ebenfalls auf IPv6-Adressen (z. B. [::]) eingestellt sein.
  • ssh_server_ports
    • Standard: ['22']
    • Beschreibung: Ports, auf denen der SSH-Server lauschen soll.
  • ssh_client_port
    • Standard: '22'
    • Beschreibung: Port, zu dem der SSH-Client verbinden soll.
  • ssh_listen_to
    • Standard: ['0.0.0.0']
    • Beschreibung: Eine oder mehrere IP-Adressen, auf die der SSH-Server hören soll. Standardmäßig sind dies alle IPv4-Adressen, sollten jedoch aus Sicherheitsgründen auf bestimmte Adressen konfiguriert werden!
  • ssh_host_key_files
    • Standard: []
    • Beschreibung: Host-Schlüssel für sshd. Wenn leer, werden ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'] verwendet, sofern von der installierten sshd-Version unterstützt.
  • ssh_host_key_algorithms
    • Standard: []
    • Beschreibung: Host-Schlüsselalgorithmen, die der Server anbietet. Wenn leer, wird die Standardliste verwendet, andernfalls wird die Einstellung mit der angegebenen Liste von Algorithmen überschrieben.
  • ssh_client_alive_interval
    • Standard: 600
    • Beschreibung: Gibt ein Intervall für das Senden von Keepalive-Nachrichten an.
  • ssh_client_alive_count
    • Standard: 3
    • Beschreibung: Definiert, wie oft Keep-Alive-Nachrichten gesendet werden.
  • ssh_permit_tunnel
    • Standard: false
    • Beschreibung: true, wenn SSH-Porttunneling erforderlich ist.
  • ssh_remote_hosts
    • Standard: []
    • Beschreibung: Eine oder mehrere Hosts und ihre benutzerdefinierten Optionen für den SSH-Client. Standard ist leer. Siehe Beispiele in defaults/main.yml.
  • ssh_permit_root_login
    • Standard: no
    • Beschreibung: Deaktiviert Root-Login. Auf without-password oder yes setzen, um Root-Login zu aktivieren.
  • ssh_allow_tcp_forwarding
    • Standard: no
    • Beschreibung: 'no', um TCP-Forwarding zu deaktivieren. Auf 'yes' setzen, um TCP-Forwarding zu erlauben. Wenn Sie OpenSSH >= Version 6.2 verwenden, können Sie 'yes', 'no', 'all' oder 'local' angeben.
      Hinweis: Die an diese Variable übergebenen Werte müssen Strings sein, daher sollten die Werte 'yes' und 'no' in Anführungszeichen übergeben werden.
  • ssh_gateway_ports
    • Standard: false
    • Beschreibung: false, um das Binden von weitergeleiteten Ports an Nicht-Loopback-Adressen zu deaktivieren. Auf true setzen, um das Binden an die Wildcard-Adresse zu erzwingen. Auf clientspecified setzen, um dem Client zu erlauben, anzugeben, an welche Adresse gebunden werden soll.
  • ssh_allow_agent_forwarding
    • Standard: false
    • Beschreibung: false, um Agent forwarding zu deaktivieren. Auf true setzen, um Agent forwarding zu erlauben.
  • ssh_x11_forwarding
    • Standard: false
    • Beschreibung: false, um X11-Forwarding zu deaktivieren. Auf true setzen, um X11-Forwarding zu erlauben.
  • ssh_pam_support
    • Standard: true
    • Beschreibung: true, wenn SSH PAM-Unterstützung hat.
  • ssh_use_pam
    • Standard: true
    • Beschreibung: false, um die PAM-Authentifizierung zu deaktivieren.
  • ssh_gssapi_support
    • Standard: false
    • Beschreibung: true, wenn SSH GSSAPI-Unterstützung hat.
  • ssh_kerberos_support
    • Standard: true
    • Beschreibung: true, wenn SSH Kerberos-Unterstützung hat.
  • ssh_deny_users
    • Standard: ''
    • Beschreibung: Wenn angegeben, ist der Login für Benutzernamen, die einem der Muster entsprechen, nicht erlaubt.
  • ssh_allow_users
    • Standard: ''
    • Beschreibung: Wenn angegeben, ist der Login nur für Benutzernamen erlaubt, die einem der Muster entsprechen.
  • ssh_deny_groups
    • Standard: ''
    • Beschreibung: Wenn angegeben, ist der Login für Benutzer, deren Hauptgruppe oder Zusatzgruppe einem der Muster entspricht, nicht erlaubt.
  • ssh_allow_groups
    • Standard: ''
    • Beschreibung: Wenn angegeben, ist der Login nur für Benutzer erlaubt, deren Hauptgruppe oder Zusatzgruppe einem der Muster entspricht.
  • ssh_authorized_keys_file
    • Standard: ''
    • Beschreibung: Ändert die Standarddatei, die die öffentlichen Schlüssel für die Benutzerauthentifizierung enthält.
  • ssh_trusted_user_ca_keys_file
    • Standard: ''
    • Beschreibung: Gibt die Datei an, die die öffentlichen Schlüssel vertrauenswürdiger Zertifizierungsstellen enthält, die zur Signierung von Benutzersertifikaten verwendet werden.
  • ssh_trusted_user_ca_keys
    • Standard: []
    • Beschreibung: Setzt die öffentlichen Schlüssel vertrauenswürdiger Zertifizierungsstellen, die zur Signierung von Benutzersertifikaten verwendet werden. Wird nur verwendet, wenn ssh_trusted_user_ca_keys_file gesetzt ist.
  • ssh_authorized_principals_file
    • Standard: ''
    • Beschreibung: Gibt die Datei an, die die erlaubten Principals enthält. Wird nur verwendet, wenn ssh_trusted_user_ca_keys_file gesetzt ist.
  • ssh_authorized_principals
    • Standard: []
    • Beschreibung: Liste von Hashes, die Dateipfade und autorisierte Principals enthalten. Siehe default_custom.yml für alle Optionen. Wird nur verwendet, wenn ssh_authorized_principals_file gesetzt ist.
  • ssh_print_motd
    • Standard: false
    • Beschreibung: false, um das Drucken der MOTD zu deaktivieren.
  • ssh_print_pam_motd
    • Standard: false
    • Beschreibung: false, um das Drucken der MOTD via PAM (Debian und Ubuntu) zu deaktivieren.
  • ssh_print_last_log
    • Standard: false
    • Beschreibung: false, um die Anzeige von Informationen zum letzten Login zu deaktivieren.
  • sftp_enabled
    • Standard: false
    • Beschreibung: true, um die SFTP-Konfiguration zu aktivieren.
  • sftp_umask
    • Standard: '0027'
    • Beschreibung: Gibt die Umask für SFTP an.
  • sftp_chroot
    • Standard: true
    • Beschreibung: false, um das Chroot für SFTP zu deaktivieren.
  • sftp_chroot_dir
    • Standard: /home/%u
    • Beschreibung: Ändert den standardmäßigen SFTP-Chroot-Standort.
  • ssh_client_roaming
    • Standard: false
    • Beschreibung: Aktiviert das experimentelle Client-Roaming.
  • sshd_moduli_file
    • Standard: '/etc/ssh/moduli'
    • Beschreibung: Pfad zur SSH-Moduli-Datei.
  • sshd_moduli_minimum
    • Standard: 2048
    • Beschreibung: Entfernt Diffie-Hellman-Parameter, die kleiner als die definierte Größe sind, um Logjam zu mindern.
  • ssh_challengeresponseauthentication
    • Standard: false
    • Beschreibung: Gibt an, ob die Challenge-Response-Authentifizierung erlaubt ist (z. B. über PAM).
  • ssh_client_password_login
    • Standard: false
    • Beschreibung: true, um die passwortbasierte Authentifizierung mit dem SSH-Client zu erlauben.
  • ssh_server_password_login
    • Standard: false
    • Beschreibung: true, um die passwortbasierte Authentifizierung mit dem SSH-Server zu erlauben.
  • ssh_banner
    • Standard: false
    • Beschreibung: true, um beim Login ein Banner anzuzeigen.
  • ssh_banner_path
    • Standard: '/etc/sshd/banner.txt'
    • Beschreibung: Pfad zur SSH-Bannerdatei.
  • ssh_client_hardening
    • Standard: true
    • Beschreibung: false, um die Härtung des Clients zu stoppen.
  • ssh_client_port
    • Standard: '22'
    • Beschreibung: Gibt die Portnummer an, um sich mit dem Remote-Host zu verbinden.
  • ssh_client_compression
    • Standard: false
    • Beschreibung: Gibt an, ob der Client Kompression anfordert.
  • ssh_compression
    • Standard: false
    • Beschreibung: Gibt an, ob serverseitige Kompression aktiviert ist, nachdem der Benutzer erfolgreich authentifiziert wurde.
  • ssh_login_grace_time
    • Standard: 30s
    • Beschreibung: Gibt die Zeit an, die für eine erfolgreiche Authentifizierung beim SSH-Server erlaubt ist.
  • ssh_max_auth_retries
    • Standard: 2
    • Beschreibung: Gibt die maximale Anzahl an Authentifizierungsversuchen pro Verbindung an.
  • ssh_max_sessions
    • Standard: 10
    • Beschreibung: Gibt die maximale Anzahl an offenen Sitzungen an, die von einer bestimmten Verbindung erlaubt sind.
  • ssh_print_debian_banner
    • Standard: false
    • Beschreibung: true, um ein debian-spezifisches Banner anzuzeigen.
  • ssh_server_enabled
    • Standard: true
    • Beschreibung: false, um den opensshd-Server zu deaktivieren.
  • ssh_server_hardening
    • Standard: true
    • Beschreibung: false, um die Härtung des Servers zu stoppen.
  • ssh_server_match_address
    • Standard: ''
    • Beschreibung: Führt einen bedingten Block ein. Wenn alle Kriterien in der Match-Zeile erfüllt sind, überschreiben die Schlüsselwörter in den folgenden Zeilen die im globalen Abschnitt der Konfigurationsdatei festgelegten, bis eine andere Match-Zeile oder das Ende der Datei erreicht wird.
  • ssh_server_match_group
    • Standard: ''
    • Beschreibung: Führt einen bedingten Block ein. Wenn alle Kriterien in der Match-Zeile erfüllt sind, überschreiben die Schlüsselwörter in den folgenden Zeilen die im globalen Abschnitt der Konfigurationsdatei festgelegten, bis eine andere Match-Zeile oder das Ende der Datei erreicht wird.
  • ssh_server_match_user
    • Standard: ''
    • Beschreibung: Führt einen bedingten Block ein. Wenn alle Kriterien in der Match-Zeile erfüllt sind, überschreiben die Schlüsselwörter in den folgenden Zeilen die im globalen Abschnitt der Konfigurationsdatei festgelegten, bis eine andere Match-Zeile oder das Ende der Datei erreicht wird.
  • ssh_server_match_local_port
    • Standard: ''
    • Beschreibung: Führt einen bedingten Block ein. Wenn alle Kriterien in der Match-Zeile erfüllt sind, überschreiben die Schlüsselwörter in den folgenden Zeilen die im globalen Abschnitt der Konfigurationsdatei festgelegten, bis eine andere Match-Zeile oder das Ende der Datei erreicht wird.
  • ssh_server_permit_environment_vars
    • Standard: no
    • Beschreibung: yes, um anzugeben, dass ~/.ssh/environment und die environment= Optionen in ~/.ssh/authorized_keys von sshd verarbeitet werden. Mit der Openssh-Version 7.8 ist es möglich, eine Whitelist von Umgebungsvariablennamen zusätzlich zu den globalen "yes" oder "no" Einstellungen anzugeben.
  • ssh_server_accept_env_vars
    • Standard: ''
    • Beschreibung: Gibt an, welche vom Client gesendeten Umgebungsvariablen in die Umgebung der Sitzung kopiert werden. Mehrere Umgebungsvariablen können durch Leerzeichen getrennt werden.
  • ssh_use_dns
    • Standard: false
    • Beschreibung: Gibt an, ob sshd den Remote-Hostnamen auflösen und überprüfen sollte, ob der aufgelöste Hostname für die Remote-IP-Adresse auf die gleiche IP-Adresse zurückführt.
  • ssh_server_revoked_keys
    • Standard: []
    • Beschreibung: Eine Liste von widerrufenen öffentlichen Schlüsseln, die der SSH-Server immer ablehnen wird. Nützlich zum Widerrufen bekannter schwacher oder kompromittierter Schlüssel.
  • ssh_max_startups
    • Standard: '10:30:100'
    • Beschreibung: Gibt die maximale Anzahl an gleichzeitigen nicht authentifizierten Verbindungen zum SSH-Daemon an.
  • ssh_macs
    • Standard: []
    • Beschreibung: Ändern Sie diese Liste, um MACs zu überschreiben. Standardwerte befinden sich in defaults/main.yml.
  • ssh_kex
    • Standard: []
    • Beschreibung: Ändern Sie diese Liste, um KEXs zu überschreiben. Standardwerte befinden sich in defaults/main.yml.
  • ssh_ciphers
    • Standard: []
    • Beschreibung: Ändern Sie diese Liste, um Chiffren zu überschreiben. Standardwerte befinden sich in defaults/main.yml.
  • ssh_custom_options
    • Standard: []
    • Beschreibung: Benutzerdefinierte Zeilen für die SSH-Client-Konfiguration.
  • sshd_custom_options
    • Standard: []
    • Beschreibung: Benutzerdefinierte Zeilen für die SSH-Daemon-Konfiguration.
  • sshd_syslog_facility
    • Standard: 'AUTH'
    • Beschreibung: Der Facility-Code, der beim Protokollieren von Nachrichten von sshd verwendet wird.
  • sshd_log_level
    • Standard: 'VERBOSE'
    • Beschreibung: Der Detailgrad, der beim Protokollieren von Nachrichten von sshd verwendet wird.
  • sshd_strict_modes
    • Standard: true
    • Beschreibung: Überprüft Dateimodi und den Besitzer der Benutzerdateien und des Home-Verzeichnisses, bevor der Login akzeptiert wird.
  • sshd_authenticationmethods
    • Standard: publickey
    • Beschreibung: Gibt die Authentifizierungsmethoden an, die erfolgreich abgeschlossen werden müssen, damit ein Benutzer Zugang erhält. Stellen Sie sicher, dass Sie alle erforderlichen Variablen für Ihre gewählte Authentifizierungsmethode festlegen. Standardwerte befinden sich in defaults/main.yml.

Konfigurieren von Einstellungen, die nicht in Rollenvorlagen aufgeführt sind

Wenn Sie SSH-Optionen konfigurieren möchten, die oben nicht aufgeführt sind, können Sie ssh_custom_options (für /etc/ssh/ssh_config) oder sshd_custom_options (für /etc/ssh/sshd_config) verwenden, um sie festzulegen. Diese Optionen werden am Anfang der Datei festgelegt, sodass Sie Optionen weiter unten in der Datei überschreiben können.

Beispiel-Playbook:

- hosts: localhost
  roles:
    - dev-sec.ssh-härtung
  vars:
    ssh_custom_options:
      - "Include /etc/ssh/ssh_config.d/*"
    sshd_custom_options:
      - "AcceptEnv LANG"

Ändern des Standardports und Idempotenz

Diese Rolle verwendet den Standardport 22 oder den im Inventar konfigurierten Port, um sich mit dem Server zu verbinden. Wenn der Standard-ssh-Port über ssh_server_ports geändert wird, versucht der SSH-Server, sich weiterhin über den vorherigen Port zu verbinden, nachdem dieser neu gestartet wurde. Um diese Rolle erneut auf demselben Server auszuführen, muss das Inventar aktualisiert werden, um den neuen SSH-Port zu verwenden.

Wenn Idempotenz wichtig ist, ziehen Sie in Betracht, die Rolle ssh-härtung-fallback zu verwenden, die eine Wrapper-Rolle um diese Rolle ist und auf Port 22 zurückfällt, wenn der konfigurierte Port unerreichbar ist.

Beispiel-Playbook

- hosts: localhost
  roles:
    - dev-sec.ssh-härtung

Lokale Tests

Die bevorzugte Methode für lokale Tests der Rolle ist die Verwendung von Docker. Sie müssen Docker auf Ihrem System installieren. Siehe Erste Schritte für ein Docker-Paket, das für Ihr System geeignet ist.

Sie können auch Vagrant und Virtualbox oder VMware verwenden, um Tests lokal auszuführen. Sie müssen Virtualbox und Vagrant auf Ihrem System installieren. Siehe Vagrant Downloads für ein Vagrant-Paket, das für Ihr System geeignet ist. Für alle unsere Tests verwenden wir test-kitchen. Wenn Sie nicht mit test-kitchen vertraut sind, schauen Sie sich bitte ihren Leitfaden an.

Installieren Sie dann test-kitchen:

# Abhängigkeiten installieren
gem install bundler
bundle install

Testen mit Docker

# schneller Test auf einer Maschine
bundle exec kitchen test ssh-ubuntu1804-ansible-latest

# Test auf allen Maschinen
bundle exec kitchen test

# für die Entwicklung
bundle exec kitchen create ssh-ubuntu1804-ansible-latest
bundle exec kitchen converge ssh-ubuntu1804-ansible-latest
bundle exec kitchen verify ssh-ubuntu1804-ansible-latest

# bereinigen
bundle exec kitchen destroy ssh-ubuntu1804-ansible-latest

Testen mit Virtualbox

# schneller Test auf einer Maschine
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test ssh-ubuntu-1804

# Test auf allen Maschinen
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test

# für die Entwicklung
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen create ssh-ubuntu-1804
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen converge ssh-ubuntu-1804

Für weitere Informationen siehe test-kitchen.

FAQ / Stolpersteine

Ich kann mich nicht in mein Konto einloggen. Ich habe den Client-Schlüssel registriert, aber es lässt mich immer noch nicht rein.

Wenn Sie alle typischen Probleme ausgeschlossen haben (Firewall, Netzwerk, fehlender Schlüssel, falscher Schlüssel, Konto deaktiviert usw.), kann es sein, dass Ihr Konto gesperrt ist. Die schnellste Möglichkeit, dies herauszufinden, besteht darin, den Passwort-Hash für Ihren Benutzer anzusehen:

sudo grep myuser /etc/shadow

Wenn der Hash ein ! enthält, ist Ihr Konto gesperrt:

myuser:!:16280:7:60:7:::

Die richtige Lösung besteht darin, das Konto zu entsperren (passwd -u myuser). Wenn der Benutzer kein Passwort hat, können Sie es über:

usermod -p "*" myuser

entsperren. Alternativ, wenn Sie PAM verwenden möchten, haben Sie es über ssh_use_pam: true aktiviert. PAM erlaubt es gesperrten Benutzern, sich mit Schlüsseln anzumelden.

Warum kann meine Anwendung nicht mehr über SSH verbinden?

Überprüfen Sie immer zuerst die Protokolldateien und wenn möglich die Verhandlung zwischen Client und Server, die beim Verbinden abgeschlossen wird.

Wir haben einige Probleme in Anwendungen (basierend auf Python und Ruby) gesehen, die auf die Verwendung einer veralteten Kryptokonfiguration zurückzuführen sind. Dies kollidiert mit diesem Härtungsmodul, das die Liste der Chiffren, der MACs (Nachrichtenauthentifizierungscodes) und der KEX-Algorithmen auf eine sicherere Auswahl reduziert hat.

Nach der Verwendung der Rolle funktionieren die Module Template/Copy/File von Ansible nicht mehr!

Diese Rolle deaktiviert standardmäßig SFTP. Ansible verwendet standardmäßig SFTP, um Dateien auf die Remote-Hosts zu übertragen. Sie müssen scp_if_ssh = True in Ihrer ansible.cfg setzen. So verwendet Ansible SCP zum Kopieren von Dateien. Alternativ können Sie SFTP erneut aktivieren, indem Sie sftp_enabled auf true setzen.

Kann den sshd-Dienst nicht neu starten wegen fehlender Berechtigungen

Wenn Sie den folgenden Fehler beim Ausführen des Handlers "neustarten sshd" erhalten:

Kann den Dienst ssh nicht neu starten: Fehler beim Neustarten von ssh.service: Zugriff verweigert

oder

Fehler 1 beim Ausführen von systemctl show für 'ssh': Verbindung zum Bus verweigert: Keine solche Datei oder Verzeichnis

entweder das Playbook als root (ohne become: yes auf der Playbook-Ebene) ausführen oder become: yes zum Handler hinzufügen.

Dies ist ein Fehler in Ansible: siehe hier und hier für weitere Informationen.

Mitwirken

Siehe Mitwirkenden-Richtlinie.

Lizenz und Autor

Lizenziert unter der Apache-Lizenz, Version 2.0 (die "Lizenz"); Sie dürfen diese Datei nicht verwenden, es sei denn, Sie erfüllen die Bedingungen der Lizenz. Sie können eine Kopie der Lizenz unter

http://www.apache.org/licenses/LICENSE-2.0

erhalten.

Es gelten die Bedingungen der Lizenz für die spezifischen Rechte und Einschränkungen.

Über das Projekt

This Ansible role provides numerous security-related ssh configurations, providing all-round base protection.

Installieren
ansible-galaxy install dev-sec.ssh-hardening
Lizenz
Unknown
Downloads
3.3M
Besitzer
Security + DevOps: Automatic Server Hardening