Schlagwort-Archive: OpenSSL Verschlüsselung

OpenSSL umfasst Implementierungen der Netzwerkprotokolle und verschiedener Verschlüsselungen sowie das Programm openssl für die Kommandozeile zum Beantragen,

Postfix mit SASL-Authentifizierung verwenden

SMTP-Server müssen entscheiden, ob ein SMTP-Client autorisiert ist E-Mails zu versenden, für die der Server selbst zuständig ist.

Simple Authentication and Security Layer (SASL) Integration Postfix


Diese Anleitung beschreibt, wie man ein MTA (Mail Transport Agent) Postfix unter CentOS 7 mit CyrusSASL zur SMTP-Authentifizierung (SMTP-Auth) erweitert. Danach können Clients E-Mails mittels SMTP-Auth versenden. Diese Anleitung ist geprüft unter CentOS Linux release 7.7.1908 (Core), mit Postfix v2.10.1 und Cyrus-SASL 2.1.26. Es wird davon ausgegangen das Postfix bereits konfiguriert ist und TLS (Transport Layer Security) implementiert ist.

Postfix implementiert die SASL Library nicht selbst, sondern verwendet vorhandene Implementierungen als Bausteine. Dies bedeutet, dass einige SASL-bezogene Konfigurationsdateien zu Postfix gehören, während andere Konfigurationsdateien zu der spezifischen SASL-Implementierung gehören, die Postfix verwenden wird.

Cyrus-SASL Installation

Als root die Pakete mit folgendem Command installieren:

yum install cyrus-sasl cyrus-sasl-plain -y

Die einzelnen SASL-Mechanismen werden als RPMs installiert.

Es folgt die Einbindung für Postfix, hierzu die modifikation in der Datei /etc/postfix/master.cf vornehmen:

==========================================================================
 service type  private unpriv  chroot  wakeup  maxproc command + args
 (yes)   (yes)   (yes)   (never) (100)
 ==========================================================================
 smtps     inet  n       -       n       -       -       smtpd
   -o syslog_name=postfix/smtps
   -o smtpd_tls_wrappermode=yes
   -o smtpd_sasl_auth_enable=yes
   -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

Damit Postfix mit SASL funktioniert, darf Postfix nicht im chroot-Verzeichnis laufen, Zeile smtps bei Position 5 (n).

SMTP-Auth für lokale Benutzer konfigurieren, wir editieren die Postfix Datei /etc/postfix/main.cf:

smtpd_tls_auth_only = no
smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_sasl_auth_enable = yes
smtp_sasl_mechanism_filter = !gssapi, !login, static:all
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = noanonymous
smtpd_sasl_type = cyrus
smtpd_sasl_path = smtpd 

Die Konfiguration von Cyrus-SASL erfolgt durch zwei Dateien. Die erste Datei /etc/sysconfig/saslauthd kann übernommen werden:

# Directory in which to place saslauthd's listening socket, pid file, and so
# on.  This directory must already exist.
SOCKETDIR=/run/saslauthd

# Mechanism to use when checking passwords.  Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
MECH=pam

# Additional flags to pass to saslauthd on the command line.  See saslauthd(8)
# for the list of accepted flags.
FLAGS=

Die SASL-Mechanismen PLAIN und LOGIN, CRAM-MD5 und DIGEST-MD5 kommen oft zum Einsatz, hierfür ist die Konfigurationsdatei /etc/sasl2/smtpd.conf zuständig, die bereitstellung wurde ebenfalls bei der Installation durchgeführt:

pwcheck_method: saslauthd
mech_list: plain login CRAM-MD5 DIGEST-MD5

Nun Cyrus-SASL Library Daemon starten und den systemd autostart aktivieren, anschliessend Postfix re-starten:

systemctl start saslauthd
systemctl enable saslauthd
systemctl restart postfix 

Der SMTP-Submission Support auf Port 587 ist nun aktiviert, überprüfen lässt sich dies mit folgendem Kommando:

ss -tuln4 | grep 587
tcp    LISTEN     0      100       *:587                  *:*

Zur Authentifizierung am SMTP-Gateway wird nun ein Benutzer erstellt, dieser E-Mails über den MTA versenden soll:

adduser -M -s /sbin/nologin User24
passwd User24

Eine lokale UserID ist für unsere Anforderung hier ausreichend, Cyrus-SASL unterstützt weiter LDAP und SQL, um mit beispielweise Kopano oder einem AD Verzeichnisdienst zu interagieren.

Cyrus-SASL SMTP-Auth Testen

Welche Mechanismen zur Authentifizierung innerhalb von STARTTLS unterstützt werden, kann mit OpenSSL überprüft werden:

openssl s_client -connect mail.relayhost.net:587 -starttls smtp

In der Ausgabe von openssl ein EHLO übergeben:

EHLO Hans
 250-mail.relayhost.net
 250-PIPELINING
 250-SIZE 27262976
 250-ETRN
 250-AUTH PLAIN LOGIN CRAM-MD5 DIGEST-MD5
 250-ENHANCEDSTATUSCODES
 250-8BITMIME
 250 DSN

Ist OpenSSL nicht vorliegend, kann dazu auch Telnet genutzt werden, es wird zum Gateway mail.relayhost.net über Port 587 eine Verbindnung hergestellt, dazu kann auch PuTTY oder KiTTY verwendet werden.

KiTTY Configuration

Nun möchten wir uns beim Gateway (MTA) Authentifizieren. Der Benutzername und das Passwort muss im base64-codierten Format an das SMTP-Gateway übertragen werden, Hierzu gibt man die folgenden Befehlszeilen ein, um die base64-Codierung für den Benutzername und das Passwort zu erhalten.

echo -en "userxy" | base64
dXNlcnh5
echo -en "password" | base64
cGFzc3dvcmQ=

Die SASL SMTP-Auth Konfiguration und Authentifizierung überprüft man wie folgt mit ausführen der folgenden Zeilen im Terminal, nach Eingabe von AUTH LOGIN der mit Base64 codierte Benutzername und das Passwort einfügen.

AUTH LOGIN
dXNlcnh5
cGFzc3dvcmQ=
$ telnet mail.relayhost.net 25
Trying mail.relayhost.net...
Connected to mail.relayhost.net
Escape character is '^]'.
220 mail.relayhost.net ESMTP MAIL Service ready at  Sat, 12 Mar 2019 09:26:12
EHLO smtp.example.com
250-smtp.example.com Hello
250-AUTH=LOGIN
250-AUTH LOGIN
250-TURN
250-SIZE 2097152
250-ETRN
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-8bitmime
250-BINARYMIME
250-CHUNKING
250-VRFY
250 OK
AUTH LOGIN
334 VXClcm5hbWU6
dXNlcnh5
334 UGFzc4dvcmQ8
cGFzc3dvcmQ=
235 2.7.0 Authentication successful

Die Ausgabe SMTP-Auth von Postfix mit Cyrus-SASL.

Die oben kodierten Credentials bei den 334 Prompts einfügen, hier bei Zeile 24 als userxy und bei Zeile 26 unser password.

  Ein 250 STARTTLS in der Ausgabe zeigt die Voraussetzungen, das Klartext-Benutzernamen mit Passwort durch STARTTLS geschützt an das SMTP-Gateway übermittelt werden.

Eine weitere einfache Möglichkeit gibt es mit SMTPConsole ein SMTP-Gateway zu testen.

Mit SMTP Console testen
SMTPConsole

Schlüsselpaar mit SSH-KEYGEN

SSH-KEYGEN Schlüsselpaar Erstellung für SSH Public-Key-Authentifizierung

Die Public-Key-Authentifizierung, oder auch Asymmetrisches Kryptosystem genannt, ist eine Authentifizierungsmethode, die von OpenSSH und OpenSSL verwendet wird, um Benutzer mit Hilfe eines Schlüsselpaars, bestehend aus digitalen Signaturen, privatem und öffentlichem Schlüssel, an einem Server anzumelden. Ein solches mit SSH-KEYGEN generiertes Schlüsselpaar ist wesentlich schwerer zu kompromittieren als ein Kennwort.

Schlüsselpaar mit SSH-KEYGEN

OpenSSH RSA-Key mit SSH-KEYGEN generieren

Der einfachste Weg ein Schlüsselpaar im OpenSSH Format zu generieren, ist die Ausführung von ssh-keygen ohne Argumente in der Shell. In diesem Fall wird nach der Datei gefragt, in der die Schlüssel gespeichert werden sollen. Wie hier in diesem Beispiel:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TZ+isKhohYE6wOcKuqWxElclsdZw4UxJwFtnB9txEC8 user@debian.localdomain
The key's randomart image is:
+---[RSA 3072]----+
|   .+.o...+o.    |
|    oOo.oo.+     |
|o   o=*o..E .    |
|oo oo. . o o .   |
|o =.  . S o o    |
|=..o   . . .     |
|+++   . .        |
|oO   . .         |
|B.... .          |
+----[SHA256]-----+

SSH-Schlüssel für die Benutzerauthentifizierung werden normalerweise in der Benutzerbasis unter dem Verzeichnis .ssh gespeichert.

Ein Schlüsselpaar generieren

Mit SSH-KEYGEN ein Schlüsselpaar mit der übergabe von Parameter generieren.

$ ssh-keygen -f ~/.ssh/key_rsa -t rsa -b 4096

Die SSH-KEYGEN Parameter haben folgende Bedeutung:
-f die Schlüsseldatei
-t der Algorithmus
-b die Schlüssellänge
Der längste Schlüssel ist 4096. Wird kein Algorithmus übergeben, ist der Standard ein RSA Key.

Bei der Frage nach der Passphrase für den privaten Schlüssel, kann eine Passphrase eingegeben werden, im übernächsten Abschnitt wird gezeigt, wie diese generiert werden kann, durch drücken der Eingabetaste, ohne eine Passphrase wird der Schlüssel ohne Passwortschutz erstellt.

Der Zweck der Passphrase besteht normalerweise darin, den Schlüssel zu schützen. Es handelt sich um einen zweiten Authentifizierungsfaktor. Dies macht die Schlüsseldatei ohne öffentlichen Schlüssel für Angreifer unbrauchbar. Es kommt nicht selten vor das Hacker nach Dateien von kompromittierten Systemen filtern, auch aus Backups und stillgelegter Hardware.

Passphrase (Passwort) generieren

Eine sichere Passphrase kann automatisch generiert werden, mit folgender Eingabe wird eine 32 Zeichen lange Passphrase erzeugt.

$ date +%s | sha256sum | base64 | head -c 32 ; echo

Auch kann OpenSSL genutzt werden, um mit dem eingebauten Zufallsgenerator (rand) eine Passphrase zu generieren, diese wie folgt ausgegeben wird.

$ openssl rand -base64 32

Zum privaten Schlüssel und die dazugehörende Passphrase dürfen nicht autorisierte kein Zugang haben, wird der private Schlüssel entwendet, muss ein neuer generiert werden, daraufhin der öffentliche Schlüssel ebenfalls ausgetauscht wird.

Öffentlicher Schlüssel erneut generieren

Geht nur der öffentliche Schlüssel verloren, zeigt folgende Eingabe wie der öffentliche Schlüssel mit der SSH-KEYGEN Option -y aus dem privaten OpenSSH Schlüssel wieder erzeugt werden kann, dazu wird die Passphrase benötigt.

$ ssh-keygen -y -f ~/.ssh/key_rsa > ~/.ssh/key_rsa.pub

Zu beachten ist, das am Ende der Datei key_rsa.pub der Kommentar (key comment) wieder hinzugefügt werden muss, nach einem Leerzeichen, wie in diesem Beispiel user@host.localdomain:

$ ssh-rsa AAAA...HPCQ== user@host.localdomain

  In key_rsa.pub an keiner weiteren stelle etwas verändern.

Soll die Passphrase entfernt werden, kann dies mit folgender Eingabe druchgeführt werden:

$ ssh-keygen -p -P old_passphrase -N "" -f ~/.ssh/key_rsa

Durch die leere Eingabe zwischen den Anführungszeichen wird keine neue Passphrase geschrieben, somit wird diese gelöscht.

Ein ECDSA-Key generieren

Als nächstes wird mit SSH-KEYGEN ein ECDSA Schlüsselpaar mit der Schlüssellänge 521 Bit erzeugt, und unter der Benutzerbasis ~/.ssh gespeichert. Gültige längen sind 256, 384 or 521 bits.

$ ssh-keygen -f ~/.ssh/key-ecdsa -t ecdsa -b 521

ECDSA ist ein neuer Algorithmus für digitale Signaturen, der von der US-Regierung unter Verwendung elliptischer Kurven standardisiert wurde. Es ist wahrscheinlich aktuell der beste Algorithmus. Die meisten SSH-Clients unterstützen heute ECDSA.

Im Verzeichnis Pfad ~/.ssh wurden nun zwei Dateien erstellt. Die Datei mit der Erweiterung .pub ist der öffentliche Schlüssel. Die Datei key-ecdsa in diesem Beispiel, ist der private Schlüssel und ist nur für den Besitzer lesbar.

-rw-------.  1 user user  801 20. Mai 20:33 key-ecdsa
-rw-r--r--.  1 user user  279 20. Mai 20:33 key-ecdsa.pub

Öffentlicher Schlüssel auf Server speichern

Der öffentliche Schlüssel key-ecdsa.pub als SHA2 Hash wird nun in der Datei authorized_keys auf dem Server im Home Verzeichnis des Benutzers unter .ssh gespeichert.

$ cat ~/.ssh/authorized_keys
ecdsa-sha2-nistp521 AAAAE2vjZHNhLXNoYTItbmlzdHA1MjEFASBIbml
zdHA1MjEAfACFBAHnx0uIYUprY7D7myKMf1H+6NjCIV9U2GhZ69/oRE546i
QsvqSnSBs6SyL2ekvSe2JO3WXkrQ4gGpdLr9+XcLxfbAD79Oc8Z/Gcpr8mN
uKabOc4V/Seyr6AQ3l2KC+k8Wp0SBWG2ZofN0QYsPND8yIUL8Y7bS+t2tH9
dhSmeVwnLHUQNoktbVPoVDHw== user@host.localdomain

Public-Key Transfer mit ssh-copy-id

Um die Authentifizierung mit öffentlichem Schlüssel zu verwenden, muss der öffentliche Schlüssel auf den Server kopiert und in der Datei authorized_keys gespeichert werden. Dies kann bequem mit dem Tool ssh-copy-id durchgeführt werden.

$ ssh-copy-id -i ~/.ssh/key-ecdsa user@host.foo.bar

Nun kann man sich am Server Anmelden ohne das ein Passwort eingegeben werden muss, auch für automatisierte Aufgaben und für Anmeldungen aus Scripts ist diese Methode geeignet.

$ ssh user@host.foo.bar
Last login: Mon May 20 21:53:46 2019 from 192.168.7.85

Bei der Fehlersuche kann der Verbose Modus hilfreich sein, dabei werden zahlreiche Debugging-Meldungen über den Fortschritt ausgegeben, wie Verbindungs-, Authentifizierungs- und Konfigurationsprobleme.

$ ssh -v user@host.foo.bar

  Mehrere -v Optionen erhöht die Ausführlichkeit, max. -vvv.

OpenSSH config

Hat man unterschiedliche Hosts und Schlüsselpaare, kann in der Datei config unter ~/.ssh dies definiert werden.

$ vi ~/.ssh/config
Host *.foo.bar
  User user
  Port 22
  HostKeyAlgorithms +ssh-rsa
  PubkeyAcceptedKeyTypes +ssh-rsa
  IdentityFile key-ecdsa

Host host.fooo.bar
  User user
  Port 22
  HostKeyAlgorithms +ssh-dss
  PubkeyAcceptedKeyTypes +ssh-dss
  IdentityFile id_dss