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).

Posted in General, IT-Security, Linux | Leave a comment

Linux Systembackups mit duply

Mit duply lassen sich verschlüsselte Inkrementelle Backups erstellen nach dem Push Prinzip (Client erstellt lokal ein Backup und schiebt es zum Backupserver. Beim Pull-Prinzip loggt sich der Backupserver auf allen Clients ein, erstellt dort das Backup und lädt es herunter).

Zuerst muss auf der zu sichernden Maschine duply installiert werden (Debian):

aptitude -y install duply python-paramiko python-gobject-2 ncftp

Und hier das Äquivalent für CentOS/RHEL:

yum -y install duply python-paramiko pygobject2

Darauf folgend erstellen wir den PGP Key zum verschlüsseln der Backups:

(
cat <<EOF
%echo Generating Key for
Key-Type: RSA
Key-Length: 8192
Subkey-Type: ELG-E
Subkey-Length: 8192
Name-Real: Tim Meusel
Name-Comment: GPG Key for duply
Name-Email: duply@bastelfreak.org
Expire-Date: 2014-08-03
Passphrase: foo
%commit
EOF
) | gpg --gen-key --batch

Aus Ausgabe erhält man unter anderem:
gpg: Schlüssel B0F90EF1 ist als uneingeschränkt vertrauenswürdig gekennzeichnet
Mit folgendem Befehl erzeugen wir eine grundlegende duply Konfiguration(‘fullbackup’ kann durch jeden beliebigen Namen für einen Backupplan ersetzt werden):
duply fullbackup create
In der Konfigurationsdatei /root/.duply/fullbackup/conf müssen einige Variablen angepasst werden. Unter anderem das Passwort (GPG_PW) für den eben erstellen Key und seine ID (GPG_KEY) (diese steht in der obigen Ausgabe – B0F90EF1). Außerdem müssen wir angeben was wir überhaupt backupen wollen. In diesem Fall alles (SOURCE=’/’). Hinzu kommt die TARGET Variable die das Protokoll, Benutzernamen, Passwort und den FQDN des Zielservers enthält auf dem das Backup später hochgeladen werden soll. Weitere Informationen zur Konfiguration findet man auf der duply Website.

Da wir Vollbackups machen wollen die alles unterhalb von / enthalten sollten wir duply mitteilen das es Verzeichnisse wie /dev und /sys ignoriert. Jedes Verzeichnis das nicht gebackupt werden soll muss Zeile für Zeile in der /root/.duply/fullbackup/exclude stehen:
/proc
/sys
/dev
/tmp

Nun kann unsere Konfiguration getestet werden (

duply fullbackup status

). Wenn alles klappt sieht dies so aus:

:~# duply fullbackup status
Start duply v1.5.2.3, time is 2013-08-03 21:13:02.
Using profile '/root/.duply/fullbackup'.
Using installed duplicity version 0.6.08b, gpg 1.4.10 (Home: ~/.gnupg)
Test - Encryption with key B0F90EF1(OK)
Test - Decryption with key B0F90EF1 (OK)
Test - Compare Original w/ Decryption (OK)
Cleanup - Delete '/tmp/duply.31759.1375557182_*'(OK)

INFO:

Backup of used key (B0F90EF1) did not exist as file
'/root/.duply/fullbackup/gpgkey.B0F90EF1.asc' .
Created it now.

Hint: You should backup your changed profile folder now.

Wie es uns duply bereits rät sollte auf jedenfall /root/.duply/fullbackup gesichert werden. Dort liegt die Konfiguration + der importierte Key. Ohne diese Dateien kann später kein Backup wiederhergestellt werden.

Sofern der Befehl keine Fehler brachte kann nun das erste Backup erstellt werden:

duply fullbackup full

Ein inkrementelles Backup wird wie folgt erstellt:

duply fullbackup backup

Diese beiden Kommandos lassen sich wunderbar in der /etc/crontab eintagen – z.B. jeden Sonntag ein Vollbackup und an allen anderen Wochentagen ein inkrementelles.

Auf dem Backupserver muss nun noch ein passender Benutzer + Verzeichnis angelegt werden in den duply backupen kann:

useradd backupuser --home=/backups --create-home &amp;&amp; passwd backupuser

Mit dem Parameter --password kann man alternativ auch einen Passworthash übergeben.

Posted in General, Linux | Leave a comment

Linux Short Tip

Anzahl der verfügbaren Entropy feststellen:

cat /proc/sys/kernel/random/entropy_avail

Entropy erhöhen (diese wird dann weniger zufällig):

aptitude install rng-tools; echo "HRNGDEVICE=/dev/urandom" >> /etc/default/rng-tools; /etc/init.d/rng-tools restart
Posted in General, Linux, Short Tips | 1 Comment

Linux Short Tip

Installation von policyd-weight Unter Debian 6

Zuerst das Paket mit aptitude installieren und dann meine modifizierte Konfigurationsdatei herunterladen:
aptitude install policy-weight
wget --quiet --no-check-certificate https://blog.bastelfreak.de/policyd-weight.conf -O /etc/policyd-weight.conf

Nun muss die /etc/postfix/master.conf angepasst werden. Der Abschnitt smtpd_recipient_restrictions sollte wie folgt aussehen:
smtpd_recipient_restrictions =
reject_unlisted_sender,
reject_unlisted_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unauth_pipelining,
check_client_access hash:/etc/postfix/policyd_weight_client_whitelist
check_policy_service inet:127.0.0.1:12525
reject_unknown_client
reject_unknown_hostname
permit

Mit einem /etc/init.d/policyd-weight reload && /etc/init.d/postfix reload werden die Änderungen aktiv.

Posted in General, Linux, Short Tips | Leave a comment

Linux Short Tip

mdadm dazu überreden ein Array zu checken:

echo "check" > /sys/block/md0/md/sync_action

Nachtrag:
Schicker ist natürlich:

for i in $(ls /sys/block/*/md/sync_action); do echo check > $i; done

Denn hiermit wird jedes Array geprüft, nicht nur md0. Mit dem Befehl:

cat /sys/block/*/md/mismatch_cnt

kann man überprüfen wie viele Blöcke eines Arrays nicht übereinstimmen. Schreibt man in “sync_action” nicht check sondern repair rein werden diese Fehler behoben. Allerdings liegt hier die Fehlerquote sehr hoch (es kann also sein, dass Daten eher kaputt geschrieben werden anstatt repariert).

Posted in General, Linux, Short Tips | Leave a comment

Linux Short Tip: Uralt Kernel unter CentOS 6 Updaten

ELRepo Repository unter CentOS 6.4 aktivieren um einen Longterm Support Kernel oder einen Mainline Kernel zu bekommen:

rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm


Zuerst die Datei <code>/etc/yum.repos.d/elrepo.repo</code> folgenden Part modifizieren:

Hier muss enabled von 0 auf 1 gestellt werden. Nach einem 
yum update
yum -y install kernel-lt
yum -y install kernel-ml

werden nun die Pakete kernel-ml und kernel-lt installiert. Sofern man nicht grub aus den CentOS Repos installiert hat sondern Grub2 aus einem Debian (weil man z.B. ein Multiboot System hat) muss man die Datei /boot/grub/grub.cfg noch manuell um Booteinträge für beide Kernel erweitern.

Sofern man alte Kernel gern entfernt haben möchte kann man folgendes machen:

yum install yum-utils
package-cleanup --oldkernels --count=2

Sofern yum dies bei einem Kernelupdate automatisch machen soll kann man die Zeile installonly_limit=2 in die Datei /etc/yum.conf eintragen.

Beide Aktionen sorgen dafür das die beiden aktuellsten Versionen des Kernels erhalten bleiben. Dies sollte man nicht reduzieren auf nur den neusten Kernel. Sofern ein Update installiert wird würden alle anderen Versionen deinstalliert werden – auch der aktuell laufende Kernel.

Posted in General, Linux, Short Tips | 2 Comments

Linux Short Tip

Epel Repository unter CentOS 6.4 64Bit aktivieren (enthält standard Tools wie htop…):

rpm -Uvh http://mirror.de.leaseweb.net/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum update
Posted in General, Linux, Short Tips | Leave a comment

Linux Short Tip

Scheduler auf Deadline ändern um IO-System Zugriffe für konkurierende Programme zu optimieren (Server mit mehreren VMs, oder LAMP Systeme):
1) Zur Laufzeit ändern:
echo "deadline" > /sys/block/_HDD_/queue/scheduler

2) Um die Änderung bootpersistent zu machen muss elevator=deadline als Kernelparameter beim bootem mitgegeben werden. Unter vielen Distributionen (z.b. Debian/Ubuntu) gibt es dazu die /etc/default/grub Datei mit der Variable GRUB_CMDLINE, dieser kann man den Parameter übergeben (nach dem editieren ein update-grub nicht vergessen). Alternativ kann man direkt /boot/grub/grub.cfg editieren sofern es sich um einen Grub2 handelt.

Posted in General, Linux, Short Tips | Leave a comment

Linux Short Tip

/etc/aliases anpassen

In der /etc/aliases definiert man wohin Mails zugestellt werden die eigentlich an einen lokalen Systembenutzer gehen sollen. Gerne leitet man alles Mails an root weiter, welches es wiederrum an eine echte eMailadresse weiterleitet:
postmaster: root
clamav: root
root: _adresse_@bastelfreak.org

Hier gehen Mails die an postmaster bzw. clamav gehen weiter an root. Dieser schickt alles an _adresse_@bastelfreak.org. Nach dem editieren der Datei muss man dem lokalen Postfix noch mitteilen das es ein Update der Datei gibt. Dazu muss man einfach newaliases ausführen.

Posted in General, Linux, Short Tips | Leave a comment

Linux Short Tip

Die Fehlermeldung
mail: command not found

wird unter Debian behoben mit:
aptitude install mailutils

Posted in General, Linux, Short Tips | Leave a comment