Rollback Debian Upgrade

A single Debian upgrade (apt-get upgrade) can be rolled back with the following command. The upgrade is identified by its date and time, which has to be looked up from /var/log/apt/history.log first.

grep -A 2 'Start-Date: 2016-06-26  17:38:49' /var/log/apt/history.log | tail -1 | sed -r -e "s/Upgrade: //" -e "s/([^:]+):amd64 \(([^,]+), [^,]+\),?/\1=\2/g" | xargs apt-get install

Improved logwatch html output

The tables, colors and fonts of the default logwatch html mails looks terrible in Mail.app. Here’s how to patch your `/usr/share/logwatch/default.conf/html/header.html`:

--- header.html    2013-06-30 14:45:00.000000000 +0200
+++ header.html 2013-06-30 15:00:00.000000000 +0200
@@ -5,10 +5,12 @@
 <meta name="generator" content="Logwatch  $Version ( $VDate )">
 <style type="text/css">
   h1 {color: gray; border-bottom: 3px double silver; font-family: sans-serif; }
-  h2 {color: white; border-bottom: 1px solid silver; font-family: sans-serif; }
-  h3 {color: white; border-bottom: 1px solid silver; font-family: sans-serif; }
-  th {background: #6D88AD; text-align: left; font-family: sans-serif; }
-  td {background: #EFEFEF; text-align: left; font-family: courier,serif; font-size: 10px; }
+  h2 {border-bottom: 1px solid silver; font-family: sans-serif; }
+  h3 {border-bottom: 1px solid silver; font-family: sans-serif; }
+  table {border-collapse: collapse; }
+  table,th, td {border: 1px solid white; }
+  th {background: #F8F8F8; text-align: left; font-family: sans-serif; }
+  td {background: #F8F8F8; text-align: left; font-family: courier,serif; }
   li { font-family: sans-serif; }
   .ref {padding-left: 1%; }
   .service {padding-left: 1%; }

Much better!

After my spam filter has been inactive for…

After my spam filter has been inactive for more than two weeks, I finally had the pleasure to investigate what went wrong during the upgrade of my system to Debian Wheezy. Back then I took the conservative approach and kept my old configs when in doubt, especially when they were personalized to my tastes. Unfortunately DSPAM wasn’t so nice as to pass Exim any meaningful error message.

Long story short, the DSPAM package changed the location of its storage drivers. Inserting „x86_64-linux-gnu“ in the StorageDriver entry in dspam.conf solved the problem. Wouldn’t this be the first thing to look for when reading „transport returned 1 from command: /usr/bin/dspam“ in the mainlog?!

Einrichtung eines sicheren Fileservers

Theorie

Bei diesem Titel versteht es sich vielleicht von selbst, dass FTP hier kein Thema ist. Es ist vermutlich zu einem nicht unwesentlichen Teil persönliche Präferenz, aber wenn ich das Wort sicher im Zusammenhang mit Servern verwende, verlasse ich mich immer gern auf SSH. Im Fall eines Fileservers bietet sich also das SFTP Protokoll an. Generell wirft die Verwendung von SSH und, im Speziellen, die Weitergabe von Zugangsdaten für einen SSH Server (zumindest) zwei brennende Fragen auf.

Zum einen muss verhindert werden, dass der eingeloggte Benutzer beliebigen Code ausführen kann. Da er zumindest für das Upload Verzeichnis Schreibrechte hat, kann ein eventueller Upload von Exploits nicht prinzipiell verhindert werden, aber wenn man dem Benutzer erst gar keine Shell gibt, kann er die Ausführung des Schadcodes nicht veranlassen. Diese Strategie verfolgt die scponly Software.

Zum anderen ist man als Administator auch interessiert, dem eingeloggten Benutzer möglichst wenig Information über das System preiszugeben. Das erreicht man mit einer chroot Umgebung. Nun wird sogar von scponly ein Skript angeboten, um eine solche Umgebung zu erstellen. Dessen Verwendung wird auf der ubuntuusers Wiki beschrieben. Leider ist dafür das Setzen des SUID Bits notwendig, was meiner Meinung nach keine saubere Lösung ist. Daher werde ich hier beschreiben, wie man eine äquivalente Umgebung mit dem makejail Skript erstellt. Diese Vorgehensweise orientiert sich stark an der Anleitung zum Absichern von Debian, welche in ihrer Gesamtheit auf jeden Fall eine Lektüre wert ist, wenn man einen Debian Server administrieren muss.

Praxis

Diese Anleitung bezieht sich auf Debian Lenny. Zuerst werden die erforderlichen Pakete installiert:

# aptitude install libpam-chroot makejail scponly

Nun wird das eben installierte PAM Modul libpam-chroot für SSH Logins aktiviert. Dazu werden die folgenden Zeilen zu der Datei /etc/pam.d/sshd hinzugefügt:

session    required     pam_chroot.so

Zunächst muss der entsprechende Benutzer erstellt werden, mit dem man sich später am Server anmelden kann.

# adduser --home /home/sftp --shell /usr/bin/scponly --no-create-home sftp

Damit das PAM Modul auch wirklich greift, muss es für den neuen Benutzer aktiviert werden. Das geschieht durch folgende Zeile in der Datei /etc/security/chroot.conf.

sftp	/var/chroot/users/sftp

Als nächstes wird das Verzeichnis für die chroot Umgebung erstellt und der neue Benutzer erhält Schreibrechte für sein Heimatverzeichnis.

# mkdir -p /var/chroot/users/sftp/home/sftp
# chown sftp:sftp /var/chroot/users/sftp/home/sftp

Für die Verwendung des makejail Skripts wird eine Konfigurationsdatei mit folgendem Inhalt erstellt und als sftp-jail.py gespeichert.

chroot="/var/chroot/users/sftp"
users=["sftp"]
testCommandsInsideJail=["scponly", "ls", "scp", "rm", "ln", "mv", "chmod", "chown", "chgrp", "mkdir", "rmdir", "pwd", "groups", "id", "echo", "passwd"]
forceCopy=["/usr/lib/sftp-server"]
cleanJailFirst=1
preserve=["/home/sftp"]

Es folgt der Aufruf des Skripts.

# makejail sftp-jail.py

Die am Ende ausgegebenen Warnungen können getrost ignoriert werden. Wenn man so vorsichtig ist wie ich, muss man noch dafür sorgen, dass der SSH Login für den neuen Benutzer freigegeben wird. Dazu fügt man den neuen Benutzernamen dem AllowUsers Parameter in der Datei /etc/ssh/sshd_config hinzu und startet das SSH Service neu.

# /etc/init.d/ssh restart