Tag 19/2016: ssh-Dämon-Konfiguration mit erweiterten Regeln

In vielen Konfigurationsbeispielen für die  sshd_config, der Konfigurationsdatei für den ssh-Dämon, wird mit der AllowUsers-Direktive explizit festgelegt, mit welchen Benutzernamen (und damit Benutzern) man sich überhaupt anmelden darf. Kombiniert mit @HOST gilt der Login eines Benutzers dann sogar nur für den angegebenen Host.

AllowUsers foo bar baz@192.168.1.100

Loginversuche von Unbefugten mit dort nicht aufgeführten Benutzerkonten lassen sich damit, dank eindeutiger Fehlermeldung im Logfile, noch einfacher mit Tools wie fail2ban aufspüren.

sshd[9140]: User system from host.example.com not allowed because not listed in AllowUsers

Hat man den Login so konfiguriert, dass nur das Public-Key-Verfahren erlaubt ist und muss einem Benutzerkonto trotzdem den Login mit Passwort erlauben, kann man sich mit konditionalen Blöcken behelfen, die man mit der Match-Direktive einleitet.

An das Ende der sshd_config kann man beispielsweise ergänzen:

Match Address 192.168.1.100 User bolo
   AllowUsers bolo
   PasswordAuthentication yes

Hier werden zwei Kriterien geprüft, nämlich ob der Login von einer bestimmten IP-Adresse aus erfolgt („Address 192.168.1.100“) und ob es der zu erlaubende Benutzer ist („User bolo“). Wenn ja, wird diesem Benutzer explizit auch der Login („AllowUsers bolo“) und die Anmeldung via Passwort erlaubt („PasswordAuthentication yes“).  Die im konditionalen Block gelisteten Einstellungen überschreiben die globalen.

Genauso gut kann man also auch schreiben:

# in der "globalen" AllowUsers Liste
AllowUsers foo bar baz@192.168.1.100 bolo@192.168.1.100

PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no

Match User bolo
PasswordAuthentication yes

Tag 18/2016: Python-Repräsentation einer YAML-Datei ausgeben

Zur Zeit kodifiziere ich das Setup einiger alter Server in Ansible-Skripte. Dank Virtualisierung und Cloud ist es mittlerweile einfach, Migrationen auf neue Betriebssysteme und Versionsstände im Vorfeld durchzuspielen. Die neuen Setups profitieren auch vom Know-how aus zahlreichen anderen Ansible-Scripten, z.B. auf Github, weil man immer wieder auf nützliche Vorgehensweisen und Module stößt.

Bei den Core-Modulen copy, file, lineinfile und template setze ich nach Möglichkeit immer explizit group, owner und mode so restriktiv wie möglich – der SuSE-Paranoid-Mode bei den Dateirechten fehlt mir bei Debian/Ubuntu einfach 🙂 Ansonsten Tags setzen mindestens für Packages und Services. Und vor dem Schreiben eigener Rollen lohnt es sich immer, nach bereits erprobten und universellen Rollen Ausschau zu halten.

Zwar ist die Struktur eines YAML-Dokuments leicht zu verstehen, aber trotzdem ist manchmal ein schneller Blick auf die Python-Repräsentation hilfreich. Das kann man beispielsweise mit ein paar Zeilen Python selbst erledigen. „Tag 18/2016: Python-Repräsentation einer YAML-Datei ausgeben“ weiterlesen

Tag 10/2016: When it rains in Southern California pt. 2 and on the server

Die Fakten: Vine, Videoportal, Videos von max. 6 Sekunden Länge (Wikipedia-Background). Witziges Beispiel aus dem großen Topf. Und dazu noch ein Cloudflare-nginx-WAF-Video.

Die Fakten: Vine, Videoportal, Videos von max. 6 Sekunden Länge (Wikipedia-Background). Für den Sound im Video links oben klicken.

„Tag 10/2016: When it rains in Southern California pt. 2 and on the server“ weiterlesen

Tag 5/2016: Dovecot-Replikation funktioniert

Was hab ich die letzten Tage gelernt? Dass Dovecot-Replikation eine fantastische Sache ist. Wie überhaupt fast alles an und mit Dovecot. Das erste Ansible-Script für einen generischen Mailserver mit Postfix, Amavis und Filtern-vor-Annahme ist fertig, die Replikations-Komponente beinahe.

Das Ziel ist ein einfacher Active/Active-Cluster mit tcps:// Verbindung. Die sichere Verbindung der eigentliche Haken, der mich ein bisschen gefuchst hat: Bei der Dovecot-Version des Betriebssystem-Pakets gibt es einen Bug, bei dem der Diffie-Hellman-Parameter ssl_dh_parameters_length in diesem Zusammenhang nur mit 1024 Bit Länge gesetzt werden kann. Schade, weil guckst Du z.B. hier.

Statt eigener CA habe ich übungshalber ein Zertifikat mit den Mitteln von letsencrypt.com erstellt. Nach dem Download des Root-Zertifikats und der beiden Intermediate-Zertifikate, dem Kopieren ins zentrale ssl- Verzeichnis und einem anschließenden c_rehash wurde es anstandslos von Dovecot akzeptiert.

Good night and good luck.

Super simple mailsink with Python

If your script or app sends  mail and you’ve got no time or don’t feel like configuring a real SMTP server, use a mailsink. A debugging method that in it’s simplest form just displays the result of the SMTP conversation, namely the message.

Fire up a terminal an run this code:

python -m smtpd -n -c DebuggingServer localhost:3000

This listens on port 3000 on your localhost (127.0.0.1). If you need port 25 (the SMTP default port), just run the line with sudo and enter your password:

sudo python -m smtpd -n -c DebuggingServer localhost:25

That’s it. Enjoy.

Remember the better pull request article

A bookmark is just not enough, sometimes. And I have way to much of them anyway.

Ok. This is my flotsam & jetsam of the week:

https://developer.atlassian.com/blog/2015/01/a-better-pull-request/

The piece of cake is in the comment of Erik van Zijst:

git merge-tree `git merge-base master bob/master` master bob/master

Booting Linux on a server when filesystem is readonly

If your root server hoster loves to integrate 10 year old harddisks with a history of 89 previous customers you’ll have to cope many times with disk failures. If you launch a shutdown -r now or reboot you’ll likely see Input/output error messages and nothing more.

How to boot? You might use your IPMI interface or some kind of hosters panel. If this is not available for any reason here’s how you might be able to force booting immediately:

# echo 1 > /proc/sys/kernel/sysrq
# echo b > /proc/sysrq-trigger

This works (as root) because you can trigger the Magic_SysRq_key concept also via the proc filesystem.

Enjoy.

Module for Apache2 which takes the last IP from the ‚X-Forwarded-For‘ header

I need a memory hook for this. All the time I search for things like proxy, forward – but never for „rpaf“ (from the description: „rpaf is short for reverse proxy add forward“).

So, purely for me, this is the $!%/%%%$$$$ module:

libapache2-mod-rpaf

aptitude install libapache2-mod-rpaf

Sigh.

** Update Day 295/2016: For newer Apaches >= 2.4 the module mod_remoteip is recommended.