Distracted Thoughts

 

Vertraut uns doch einfach

Die Politik fordert immer wieder im Rahmen der Skandale um PRISM und co. dem Rechtsstaat, der Demokratie und den Geheimdiensten zu vertrauen. Warum sich das Vertrauen bei mir nicht so richtig einstellt, haben die NachDenkSeiten gut auf den Punkt gebracht:

Nicht minder erschreckend ist, dass es unter den ganzen vermutlich zehntausenden Menschen, die in diesem aberwitzigen Überwachungsapparat tätig sind, bisher nur eine einzige Person – Edward Snowden – gab, die über so viel moralische Aufrichtigkeit verfügte, den gesamten Komplex öffentlich zu machen.

Mit der Nachricht, dass die Sendung "Space Night" im Bayerischer Rundfunk wegen zu hoher GEMA Gebühren eingestellt wird, hat sich die die GEMA wieder ein Stück unbeliebter gemacht. Die seit 1994 ausgestrahlte Sendung ist einfach popkultureller Kult.

Aber auch dem BR muss man die Frage stellen, warum sie nach der Gebührenerhöhung nicht auf (gema)freie Musik umsteigen. In jedem Fall, in dem offiziell rein wirtschaftliche Gründe eine Rolle spielen, gibt es zwei Parteien: jene, die zu viel verlangen, und welche, die nicht bereit sind mehr zu zahlen.

Was mich in diesem Fall etwas wunder ist, dass der BR keinen GEMA-Pauschalvertrag hat.

FreeBSD Setup - IPv6

Nachdem mein Server jetzt ein halbes Jahr problemlos läuft und ich auch wieder ein bisschen mehr Zeit und Muse hatte, wollte ich die IPv6 Erreichbarkeit angehen.

Also zuerst mal bei meinem Hoster IPv6-Adressen "beantragt" – zwei Clicks und gut ist. Die Infos die ich bekommen habe waren: IPv6-Range: 2a01:4f8:d15:2644::/64, Gateway: 2a01:4f8:d15:2644::1 Woohoo. einen /64 Range. Wooohooo! Aber was soll ich mit 2^64 Adressen anfangen? Egal.

FreeBSD itself

Am Anfang steht natürlich das Eintragen der Adresse(n) in der Serverkonfiguration selbst. Für meinen Hoster gibt es da etliche Anleitungen im Netz, da er eine etwas andere Routing-Konfiguration benutzt – aber nur bei Dedicated Servern. Hat ein bisschen gedauert, bis ich verstanden habe, dass es bei meinem Virtuellen Server nicht so ist. Zudem haben sich die Parameter zwischen FreeBSD 8 und 9 geändert. Aber eigentlich ist alles gaaaanz einfach:

1
2
3
4
5
6
7
8
§ vim /etc/rc.conf
  …
  # setup of network interfaces - IPv6
  ipv6_network_interfaces="re0"
  ifconfig_re0_ipv6="inet6 2a01:4f8:d15:2644::2 prefixlen 64"
  ipv6_defaultrouter="2a01:4f8:d15:2644::1"
  ip6addrctl_policy="ipv6_prefer"
  …

Ich habe als IP-Adresse die ::2 gewählt, da die 1 durch das Gateway belegt ist.

FreeBSD jails

Zur Konfiguration der Jail-IP-Adressen mussten auch einfach nur die entsprechenden Konfigurationsdateien angepasst werden. Da mein Server die ::2 belegt, habe ich mich dafür entschieden, die Jail-IPs mit ::201, ::202, etc. zu vergeben.

1
2
3
4
5
§ vim /etc/usr/local/ezjail/wwwexport jail_www_ip="10.1.1.2,2a01:4f8:d15:2644::201"
  …
§ ezjail-admin restart wwww

Auf was man dabei besonders achten sollte, ist dass nach dem Komma kein leerzeichen erfolgt. Über jls -v kann man kontrollieren, ob die Adresse entsprechend übernommen wurde.

Obwohl die IPv6 übernommen wurde konnte ich diese nicht anpingen. Ich dachte mir schon, dass es damit zusammenhängt, dass ich dem FreeBSD noch klarmachen musste, dass auch die ::201 auf dem Server – wenn auch im Jail – läuft. Dass es nicht wie bei den v4-Adressen über ein privates Netz mit NAT läuft ist eigentlich auch klar. Es reichte einen einfachen Alias einzutragen.

1
2
3
4
5
6
§ vim /etc/rc.conf
  …
  # setup jail ip addresses
  ifconfig_lo1_alias0="inet 10.1.1.2 netmask 255.255.255.255"
  ifconfig_re0_alias0="inet6 2a01:4f8:d15:2644::201 prefixlen 128"
  …

Im gegensatz zu IPv4 ist es jedoch kein Alias für das Loopbackinterface sondern ein Alias für das eigentliche Netzwerkinterface.

Nginx im Jail

Nun muss man noch nginx dazu bringen, auch auf IPv6-Verbindungen zu reagieren. Im Netz wurde mehrfach erwähnt, dass man anstatt listen 80; einfach listen [::]:80; verwenden soll und alles wird gut. Das hat bei mir nur teilweise funktioniert. Ich musste beide Versionen eintragen, einmal für IPv4 und für IPv6.

AAAA

Was noch zu tun blieb, war die Einträge im DNS-Server zu ändern. Dazu waren drei Eintragungen nötig: freebsd.holgerfrey.de auf 2a01:4f8:d15:2644::2, holgerfrey.de und *.holgerfey.de auf 2a01:4f8:d15:2644::201, den www Jail. Mit der Zuordnung der Jail-IPv6 auf holgerfrey.de bin ich noch nicht so glücklich, aber mal sehen, was ob ich da noch was ändere.

Manchmal findet man Dokumente im Netz, bei denen man das Gefühl hat, dass es schade wäre wenn sie verschwinden würden. Daher habe ich mit einer kleinen Liste mit Privatkopien angefangen.

Besser als Fefe kann ich es auch nicht:

Das Wahlrechts-Fiasko hat einen neuen Höhepunkt erreicht. Wir erinnern uns: Das Wahlrecht ist nicht grundgesetzkonform, weil es die CDU bevorzugt. Die CDU tut natürlich genau nichts dagegen, im Gegenteil. Das landet vor dem Verfassungsgericht, die sagen es ist verfassungswidrig, nichts passiert. Also setzt das Gericht eine Frist, und die CDU reagiert mit Salamitaktik, spielt auf Zeit. Und jetzt? Festhalten, das ist selbst für CDU-Verhältnisse auffallend kriminell: CDU im Bundestag will dem Verfassungsgericht per Grundgesetzänderung die Kompetenz für das Wahlrecht wegnehmen. Was zur HÖLLE glauben die eigentlich, wer sie sind!? Wieso sitzen die im Parlament und nicht im Knast?

Holgi redet seeeehr ausführlich (4:30) mit Steffen – seinem selbsternannten Hausökonom – über die Euro-Schulden-Staats-Wirtschaftskrise. Unbedingt anhören!

Tim Pritlove könnte das eigentlich als Fremd-CRE bei sich mit aufnehmen :-)

Habe so eben die Installation von OS X 10.8 Mountain Lion abgeschlossen. Lief (fast) einwandfrei, musste nur zuvor FileVault deaktivieren :-)

Über das IOC und sein Kontrollwahn war in den letzten Wochen etliches in der Presse zu lesen. So wollen sie zum Beispiel verbieten, Links auf die Website der Olympischen Spiele zu setzen, die diese in einem negativen Licht erscheinen lassen könnten.

Um dem ganzen mit entsprechenden Mitteln zu begegnen, gibt es nun “offizielle” Proteste, zu denen man sich anmelden kann. Und natürlich sind anderen Demonstrationen verboten :-)

FreeBSD Setup - Teil 4 - Webserver


Teil 1 - Benutzer und ssh | Teil 2 - systools | Teil 3 - jails | Teil 4 - Webserver


Nachdem im letzten Teil ein Jail für einen Webserver eingerichtet wurde sollte dieser natürlich auch installiert werden.

sshd mal wieder

Ein paar Sicherheitsvorkehrungen sollten natürlich auch getroffen werden. So ist es eine hervorragende Idee, das Rootpasswort des Jails zu einzurichten. Zudem wurde eine SSH-Weiterleitung eingerichtet die auf der Seite des Jails noch nicht konfiguriert ist. Wie zuvor beim Hauptsystem wird auch hier das Anmelden per Passwort und der root-Zugang abgeschaltet.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
§ ezjail-admin console www
www§ passwd
     Changing local password for root
     New Password:
     Retype new password:

www§ 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

www§ vim /etc/rc.conf
     []
     sshd_enable="YES"

nginx als Webserver

Als Webserver habe ich mich für nginx entschieden. Gegenüber dem Klassiker apache ist er ressourcenschonender und meiner Ansicht nach besser zu konfigurieren. Nachteilig ist jedoch, dass man nicht wie bei apache Module einfach nachladen kann, sonder sie müssen einkompiliert werden. Ich habe wahrscheinlich viel mehr eingebaut, als ich benötige – aber ich will ja auch ein bisschen "rumspielen". Die Liste unten gibt an, was ich alles ausgewählt habe.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
www§ cd /usr/ports/www/nginx
www§ make
     IPV6
     HTTP
     HTTP_GZIP_STATIC
     HTTP_IMAGE_FILTER
     HTTP_REAL_IP
     HTTP_REWRITE
     HTTP_SSL
     HTTP_STATUS
     HTTP_AUTH_DIGEST
     WWW
     HTTP_PUSH
     HTTP_UPLOAD
     HTTP_UPLOAD_PROGRESS
     CHUNKIN
     HTTP_MP4
     HTTP_MP4_H264
www§ make install
www§ make clean

Auch für andere verwendete Pakete die mitinstalliert werden, gibt es etliche Konfigurationsabfragen. Einfach nach eigenem Gusto auswählen.

Damit nginx läuft, muss man noch ein paar Vorbereitungen treffen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
www§ mkdir -p /var/tmp/nginx/client_body_temp
www§ vim /etc/rc.conf
     []
     sshd_enable="YES"
     nginx_enable="YES"

www§ vim /etc/newsyslog.conf
     []
     /var/log/nginx-access.log    644    7    100  *    JC    /var/run/nginx.pid
     /var/log/nginx-error.log     644    7    100  *    JC    /var/run/nginx.pid

www§ vim /usr/local/etc/nginx/nginx.conf
     []

Ausprobiert habe ich das ganze von außerhalb des Jails:

1
2
www§ exit
§ ezjail-admin restart www

Nun müsste der Webserver eine Standardseite zeigen, wenn man die Domain aufruft.

Git

Wie ich schon beim Einrichten des Jails geschrieben habe, möchte ich git verwenden um bestimmte Websiten auf dem aktuellen Stand zu halten. Daher benötige ich für git einen Benutzer mit ssh-Zugang im Jail. Der Benutzer wird gleich noch der Gruppe "www" hinzugefügt. Dadurch kann er in für den Webserver freigegebenen Ordner schreiben bzw. Dateien ändern.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
§ ezjail-admin console www
www§ adduser
     Username: gitwwwuser
     Full name: Git User Example
     Uid (Leave empty for default): 
     Login group [gitwwwuser]: 
     Login group is gitwwwuser. Invite gitwig into other groups? []: www
     Login class [default]: 
     Shell (sh csh tcsh git-shell nologin) [sh]: 
     Home directory [/home/gitwwwuser]: 
     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]: 
     []

www§ vim /etc/ssh/ssh_config
     AllowUsers gitwwwuser

www§ /etc/rc.d/sshd reload
www§ exit

Da auch hier eine Anmeldung über einen ssh-Key erfolgen soll, muss dieser natürlich auf den Server kopiert werden und im Jail an der richtigen Stelle untergebracht werden.

1
2
> ssh-keygen -t rss -f gitwwwkey
> scp gitwwwkey.pub max@<domain name of server>:~/

Um den Schlüssel im Jail an die richtige Stelle zu bekommen wird der Jail gestoppt, der SSH-Key kopiert und anschließend im erneut gestarteten Jail die rechte für den Key angepasst

1
2
3
4
5
6
7
§ ezjail-admin stop www
§ mkdir /usr/jails/www/home/gitwwwuser/.ssh
§ mv /home/max/gitwwwkey.pub /usr/jails/www/home/gitwwwuser/.ssh/authorized_keys
§ ezjail-admin start www
§ ezjail-admin console www
§ cd /home/gitwwwuser/
§ chown -R gitwwwuser .ssh

Das Anmelden im Jail vom lokalen Rechner aus sollte jetzt mit ssh -p 2222 gitwwwuser@<domain name of server> sollte funktionieren.

Zusammenfassung

  1. SSH-Zugang des Jails wurde abgesichert
  2. Webserver nginx installiert und konfiguriert
  3. einen Benutzer inklusive ssh-Anmeldung im Jail angelegt

Teil 1 - Benutzer und ssh | Teil 2 - systools | Teil 3 - jails | Teil 4 - Webserver

FreeBSD Setup - Teil 3 - Jails


Teil 1 - Benutzer und ssh | Teil 2 - systools | Teil 3 - jails | Teil 4 - Webserver


Einer der Gründe, warum ich mich für FreeBSD entschieden habe ist das Konzept der Jails. Ein Jails ist eine Art von Virtualisierung, d.h. dass innerhalb der eigentlichen FreeBSD-Installation ein oder mehrere Prozesse laufen, die wiederum FreeBSD ausführen. Stimmt so nicht genau, ist aber anschaulich.

Der Vorteil dabei ist, dass Programme in diesen Jails – wie zum Beispiel ein Webserver – kein Zugriff auf das eigentliche Basissystem haben. Falls es also jemandem gelingen sollte in einem Jail "einzubrechen", so ist zwar dieser kompormitiert aber andere Jails und das Basissystem ist nicht betroffen.

Für das ganze Jails benutze ich ezjail was mir die Verwendung von sogenannten Appjails einfacher macht.

Aber zuerst einmal müssen wir ein paar Vorbereitungen treffen:

Routing

Jedem Jail muss eine eigene IP-Adress zugeteilt werden. Leider sind IPv4-Adressen knapp und die meisten Benutzer noch nicht auf IPv6 umgestiegen. Da ich auch noch keine einfache Möglichkeit gefunden habe IPv6 auszuprobieren, lasse ich diese Konfiguration einfach mal unter den Tisch fallen. Ich habe nur eine öffentliche IP-Adresse und werde daher für die Jails ein serverinternes privates Netzwerk mit NAT konfigurieren.

Um dieses aufzubauen, muss zuerst dem Loopback-Interface einige IP-Adressen zugewiesen werden.

1
2
3
4
5
6
7
8
9
§ vim /etc/rc.conf
  # setup of network interfaces
  []
  # Setup interface all jails will use
  # Make sure this netmask is unique in your rc.conf
  cloned_interfaces="lo1"
  ifconfig_lo1="inet 10.1.1.1 netmask 255.255.255.0"
  # setup jail ip addresses, for every jail one address
  ifconfig_lo1_alias0="inet 10.1.1.2 netmask 255.255.255.255"

Danach muss noch pf das entsprechende Routing mitgeteilt werden. Ich poste hier mal die komplette Datei, da auch die Positionierung der Regeln für sshguard eine Rolle spielt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
§ vim /etc/pf.conf
  # INTERFACES
  ext_if = "re0"
  int_if = "lo1"
  # config tables 
  table <sshguard> persist
  # jail definitions
  jailnet = $int_if:network
  jail_www_ip  = "10.1.1.2"
  jail_www_tcp = "{80, 443}"
  # NAT
  nat on $ext_if from $jailnet to any -> ($ext_if)
  # redirects to jails
  rdr pass on $ext_if inet proto tcp to port $jail_httpd_tcp -> $jail_httpd_ip
  rdr pass on $ext_if inet proto tcp to port 2222 -> $jail_httpd_ip port 22
  # sshguard filters
  block in quick on $ext_if proto tcp from <sshguard> to any port ssh label "ssh brute"

§ /etc/rc.d/pf restart

Interessant für die Jails ist zum einen die NAT-Regel, die besagt dass ausgehender Verkehr aus den Jails auch nach Außen gelangt, und zum anderen die Redirects (rdr). Ich versuche mal die erste Regel zu übersetzen: Leite eingehenden IPv4-Verkehr auf der Netzwerkkarte der auf den TCP-Ports 80 und 443 angkommt an das Jail mit der IP 10.1.1.2 weiter. Die zweite Regel leitet einkommenden Verkehr auf Port 2222 an das Jail auf Port 22 (für ssh) weiter, da ich in diesem Jail auch mehrere git-Repositories verwenden will und zu diesen Zugang benötige.

Geschmacksrichtungen

Bei ezjails gibt es sogenannte 'flavours'. Dabei handelt es sicht um eine Art Vorlagen, in die man Konfigurationen und Programme vorbereiten kann, die man für mehrere Jails immer wieder benötigt. Nachdem ich ezjails selbst installiert habe, werde ich ein Flavour erstellen, in dem schon mal vim, portaudit und portmaster für die Installation notiert sind. Hilfe kam dabei von hier und hier.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
§ pkg_add -r ezjail
§ ezjail-admin update -b -p

§ cp -r /usr/jails/flavours/example /usr/jails/flavours/default

§ cd default/
§ cp /etc/resolv.conf etc/resolv.conf
§ cp -r /usr/local/etc/ssmtp usr/local/etc/
§ mkdir etc/mail
§ cp /etc/mail/mailer.conf etc/mail/
§ mv etc/rc.d/ezjail.flavour.example etc/rc.d/ezjail.flavour.default 
§ vim etc/rc.d/ezjail.flavour.default 
  name=ezjail.flavour.default
  pkg_add -r vim-lite
  pkg_add -r portmaster
  pkg_add -r portaudit

§ cd ~

Erstellen eines Jails

Jetzt kann endlich ein Jail namens "www" erstellt und gestartet werden. In diesem soll später ein Webserver laufen.

1
2
§ ezjail-admin create -f default www 10.1.1.2
§ ezjail-admin start www

Eines bleibt noch zu tun. Nach einem Systemstart sollten natürlich auch die Jails automatisch starten.

1
2
3
4
§ vim /etc/rc.conf
  # enabling services
  []
  ezjail_enable="YES"

Zusammenfassung

  1. Ein lokales IPv4 Netzwerk für die Jails wurde konfiguriert
  2. Es wurde ein Flavour erstellt, in dem schon Standardsoftware und Einstellungen vorbereitet sind
  3. Es wurde ein Jail erstellt, in dem später ein Webserver laufen soll.

Teil 1 - Benutzer und ssh | Teil 2 - systools | Teil 3 - jails | Teil 4 - Webserver

FreeBSD Setup - Teil 2 - Systools


Teil 1 - Benutzer und ssh | Teil 2 - systools | Teil 3 - jails | Teil 4 - Webserver


Editoren

Texteditoren unter Unix gibt es wie Sand am Meer. Ich möchte hier nicht auf Vor- und Nachteile eingehen oder gar einen Glaubenskrieg starten. Ich benutze vim und die Installation ist recht einfach.

1
§ pkg_add -r vim-lite

Ich habe das Paket vim-lite gewählt, da es vim als reines Konsolenprogramm installiert und auf weitere Pakete für graphische Oberflächen verzichtet.

Ports und Basisquellen

Bisher habe ich fertige vorinstallierte Quellen, sogenannte Packages installiert. Das geht schnell und einfach, hat aber ein paar Nachteile gegenüber der eigenen Kompilierung direkt aus dem Quellcode: Updates kommen oft später, bestimmte Optionen können nicht gesetzt werden, etc. Die Software rund um FreeBSD baut halt auf Ports auf und Packages ist nur was für Standardsoftware und faule :-).

Ich musste auch feststellen, dass bei der Installation von meinem Provider keine Ports und Basisquellen installiert. Ist verständlich, denn meistens reichen Packages aber spätestens wenn man Jails verwenden will braucht man diese.

Also zuerst mal den Portstree installieren:

1
2
§ portsnap fetch
§ portsnap install

Und danach die Basisquellen. Das ist ein bisschen aufwendiger, aber nicht schwierig:

1
2
3
4
5
§ cp /usr/share/examples/cvsup/standard-supfile /root/supfile
§ vim /root/supfile
  *default host=cvsup.de.FreeBSD.org
§ cd /usr/src
§ csup /root/supfile

Fast schon automatische Updates

Um herauszufinden, für welche Software neue Updates bereit stehen und das einfache Aktualisieren braucht man noch zwei kleine Programme:

1
2
§ pkg_add -r portaudit
§ pkg_add -r portmaster

Durch aufrufen des Befehls portaudit wird die installierte Software auf Aktualisierungen überprüft und mit portmaster -a werden alle aktualisiert.

Emails versenden

Ich habe keine Lust einen eigenen Mailserver mit allem Drum und Dran wie IMAP, Spamfilter, etc. zu betreiben. Da gebe ich meinem Provider lieber noch ein paar Euro mehr und der macht das für mich. Was ich jedoch haben will ist, dass ich Emails vom Server aus versenden kann – zum Beispiel für die Reports der täglichen Wartungsskripte.

Da ich nicht der Erste bin, der so was will gibt es das natürlich schon: ssmtp. Ist einfach zu installieren und zu konfigurieren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
§ pkg_add ssmtp
§ vim  /usr/local/etc/ssmtp/ssmtp.conf
  # The person who gets all mail for userids < 1000
  # Make this empty to disable rewriting.
  root=<emailadresse des Absenders>   
  # mailhub=mail
  mailhub=<server des mail providers>:<port>
  # Where will the mail seem to come from?
  rewriteDomain=<meine domain>
  # The full hostname
  hostname=_HOSTNAME_
  # Set this to never rewrite the "From:" line (unless not given) and to
  # use that address in the "from line" of the envelope.
  FromLineOverride=YES
  # Use SSL/TLS to send secure messages to server.
  UseTLS=YES
  # Username and Password  
  AuthUser=<email relay user>
  AuthPass=<email relay password>

§ vim /usr/local/etc/ssmtp/revaliases
  root:<emailadresse des Absenders>:<server des mail providers>

Nur das ausschalten des Standard-MTAs hat mich ein bisschen Recherche gekostet.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
§ vim /etc/rc.conf
  sendmail_enable="NO"
  sendmail_submit_enable="NO"
  sendmail_outbound_enable="NO"
  sendmail_msp_queue_enable="NO"

§ vim /etc/mail/mailer.conf
  sendmail    /usr/local/sbin/ssmtp
  send-mail   /usr/local/sbin/ssmtp
  mailq       /usr/local/sbin/ssmtp
  newaliases  /usr/local/sbin/ssmtp
  hoststat    /usr/bin/true
  purgestat   /usr/bin/true

Ob eine Mail versendet wird kann man z.B. mit dem Befehl mail -s "Betreffszeile" foo@example.com.

Zusammenfassung

  1. Der lieblings Texteditor wurde eingerichtet
  2. Auf Softwareupdates kann einfacher überprüft bzw. diese installiert werden
  3. Die Quellen für das Basissystem sind vorhanden, wird spätestens für Jails benötigt
  4. Emails können über einen Mail-Provider versendet werden ohne dass ein richtiger MTA läuft.

Teil 1 - Benutzer und ssh | Teil 2 - systools | Teil 3 - jails | Teil 4 - Webserver

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:

1
2
3
4
§ 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.

1
2
§ 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.

1
%sudo ALL=(ALL) ALL

Da es die Benutzegruppe sudo noch nicht gibt, muss sie erstellt werden und der Benutzer max hinzugefügt werden.

1
2
§ 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!).

1
2
3
4
5
6
7
8
9
> 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.

1
> 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.

1
2
$ 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.

1
2
3
4
5
6
7
8
9
§ 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:

1
§ /etc/rc.d/sshd reload

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:

  1. Es gibt nur einen Benutzer max, mit dem man sich über ssh auf dem Server anmelden kann.
  2. Die Anmeldung kann nur mit ssh-Keys erfolgen
  3. 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.
  4. 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

Da ich den vorherigen Post lesen kann und diesen auch, hat es wohl funktioniert.

So, der erste Versuch, ob die Inboxfunktion von gitwig funktioniert.

Es ist geschafft. Der Source dieses kleinen Blog gibt es mit einer – aller Wahrscheinlichkeit nach unvollständigen und zu kurz geratenen – Anleitung auf github.

So, die Betrollung für die Internet Explorerbenutzer funktioniert. Wer diesen *Kraftausdruck* Browser benutzt bekommt die Seite in Comic Sans angezeigt, zusammen mit einem netten Hinweis.

Und da IE6 noch kein HTML5 kann, funktioniert das Layout auch nicht :-)

So, diese is der erste Post hier. Ich hoffe demnächst kommt mehr :-)