Dovecot & Postfixadmin: Password Schema aktualisieren

Aufgrund der Migration meines Mailservers (unter anderem Ubuntu 16.04 & Postfixadmin 3) habe ich mich entschlossen mein Password Schema von MD5-Crypt auf SHA512 zu aktualisieren. Nach einiger Bastelarbeit und vielen Problemen habe ich es nun endlich hinbekommen. Hier meine dafür notwendigen Schrittse:

In der Datenbank das Password Schema als Prefix im Passwort eintragen:

UPDATE admin SET password = CONCAT('{MD5-CRYPT}', password);
UPDATE mailbox SET password = CONCAT('{MD5-CRYPT}', password);

In der Dovecot Config habe ich folgendes hinzugefügt:

passdb {
 driver = sql
 args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
 driver = prefetch
}
# The userdb below is used only by lda.
userdb {
 driver = sql
 args = /etc/dovecot/dovecot-sql.conf.ext
}

Und dann noch die jeweils benötigten Post-Login Scripts die dann automatisch das Passwort aktualisieren:

service imap {
 executable = imap imap-postlogin
 unix_listener imap-master {
 user = dovecot
 }
}

service imap-postlogin {
 executable = script-login /etc/dovecot/after_login.sh
 user = vmail
 unix_listener imap-postlogin {
 }
}

service pop3 {
 executable = pop3 pop3-postlogin
}
service pop3-postlogin {
 executable = script-login /etc/dovecot/after_login.sh
 user = vmail
 unix_listener pop3-postlogin {
 }
}

In der Datei /etc/dovecot/dovecot-sql.conf.ext  habe ich das default_password_scheme auskommentiert und die Queries folgendermaßen angepasst

user_query = SELECT '/srv/vmail/%d/%n' as home, 'maildir:/srv/vmail/%d/%n' as mail, 150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password, '/srv/vmail/%d/%n' as userdb_home, 'maildir:/srv/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid, '%w' as userdb_plain_pass FROM mailbox WHERE username = '%u' AND active = '1'
iterate_query = SELECT username AS user FROM mailbox

Dann habe ich folgendes Script angelegt: /etc/dovecot/after_login.sh

#!/bin/sh
DOVECOTPW=$(/usr/bin/doveadm pw -s SHA512-CRYPT -p $PLAIN_PASS)
/etc/dovecot/convertpw.php $USER $DOVECOTPW
exec "$@"

und dann das eigentlich Script um das Passwort zu ändern: /etc/dovecot/convertpw.php

#!/usr/bin/php
<?php
$mysqlhost = "127.0.0.1";
$mysqluser = "postfix"; // username which is used to connect to the database
$mysqlpass = "meinpasswort"; // password which is used to connect to the database
$mysqldb = "postfix"; // databasename where the passwords are stored
$mysqltable = "mailbox"; // table where the passwords are stored
$idfield = "username"; // fieldname where the userlogin is stored
$passfield = "password"; // fieldname where the passwords is stored

$usr = $argv[1];
$dov = $argv[2];
$mysqli = new mysqli("$mysqlhost", "$mysqluser", "$mysqlpass", $mysqldb);
if ($mysqli->connect_errno) {
 echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
$result = $mysqli->query("SELECT $passfield FROM $mysqltable WHERE $idfield = '$usr' AND $passfield like '{SHA%'");
if($result->num_rows == 0) {
 $mysqli->query("UPDATE $mysqltable SET $passfield='".$dov."', modified=NOW() WHERE $idfield='".$usr."'");
}
exit;

Danach habe ich noch die config.inc.php von Postfixadmin angepasst:

$CONF['encrypt'] = 'dovecot:SHA512-CRYPT';
$CONF['dovecotpw'] = "/usr/bin/doveadm pw";

Bei mir ist der Besitzer des Ordners /etc/dovecot „vmail“ – diesbezüglich muss man noch die Rechte anpassen und die after_login.sh ausführbar machen. Danach noch dovecot neustarten und es sollte alles funktionieren.

Quellen:

https://kaworu.ch/blog/2016/04/20/strong-crypt-scheme-with-dovecot-postfixadmin-and-roundcube/
http://wiki2.dovecot.org/HowTo/ConvertPasswordSchemes

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert