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
oderyes
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. Auftrue
setzen, um das Binden an die Wildcard-Adresse zu erzwingen. Aufclientspecified
setzen, um dem Client zu erlauben, anzugeben, an welche Adresse gebunden werden soll.
- Standard:
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, wennssh_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.
- Standard:
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.
- Standard:
ssh_client_port
- Standard:
'22'
- Beschreibung: Gibt die Portnummer an, um sich mit dem Remote-Host zu verbinden.
- Standard:
ssh_client_compression
- Standard:
false
- Beschreibung: Gibt an, ob der Client Kompression anfordert.
- Standard:
ssh_compression
- Standard:
false
- Beschreibung: Gibt an, ob serverseitige Kompression aktiviert ist, nachdem der Benutzer erfolgreich authentifiziert wurde.
- Standard:
ssh_login_grace_time
- Standard:
30s
- Beschreibung: Gibt die Zeit an, die für eine erfolgreiche Authentifizierung beim SSH-Server erlaubt ist.
- Standard:
ssh_max_auth_retries
- Standard:
2
- Beschreibung: Gibt die maximale Anzahl an Authentifizierungsversuchen pro Verbindung an.
- Standard:
ssh_max_sessions
- Standard:
10
- Beschreibung: Gibt die maximale Anzahl an offenen Sitzungen an, die von einer bestimmten Verbindung erlaubt sind.
- Standard:
ssh_print_debian_banner
- Standard:
false
- Beschreibung:
true
, um ein debian-spezifisches Banner anzuzeigen.
- Standard:
ssh_server_enabled
- Standard:
true
- Beschreibung:
false
, um den opensshd-Server zu deaktivieren.
- Standard:
ssh_server_hardening
- Standard:
true
- Beschreibung:
false
, um die Härtung des Servers zu stoppen.
- Standard:
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.
- Standard:
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.
- Standard:
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
.
- Standard:
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
- Autor:: Sebastian Gumprich
- Autor:: Christoph Hartmann chris@lollyrock.com
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.
This Ansible role provides numerous security-related ssh configurations, providing all-round base protection.
ansible-galaxy install dev-sec.ssh-hardening