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

WebDAV on Windows Vista & Windows 7

There are quite a number of tales of woe around that topic. I had to find that out when I experienced some trouble myself today. If you’re in the same situation skip right down to the last two lines of this posting, the stuff in between just details the problem to associate the solution to the problem for the search engines.

My intention was to connect to my freshly set up  WebDAV directory served by Apache. The setup on the server side was quite tedious as well, but as expected, there are countless howtos around and one just has to put the pieces together as usual. The real problem however arose, when I starry-eyed tried to connect to that online directory using Vista’s “Map Network Drive …” dialog. After some steps into the wizard that always gave me the error popup saying “The folder you entered does not appear to be valid”.

Well that soon let me drop to the beloved command line. But using net use W: https://example.com/davroot was answered by “System error 67 has occurred” and “The network name cannot be found”. Using net use W: \\example.com@SSL\davroot gave no improvement.

I will spare you my other trials and all the different possible solutions that can be found on the net (I even installed a Microsoft patch which didn’t change anything) and write down straight what solved the problem:

  1. Make sure the “WebClient” service is running! (Type “services.msc” into the search box in the start menu and hit enter.  Scroll down the WebClient and check.)
  2. Use “\\yourserver@SSL\DavWWWRoot\yourshare” as the server address in the Folder field of the Map Network Drive dialog box. Do not forget the DavWWWRoot or the @SSL.  

How-to reduce fail2ban memory usage

This morning, when I did the routinely scan of the server’s resource usage history, I noticed a suspicious network activity between 1 and 5 am. Some reading of the latest log files soon identified the traffic to have been caused by a dictionary attack on my SSH server. I took the opportunity to extend my current setup for the script-kiddie enemy called fail2ban. This program monitors potentially any service’s log file for failed login attempts and if their number exceeds a certain limit, it blocks the issuing host using iptables rules.

Unfortunately the first start of the new service turned out to blow up the memory usage by about 100 MB which is unacceptable regarding the tight resources of my virtual private server. As I found out, others had similar experience and switched to DenyHosts due to this issue. My experience with setting up Trac two weeks ago taught me that a Python application (like fain2ban) might consume a lot of memory only because of the relatively oversized default stack size on Linux.

The means to reduce the default stack size in Linux are widely known to be the limits.conf file and the ulimit command. But how to use those two in my situation? The solution turns out to be a one-liner on Debian Lenny: All I had to do was to append the ulimit command to my /etc/default/fail2ban file.

This is the changed /etc/default/fail2ban file:

# This file is part of Fail2Ban.
#
# Fail2Ban is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# Fail2Ban is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Fail2Ban; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# Author: Cyril Jaquier
#
# $Revision: 1.2 $
 
# Command line options for Fail2Ban. Refer to "fail2ban-client -h" for
# valid options.
 
FAIL2BAN_OPTS=""
 
ulimit -s 256

Using this sets the default stack size for the Python instances running fail2ban to 256 KB and lowers the memory consumption of fail2ban approximately by a factor of 10.

Erklärung zur Schlagwortwolke

Neben den klassischen Navigationsmethoden auf dieser Website, wie die Selektierung einer Kategorie oder eines Zeitraumes im Archiv, gibt es, wie kaum zu übersehen ist, auch eine etwas neuartigere Möglichkeit. Die Tagcloud oder auf Deutsch Schlagwortwolke vermittelt auf einen Blick, welche Informationen auf dieser Website zu finden sind und wo die Schwerpunkte liegen.

Damit das Prinzip funktioniert, habe ich begonnen, den neueren Artikeln Schlagworte zuzuweisen. Im Gegensatz zu Stichworten, welche sich auf den Titel beziehen, geben Schlagworte in kürzester Form den Inhalt eines Artikels wieder. Sobald eine Mindestanzahl von Artikeln mit Schalgworten markiert wurde, kommen natürlich in Summe manche Schlagworte öfter vor als andere. Dieser Unterschied wird in der Schlagwortwolke durch das Schriftbild des Schlagwortes dargestellt. Häufiger vorkommende Schlagworte sind auffälliger dargestellt als selten vorkommende. 

In diesem frühen Stadium der Website ist der Vorteil dieser Navigationsmöglichkeit leider noch nicht offensichtlich. Das wird sich aber bei einer größeren Anzahl von Artikeln ändern. Um dann eine effiziente Navigation mittels der Kategorien zu erreichen, müsste ich eine gutüberlegte Hierarchie einführen und regelmäßig aktualisieren, wenn manche Kategorien wichtiger werden als ursprünglich angenommen. Die Schlagwortwolke aktualisiert sich sozusagen von selbst und stellt immer die gerade aktuelle Informationsverteilung auf der Website dar.

Ich hoffe, ich konnte mit dieser kurzen Erklärung die auffällige und vielleicht auf den ersten Blick störende Einrichtung mit dem irritierenden Namen rechtfertigen. Wie gesagt, vielleicht überzeugt sie ja im Lauf der Zeit. Es würde mich freuen.

Umstieg auf WordPress

Motivation

Nachdem das Design meiner Website zwiespältige Reaktionen hervorgerufen hat (Nicht alle Besucher war darüber begeistert, dass ich Ihnen gleich tief in die Augen geschaut habe.), habe ich schon vor einiger Zeit begonnen, mir über eine gänzliche Neugestaltung Gedanken zu machen. Bei dieser Gelegenheit habe ich mir auch vorgenommen, die bisherige Basis der Website, nämlich das Frog Content Management System neu zu evaluieren.

Es folgte eine längere Recherchephase, weil ich nie wirklich viel Zeit auf einmal darauf verwendet habe. In die engere Auswahl kam immer wieder Drupal. Gegenüber Joomla habe ich eine irrationale Abneigung, die ich manchmal darauf zurückführe, dass es dafür sogar an Schulen Einführungen gibt und manchmal darauf, dass es einfach irgendwie zu bunt wirkt. Gegen eine weitere Verwendung von Frog sprach die Tatsache, dass es anscheinend nur drei aktive Entwickler gab und mir die Entwicklung etwas zu verschlafen schien. So perfekt ist es dann doch noch nicht, auch wenn mich die Schlankheit und das Konzept einst überzeugen konnten.

Warum WordPress?

WordPress wurde es dann ganz einfach, weil es anscheinend für Websites und insbesondere für Blogs die erste Wahl ist. Ich kann mich nicht mehr erinnern, warum ich es früher ausgeschlossen hatte, befürchte aber, dass es von einem Emanzipationsbedürfnis hergerührt hat. Dieses Bedürfnis ist in den letzten Monaten in mir sehr zurückgegangen. Vielleicht steht damit auch im Zusammenhang, dass ich auf meinem Arbeitscomputer nun endgültig bei Windows Vista geblieben bin und es kennen und mögen gelernt habe.

Jedenfalls konnte ich keinen Grund und kein fehlendes Feature finden, das gegen WordPress gesprochen hätte. Meine Kriterien waren vor allem die Möglichkeit, konsistene statische Seiten zu erstellen und Versionierung der Artikel. Da ich mich nicht noch einmal mit Serversoftware herumschlagen wollte, musste das potentielle System auch auf der PHP/MySQL Infrastruktur laufen. Da beides keine stark einschränkenden Kriterien sind, waren die beiden “Bonuskriterien” ausschlaggebend: Ein vernünftiges Plugin für die Einbindung von Picasa Fotoalben und ein Darstellungsmotiv, das mir zusagt.

plaintxtblog

Die Wahl des Aussehens wurde diesmal von einer reduktionistischen Strategie geleitet. Geheimes Vorbild war der Blog von Mark Russinovich, einem früheren SysInternals und jetzt Microsoft Kernel Entwickler, aus dessen Interviews ich einige interessante Hintergrundinformationen zu Vista und Windows 7 erfahren habe. Tatsächlich wird das Aussehen seines Blogs natürlich von TechNet vorgegeben, aber egal. Ich fand ganz einfach, dass ich lieber weiterhin Bilder in meine Artikel aufnehme und alle anderen Fotos und Grafiken vermeiden sollte. Damit wird die Aufmerksamkeit nicht vom interessanteren, neuen Inhalt abgelenkt und man sieht nicht tausendmal dasselbe große, bald altgewordene Bild, das alles andere in den Schatten stellt und zuerst beeindruckt und später langweilt.

Belohnung

Weil ich gerade beim Thema war, gibt es jetzt zur Belohnung noch ein gerade aufgenommenes Foto von Romy, die heute schon einige intensive Knuddeleinheiten einstecken musste und den Samstag genauso genießt wie ich.

Jetzt muss ich aber doch noch hinaus aus der Wohnung, den Wochenendeinkauf erledigen und ein bisschen die Nachmittagssonne inhalieren.