Plesk: smtp per_source_limit

Sep 10 09:20:20 example xinetd[3033]: FAIL: smtp per_source_limit from=10.10.10.1
Sep 10 09:20:20 example xinetd[3033]: FAIL: smtp per_source_limit from=10.10.10.1
Sep 10 09:20:21 example xinetd[3033]: FAIL: smtp per_source_limit from=10.10.10.1

Wenn solche Einträge im Log auftauchen oder der Monitoring-Server meint der SMTP wäre dicht, sperrt der xinetd weitere Verbindungen. Der Standardwert steht auf 10 Connections per Source-IP. Da Plesk den qmail über xinetd anbindet, greifen hier die default Einstellungen des xinetd… Änderbar wie folgt:

# /etc/xinetd.conf
 
defaults
{
...
per_source = 50

Bei Gelegenheit muss ich mir nochmal anschauen in wie fern das mit den concurrencylocal/remote Einstellungen des qmail kollidiert. Man muss sicherlich beide (xinetd und qmail) anpassen.

PHP5.3: log mail() usage

Es geschehen noch Wunder. Ein ur-alter Patch, der PHP das Loggen der „mail()“ Funktion beibringt hat es in den Core geschafft – und ich habe es nicht gemerkt ;).

Damit wird es auf Shared-Hosting Systemen endlich (ohne Klimmzüge) möglich, spammende Formulare etc. zu identifizieren…

So wird es aktiviert:

# /etc/php.ini
 
mail.add_x_header = On              # Fügt einen neuen Mailheader hinzu:
                                    # X-PHP-Originating-Script: <uid>:formmail.php
 
mail.log = /var/log/phpmail.log     # Loggt jede Benutzung der mail() Funktion

Das Log sieht dann so aus:

mail() on [/var/www/formmail.php:3]: To: otto@example.org -- Headers:

many THANKS!

Plesk: FastCGI wrapper unter Ubuntu

Um eine Domainspezifische php.ini laden zu können verwende ich einen angepassten Wrapper für die FastCGI Schnittstelle. Plesk verwendet das Script /var/www/cgi-bin/cgi_wrapper/cgi_wrapper als Wrapper für PHP-Scripts.

#!/bin/bash
 
DIR=`fgrep "$UID" /etc/passwd | cut --delimiter=: -f6`
 
if [ -f "$DIR/private/php/php.ini" ]; then
        PHPRC=$DIR/private/php/php.ini
else
        PHPRC=/etc/php5/cgi/php.ini
fi
 
export PHPRC
exec /usr/bin/php-cgi

Nebenbei erwähnt: Hier findet sich der Grund warum der angepasste Wrapper für FastCGI unter Ubuntu zunächst nicht funktioniert hat.

Plesk 10.1.1

Mittlerweile ist Plesk 10.1.1 erschienen (Changelog).

Die hier genannten Bugs wurden behoben (und noch viele andere). Jedoch ist auch ein neuer Bug beim Migrieren von Domains mit Postfächern aufgetaucht: Enthalten die Postfächer Weiterleitungen, werden diese zwar mit übernommen – sie werden jedoch nicht in die Qmail-Konfiguration eingetragen. D.h. die in der Oberfläche aktivierten Weiterleitungen funktionieren nicht (die Mail landet im Nirvana).

Zwei Möglichkeiten zur Abhilfe: Die betreffenden Weiterleitungen ein- und wieder ausschalten. Oder die Mailkonfiguration komplett neu schreiben lassen:

/usr/local/psa/admin/sbin/mchk --without-spam

Plesk 10 Eigenarten

Plesk 10 ist jetzt schon einige Monate draussen. Damals konnte ich es kaum erwarten, da es die erste Plesk Version ist, welche die Ubuntu Longterm 10.04 unterstützt. Man sollte wissen, dass sich mit Plesk 10 vieles ändert. In jedem Fall ist Eingewöhnung für Admins und Kunden angesagt.

Was anders ist

  • Es gibt jetzt ein Plesk-Panel für den Server-Admin, wo er – das ist neu – Subscribtions anlegt. Man könnte sagen, eine Domain entspricht einer Subscription. Aber: Eine Subscription kann auch mehrere Domains enthalten. Das Panel ist mehr oder weniger im gewohnten Layout.
  • Ein weiteres (neues) Panel ist das Control-Panel für den User bzw. Subscriptionsinhaber. Dort werden jetzt Mailkonten, Hostingeinstellungen etc. verwaltet. Auch der Serveradmin muss damit arbeiten.
  • Neu im Control-Panel bei den Hostingeinstellungen ist, dass man den Mountpoint des httpdocs Verzeichnisses angeben kann. Bei Subscribtions mit mehreren Domains kann das jeweilige Dokumentenverzeichnis so beliebig gewählt werden – z.B. /domain1, /domain2 unterhalb der Hauptdomain. Merkwürdig dabei ist, dass trotzdem unter /vhosts ein Verzeichnis für die Domain angelegt wird.  Dieses scheint nur für die Meta Daten da zu sein – es enthält z.B. die Statistiken, Logs und das conf-Verzeichnis – nur eben kein httpdocs. Ich freue mich schon auf das Support-Chaos. Ach ja, Subdomains gibt es auch noch wie gehabt.
  • Das neue Control-Panel mag einfacher sein, ist aber jedenfalls für Umsteiger völlig neu.
  • Apache-Konfiguration: Es soll möglich sein, mittels Templates (global)  z.B. die Apache-Konfiguration zu beeinflussen – was früher nicht möglich war. Es gibt auch im /conf Verzeichnis der jeweiligen Domain keine httpd.include mehr, sondern mehrere generierte Dateien mit einem Timestamp im Dateinamen. Man erkennt am Datum welche Datei wohl vom Webserver eingebunden wird. (Ich habe den Eindruck, dass hier alte Configdateien nicht gelöscht werden…). Ich gucke da manchmal rein, um zu sehen was Plesk mit der Apache-Konfig anstellt – um dies dann mit der vhosts.conf zu beeinflussen.  Zum Glück kann die gute alte vhost.conf nach wie vor verwendet werden.

Einige mir bekannte Bugs mit dem Migration-Manager:

  • Bei Postfächern werden keine Unterordner migriert
  • Im /httpdocs Verzeichnis werden keine Dateien mit „.“ am Anfang migriert (z.B. „.htaccess“)

Ich warte erst mal mit Migrationen und Updates bestehender Systeme auf das erwartete Update Plesk 10.1 .

Plesk/qmail: globales procmail Script

Die Möglichkeit Spam-Mails mittels procmail in einen Unterordner zu verschieben hatte ich hier schon mal aufgeschrieben. Leider bietet Qmail meines Wissens nicht die Möglichkeit ein procmail Rezept global anzuwenden sondern prinzipiell nur über die Einbindung in das .qmail-File des jeweiligen Postfachs.

Zumindest die Erstellung/Anpassung des procmail-Rezeptes kann man aber global Abhandeln. Prinzipiell wird das Script einfach nur in der .qmail Datei verlinkt:

| true
| preline /usr/bin/procmail -p /etc/procmail_spam

Soweit eigentlich logisch. Es gibt jedoch einen kleinen Haken: Das procmail Script benötigt das aktuelle Verzeichnis bzw. das aktuelle Postfach um die Mails richtig zu verschieben. Normalerweise steht das aktuelle Verzeichnis ja in der Umgebungsvariable $PWD – aber procmail löscht einige dieser Variablen aus Sicherheitsgründen. Auf neueren Plesk-Systemen bekommt man das Verzeichnis nur über die DELIVERED_TO Umgebungsvariable – welche nur gesetzt wird wenn man den besagten „Sicherheitsmechanismus“ von Procmail ausschaltet (-p) und damit den Zugriff auf alle Umgebungsvariablen erlaubt.

LOGFILE=/var/log/procmail.log
#VERBOSE=YES
MAILDIRMAKE=/usr/bin/maildirmake
 
MAIL_HOME=`if [ -n "$DELIVERED_TO" ]; then echo $DELIVERED_TO | awk -F @ '{print "/var/qmail/mailnames/"$2"/"$1}'; else /bin/pwd; fi`
MAIL_HOME=`if [ -e "$MAIL_HOME" ]; then echo $MAIL_HOME; fi`
 
# sollte es keine Ordner Junk geben, diesen anlegen
DUMMY=`test -d $MAIL_HOME/Maildir/.Junk || echo "Junk" >> $MAIL_HOME/Maildir/courierimapsubscribed`
DUMMY=`test -d $MAIL_HOME/Maildir/.Junk || $MAILDIRMAKE -f Junk $MAIL_HOME/Maildir/`
 
# Spam-Mails nach 30 Tagen löschen
DUMMY=`find $MAIL_HOME/Maildir/.Junk/cur/ -type f -mtime +30 -exec rm -f {} \\;`
DUMMY=`find $MAIL_HOME/Maildir/.Junk/new/ -type f -mtime +30 -exec rm -f {} \\;`
 
# Spam-Mails in den Ordner Junk verschieben
:0 w
* ^Subject:.\*\*\*\*\*SPAM\*\*\*\*\*
$MAIL_HOME/Maildir/.Junk/
 
# Wichtig: alle weiteren Mails normal zustellen
:0 w
$MAIL_HOME/Maildir/

Um die .qmail Files anzupassen habe ich mir ein Script geschrieben. Sollte jemand einen eleganten Weg kennen ein Procmail-Script auch global in die Qmail Kette einzubinden darf er sich gerne melden 😉

Update: für neuere Plesk-Versionen war leider ein Update des Scripts nötig, da qmail dort anders aufgerufen wird und daher /bin/pwd nicht auf das richtige Homeverzeichnis verweist.

Plesk QMail: Unable to get ‚From:‘ string from SMTP session

Die aktuelle Plesk-Version 9.3 hat ein Problem mit qmail. Im Log tauchen folgende Meldungen auf:

qmail-queue-handlers[17561]: Unable to get 'From:' string from SMTP session

Was genau das Problem ist konnte ich bisher nicht herausfinden. Es scheinen Mails zwar größtenteils ausgeliefert werden aber u.U. kommen trotzdem failure-notices zurück. Nichts genaues weiß man nicht. Einen offiziellen Fix gibt es noch nicht, allerdings einen offiziellen Workaround (dort Archiv herunterladen).

# Entpacken
tar xvfj update.tar.bz2
# Backup anlegen
cp -p /var/qmail/bin/qmail-queue /var/qmail/bin/qmail-queue.bak
# Kopieren (dist-rpm-Centos-5-x86_64 durch eigene Distibution ersetzen)
cp update/dist-rpm-Centos-5-x86_64/qmail-queue /var/qmail/bin/
# Rechte setzen
chmod 2511 /var/qmail/bin/qmail-queue
chown mhandlers-user:popuser /var/qmail/bin/qmail-queue

Da Plesk ja bekanntlich qmail patcht (was nebenbei bemerkt auch leider notwendig ist) stellt es hier die Quellen der Patches zur Verfügung. Leider finde ich dort allerdings nicht die Patches der aktuellen Version 9.3 (falls sich dort überhaupt etwas geändert hat). So kann ich nicht direkt nachvollziehen was wirklich das Problem war/ist :(.

Anleitung natürlich ohne Gewähr!

Jahr 2010 Problem

Komisch, gestern an Sylvester dachte ich noch daran welcher Hype damals vor 10 Jahren (!) um das Jahr 2000 gemacht wurde.

Jetzt scheint es wirklich ein kleines Jahr 2010 Problem zu geben: Spamassassin markiert nämlich ab heute alle Mails mit einem relativ hohen Score weil sie ein Datum aus einem Jahr größer 2010 besitzen. Näheres hier bei heise bzw. im SA-Bug-Report.

Auf die schnelle (bis sa-update einen Fix liefert) habe ich erstmal in der local.cf den Score für den betroffenen Filter heruntergesetzt:

# /etc/mail/spamassassin/local.cf
score FH_DATE_PAST_20XX 0.0

Plesk 9.22 erschienen

Soeben ist Plesk 9.22 erschienen. Dies ist mir nur deshalb ein Eintrag wert, da ein seit Jahrzehnten existierender Bug gefixt wurde:

56. Cannot remove non-existent IP addresses using Parallels Plesk Panel GUI

Plesk: DNS-Zonen auf neue Serial umstellen

Plesk kann seit Version 8.6 auch mit RIPE-Konformen Zonen-Serials umgehen. Um in einem Rutsch sämtliche Domains auch einem Server auf das neue Format umzustellen reichen folgende Befehle (vorher Backup anlegen!):

Neue Serial setzen (natürlich auf aktuelles Datum anpassen):

mysql -Ns -u admin -p`cat /etc/psa/.psa.shadow` -D psa \
-e "UPDATE dns_zone SET serial_format = 'YYYYMMDDNN', serial = '2009022000' "

Alle Zonen im Bind updaten:

mysql -Ns -u admin -p`cat /etc/psa/.psa.shadow` -D psa \
-e 'SELECT name FROM dns_zone' \
| awk '{print " /usr/local/psa/admin/sbin/dnsmng update " $1}' | sh

Den zweiten Befehl habe ich hier abgeleitet. Da einige Programme keine Argumente über die Standardeingabe (stdin) annehmen (oder mangels Dokumentation nicht klar ist, ob sie das tun) finde ich es eigentlich ganz elegant, das Kommando mittels awk zusammenzubauen und dann zeilenweise auszuführen.