Inhaltsverzeichnis

Verschlüsselung von eMails mit Hilfe von Zeyple unter CentOS7

Verschlüsselung vertraulicher Daten dürfte in sensiblen Bereichen kaum mehr weg zu diskutieren sein. Sehr oft werden eMails genutzt, um einen Systemadministrator über Stati, (Fehl-)Funktionen und aussergewöhnliche Situationen zu informieren.

Besser als der Programm-Author Cédric Félizard des Encyption-Daemons ZEYPLE kann man es nicht besser beschreiben:

Why should I care? If you are a sysadmin who receives emails from various monitoring tools like Logwatch, Monit, Fail2ban, Smartd, Cron, whatever - it goes without saying that those emails contain lots of information about your servers. Information that may be intercepted by some malicious hacker sniffing SMTP traffic, your email provider, <insert your (paranoid) reason here>… Why would you take that risk - encrypt them all!

In unserem Anwendungsbeispiel wollen wir alle eMails, die unsere Monitoring-Umgebung Icinga 2 verschickt automatisch verschlüsseln, sofern die Nachrichten den geschützen Bereich der eigenen Infrastruktur verlässt.

Kommunikationsablauf

Die wesentlichen Kernaufgaben von Zeyple sind:

  1. Annahme der (unverschlüsselten) Nachrichten vom MTA1) (Postfix)
  2. Verschlüsseln der Nachrichten mit Hilfe des öffentlichen PGP Keys des Systemadministrators.
  3. Übergabe der (verschlüsselten) eMail an den MTA (Postfix)

Nachfolgende Übersichsskizze zeigt diese Verarbeitungsschritte.

Postfix Mail Transfer Agent - ServerPostfix DaemonAnnahme der eMail durch dasPostfix-Modul POSTDROPund Weiterleitung an denzeyple-Encryption-Daemonzeyple (Mail Encryption Gateway/Daemon)Annahme der unverschlüsselten Admin-Mails vom Postfix-Daemen (queue);Verschlüsseln der Nachrichtenen mit dem PGP-Key des Empfängers und anschließendweiterleiten der verschlüsselten Mail an den Postfix SMTP-Daemon Port 10026Postfix Port 10026Entgegennahme der verschlüsselten eMailvom zyple Daemon und weiterleiten an denzuständigen Mailserver (next-hop)/usr/bin/sendmailScript oder Daemon generierteMail und verschickt diesevia /usr/bin/sendmailFrom: icinga <icinga@nausch.orgTo: django@nausch.orgSubject: icinga 2 Service-NotificationDate: Friday 17:25:30 Content-Type: multipart/encrypted; boundary="=_KVUguhHg3_izbRdYCjHHIA2";protocol="application/pgp-encrypted"Content-Description: Mit PGP=?utf-8?b?dW50ZXJ6ZWljaG5ldGUvdmVyc2NobMO8c3NlbHRl?= DatenMIME-Version: 1.0 This message is in MIME format and has been PGP signed and encrypted. --=_KVUguhHg3_izbRdYCjHHIA2Content-Type: application/pgp-encrypted Version: 1 --=_KVUguhHg3_izbRdYCjHHIA2Content-Type: application/octet-streamContent-Disposition: inline Version: GnuPG v2.0.14 (GNU/Linux) hQIMA7qTOzFT6dtKAQ/+LGrN28ikLsfChNJ4A+gko5Pxr6OEItdcORT3FPRxbhXgXogSXhi57xIgMF2dY3BlY02JIrJ/3ysnIZOwhy5HstV1kz4M/AEOOCLOxq4NCjAM4NpQovyw5Yd9OOxGfP49+qNn1MIgWwbOsIPf91qT1RAzdWMwIg25Rkdn63OSMTsEfLquJLPdbrbVZQfb2oTzThwmWZ9LGHB54zQpOSG2Nehq4UYHdCed/ALO8oYHdWbBFwqkZGr9SSUVLQz7VkBUnHfcuMHZ22zliFdsbjhp84Q9ekZqqOBATK99BeF+kZBdFCtKLtpBOlJ03zOz3J7vxgcpVpScnbn9kXJFg3g05Y/3bAqwr1dTlnBI9suP6sELmul0lY1zMM6TRSWkezuR8y26kNqOUw2y5rOKCq8fjPoqY9SJBSEKiPPukQsZ9W8uWRTxrEQqixGedABrZfKq41uQv+gQyF9iYJpiBSPT6Sws/nK3L4nY8OI01ph7DBPZ9tUowUkaUao/b1z2FyGm8zDY6AqQG2TfMGkx1uWPkRERmg/1gxCS2eDeghaETR8SWf+CSD9u/1GGu6aXHO+s/H6iG/DoJ3Fbp6xLbu4nrKeLKPWdJ+uwYXtGguA65bIvs/aZ3e3ZtDtTG5JG0x7ckPGlbq2FOrJNgBemXI5jtoNkUNRqntsLYZ6aF37aNFmFAgwD8mpRdV5KKq0BEACcRFnmcNhfGoM1oql5WWLkJNcaixELxJ/ifILSR5PjVQ/fGySlbYCymO6B3stRzajuBjCVC0+eFluYAFbpVRXlA4jUN7YE41P5JGWf4S6vpOZE/CmFr1WViHj5u3/Yx23APvsb0G/namf9b1NDe+A5kVQjzR5MyGm+btGJ9XC58mb3jcekTCBroHISAhMec0IYh060a8T4ojlxprp6cpRkJ8ofnVBGBi6w8pan2W9FdNhD9MxE/gE1zmRikA85j9RfqfrC9T716CEfj06Fjq1VcPZ9Zz+Xbs5htIm5bzQfQoI9ML8pMGUcjJAlE0w68jnhvznKN1WS82C+s/42q9SYCcVHUVwg5HyDIdVNtl8Bbn+HOpP8pPrV0gaJMNFZB2lHX6p7btFcbYL3wWXT2Rp6QBYSBZx8AYAoERSRNbi9DKSBAtgU0YkAjYnuZcQ3+VasXmHayhayR1l1b22NRHxwfbf8Ls/3zvO29dVsrbJ/vDP3kV6DcAo7wZmtpazyqKmdU1H8MQ0QOW5UmjWF62A10Qjrg7I2Y3K6k/R3/QiW5+ooFreQ9cWsAMI0GiUvCZMi29wI4GqWvkdL1I1PZxrvGfmz6lL1hK26PzEoWgUqeSdjws1o9O04IhZkyCeH8sPSoUylIEei/RYgXVp3rmOFlMw/yLsbKwzk5qtevF5RBDgpkB12G4rGASScJYWzCUsuhonj/98YNi9HCrBsIBoXig==Ydeu-BEGIN PGP MESSAGE- -END PGP MESSAGE-    _KVUguhHg3_izbRdYCjHHIA2From: icinga <icinga@nausch.orgTo: django@nausch.orgSubject: icinga 2 Service-NotificationDate: Friday 17:25:30  nausch.org Icinga2 Service Monitoring*         When?Service? System_UsersHost?    vml000017.dmz.nausch.orgAddress? 10.0.0.17Info?    USERS WARNING - 4 users currently logged in Comment by : Have a look:https://orwell.nausch.org/icingaweb2/monitoring/service/show?host=vml000017.dmz.nausch.org&amp;service=System_Users >  alert for System_Users is WARNING! <

GitHub

Download

Bevor wir uns nun dieses Projekt auf unseren Rechner clonen, wechseln wir in das Prokekt-Verzeichnis unseres Servers.

 # cd /usr/local/src

Nun clonen wir das Projekt direkt in das Verzeichnis zeyple.

 # git clone https://github.com/infertux/zeyple.git
Cloning into 'zeyple'...
remote: Counting objects: 591, done.
remote: Total 591 (delta 0), reused 0 (delta 0), pack-reused 591
Receiving objects: 100% (591/591), 113.99 KiB | 0 bytes/s, done.
Resolving deltas: 100% (315/315), done.

Update

Möchten wir unsere lokale Installation updaten, so gehen wir in folgenden Schritten vor. Als erstes wechseln wir in das Verzeichnis zeyple.

 # cd /usr/local/src/zeyple

Anschließen führen wir einen pull gegen das Projekt bei GitHub durch.

 # git pull

Als erstes holen wir uns nun das

Installation

Zum Verschlüsseln der Nachrichten benötigen wir natürlich noch mind. folgende zwei Pakete pygpgme und gnupg2. Falls sich diese beiden Pakete noch nicht auf unserem Server befinden, installieren wir diese nun einfach mit Hilfe von yum.

 # yum install pygpgme gnupg2 -y

Konfiguration

Zeyple-User anlegen

Zum Speichern der benötigten PGP-Schlüssel benötigen wir einen eigenen User zeyple, den wir uns nun anlegen.

 # adduser --system --no-create-home --shell /sbin/nologin zeyple

PGP-Keys der Empfänger importieren

Zum Ablegen benötigen wir nun noch ein Verzeichnis, welches wir wie folgt anlegen.

 # mkdir -p /var/lib/zeyple/keys

Nur der User zeyple soll Zugriff auf das Schlüsselmaterial bekommen. Wir passen also die Verzeichnisrechte entsprechend an und weisen das Verzeichnis dem User zeyple zu.

 # chmod 700 /var/lib/zeyple/keys
 # chown zeyple: /var/lib/zeyple/keys

Nun können wir die öffentlichen PGP-Schlüssel der potentiellen Empfänger importieren. Haben wir den PGP public key in einer Datei lokal auf dem Server benutzen wir folgenden Aufruf.

 # sudo -u zeyple gpg --homedir /var/lib/zeyple/keys --import /tmp/g33k@nausch.org.key.asc
gpg: keyring `/var/lib/zeyple/keys/secring.gpg' created
gpg: keyring `/var/lib/zeyple/keys/pubring.gpg' created
gpg: /var/lib/zeyple/keys/trustdb.gpg: trustdb created
gpg: key 637EE91F: public key "Thomas Gelf <thomas@gelf.net>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

Alternativ können wir den Schlüssel auch von einem öffentlichen PGP-Keyserver laden.

 # sudo -u zeyple gpg --homedir /var/lib/zeyple/keys --keyserver hkp://keys.gnupg.net --search thomas@gelf.net
gpg: searching for "thomas@gelf.net" from hkp server keys.gnupg.net
(1)	Thomas Gelf <thomas@gelf.net>
	  1024 bit DSA key 637EE91F, created: 2008-10-19
Keys 1-1 of 1 for "thomas@gelf.net".  Enter number(s), N)ext, or Q)uit > 1
gpg: requesting key 637EE91F from hkp server keys.gnupg.net
gpg: /var/lib/zeyple/keys/trustdb.gpg: trustdb created
gpg: key 637EE91F: public key "Thomas Gelf <thomas@gelf.net>" imported
gpg: Total number processed: 1
gpg:               imported: 1

zeyple Konfigurationsdatei

Damit nun der zeyple encryption deamon weiss, wo er sein Schlüsselmaterial findet und wie dieser mit dem SMTP-Relayhost kommunizieren soll, müssen wir ihm ein paar Informationen bereitstellen. Hierzu wird die Konfigurationsdatei /etc/zeyple.conf verwendet. Wir kopieren uns daher die Beispielskonfigurationsdatei aus dem GitHUB-Projektverzeichnis nach /etc.

 # cp /usr/local/src/zeyple/zeyple/zeyple.conf.example /etc/zeyple.conf

Änderungen an dieser Datei sind in aller Regel nicht nötig.

/etc/zeyple.conf
[zeyple]
log_file = /var/log/zeyple.log
 
[gpg]
home = /var/lib/zeyple/keys
 
[relay]
host = localhost
port = 10026

zeyple Logdatei

Damit zeyple sein logfile auch beschreiben kann, müsseen wir dieses nun noch anlegen und mit den zugehörigen Rechten versehen.

 # touch /var/log/zeyple.log 
 # chown zeyple: /var/log/zeyple.log

Postfix Integration

Zur Einbindung des zeyple encyption gateway in unseren Postfix MTA sind nun zwei Dinge erforderlich. Zur Übergabe an zeyple benötigen wir eine Content-Filter definition und zur Rückleitung einen SMTP-Daemon, auf dem zeyple dann die verschlüsselten Nachrichten dem Postfix MTA wieder übergibt.

Diese beiden Definitionen nehmen wir nun als erstes in der Postfix Konfigurationsdatei /etc/postfix/master.cf vor. Wir öffnen diese Datei mit dem Editor unserer Wahl und fügen am ende folgende Zeilen ein.

 # vim /etc/postfix/master.cf
/etc/postfix/master.cf
...
 
# Django : 2016-06-30 - Content-Scanner zur Übergabe der unverschlüsselten Nachrichten an das
#          encryption gateway zeyple
zeyple    unix  -       n       n       -       -       pipe
      user=zeyple argv=/usr/local/src/zeyple/zeyple/zeyple.py ${recipient}
 
# Django : 2016-06-30 - SMTP-Daemon (Rückkanal) bei dem das encyrption gateway zeyple die
#          verschlüsselten Nachrichten wieder dem MTA zur weiteren Verarbeitung übergibt
localhost:10026 inet  n       -       n       -       10      smtpd
      -o content_filter=
      -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks,no_milters
      -o smtpd_helo_restrictions=
      -o smtpd_client_restrictions=
      -o smtpd_sender_restrictions=
      -o smtpd_recipient_restrictions=permit_mynetworks,reject
      -o mynetworks=127.0.0.0/8,10.0.0.117/32
      -o smtpd_authorized_xforward_hosts=127.0.0.0/8,10.0.0.117/32

Anschließend informieren wir noch Postfix, dass dieser den neu definierten Contentfilter auch verwenden soll. Hierzu tragen wir am Ende folgende Zeilen ein.

 # vim /etc/postfix/main.cf
/etc/postfix/main.cf
...
 
# Django : 2016-06-30 - Definition des encryption gateways zeyple als Content-Filter
content_filter = zeyple

Zur Aktivierung der Konfigurationsänderung starten wir nun den Postfix-Daemon einmal durch.

 # systemctl restart postfix.service

Den Status unseres Mailservers können wir wie gewohnt abfragen.

 # systemctl status postfix.service -l

 postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2016-08-09 10:01:21 CEST; 1min 23s ago
  Process: 25123 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
  Process: 25141 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 25138 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 25133 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
 Main PID: 25215 (master)
   CGroup: /system.slice/postfix.service
           ├─25215 /usr/libexec/postfix/master -w
           ├─25216 pickup -l -t unix -u
           └─25217 qmgr -l -t unix -u

Aug 09 10:01:21 vml000117.dmz.nausch.org systemd[1]: Starting Postfix Mail Transport Agent...
Aug 09 10:01:21 vml000117.dmz.nausch.org postfix/postfix-script[25212]: starting the Postfix mail system
Aug 09 10:01:21 vml000117.dmz.nausch.org postfix/master[25215]: daemon started -- version 2.11.8, configuration /etc/postfix
Aug 09 10:01:21 vml000117.dmz.nausch.org systemd[1]: Started Postfix Mail Transport Agent.

Systemtest

Nun ist es an der Zeit unsere Konfiguration zu testen. Als erstes schicken wir von der Konsole aus eine Testnachricht an eine Adresse, bei der wir zuvor den zugehörigen PGP-Schlüssel importiert hatten.

 $ echo "very important top secret stuff" | mailx -s "secured message" thomas@gelf.net

Im Logfile unseres Postfix MTA sehen wir die Abarbeitung dieser Nachricht.

Aug  9 10:39:40 vml000117 postfix/pickup[27862]: 6172B1811270: uid=1000 from=<django>
Aug  9 10:39:40 vml000117 postfix/cleanup[28680]: 6172B1811270: message-id=<20160809083940.6172B1811270@vml000117.dmz.nausch.org>
Aug  9 10:39:40 vml000117 postfix/qmgr[27863]: 6172B1811270: from=<django@nausch.org>, size=484, nrcpt=1 (queue active)
Aug  9 10:39:40 vml000117 postfix/smtpd[28710]: connect from localhost[127.0.0.1]
Aug  9 10:39:40 vml000117 postfix/smtpd[28710]: 8A6AE183645E: client=localhost[127.0.0.1]
Aug  9 10:39:40 vml000117 postfix/cleanup[28680]: 8A6AE183645E: message-id=<20160809083940.6172B1811270@vml000117.dmz.nausch.org>
Aug  9 10:39:40 vml000117 postfix/qmgr[27863]: 8A6AE183645E: from=<django@nausch.org>, size=2343, nrcpt=1 (queue active)
Aug  9 10:39:40 vml000117 postfix/smtpd[28710]: disconnect from localhost[127.0.0.1]
Aug  9 10:39:40 vml000117 postfix/pipe[28682]: 6172B1811270: to=<thomas@gelf.net>, relay=zeyple, delay=0.21, delays=0.02/0/0/0.18, dsn=2.0.0, status=sent (delivered via zeyple service)
Aug  9 10:39:40 vml000117 postfix/qmgr[27863]: 6172B1811270: removed
Aug  9 10:39:41 vml000117 postfix/smtp[28712]: 8A6AE183645E: to=<thomas@gelf.net>, relay=10.0.0.87[10.0.0.87]:25, delay=0.99, delays=0.01/0/0.01/0.98, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 91DF3C00088)
Aug  9 10:39:41 vml000117 postfix/qmgr[27863]: 8A6AE183645E: removed

Im Logfile des zeyple encryption daemon wird die Verarbeitung auch entsprechend dokumentiert.

2016-08-09 10:39:40,484 28857 INFO Zeyple ready to encrypt outgoing emails
2016-08-09 10:39:40,486 28857 INFO Processing outgoing message <20160809083940.6172B1811270@vml000117.dmz.nausch.org>
2016-08-09 10:39:40,486 28857 INFO Recipient: thomas@gelf.net
2016-08-09 10:39:40,486 28857 INFO Trying to encrypt for thomas@gelf.net
2016-08-09 10:39:40,514 28857 INFO Key ID: 5D3F54A8637EE91F
2016-08-09 10:39:40,560 28857 INFO Sending message <20160809083940.6172B1811270@vml000117.dmz.nausch.org>
2016-08-09 10:39:40,578 28857 INFO Message <20160809083940.6172B1811270@vml000117.dmz.nausch.org> sent

Verschicken wir nun eine Nachricht an einen Empfänger für den wir keinen PGP-Schlüssel haben, kann diese natürlich nicht verschlüsselt werden.

 $ echo "very important top secret stuff" | mailx -s "secured message" bigchief@omni128.de

Im Logfile des zeyple encryption daemon wird die Verarbeitung auch entsprechend dokumentiert.

2016-08-09 10:43:16,882 29254 INFO Zeyple ready to encrypt outgoing emails
2016-08-09 10:43:16,884 29254 INFO Processing outgoing message <20160809084316.BCE621811270@vml000117.dmz.nausch.org>
2016-08-09 10:43:16,884 29254 INFO Recipient: bigchief@omni128.de
2016-08-09 10:43:16,885 29254 INFO Trying to encrypt for bigchief@omni128.de
2016-08-09 10:43:16,909 29254 INFO Key ID: None
2016-08-09 10:43:16,909 29254 WARNING No keys found, message will be sent unencrypted
2016-08-09 10:43:16,910 29254 INFO Sending message <20160809084316.BCE621811270@vml000117.dmz.nausch.org>
2016-08-09 10:43:16,949 29254 INFO Message <20160809084316.BCE621811270@vml000117.dmz.nausch.org> sent

In der Postfix Logdatei wird der ordnungsgemäße Verarbeitungsablauf wie gewohnt festgehalten.

Aug  9 10:43:16 vml000117 postfix/pickup[27862]: BCE621811270: uid=1000 from=<django>
Aug  9 10:43:16 vml000117 postfix/cleanup[29251]: BCE621811270: message-id=<20160809084316.BCE621811270@vml000117.dmz.nausch.org>
Aug  9 10:43:16 vml000117 postfix/qmgr[27863]: BCE621811270: from=<django@nausch.org>, size=488, nrcpt=1 (queue active)
Aug  9 10:43:16 vml000117 postfix/smtpd[29267]: connect from localhost[127.0.0.1]
Aug  9 10:43:16 vml000117 postfix/smtpd[29267]: E4D1E183645E: client=localhost[127.0.0.1]
Aug  9 10:43:16 vml000117 postfix/cleanup[29251]: E4D1E183645E: message-id=<20160809084316.BCE621811270@vml000117.dmz.nausch.org>
Aug  9 10:43:16 vml000117 postfix/qmgr[27863]: E4D1E183645E: from=<django@nausch.org>, size=685, nrcpt=1 (queue active)
Aug  9 10:43:16 vml000117 postfix/smtpd[29267]: disconnect from localhost[127.0.0.1]
Aug  9 10:43:16 vml000117 postfix/pipe[29253]: BCE621811270: to=<bigchief@omni128.de>, relay=zeyple, delay=0.21, delays=0.05/0.01/0/0.15, dsn=2.0.0, status=sent (delivered via zeyple service)
Aug  9 10:43:16 vml000117 postfix/qmgr[27863]: BCE621811270: removed
Aug  9 10:43:17 vml000117 postfix/smtp[29269]: E4D1E183645E: to=<bigchief@omni128.de>, relay=10.0.0.87[10.0.0.87]:25, delay=0.64, delays=0.01/0.01/0.07/0.54, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 0FE1EC00088)
Aug  9 10:43:17 vml000117 postfix/qmgr[27863]: E4D1E183645E: removed

Links

1)
Mail Transfer Agent