CheckPassword
Checkpassword is an authentication interface originally implemented by qmail. Checkpassword combines both the password database and user database lookups into a single checkpassword lookup, which makes the standard implementation unsuitable for a standalone userdb. With Dovecot extensions it's also possible to use checkpassword as a userdb.
Typically you'll use prefetch as the userdb, but it's not required that you use the checkpassword script's userdb capabilities. You can still use for example static userdb if you're using only a single UID and GID, and your home directory fits into a template.
Deliver
If your checkpassword script doesn't support Dovecot extensions, you can't use it as a user database. This means that if you wish to use LDA, you can't use the -d parameter to do userdb lookups. There are two ways to solve this:
Use another userdb which does the lookup for deliver, for example SQL or static. Add this userdb after the prefetch userdb.
Use a script to look up the user's home directory and run deliver without -d parameter. For example:
#!/bin/sh # <<Lookup user's home directory here.>> # If users have different UIDs/GIDs, make sure to also change this process's UID and GID. # If you want to override any settings, use dovecot-lda's -o parameter # (e.g. dovecot-lda -o mail_location=maildir:~/Maildir). export HOME exec /usr/local/libexec/dovecot/dovecot-lda
Checkpassword Interface
The interface is specified in http://cr.yp.to/checkpwd/interface.html. However here's a quick tutorial for writing a script:
Read <username> NUL <password> NUL from fd 3.
- Verify the username and password.
- If the authentication fails, exit with code 1. This makes Dovecot give "Authentication failed" error to user.
- If you encounter an internal error, exit with code 111. This makes Dovecot give "Temporary authentication failure" error to user.
- If the authentication succeeds, you'll need to:
Set user's home directory to $HOME environment. This isn't required, but highly encouraged.
Set $USER environment variable. If the user name was changed (eg. if you lowercased "Username" to "username"), you can tell about it to Dovecot by setting $USER to the changed user name.
Change the process's effective UID and GID to the user's UNIX UID and GID.
Alternatively you could set userdb_uid and userdb_gid environments and add them to EXTRA environment (see below for Dovecot extensions).
Your program received a path to checkpassword-reply binary as the first parameter. Execute it.
Qmail-LDAP
Note that auth_imap that comes with qmail-ldap is not compatible with this interface. You can get a patch that adds auth_dovecot functionality to qmail-ldap here. Or you can use auth_pop instead, but you may need to pass aliasempty to let auth_pop find the Maildir, so it is recommended to write a /var/qmail/bin/auth_dovecot wrapper (don't forget to chmod +x it) around auth_pop.
#!/bin/sh
QMAIL="/var/qmail"
if [ -e $QMAIL/control/defaultdelivery ]; then
ALIASEMPTY=`head -n 1 $QMAIL/control/defaultdelivery 2> /dev/null`
else
ALIASEMPTY=`head -n 1 $QMAIL/control/aliasempty 2> /dev/null`
fi
ALIASEMPTY=${ALIASEMPTY:-"./Maildir/"}
exec $QMAIL/bin/auth_pop "$@" $ALIASEMPTYyou can also use this wrapper to pass LOGLEVEL environmental variable to auth_pop.
Dovecot Extensions
If you wish to return extra fields for Dovecot, set them in environment variables and then list them in EXTRA environment variable. The userdb extra fields can be returned by prefixing them with userdb_. For example:
userdb_quota_rule=*:storage=10000 userdb_mail=mbox:$HOME/mboxes EXTRA=userdb_quota_rule userdb_mail
Dovecot also sets some environment variables that the script may use:
SERVICE: contains eg. imap, pop3 or smtp
TCPLOCALIP and TCPREMOTEIP: Client socket's IP addresses if available
MASTER_USER: If master login is attempted. This means that the password contains the master user's password and the normal username contains the user who master wants to log in as.
AUTH_*: All of the auth variables are available as AUTH_<long name> extra fields. For example %{cert} is in AUTH_CERT. (v2.0.16+)
Checkpassword as userdb
Dovecot calls the script with AUTHORIZED=1 environment set when performing a userdb lookup. The script must acknowledge this by changing the environment to AUTHORIZED=2, otherwise the lookup fails. Other than that, the script works the same way as a passdb checkpassword script.
Checkpassword with passdb lookups (v2.1.2+)
Normally checkpassword answers to questions "is user X's password Y?" This doesn't work with non-plaintext auth mechanisms, or when Dovecot wants to do a non-authenticating passdb lookup (e.g. for LMTP proxy). These passdb credentials lookups can be implemented the same way as a userdb lookup (i.e. change the AUTHORIZED environment).
CREDENTIALS_LOOKUP environment is set for all non-plaintext passdb lookups.
The password scheme that Dovecot wants is available in SCHEME environment.
If the SCHEME is empty, it means Dovecot is doing a passdb lookup for e.g. a proxy which doesn't really want the password, just the extra fields.
If a password is returned, it must be returned as password={SCHEME}secret.
Example
The standard way:
passdb {
driver = checkpassword
args = /usr/bin/checkpassword
}
userdb {
driver = prefetch
}
# If you want to use deliver -d and your users are in SQL:
userdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}Using checkpassword only to verify the password:
passdb {
driver = checkpassword
args = /usr/bin/checkpassword
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/home/%u
}