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