09.12.2021
OpenSSH ist die Implementierung des SSH-Protokolls. OpenSSH ist für Remote Login empfohlen, das Erstellen von Backups, Remote-File-Transfer per SCP oder SFTP, und vieles mehr. SSH ist ideal, um die Vertraulichkeit und Integrität von Daten zwischen zwei Netzwerken und Systemen austauschen. Allerdings ist der Hauptvorteil Server-Authentifizierung, durch den Einsatz von Public-Key-Kryptographie. Von Zeit zu Zeit gibt es Gerüchte über OpenSSH Zero-Day-Exploit. Hier sind ein paar Dinge, die Sie zu zwicken, um OpenSSH-Server-Sicherheit zu verbessern.
Die Default Config Files und der SSH Port
- /etc/ssh/sshd_config - OpenSSH server configuration file.
- /etc/ssh/ssh_config - OpenSSH client configuration file.
- ~/.ssh/ - Users ssh configuration directory.
- ~/.ssh/authorized_keys or ~/.ssh/authorized_keys - Lists the public keys (RSA or DSA) that can be used to log into the user’s account
- /etc/nologin - If this file exists, sshd refuses to let anyone except root log in.
- /etc/hosts.allow and /etc/hosts.deny : Access controls lists that should be enforced by tcp-wrappers are defined here.
- SSH default port : TCP 22
Tipp Nr. 01: OpenSSH Server Deaktivieren
Laptops und Workstationen funktionieren auch ohne OpenSSH-Server. Wenn Sie nicht mit Remote Login und einer Dateiübertragungsfunktionen per SSH arbeiten, deaktivieren und entfernen Sie den sshd-Server. RHEL / Fedora / CentOS Linux-Benutzer deaktivieren und entfernen den openssh-server mit dem yum Befehl:
chkconfig sshd off # yum erase openssh-server
Ubuntu / Debian Linux User tund dasselbe mit dem apt-get Befehl:
apt-get remove openssh-server
Warscheinlich muss das iptables script upgedated werden um die ssh Regel zu entfernen. Unter Fedora / RHEL oder CentOs editiert man dazu die Dateien /etc/sysconfig/iptables & /etc/sysconfig/ip6tables und restartet den iptables Service:
service iptables restart # service ip6tables restart
Tipp Nr. 02: Nur SSH Protocol 2 verwenden
SSH protocol version 1 (SSH-1) hat man-in-the-middle Attacken Probleme und Sicherheitslücken. SSH-1 ist veraltet und sollte um jeden Preis vermieden werden. Öffnen Sie die sshd_config Datei und vergewissern Sie sich die folgende Zeile vorhanden ist:
Protocol 2
Tipp Nr. 03: SSH Benutzer Zugriff limitieren
Standardmäßig können sich alle System-Anwender sich per SSH mit ihrem Passwort oder öffentlichem Schlüssel anmelden . Irgendwann erstellen Sie dann noch einen UNIX / Linux-Benutzer-Account für FTP oder E-Mail Zugang. Allerdings können diese Anwender sich nun auch auf dem System per ssh einloggen. Sie werden vollen Zugang zu System-Tools wie Compiler & Skriptsprachen sowie Perl, Python haben und die Netzwerk-Ports öffnen können. Einer meiner Kunden hatte ein wirklich veraltetes PHP-Skript und ein Angreifer konnte ein neues Konto auf dem System über ein PHP-Skript erstellen. Allerdings gelang es dem Angreifern nicht in den Server per ssh einzuloggen, weil sie nicht in der AllowUsers Datei eingetragen waren.
Um nur dem root, admin und sysadmin User Zugang per SSH zu gewähren, fügt man folgende Zeile in die sshd_config:
AllowUsers root admin sysadmin
Alternativ dazu kann auch alle Usern der Zugriff per ssh gestattet werden und dann nur ein paar Usern durch hinzufügen der folgenden Zeile verboten werden :
DenyUsers username1 username2 username3
Sie können auch so konfigurieren, daß Linux PAM durch den sshd Server erlaubt oder verboten wird. Ebenso kann man eine liste von Gruppen Namen den Zugang per ssh erlauben oder verbieten.
Tipp Nr. 04: Einstellen eines Idle Timeout Log Out Intervalles
Sie können auch ein Timeout Idle Intervall einstellen um Benutzer automatisch auszuloggen wenn Ihre SSH-Sitzung nicht beaufsichtigt ist. Öffnen sie die sshd_config und und vergewissern Sie sich das folgende Werte konfiguriert sind:
ClientAliveInterval 300 ClientAliveCountMax 0
Sie können eine Idle timeout in Sekunden angeben (300 secs = 5 minutes). Nachdem dieses Zeitfenster abgelaufen ist, wird der User automatisch gekickt (ausgeloggt)
Tipp Nr. 05: .rhosts Dateien deaktivieren
Abschalten der Lesefunktion der Benutzerdateien /.rhost_s und _/.shosts. Dazu muss die sshd_config Datei mit folgenden Einstellungen geändert werden:
IgnoreRhosts yes
SSH kann das Verhalten des veralteten RSH-Kommandos emulieren, weshalb der unsichere Zugang über RSH deaktiviert werden sollte.
Tipp Nr. 06: Deaktivieren von Host-Basierter Authentifizierung
Um Host basierte Authentifizierung zu deaktivieren muss die sshd_config mit Folgenden Optionen upgedated werden:
HostbasedAuthentication no
Tipp Nr. 07: Deaktivieren des root Login via SSH
Es gibt keinen Notwendigkeit sich als root Benutzer per ssh über das Netzwerk anzumelden. Normale Benutzer können su oder sudo benutzen, um root Rechte zu haben:
PermitRootLogin
Tipp Nr. 08: Aktivieren einer Banner-Warnung
Um eine Banner Warnung zu aktivieren muss folgende Zeile in die Datei sshd_config gefügt werden:
Banner /etc/issue
Sample /etc/issue file:
,-.
___,---.__ /'|`\ __,---,___
,-' \` `-.____,-' | `-.____,-' // `-.
,' | ~'\ /`~ | `.
/ ___// `. ,' , , ___ \
| ,-' `-.__ _ | , __,-' `-. |
| / /_ ` . | , _/\ \ |
\ | \ \`-.___ \ | / ___,-'/ / | /
\ \ | `._ `\\ | //' _,' | / /
`-.\ /' _ `---'' , . ``---' _ `\ /,-'
`` / \ ,='/ \`=. / \ ''
|__ /|_,--.,-.--,--._/|\ __|
/ `./ \\`\ | | | /,//' \,' \
/ / ||--+--|--+-/-| \ \
| | /'__\ | /_/_/`\ | |
\ __, _ `~' _/ .__/ /
`-._,-' `-._______,-' `-._,-'
Hier z.B. ein Banner das den potentiellen Hacker abschrecken soll.
Tipp Nr. 08: Firewall SSH Port # 22
Sie sollten den ssh Port #22 durch Ihre Firewall abschirmen, indem sie die iptables Firewall Konfiguration updaten. Für gewöhnlich brauchen OpenSSH server nur Verbindungen aus dem LAN oder einem anderen remote WAN akzeptieren.
Firewall Konfiguration (Iptables)
Update /etc/sysconfig/iptables (spezifische Datei bei Redhat Systemen) um Verbindungen von 192.168.1.0/24 und 200.54.1.18/29 zu akzeptieren:
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT -A RH-Firewall-1-INPUT -s 200.54.1.18/29 -m state --state NEW -p tcp --dport 22 -j ACCEPT
Falls sie einen Dual gestapelten sshd mit IPv6 haben, editieren sie /etc/sysconfig/ip6tables (spezifische Datei bei Redhat Systemen):
-A RH-Firewall-1-INPUT -s ipv6network::/ipv6mask -m tcp -p tcp --dport 22 -j ACCEPT
Ersetzen sie dabei ipv6network::/ipv6mask mit ihrer IPv6 Range.
BSD PF Firewall Konfiguration
Falls sie eine BSD PF Firewall benutzen muss die Datei /etc/pf.conf wie folgt geändert werden:
pass in on $ext_if inet proto tcp from {192.168.1.0/24, 202.54.1.5/29} to $ssh_server_ip port ssh flags S/SA synproxy state
Tipp Nr. 09: Änderung des SSH Ports und Limitierung der IP Verbindungen
Per Default hört SSH an allen verfügbaren Interfaces und IP-Addressen auf dem System. Limitieren sie deshalb die ssh port Verbindungen und ändern sie den ssh port (per Grundeinstellung versuchen Brute Force Skripte nur auf Port #22 anzugreifen). Um Zugriff nur von der IP 192.168.1.15 und 202.54.1.15 zuzulassen und den Port auf Port #300 zu legen muss folgendes eingefügt werden:
Port 300 ListenAddress 192.168.1.15 ListenAddress 202.54.1.15
Noch besser ist es wenn man proaktive Skripte wie fail2ban oder denyhosts verwendet. (siehe unten)
Tipp Nr. 10: Benutze starke SSH Passwords und Passphrase
It cannot be stressed enough how important it is to use strong user passwords and passphrase for your keys. Brute force attack works because you use dictionary based passwords. You can force users to avoid passwords against a dictionary attack and use john the ripper tool to find out existing weak passwords. Here is a sample random password generator (put in your ~/.bashrc):
Es kann nicht genug betont werden, wie wichtig es ist, starke Benutzer-Passwörter und Passortphrases für Ihren pirvaten Schlüssel zu verwenden ist. Brute-Force-Angriff funktioniert nur weil die Passwörter in Wörterbüchern gefunden werden. Sie können die Benutzer dazu zwingen, starke Passwörter zu verwenden und z.B. selber einen Wörterbuch Angriff mittels des John the Ripper-Tool versuchen um vorhandeneschwachen Passwörter herauszufinden.
Hier mal 3 Beispiel eines Random Password Generator Skripts (Einfügen in Ihre ~ / bashrc Datei.)
genpasswd() {
local l=$1 [ "$l" == "" ] && l=20
tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs
}
Run it:
genpasswd 16
Output:
Rw9CnDXMwC8kkLKgX
mkpasswd() {
local l=$1
[ "$l" == "" ] && l=8
tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs
}
Run it:
genpasswd 6
passgen() {
local l=$1
[ "$l" == "" ] && l=16
tr -dc A-Za-z0-9_=., < /dev/urandom | head -c ${l} | xargs
}
#as oneliner
passgen() { local l=$1 ; [ "$l" == "" ] && l=20 ; tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs }
Tipp Nr. 11: Benutze Public Key Based Authentifikation
Nutzen Sie die öffentlichen / privaten Schlüsselpaar mit Passwort-Schutz für den privaten Schlüssel. In einer anderen Anleitung hier wird erklärt Sie eine RSA und DSA-Schlüssel basierte Authentifizierung verwenden. Verwenden Sie niemals einen Schlüssel ohne Passphrase (passphrase key less) um sich anmelden.
Tipp Nr. 12: Benutze Keychain Based Authentifikation
keychain ist eine spezielle entwickeltes Bash-Skript, um Schlüssel-basierte Authentifizierung unglaublich bequem und flexibel zu machen. Es bietet verschiedene Vorteile gegenüber Passphrase Security-freie Tasten. Sehen Sie, wie einzurichten und zu bedienen Schlüsselbund Software.
Tipp Nr. 13: Chroot SSHD (Einsperren der Benutzer in ihre Heimatverzeichnisse)
Standardmäßig durfen Benutzer die Server-Verzeichnisse wie / etc /, / bin und so weiter ansehen und durchsuchen. Sie können ssh dafor beschützen, indem sie ein Betriebssystem basiertes chroot oder spezielle Tools wie rssh verwenden. Seit der Veröffentlichung von OpenSSH 4.8p1 oder 4.9p1 müssen nicht mehr auf fremden Hacks wie rssh oder das komplizierte chroot verlassen, um Benutzer auf ihre Home-Verzeichnisse zu sperren. Lesen Sie für weiteren Informationen dieses Debian-Blog-Eintrag über neue ChrootDirectory Richtlinie um Benutzer in Ihre Home-Verzeichnisse zu sperren.
Tipp Nr. 14: Benutze TCP Wrappers
TCP Wrapper ist ein host-basiertes Networking ACL System, das verwendet wird um den Internetzugang zu filtern. OpenSSH unterstützt TCP wrappers jedoch nicht. Aktualisieren sie einfach Ihre /etc/hosts.allow Datei wie folgt um SSH Zugang nur von 192.168.1.2 und 172.16.23.12 zu erlauben:
sshd : 192.168.1.2 172.16.23.12
Tipp Nr. 15: Deaktiviere leere Passwörter
You need to explicitly disallow remote login from accounts with empty passwords, update sshd_config with the following line:
Sie müssen zusätzlich auch ausdrücklich verbieten leeren Kennwörtern für einen Remote-Login verwenden zu können indem folgende Zeile der Datei sshd_config hinzugefügt wird:
PermitEmptyPasswords no
Tipp Nr. 16: Thwart SSH Crackers (Brute Force Attack)
Brute-Force ist eine Methode ein kryptographischen Systems zu besiegen, indem versucht wird eine große Anzahl von Möglichkeiten mit einem einzigen oder verteilte Computer-Netzwerk durchzutesten. Um Brute-Force-Angriffe auf SSH zu vermeiden, können Sie die folgende Software verwenden:
- DenyHosts ist ein Python basierendes Security Hilfsprogramm für SSH Server. Das Programm beabsichtigt, Brute-Force-Angriffe auf den SSH-Server durch die Überwachung von ungültigen Login-Versuche im Authentifizierungs Log vorzubeugen und die Ursprung IP-Adressen zu blocken
- Fail2ban ist ein ähnliches Programm, welches Brute Force Attacken auf SSH vorbeugen kann.
- security/sshguard-pf schützt Host vor Brute Force Angriffen gegen SSH und andere Dienste duch Benutzung von pf.
- security/sshguard-ipfw schützt Host vor Brute Force Angriffen gegen SSH und andere Dienste duch Benutzung von ipfw.
- security/sshguard-ipfilter schützt Host vor Brute Force Angriffen gegen SSH und andere Dienste duch Benutzung von ipfilter.
- security/sshblock Blockt missbräuchliche SSH Login Versuche
- security/sshit Kontrolle von SSH/FTP Bruteforce Angriffen und IP Blöcken
- BlockHosts Automatisches Blocken von missbrauchten IP-Hosts.
- Blacklist Befreien Sie sich von Bruteforce Versuchen
- Brute Force Detection Ein modulares Shell-Skript zum Parsen von Anwendung Logdateien und zur Kontrolle für die Authentifizierung Failures. Das Skript schafft dies mit einem Regel System inwelchem anwendungsspezifischen Optionen einschließlich regulärer Ausdrücke für jede eindeutige auth-Format gespeichert werden.
- IPQ BDB filter Kann als fail2ban lite Version angesehen werden.
Tipp Nr. 17: Begrenzungslimit von eingehenden Verbindungen auf Port 22
Netfilter und pf stellen beide ein Begrenzungslimit-Option zur Verfügung, welche eine einfache Drosselung für eingehende Verbindungen auf Port #22 erlaubt
Iptables Beispiel
Die folgenden Beispiel Konfiguration senkt die eingehenden Verbindungen, wenn mehr als 5 Verbindungsversuche auf Port 22 innerhalb von 60 Sekunden stattfinden:
#!/bin/bash
inet_if=eth1
ssh_port=22
$IPT -I INPUT -p tcp --dport
${ssh_port} -i
${inet_if} -m state --state NEW -m recent --set
$IPT -I INPUT -p tcp --dport ${ssh_port} -i
${inet_if} -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP
# Rufen Sie oberes Skript Ihrer iptables-Skripte mit einer weiteren Konfigurations Option auf: .
$IPT -A INPUT -i ${inet_if} -p tcp --dport ${ssh_port} -m state --state NEW -m limit --limit 3/min --limit-burst 3 -j ACCEPT
$IPT -A INPUT -i ${inet_if} -p tcp --dport ${ssh_port} -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o ${inet_if} -p tcp --sport ${ssh_port} -m state --state ESTABLISHED -j ACCEPT
# another one line Beispiel
$IPT -A INPUT -i ${inet_if} -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 22 -m limit --limit 5/minute --limit-burst 5-j ACCEPT
Sehen Sie sich die man Pages für weitere Details an.
Tipp Nr. 18: Benutze Port Knocking
is a method of externally opening ports on a firewall by generating a connection attempt on a set of prespecified closed ports. Once a correct sequence of connection attempts is received, the firewall rules are dynamically modified to allow the host which sent the connection attempts to connect over specific port(s). A sample port Knocking Beispiel for ssh using iptables:
Port knocking ist eine Methode zum externen Öffnen von Ports auf einer Firewall durch Erzeugung eines Verbindungs Versuches auf einer Reihe von vorgegebenen geschlossenen Ports. Sobald eine richtige Reihenfolge von Verbindungsversuche empfangen wird, werden die Firewall-Regeln dynamisch modifiziert werden, um dem Host, der die Verbindung aufnehmen will, eine Verbindung über bestimmten Port (s) genehmigt wird. Hier ein Beispiel für ein Port Knocking Eintrag für ssh in iptables:
$IPT -N stage1
$IPT -A stage1 -m recent --remove --name knock
$IPT -A stage1 -p tcp --dport 3456 -m recent --set --name knock2
$IPT -N stage2
$IPT -A stage2 -m recent --remove --name knock2
$IPT -A stage2 -p tcp --dport 2345 -m recent --set --name heaven
$IPT -N door
$IPT -A door -m recent --rcheck --seconds 5 --name knock2 -j stage2
$IPT -A door -m recent --rcheck --seconds 5 --name knock -j stage1
$IPT -A door -p tcp --dport 1234 -m recent --set --name knock
$IPT -A INPUT -m --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 5 --name heaven -j ACCEPT
$IPT -A INPUT -p tcp --syn -j doo
- fwknop eine Umsetzung welche Port knocking und Passives OS fingerprinting kombiniert.
- Multiple-port knocking Netfilter/IPtables only Umsetzung
Tipp Nr. 19: Analysiere die Logdateien
Lesen Sie Ihre Logdateien indem Sie Programme wie logwatch oder logcheck verwenden. Diese Tools machen das Log Lese Leben einfacher. Die Programme gehen von Zeit zu Zeit durch Ihre Logdateien und erstellen einen Bericht über Bereiche die Sie wünschen. Stellen Sie sicher, das der LogLevel auf INFO oder DEBUG in der sshd_config gesetzt wird:
LogLevel INFO
Tipp Nr. 20: Einspielen von Sicherheitsupdates von OpenSSH und des Betriebssystemes
Es wird empfohlen Programme wie yum, apt-get, freebsd-update usw. zu verwenden um Ihr System Up to Date zu halten und die neuersten Sicherheits Patches einzuspielen.
Andere Möglichkeiten
Um die OpenSSH-Version zu verstecken, müssen Sie Quellcode aktualisieren und openssh wieder neu kompilieren . Vergewissern Sie sich das folgende Optionen in sshd_config aktiviert sind:
# Turn on privilege separation
UsePrivilegeSeparation yes
# Prevent the use of insecure home directory and key file permissions
StrictModes yes
# Turn on reverse name checking VerifyReverseMapping
yes
# Do you need port forwarding?
AllowTcpForwarding no
X11Forwarding no
# Specifies whether password authentication is allowed. The default is yes.
PasswordAuthentication no
Überprüfen der sshd_config Datei bevor neu gestartet oder geladen wird:
# /usr/sbin/sshd -t
Sicherere und dichtere SSH Sicherheit mit two-factor oder three-factor (oder mehr) Autentifizierung
Quellen:
- Das offizielle OpenSSH Project.
- Tool for testing bruteforce SSH: Github SSHbrute by gotr00t0day
- man pages sshd_config, ssh_config, tcpd, yum,and apt-get.