FreeBSD Setup - Teil 1 - Benutzer und ssh
Teil 1 - Benutzer und ssh |
Teil 2 - systools |
Teil 3 - jails |
Teil 4 - Webserver
Nachdem ich etliche Jahre ein Webhosting-Paket hatte, habe ich mich entschieden nun doch auf einen eigenen Server umzusteigen – einfach nur um meinen "Spieltrieb" zu befriedigen. Ich habe mich eigentlich von vorneherein schon darauf festgelegt, dass ich gerne eine BSD-Variante einsetzen will und mich für einen Virtuellen Server mit FreeBSD 9 entschieden, obwohl mir OpenBSD mit Jails lieber gewesen wäre. Aber bei OpenBSD gibt es keine Jails und noch weniger Auswahl bei den Providern.
Um das Setup für mich zu dokumentieren und natürlich auch anderen zu helfen, werde ich das ganze zusammenschreiben. Ich bin kein FreeBSD- oder Sysadminexperte sondern einfach nur neugierig :-)
Zur Erklärung: § wird benutzt um die Shell des root-Accounts darzustellen, $ für den Benutzerzugang. Für die Kommandozeile auf dem lokalen Rechner wird > verwendet. Buchstaben vor dem Prompt, z.B. www deuten auf den entsprechenden Zugang in einem Jail hin. Ich habe mich für § für root entschieden, da der klassische 'Lattenzaun' # gleichzeitig für Kommentare in Dateien verwendet wird.
Ich gehe mal spontan davon aus, dass man es geschafft hat nach der Anleitung seines Providers FreeBSD 9 zu installieren und einen root-Account mit einem Passwort hat. Als erstes sollte man sich einen weiteren Benutzer anlegen, mit dem man sich am Server anmeldet und über den man für gewünschte Aufgaben root-Rechte erlangen kann. Ich nenne den einfach mal 'max' – frei nach "Max Mustermann".
root-Passwort ändern
Bei der Installation hat man wahrscheinlich ein automatisch generiertes Passwort vom Hoster bekommen. Das erste sollte sein dieses zu ändern:
| § passwd
Changing local password for root
New Password:
Retype new password:
|
Natürlich sollte man hier wie überall ein langes, sicheres Passwort vergeben.
Neuen Benutzer anlegen
Durch den Befehl adduser kann sehr einfach ein neuer Benutzer angelegt werden:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | § adduser
Username: max
Full name: Max Mustermann
Uid (Leave empty for default):
Login group [<user>]:
Login group is <user>. Invite holgi into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/<user>]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
|
sudo
Der angelegte Benutzer ist nur seiner eigenen Benutzergruppe zugewiesen und kann daher nicht viel machen. Das wollte ich auch so. Mit diesem Benutzer will ich mich nur per ssh anmelden um dann von dort aus root-Rechte zu erhalten. Viel mehr soll er (momentan) nicht können.
Ich will nicht su verwenden sonder sudo um nicht dauernd das root-Passwort irgendwo eingeben zu müssen, sondern das oben vergebene Passwort. Falls ich dem Account max aus irgend einem Grund nicht mehr vertrauen würde könnte ich ihn einfach löschen und neu anlegen und kann mir (fast) sicher sein, dass das root-Passwort noch vertrauenswürdig ist, da ich es fast nie gebraucht habe. (Natürlich auch nur, so lange es ein gutes Passwort ist).
Zuerst wird sudo installiert und mit Hilfe von visudo die Konfiguration bearbeitet. Vorsicht: visudo basiert wie der Name vermuten lässt auf vi und hat daher für Ungeübte eine etwas seltsam anmutende Bedienung. Das ganze habe ich mir auch nicht selbst ausgedacht, sondern in einem Blogpost gefunden.
| § pkg_add -r sudo
§ /usr/local/sbin/visudo /usr/local/etc/sudoers
|
In der Datei habe ich eine Zeile auskommentiert, die gewährt allen Benutzer in der Gruppe sudo nach Angabe ihres Passwortes root-Zugang.
Da es die Benutzegruppe sudo noch nicht gibt, muss sie erstellt werden und der Benutzer max hinzugefügt werden.
| § pw groupadd sudo
§ pw groupmod sudo -m max
|
ssh
Da ich nicht jedes mal ein langes, kompliziertes Passwort eingeben will wenn ich mich am Server anmelde werde ich mir ein ssh-Schlüsselpaar erstellen. Dieses besteht aus zwei Dateien: einem privaten Schlüssel der auf meinem Rechner bleibt und einem öffentlichen Schlüssel der auf den Server kopiert wird. Ich möchte hier gerne auf Johannes Franken verweisen, der sehr ausführlich zu dem Thema geschrieben hat (Framealarm!).
| > ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/<user home folder>/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /<user home folder>/.ssh/id_rsa.
Your public key has been saved in /<user home folder>/.ssh/id_rsa.pub.
The key fingerprint is:
7e:9b:5e:ac:dd:59:42:62:a5:b3:ef:4d:9e:36:71:11 <benutzer>@<irgendwo>
|
Der öffentliche Schlüssel muss nun auf den Server kopiert werden.
| > scp ~/.ssh/id_rsa.pub max@<domain name of server>:~/
|
Auf dem Server muss er natürlich noch an die richtige Stelle kopiert werden. Alle Schlüssel für einen Account werden in der Datei ~/.ssh/authorized_keys hinzugefügt. Da es diese Datei noch nicht gibt, wird der eben kopierte Schlüssel einfach entsprechend umbenannt.
| $ mkdir ~/.ssh
$ mv ~/id_rsa.pub ~/.ssh/authorized_keys
|
Nun muss noch die Konfigurationsdatei für den sshd-Dienst angepasst werden. Die von mir gewählten Einstellungen verhindern dass sich root über ssh anmelden kann und dass eine Anmeldung mit Passwort erfolgen kann. Es ist danach nur noch möglich sich über das oben erstellte Schlüsselpaar anzumelden. Ich habe unten nur das notiert, was geändert wurde bzw. auf was geachtet werden sollte.
| § vim /etc/ssh/ssh_config
# Change to yes to enable built-in password authentication.
PasswordAuthentication no
PermitEmptyPasswords no
# Change to no to disable PAM authentication
ChallengeResponseAuthentication no
# user account restriction
PermitRootLogin no
AllowUsers max
|
Der sshd-Daemon muss natürlich noch neu gestartet werden, damit alles funktioniert:
sshguard
Zum Thema ssh gehört auch das Auswerten der Logfiles um eventuelle Angreifer zu blockieren. Ich dachte nicht, dass es bei meinem Server so schnell geht, bis die ersten Versuche erfolgten, aber da hatte ich mich getäuscht. Daher habe ich sshguard installiert, das Log-Files automatisch nach Einbruchsversuchen absucht und entsprechende IP-Adressen mit der in FreeBSD 'eingebauten' Firewall pf blockiert. Die Konfiguration der Dienste die zusammenspielen müssen habe ich aus der sshguard-Dokumentation übernommen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | § pkg_add -r sshguard-pf
§ vi /etc/syslog.conf
[…]
# may want to use only tabs as field separators here.
# Consult the syslog.conf(5) manpage.
auth.info;authpriv.info |exec /usr/local/sbin/sshguard
*.err;kern.warning;auth.notice;mail.crit /dev/console
[…]
§ /etc/rc.d/syslogd restart
§ vi /etc/pf.conf
# interfaces
ext_if = "re0"
# config tables
table <sshguard> persist
[…]
# sshguard filters
block in quick on $ext_if proto tcp from <sshguard> to any port ssh label "ssh brute"
§ pfctl -F all -f /etc/pf.conf
§ vi /etc/rc.conf
# enabling services
sshd_enable="YES"
sshguard_enable="YES"
pf_enable="YES"
pf_rules="/etc/pf.conf"
|
Zusammenfassung
Was wurde erreicht:
- Es gibt nur einen Benutzer
max, mit dem man sich über ssh auf dem Server anmelden kann.
- Die Anmeldung kann nur mit ssh-Keys erfolgen
- Der Benutzer
max kann fast nichts wichtiges auf dem Server machen, außer Befehle über sudo als root ausführen und dafür wird sein Passwort benötigt.
- Wenn versucht wird mit 'Brute-Force'-Angriffen auf
ssh Zugang zum Server zu erhalten werden entsprechende IPs geblockt.
Teil 1 - Benutzer und ssh |
Teil 2 - systools |
Teil 3 - jails |
Teil 4 - Webserver