How To SSH Server Einrichten unter Linux

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:

Iptables Grundlagen

Root Server absichern

Viel Spass und bei Fragen oder Anregungen bitte einen Kommentar hinterlassen.

Gruß Euer DocSchneidi ak Cheech

Tagged , , , , , , , , , , , , , , , , , , , , , .Speichere in deinen Favoriten diesen permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.