How To SSH Server Einrichten unter Linux
Man sollte immer seinen SSH Server um konfigurieren da die Standard Konfiguration leider nicht die Sicherste ist und daher ein Sicherheitsrisiko darstellt.
Wechsel vom user zu root oder man arbeitet mit sudo:
doc@server01:~$ su Passwort:
Installation:
aptitude install openssh-server Die folgenden Pakete werden INSTALLIERT: openssh-server 0 Pakete aktualisiert, 0 zusätzlich installiert, 1 erneut installiert, 0 werden entfernt und 0 nicht aktualisiert. 331 kB an Archiven müssen heruntergeladen werden. Nach dem Entpacken werden 0 B zusätzlich belegt sein. Holen: 1 http://ftp.de.debian.org/debian/ jessie/main openssh-server amd64 1:6.7p1-5+deb8u1 [331 kB] 331 kB wurden in 0 s heruntergeladen (1.318 kB/s) Vorkonfiguration der Pakete ... (Lese Datenbank ... 34167 Dateien und Verzeichnisse sind derzeit installiert.) Vorbereitung zum Entpacken von .../openssh-server_1%3a6.7p1-5+deb8u1_amd64.deb ... Entpacken von openssh-server (1:6.7p1-5+deb8u1) über (1:6.7p1-5+deb8u1) ... Trigger für systemd (215-17+deb8u3) werden verarbeitet ... Trigger für man-db (2.7.0.2-5) werden verarbeitet ... openssh-server (1:6.7p1-5+deb8u1) wird eingerichtet ...
Dateien:
Wechsel in das SSH Verzeichnis: cd /etc/ssh/ Verzeichnis:
ls -al insgesamt 288 drwxr-xr-x 2 root root 4096 Feb 3 23:08 . drwxr-xr-x 84 root root 4096 Feb 3 23:30 .. -rw-r--r-- 1 root root 242091 Jan 13 22:19 moduli -rw-r--r-- 1 root root 1690 Jan 13 22:19 ssh_config -rw-r--r-- 1 root root 2541 Feb 3 23:08 sshd_config -rw------- 1 root root 668 Feb 3 23:08 ssh_host_dsa_key -rw-r--r-- 1 root root 603 Feb 3 23:08 ssh_host_dsa_key.pub -rw------- 1 root root 227 Feb 3 23:08 ssh_host_ecdsa_key -rw-r--r-- 1 root root 175 Feb 3 23:08 ssh_host_ecdsa_key.pub -rw------- 1 root root 399 Feb 3 23:08 ssh_host_ed25519_key -rw-r--r-- 1 root root 95 Feb 3 23:08 ssh_host_ed25519_key.pub -rw------- 1 root root 1679 Feb 3 23:08 ssh_host_rsa_key -rw-r--r-- 1 root root 395 Feb 3 23:08 ssh_host_rsa_key.pub
Die ssh_config ist nur für den Client und daher uninteressant.
Key und Pub sind die Verschlüsselungs Keys der SSH Verbindung für den SSH Server, diese löschen wir alle um neue zu erstellen bis auf die ECDSA da diese maximal 512Bit können und standardmäßig schon auf 512 Bit sind.
Die DSA Keys werden gelöscht da DSA als unsicher gilt werden wir kein DSA nutzen, sondern nur RSA und ECDSA sowie ED25519.
Wer mehr über ECDSA Wissen möchten kann sich noch den Wiki Artikel durch lesen.
Keys:
DSA und RSA Keys löschen:
rm ssh_host_dsa_key ssh_host_dsa_key.pub ssh_host_rsa_key ssh_host_rsa_key.pub
Neuen RSA Key erstellen:
ssh-keygen -t rsa -b 4096 Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /etc/ssh/ssh_host_rsa_key Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /etc/ssh/ssh_host_rsa_key. Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub. The key fingerprint is: bb:20:15:34:ab:84:ba:6f:37:c0:58:08:88:a4:a7:b9 root@server01 The key's randomart image is: +---[RSA 4096]----+ |+. o | |= . . o | |o.o . o | |.=.. . . | |++ . . S | |.oo . . | |E .. . . | | .. o. . . | | ... . . | +-----------------+
So jetzt haben wir einen RSA Key erstellt mit 4096Bit Verschlüsselung, das minimum liegt bei 2048Bit, aber etwas mehr schadet nie.
Man kann auch einen 8192Bit erstellen oder sogar noch höher.
Das maximum liegt bei 32kBit aber dazu brauch man dann auch die Zeit bis das System damit fertig ist, man muss auch davon ausgehen das dann die Verbindungsgeschwindigkeit in die knie geht bei einer so hohen Verschlüsselung.
ECDSA-Key erstellen:
ssh-keygen -t ecdsa
Bitrate muss man nicht angeben da ECDSA fix mit 256Bit arbeitet.
Wie beim RSA Key wird nach einem Pfad und Dateiname gefragt, wie beim RSA angeben.
ED25519-Key erstellen:
ssh-keygen -t ed25519
Bitrate muss man nicht angeben da ED25519 fix mit 256Bit arbeitet.
Wie beim RSA Key wird nach einem Pfad und Dateiname gefragt, wie beim RSA angeben.
Nochmal das Aktuelle Verzeichnis:
ls -al insgesamt 280 drwxr-xr-x 2 root root 4096 Feb 4 00:18 . drwxr-xr-x 84 root root 4096 Feb 3 23:30 .. -rw-r--r-- 1 root root 242091 Jan 13 22:19 moduli -rw-r--r-- 1 root root 1690 Jan 13 22:19 ssh_config -rw-r--r-- 1 root root 2541 Feb 3 23:08 sshd_config -rw------- 1 root root 227 Feb 3 23:08 ssh_host_ecdsa_key -rw-r--r-- 1 root root 175 Feb 3 23:08 ssh_host_ecdsa_key.pub -rw------- 1 root root 399 Feb 3 23:08 ssh_host_ed25519_key -rw-r--r-- 1 root root 95 Feb 3 23:08 ssh_host_ed25519_key.pub -rw------- 1 root root 3243 Feb 4 00:18 ssh_host_rsa_key -rw-r--r-- 1 root root 739 Feb 4 00:18 ssh_host_rsa_key.pub
Konfiguration:
Jetzt geht es an die sshd_config , das ist die für den SSH Server.
nano sshd_config erstmal die Standard Config:
# Package generated configuration file See the sshd_config(5) manpage for details What ports, IPs and protocols we listen for Port 22 Use these options to restrict which interfaces/protocols sshd will bind to ListenAddress :: ListenAddress 0.0.0.0 Protocol 2 HostKeys for protocol version 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key Privilege Separation is turned on for security UsePrivilegeSeparation yes Lifetime and size of ephemeral version 1 server key KeyRegenerationInterval 3600 ServerKeyBits 1024 Logging SyslogFacility AUTH LogLevel INFO Authentication: LoginGraceTime 120 PermitRootLogin without-password StrictModes yes RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile %h/.ssh/authorized_keys Don't read the user's ~/.rhosts and ~/.shosts files IgnoreRhosts yes For this to work you will also need host keys in /etc/ssh_known_hosts RhostsRSAAuthentication no similar for protocol version 2 HostbasedAuthentication no Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication IgnoreUserKnownHosts yes To enable empty passwords, change to yes (NOT RECOMMENDED) PermitEmptyPasswords no Change to yes to enable challenge-response passwords (beware issues with some PAM modules and threads) ChallengeResponseAuthentication no Change to no to disable tunnelled clear text passwords PasswordAuthentication yes Kerberos options KerberosAuthentication no KerberosGetAFSToken no KerberosOrLocalPasswd yes KerberosTicketCleanup yes GSSAPI options GSSAPIAuthentication no GSSAPICleanupCredentials yes X11Forwarding yes X11DisplayOffset 10 PrintMotd no PrintLastLog yes TCPKeepAlive yes UseLogin no MaxStartups 10:30:60 Banner /etc/issue.net Allow client to pass locale environment variables AcceptEnv LANG LC_* Subsystem sftp /usr/lib/openssh/sftp-server Set this to 'yes' to enable PAM authentication, account processing, and session processing. If this is enabled, PAM authentication will be allowed through the ChallengeResponseAuthentication and PasswordAuthentication. Depending on your PAM configuration, PAM authentication via ChallengeResponseAuthentication may bypass the setting of "PermitRootLogin without-password". If you just want the PAM account and session checks to run without PAM authentication, then enable this but set PasswordAuthentication and ChallengeResponseAuthentication to 'no'. UsePAM yes
Anpassung:
Und jetzt passen wir das alles so an damit es Sicher ist und so wie wir das wollen.
Port 22 kann man so lassen, ich Empfehle aber einen Port zu nutzen der über 1024 ist und auch sonst von keinem anderen Dienst genutzt wird, da hier immer Attacken drauf laufen. Um einen freien Port zu finden der über 1024 liegt kann auf der Wiki Seite finden.
Ich änder den Port einfach mal als Beispiel in 12345, danach sieht das dann so aus Port 12345 und bitte benutzt diesen Port NICHT !!!
Der Nächste Punkt ist dann die ListenAddress die gibt an auf welche IP der SSH hört. Hat man einen Server mit mehr als eine IP Adresse sollte man hier die 2. nehmen.
Also ändern wir die Zeile ab von #ListenAddress 0.0.0.0 auf ListenAddress 0.0.0.0 bedeutet hier das der SSH Server auf alle Ip Adressen hört, was keiner wirklich will.
Hat man nur eine IP muss man anderen maßnahmen ergreifen um seinen Server zu schützen. (siehe hierzu meinen Artikel über Iptables)
Ändern auf ListenAddress 192.168.178.7 kann ich sicherstellen das mein SSH Server nur noch auf diese eine IP hört und auch nur über diese erreichbar ist.
Die # muss natürlich weg da hier durch die Zeile sonst ignoriert wird.
Die Zeile Protocol 2 lassen wir so, da hiermit das SSH Protokoll auf die Version 2 geschaltet wird, es gibt noch SSH 1 aber das gilt als unsicher und wird nicht mehr genutzt.
Pfadangaben zu den Keys für die Verschlüsselung:
# HostKeys for protocol version 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key
Da wir keinen DSA Key mehr haben kann die Zeile gelöscht werden oder mit # deaktiviert werden.
Da die RSA Key Datei genauso heisst wie vorher muss hier nichts angepasst werden.
Hat man jedoch den Pfad oder den Dateinamen geändert muss man dies anpassen!
Abgeänderte Version:
# HostKeys for protocol version 2 HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_dsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key
Key lebenszeit und Bit höhe:
# Lifetime and size of ephemeral version 1 server key KeyRegenerationInterval 3600 ServerKeyBits 1024
Was viele hier falsch machen ist hier was zu ändern, braucht man aber nicht, da ganz klar dabei steht Version 1 also geht es hier um SSH 1 was wir nicht nutzen daher sind die Zeilen unnütz.
Wenn man möchte kann man noch das Logging ändern was ratsam ist da man dann mehr information erhält was bei einem Angriff oder Einbruch wichtig sein könnte.
Daher ändere ich das Logging von Loglevel INFO zu LogLevel ERROR.
Was ich auch noch ändere ist die Login Zeit bei untätigkeit.
Die ist Standardmäßig auf 120 (Minuten) gesetzt, diese reduziere ich auf 30 (Minuten).
Das heißt die Zeile LoginGraceTime 120 auf LoginGraceTime 30 ändern. Man kann da auch 10 für 10 Minuten eintragen wie man möchte.
PermitRootLogin without-password
Aus der Manpage:
PermitRootLogin Specifies whether root can log in using ssh(1). The argument must be “yes”, “without-password”, “forced-commands-only”, or “no”. The default is “yes”. If this option is set to “without-password”, password authentication is disabled for root. If this option is set to “forced-commands-only”, root login with public key authentication will be allowed, but only if the command option has been specified (which may be useful for taking remote backups even if root login is normally not allowed). All other authentication methods are disabled for root. If this option is set to “no”, root is not allowed to log in.
Man kann dies so lassen oder ändert es auf No, bis Debian 7 stand der Wert auf yes was ein absolutes NOGO ist und geändert werden muss!
Auch wenn das Anmelden als root verboten ist sollte man sich nie ohne Passwort anmelden dürfen.
PermitEmptyPasswords no
Nun schalten wir die “Message of the Day” an auch einfach Motd genannt in dem die Option PrintMotd no auf PrintMotd yes geändert wird.
PrintMotd yes PrintLastLog yes
Als kleinen Schutz definieren wir noch die maximalen Unbekannte Verbindungen (inaktive) MaxStartups 3:50:10 = Maximal 3 unbekannte Verbindungen: 50% chance das die Verbindung gekappt wird bevor die 3 Verbindungen erreicht werden:ab 10 Verbindungen wird alles blockiert.
Wichtig: das Betrifft nur einen Client (IP) und nicht alle Verbindungen.
Datei und Pfad für das Banner(Rechtlicher hinweis beim Login für jeden user):
Banner /etc/issue.net
Beispiel:
############################################################################################################ # Welcome to Cheech's Server # ############################################################################################################ # ALERT! You are entering into a secured area! # # Your IP, Login Time, Username has been noted and has been sent to the server administrator! # # This service is restricted to authorized users only. # # All activities on this system are logged. # # Unauthorized access will be fully investigated and reported to the appropriate law enforcement agencies. # ############################################################################################################
So zum schluss definieren wir ganz genau welcher user sich via SSH Anmelden darf und wer nicht, das wird zwar auch durch die Datei /etc/passwd definiert, wird aber gerne vergessen beim Anlegen von neuen Usern dies beim erstellen zu definieren oder später in der Datei ab zu ändern. Ist also ein doppelter Schutz.
AllowUsers doc DenyUsers root daemon bin sys sync games man lp mail news proxy www-data backup list irc gnats nobody libuuid ntp Debian-exim mysql popuser bind
An die Denyusers kommt man am besten in dem man ein cat /etc/passwd macht.
Hier werden alle User aufgelistet die im System eingetragen sind und es können alle auf die Deny Liste bis auf die User denen es erlaubt werden soll via SSH Zugriff auf das System zu erhalten.
Kein Lokaler Dienst wird je versuchen sich via SSH Anzumelden daher können auch diese User accounts alle hier eingetragen werden.
Ihr könnte die Liste auch erweitern, je nachdem was alle so auf Eurem Server drauf ist.
Jetzt ist die Konfiguration abgeschlossen und ihr könnt die Datei mit strg+o Speichern und mit strg+x schließen.
Abschluss und Test:
Und der SSH Dienst neu gestartet werden service ssh restart
Und wir können uns auf unseren SSH Server Verbinden:
ssh -l doc -p 12345 192.168.178.7 -l = login (Benutzername) -p Port und dann die IP des Servers. doc@192.168.178.7's password: The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc//copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Wed Feb 3 23:33:42 2016 from doc.fritz.box The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc//copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.
Man sieht wann sich das letzte mal in das System eingeloggt wurde und von wo.
Danach kommt das Banner.
In dem Banner kann einfacher Text drin stehen, man kann aber auch ein Bash Script rein schreiben, was einem etwas dann noch irgendwas Anzeigt.
Zur weiteren Absicherung des System und SSH sollte man noch die Artikel lesen:
Viel Spass und bei Fragen oder Anregungen bitte einen Kommentar hinterlassen.
Gruß Euer DocSchneidi ak Cheech