DKIM unter Postfix einrichten

Ich nutze Postfix/Dovecot unter Debian mit MySQL Anbindung zur Userverwaltung (Datenbankstruktur basiert auf diesem Tutorial). Für jede verwendete eMailadresse möchte ich ein Keypaar erstellen und damit ausgehende eMails signieren. Außerdem gibt es pro Domain einen default Keypaar zum signieren von eMails deren Absender nicht in der DB steht. Zur Einrichtung bietet sich folgendes von mir erstelltes Script an:

#!/bin/bash
MYSQLFILE="/etc/postfix/mysql-virtual-alias-maps.cf"
USER=$(grep user ${MYSQLFILE} | awk '{print $3}')
PASS=$(grep password ${MYSQLFILE} | awk '{print $3}')
HOST=$(grep hosts ${MYSQLFILE} | awk '{print $3}')
DB=$(grep dbname ${MYSQLFILE} | awk '{print $3}')
QUERY="(SELECT virtual_aliases.source as subject FROM \`virtual_aliases\`) UNION DISTINCT (SELECT virtual_aliases.destination as subject FROM \`virtual_aliases\`) UNION DISTINCT (SELECT virtual_users.email as subject FROM \`virtual_users\`) ORDER BY \`SUBJECT\` ASC"
CONF_DIR="/etc/opendkim"
SENDER_MAP="${CONF_DIR}/SigningTable"
KEY_MAP="${CONF_DIR}/KeyTable"
CONF_FILE="/etc/opendkim.conf"
DEF_FILE="/etc/default/opendkim"
KEY_DIR="${CONF_DIR}/keys"
POSTFIX="/etc/postfix/main.cf"
TOTAL=0
NEW=0
green="\e[0;32m"
orange="\e[0;33m"
endColor="\e[0m"
aptitude install -y opendkim mysql-client 1> /dev/null
mkdir "${CONF_DIR}"
if [ ! -e "${SENDER_MAP}" ]; then
        touch "${SENDER_MAP}"
fi
if [ ! -e "${KEY}" ]; then
        touch "${KEY_MAP}"
fi
if ! grep --quiet "^KeyTable" "${CONF_FILE}"; then
        echo "KeyTable ${KEY_MAP}" >> "${CONF_FILE}"
fi
if ! grep --quiet "^SigningTable" "${CONF_FILE}"; then
        echo "SigningTable refile:${SENDER_MAP}" >> "${CONF_FILE}"
fi
if ! grep --quiet "^SOCKET" "${DEF_FILE}"; then
        echo "SOCKET=\"inet:8891@localhost\"" >> "${DEF_FILE}"
fi
if ! grep --quiet "^milter_default_action" "${POSTFIX}"; then
        echo "milter_default_action = accept" >> "${POSTFIX}"
fi
if ! grep --quiet "^milter_protocol" "${POSTFIX}"; then
        echo "milter_protocol = 2" >> "${POSTFIX}"
fi
if ! grep --quiet "^smtpd_milters" "${POSTFIX}"; then
        echo "smtpd_milters = inet:localhost:8891" >> "${POSTFIX}"
fi
if ! grep --quiet "^non_smtpd_milters" "${POSTFIX}"; then
        echo "non_smtpd_milters = inet:localhost:8891" >> "${POSTFIX}"
fi
for SUBJECT in $(mysql --user="${USER}" --host="${HOST}" --password="${PASS}" "${DB}" --execute "${QUERY}" | awk '{print $1}' | grep -v ^subject$); do
        (( TOTAL++ ))
        if [ "${SUBJECT:0:1}" == "@" ]; then
                STRING=$(grep "^*${SUBJECT} " "${SENDER_MAP}")
                KEYNAME="default"
        else
                STRING=$(grep "^${SUBJECT} " "${SENDER_MAP}")
                KEYNAME=$(echo "${SUBJECT}" | cut -d'@' -f1)
        fi
        if [ -z "${STRING}" ]; then
                (( NEW++ ))
                DOMAIN=$(echo "${SUBJECT}" | cut -d'@' -f2)
                mkdir -p "${KEY_DIR}/${DOMAIN}"
                opendkim-genkey -S -r -s "${KEYNAME}" -b 2048 -d ${DOMAIN} -D "${KEY_DIR}/${DOMAIN}"
                SUM=$(echo -n "${SUBJECT}" | sha512sum)
                TXT_RECORD="${SUM:16:32}"
                echo "${TXT_RECORD} ${DOMAIN}:${KEYNAME}:${KEY_DIR}/${DOMAIN}:${KEYNAME}" >> "${KEY_MAP}"
                if [ "${SUBJECT:0:1}" == "@" ]; then
                        echo "*${SUBJECT} ${TXT_RECORD}" >> "${SENDER_MAP}"
                else
                        echo "${SUBJECT} ${TXT_RECORD}" >> "${SENDER_MAP}"
                fi
                echo -e "${green}Done with ${DOMAIN} ${endColor}"
        fi
done
chown opendkim:opendkim /etc/dkim/keys/* -R
/etc/init.d/postfix reload 1> /dev/null
echo -e "${green}Processed ${TOTAL} subjects, ${NEW} are new${endColor}"
if [ $(pgrep -f /usr/lib/postfix/master) ]; then
        echo -e "${green}Postfix reload was also successfull. Postfix will now sign outgoing mails via opendkim. You have to add the TXT records to your zone file to allow other mailserver to verify your signature${endColor}"
else
        echo -e "${orange}Postfix reload failed. Please view these logs:${endColor}"
        tail -n10 /var/log/mail.log
fi

Mit dem erstellten private Key werden die Mails signiert. Den zugehörigen public Key muss man als TXT Record noch in die entsprechende DNS Zone eintragen. Die Records findet man wie folgt:

cat /etc/opendkim/keys/*/*.txt

Das Script modizifiert auch Postfix damit Mails direkt signiert werden. Außerdem kann es gefahrlos beliebig oft aufgerufen werden. Sofern in der Datenbank eine neue eMailadresse oder eine neue Domain eingetragen wird, wird dies beim nächsten Scriptaufruf erkannt und die zusätzlichen Keys werden erstellt. Weitere Informationen zu OpenDKIM findet man auf der Projektseite. Außerdem gibt es zu ‘DomainKeys Identified Mail’ auch eine RFC(RFC4871).

This entry was posted in General, IT-Security, Linux. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.