syslog.warten.de

Smarthost Signiert Mails Mit DKIM

Die Produktionsserver relayen alle Mails an einen zentralen Mailserver, der dann den Versand übernimmt. Zusätzlich soll der Smarthost nun alle Mails mit DKIM signieren. Ich habe mich für den dkim-milter entschieden und die Umsetzung ging dank seiner Helferlein wie dkim-genkey recht schnell und einfach.

Damit der dkim-filter für mehrere Domains signierend tätig werden kann, muss man die Schlüsselinformationen in einer Datei hinterlegen und deren Pfad mit KeyList übergeben. Die Paramater Domain, KeyFile und Selector können ausschliesslich für Ein-Domain-Lösungen verwendet werden.

Die an KeyList übergebene Datei könnte beispielsweise wie folgt aussehen. Durch Doppelpunkte getrennt werden die für die Signierung zugelassenen E-Mail-Adressen, der Domainname (die Redundanz an dieser Stelle ist auffällig häßlich und historisch bedingt) sowie der Pfad zum keyfile angebenen. Die Angabe der Endungen .private und .pem ist optional.

relay:~# cat /etc/dkim-keys.conf
*@example.de:example.de:/etc/dkim/example.de/2009
*@example.com:example.com:/etc/dkim/example.com/2009
*@example.es:example.es:/etc/dkim/example.es/2009
*@example.fr:example.fr:/etc/dkim/example.fr/2009
*@example.nl:example.nl:/etc/dkim/example.nl/2009
*@example.pl:example.pl:/etc/dkim/example.pl/2009
*@example.se:example.se:/etc/dkim/example.se/2009

Nach den notwendigen DNS-Änderungen (TXT für z.B. 2009._domainkey.example.com) funktionierte der lokale Versand wie gewünscht und mit gültiger Signatur. Allein die (wichtigen) externen Hosts wurden ignoriert. Im Logfile sieht das dann so aus:

(unknown-jobid) external host www.example.com attempted to send as example.de

Ein Blick in die man-Page konnte auch dieses Problem lösen: Die Grundeinstellung sieht nur eine Signierung von Mails von 127.0.0.1 vor. Mit dem Aufrufparameter -i kann man den Pfad einer Datei übergeben, die pro Zeile eine IP-Adresse weiterer zustellender Systeme enthält.

relay:~# cat /etc/default/dkim-filter
# Command-line options specified here will override the contents of
# /etc/dkim-filter.conf. See dkim-filter(8) for a complete list of options.
DAEMON_OPTS="-i /etc/dkim-peers.conf"
[...]
relay:~# cat /etc/dkim-peers.conf
127.0.0.1
10.17.133.217

NFS: Permission Denied Wegen Group

RPC, das von NFS für die Identifikation von Benutzern verwendet wird, kann nicht mehr als 16 Gruppen, deren Mitglied ein Benutzer ist, übermitteln. Hier hatten wir den Fall, dass eine Benutzerin plötzlich nicht mehr auf Verzeichnisse zugreifen konnte, für die sie aufgrund der Gruppenrechte Zugriff haben sollte (Permission denied). Selbstverständlich waren die GID auf NFS-Server und Client-System identisch. Sie war kürzlich einer 17. Gruppe zugeordnet worden und die für den Zugriff relevante Gruppe (sie hatte die höchste Group-ID) wurde nicht mehr an den NFS-Server übertragen.

Das war extrem schwer zu debuggen. Die Ursache wurde erst nach Stunden gefunden. Der Sachverhalt wird hier ausführlich erläutert. Die Lösung war einfach: Es wurde die Option –manage-gids beim Start von rpc.mountd hinzugefügt.

Sudo Mit SSH Auf Remote Hosts

Mit SSH lassen sich Kommandos direkt auf entfernten Rechnern ausführen. Werden für das Kommando die Rechte des Superusers benötigt (und man kann sich nicht direkt als root anmelden), kann in den meisten Fällen sudo nicht sofort helfen.

$ ssh host "sudo mycommand"
sudo: sorry, you must have a tty to run sudo

Aus Sicherheitsgründen ist bei den meisten Linux-Distributionen in der Konfiguration von sudo mit ‘requiretty’ das Vorhandensein einer Terminal-Sitzung verpflichtend, wie sie auch nach einer Anmeldung mittels SSH besteht.

# grep requiretty /etc/sudoers
Defaults    requiretty

Im Fall des mit SSH übermitteln Kommandos findet jedoch üblicherweise keine tty-Belegung statt. Forcieren kann man eine pseudo-tty allocation mit dem Parameter -t in SSH und dann funktioniert auch sudo bei der Kommandoübergabe mit SSH.

$ ssh -t hostname "sudo mycommand"

Bug: Network-Manager Speichert PPP-Einstellungen Nicht

Die aktuelle Version des network-manager (network-manager-gnome: 0.7~~svn20081020t000444-0ubuntu1) in Ubuntu 8.10 speichert nicht die PPP-Einstellungen für Mobile Broadband-Verbindungen. Welche Änderungen auch gemacht werden, die Software schreibt undefinierte Werte nach gconf.

Mit dem gconf-editor kann man die Werte manuell setzen. In /system/networking/connections/NUMMER/ppp) werden bei Änderungen im network-manager die keys mit undefinierten Werten geschrieben, die man dann selbst setzen muss.

GET / Im Terminal

Da staunte ich eben nicht schlecht als meine telnet-Session abbrach und das Kommando GET / im Terminal ausgeführt wurde. Als Ausgabe wurde ein HTML-formatiertes ls -1a / zurückgegeben.

$ telnet example.com 80
Trying 208.77.188.166...
GET /
telnet: Unable to connect to remote host: Connection timed out
$ GET /
<HTML>
<HEAD>
<TITLE>Directory /</TITLE>
<BASE HREF="file:/">
</HEAD>
<BODY>
<H1>Directory listing of /</H1>
<UL>
<LI><A HREF="./">./</A>
<LI><A HREF="../">../</A>
<LI><A HREF=".rnd">.rnd</A>
<LI><A HREF="aquota.group">aquota.group</A>
<LI><A HREF="aquota.user">aquota.user</A>
<LI><A HREF="bin/">bin/</A>
<LI><A HREF="boot/">boot/</A>
<LI><A HREF="dev/">dev/</A>
<LI><A HREF="etc/">etc/</A>
<LI><A HREF="home/">home/</A>
<LI><A HREF="initrd/">initrd/</A>
<LI><A HREF="lib/">lib/</A>
<LI><A HREF="media/">media/</A>
<LI><A HREF="mnt/">mnt/</A>
<LI><A HREF="opt/">opt/</A>
<LI><A HREF="proc/">proc/</A>
<LI><A HREF="root/">root/</A>
<LI><A HREF="sbin/">sbin/</A>
<LI><A HREF="srv/">srv/</A>
<LI><A HREF="sys/">sys/</A>
<LI><A HREF="tmp/">tmp/</A>
<LI><A HREF="usr/">usr/</A>
<LI><A HREF="var/">var/</A>
</UL>
</BODY>
</HTML>

Des Rätsels Lösung war schnell gefunden und ernüchternd. GET ist ein symbolischer Link auf lwp-request, das benutzt werden kann, um Anfragen an WWW-Server und das lokale Dateisystem zu senden.

$ ls -l `which GET`
lrwxrwxrwx 1 root root 11 2008-11-02 21:09 /usr/bin/GET -> lwp-request

MySQL: Ein Benutzer Für Datenbanknamensschema

Will man einen Benutzer für beliebig viele Datenbanken eines bestimmten Namensschemas anlegen, also für beispielsweise db_1, db_2, db_3, …, kann der variable Teil im Datenbanknamen durch die wildcard % ersetzt werden:

GRANT ALL ON `db_%`.* TO 'user'@'localhost' IDENTIFIED BY 'password';

AutoMySQLBackup: Bug in Weekly Rotation

AutoMySQLBackup hat in der aktuellen Version 2.5 einen Bug bei der Rotation der wöchentlichen Sicherungen, was zur Folge hat, dass diese nicht gelöscht werden. Der Bug ist auf der Project-Seite dokumentiert und es wird ein Patch bereitgestellt.

Die Änderung ist simpel und betrifft lediglich eine Zeile.

patch -p0 automysqlbackup.sh.2.5 < automysqlbackup.fix_weekly_rotation.patch
mv automysqlbackup.sh.2.5 automysqlbackup.sh.2.5.fix_weekly_rotation.patch
ln -s automysqlbackup.sh.2.5.fix_weekly_rotation.patch automysqlbackup

Redirect Aller Webseiten Auf Eine Datei

Wenn man beispielsweise wegen Wartungsarbeiten an der Infrastruktur den ordentlichen Betrieb einer Website nicht mehr aufrecht erhalten kann und für den Zeitraum der Arbeiten eine Seite anzeigen möchte, die den Besucher kurz über die Wartungsarbeiten informiert und vertröstet, kann das recht einfach mit rewrite-Regeln im Webserver lösen.

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/offline.php$
RewriteRule (^$|.(html|php)$) http://www.example.com/offline.php [L]

Das Beispiel leitet beim direkten Aufruf des Domainnamens sowie beim Aufruf von HTML- und PHP-Dateien auf eine bestimmte Seite weiter. Diese Seite wird zuvor als Ausnahme von der Regel ausgenommen. Da nur HTML- und PHP-Dateien weitergeleitet werden, bleiben die Links zu Images und CSS o.ä. erhalten.