Schlagwortarchiv: Planet

Tag für den Ubuntuusers.de Planeten.

Raspi-SHT21 in Version 1.2.0 veröffentlicht

Auf GitHub habe ich die Version 1.2.0 des Raspi-SHT21 veröffentlicht.

Raspi-SHT21 ist ein Projekt zur Messung und Visualisierung von Umweltdaten, auf Basis des Raspberry Pi und des SHT21-Sensors.

Der Raspi-SHT21 eignet sich zur Messung von Temperatur und Luftfeuchtigkeit, z.B. in Serverräumen, Kühlräumen, Gewächshäusern, Terrarien, etc. Die ermittelten Werte werden auf dem Raspi in einer CSV-Datei gespeichert und über eine Webseite visualisiert.

Standardmäßig erfolgt die Messung alle 10 Minuten. Das Messintervall kann über eine Konfigurationsdatei an die persönlichen Bedürfnisse angepasst werden. Über die Konfigurationsdatei können ebenfalls Grenzwerte für die Temperatur und Luftfeuchtigkeit festgelegt werden, bei deren Über- bzw. Unterschreiten eine Warnung per E-Mail versendet werden kann.

example-of-configuration-file

Muster der Konigurationgsdatei

Wie man den Raspi zum Versand von E-Mail konfigurieren kann, wird im Artikel Postfix mit Gmail beispielhaft beschrieben.

Die Version 1.2.0 enthält neben den Kernfunktionen auch ein Plugin für die Integration in Nagions/Icinga. So können neben der E-Mail Alarmierung des Raspi auch die Warn- und Alarmfunktionen des Monitoring-Systems verwendet werden.

Das Projekt wurde unter der GNU GPLv3 veröffentlicht und darf von jedermann genutzt und weiterentwickelt werden.

Der Raspi-SHT21 stellt insgesamt eine effiziente und kostengünstige Alternative zu kommerziellen Produkten dar.

Bei allgemeinen Fragen nutzt gern die Kommentarfunktion zu diesem Artikel. Für Fehlermeldungen und Featurerequests nutzt bitte Issue-Funktion des GitHub-Repository.

Quellen und weiterführende Links:
[Artikelwettbewerb] Der Raspberry Pi im professionellen Einsatz
Konzept zur Überwachung von Temperatur und Luftfeuchtigkeit
Überwachung von Temperatur und Luftfeuchtigkeit mit dem SHT21
Visualisierung von Umweltdaten
Postfix mit Gmail als Smarthost
SHT21 Breakout Board

Der eigene Mailserver – Teil 2

Herzlich willkommen zurück bei der Artikelreihe „Der eigene Mailserver“.

Der erste Artikel dieser Reihe handelte von dem zu Grunde liegenden Serverbetriebssystem, dem Remote-Zugriff über SSH und der Installation der ersten Pakete.

In dieser Ausgabe geht es vor allem um die folgenden drei Punkte:

  1. Erwerb und Installation eines SSL/TLS Zertifikats.
  2. Grundlegende Konfiguration von Postfix, so dass E-Mails versendet und empfangen werden und Postfix mit Dovecot zusammenarbeitet.
  3. Grundlegende Konfiguration von Dovecot. Es werden drei virtuelle Benutzer und Mailverzeichnisse angelegt.

Und los geht’s!

Eine Sache noch…

Im ersten Artikel dieser Reihe habe ich geschrieben, dass der Betrieb eines Mailservers im Internet eine verantwortungsvolle Aufgabe ist. Dabei habe ich darauf hingewiesen, dass man stets die Sicherheit des eigenen Systems im Blick haben sollte. Daher ist es, denke ich, ein guter Zeitpunkt, an dieser Stelle zu prüfen, ob es Updates für den eigenen Server gibt und diese zu installieren.

Bei einem Ubuntu Server kann dies ganz einfach mit dem folgenden Befehl durchgeführt werden.

:~$ sudo apt-get update && sudo apt-get upgrade

 

SSL/TLS Zertifikat

Bei der Installation von Postfix und Dovecot im letzten Artikel wurde gefragt, ob man ein selbstsigniertes Zertifikat für Dovecot nutzen möchte. Dies habe ich verneint. Denn für einen Mailserver im Internet benötigt man ein gültiges und vertrauenswürdiges Zertifikat.

Gültig und vertrauenswürdig bedeutet in diesem Fall, dass das Zertifikat von einer anerkannten Zertifizierungsstelle ausgegeben wurde. Dieses Zertifikat wird vom Mailserver genutzt, um sich anderen Mailservern gegenüber zu identifizieren. Selbstsignierte Zertifikate oder jene der gemeinschaftlichen Zertifizierungsstelle CAcert werden von anderen Mailservern in der Regel nicht akzeptiert.

Zum Glück gibt es für Privatpersonen die Möglichkeit, kostenlos ein SSL/TLS Zertifikat z.B. bei der Zertifizierungsstelle StartSSL[1. StartSSL] zu erhalten. Da ich noch kein Zertifikat besitze, werde ich im folgenden die Schritte dokumentieren, um ein Zertifikat von StartSSL zu erhalten. Für die folgenden Schritte muss JavaScript im Webbrowser aktiviert sein.

Wer bereits über ein gültiges und vertrauenswürdiges Zertifikat verfügt, kann dieses natürlich auch verwenden und diesen Abschnitt überspringen.

startssl-express-lane

Startseite von StartSSL.com

Mit der Express Lane geht es weiter zum nächsten Schritt, wo die Daten zur Person abgefragt werden und die CA Policy akzeptiert werden muss. Anschließend erhält man einen Authentifizierungscode per E-Mail.

Die Authentifizierung bei StartSSL erfolgt nicht wie gewohnt mit Benutzername und Passwort, sondern mittels eines Client-Zertifikats, welches mit Hilfe des Webbrowsers generiert und anschließend im Browser installiert wird.

Anschließend ist man direkt in seinem Account angemeldet und durchläuft den Assistenten, um die eigene Domain zu verifizieren. Man folgt der Express Lane, bis man bei folgendem Schritt angelangt ist. Den privaten Schlüssel sollte man tunlichst nicht auf dieser Seite generieren![2. Privaten Schlüssel erstellen]

generate-private-key2

Privater Schlüssel für Domain-Zertifikat

Den privaten Schlüssel sollte man immer auf einem der eigenen Systeme generieren. Dieser gehört niemals in die Hände von Dritten. Auch nicht in die einer Zertifizierungsstelle. Daher erstellen wir den privaten Schlüssel und den Certificate Signing Request (CSR) auf dem eigenen Server.

Da für die folgenden Schritte root-Rechte benötigt werden, wechseln wir mit folgendem Kommando den Benutzer, um uns die Arbeit ein wenig zu erleichtern.

johndoe@server:~$ sudo su
root@server:/home/johndoe#

Nun erstellt man mit dem folgenden Befehl den privaten Schlüssel. Dieser wird als domainname-private-ssl.key gespeichert.

root@server:/home/johndoe# openssl genrsa -out /home/johndoe/domainname-private-ssl.key 4096

Die Angabe 4096 stellt die Stärke bzw. Länge des Schlüssels in Bit dar. Achtung: Schlüssel mit einer Länge von unter 2048 Bit gelten heute nicht mehr als sicher.

Nun kann mit dem nächsten Befehl der CSR erstellt werden. Die Angaben im Code unten stellen dabei Beispiele dar. Beim Common Name ist der Name einzutragen, unter dem der Server später im Internet erreichbar sein wird. Es wird kein „challenge password“ vergeben. Dies müsste später bei jedem Neustart des Webservers eingegeben werden oder im Klartext in einer Textdatei hinterlegt werden. Der erste Fall ist extrem unpraktisch und der zweite extrem unsicher.

root@server:/home/johndoe# openssl req -new -key domainname-private-ssl.key -out /home/johndoe/domainname.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Nordrhein-Westfalen
Locality Name (eg, city) []:.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (e.g. server FQDN or YOUR name) []:server.domainname.tld
Email Address []:webmaster@domainname.tld

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
johndoe@server:/home/johndoe#

Den Inhalt des CSR kopiert man nun in das Eingabefeld des Certification Wizard von StartSSL. Man befolgt die weiteren Schritte des Assistenten und am Ende wird das neu erstellte SSL-Zertifikat angezeigt. Dieses kopieren wir nun in die Datei /etc/ssl/private/ssl-cert-mail-yourdomain.pem. Verwendet man dabei einen Editor wie vim, nutzt man :set paste, bevor man den Text des Zertifikats einfügt. Den im vorhergehenden Schritt erstellten privaten Schlüssel und den CSR kopiert man ebenfalls in das Verzeichnis /etc/ssl/private. Jetzt lädt man noch das Intermediate Zertifikat von StartSSL mittels des folgenden Befehls in das gleiche Verzeichnis herunter.

root@server:/home/johndoe# cd /etc/ssl/private/
root@server:/etc/ssl/private# wget https://www.startssl.com/certs/sub.class1.server.ca.pem
--2014-12-20 14:09:08--  https://www.startssl.com/certs/sub.class1.server.ca.pem
Resolving www.startssl.com (www.startssl.com)... 192.116.242.20
Connecting to www.startssl.com (www.startssl.com)|192.116.242.20|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2212 (2,2K) [application/x509-ca-cert]
Saving to: ‘sub.class1.server.ca.pem’

100%[========================================================================================================================================>] 2.212       --.-K/s   in 0s      

2014-12-20 14:09:09 (63,3 MB/s) - ‘sub.class1.server.ca.pem’ saved [2212/2212]

root@server:/etc/ssl/private#

Als nächstes verknüpft man das Zertifikat mit dem Intermediate-Zertifikat der Zertifizierungsstelle zu einem sogenannten „chain-certificate“. Das sind zwei Zertifikate in einer Datei. Dies ermöglicht es einem Client, die komplette Zertifizierungskette zu überprüfen.

:/etc/ssl/private# cat ssl-cert-mail-domainname.pem sub.class1.server.ca.pem > ssl-chain-mail-domainname.pem

Das soeben erstelle Zertifikat wird später sowohl für Postfix, als auch für Dovecot benutzt. Doch bevor wir fortfahren, schützen wir noch unseren privaten Schlüssel vor unbefugtem Zugriff, indem wir einzig dem root-Benutzer Leserechte auf diese Datei einräumen.

chmod 400 my-it-brain-private-ssl.key

Jetzt wo ich alle Zertifikate in der Reihe habe, geht es an die Konfiguration von Postfix.

/etc/postfix/main.cf

Los geht’s mit:

$ sudo vim /etc/postfix/main.cf

Im Folgenden wird die main.cf dargestellt, wie sie nach der Bearbeitung aussieht. Diese Datei ist nicht für Copy & Paste geeignet. Zum einen funktioniert die Datei nicht und zum Anderen möchte man ja auch erst verstehen, was dort passiert ist. Wer in die Tiefen der Postfix Konfiguration eintauchen möchte, dem sei die offizielle Dokumentation ans Herz gelegt.[3. Postfix Documentation] Die wesentlichen Elemente der Konfigurationsdatei werden im Folgenden näher beschrieben.

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
myorigin = /etc/mailname

## Customized smtpd parameters
smtpd_banner = $myhostname ESMTP
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname, permit
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_client_hostname, reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, reject_unauth_destination, reject_invalid_hostname, reject_non_fqdn_sender
smtpd_sender_restrictions = reject_unknown_sender_domain, reject_sender_login_mismatch, reject_unknown_sender_domain
smtpd_sender_login_maps = $virtual_mailbox_maps

## Dealing with rejection: use permanent 550 errors to stop retries
unknown_address_reject_code = 550
unknown_hostname_reject_code = 550
unknown_client_reject_code = 550

biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = mx.domainname.de
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = mx.domainname.de, domainname.de, h2381200.stratoserver.net, localhost.stratoserver.net, localhost, localhost.domainname.de
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_command = /usr/lib/dovecot/deliver -c /etc/dovecot/dovecot.conf -m "${EXTENSION}"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
home_mailbox = Maildir/
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/dovecot-auth
smtpd_sasl_authenticated_header = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
smtp_use_tls = yes
smtpd_tls_received_header = yes
smtpd_tls_mandatory_protocols = SSLv3, TLSv1
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_auth_only = yes
tls_random_source = dev:/dev/urandom

## customized TLS parameters
smtpd_tls_ask_ccert = yes
smtpd_tls_cert_file = /etc/ssl/private/ssl-chain-mail-domainname.pem
smtpd_tls_key_file = /etc/ssl/private/domainname-private-ssl.key
smtpd_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtpd_tls_ciphers = high
smtpd_tls_loglevel = 1
smtpd_tls_security_level = may
smtpd_tls_session_cache_timeout = 3600s

## Customized Dovecot and virtual user-specific settings
canonical_maps = hash:/etc/postfix/canonical
home_mailbox = Maildir/
message_size_limit = 104857600
virtual_alias_maps = hash:/etc/postfix/virtual
virtual_mailbox_domains = hash:/etc/postfix/virtual-mailbox-domains
virtual_mailbox_maps = hash:/etc/postfix/virtual-mailbox-users
virtual_transport = dovecot

## This setting will generate an error if you restart Postfix before
## adding the appropriate service definition in master.cf, so make
## sure to get that taken care of!
dovecot_destination_recipient_limit = 1

## Other customized mail server settings
default_destination_concurrency_limit = 5
disable_vrfy_command = yes
relay_destination_concurrency_limit = 1
smtp_tls_note_starttls_offer = yes

Ziemlich zu Beginn der Konfigurationsdatei steht die Variable myorigin. Diese enthält den Namen des Mailservers. Auf einem debianbasierten System steht dieser Name in der Datei /etc/mailname.

Es gibt einige smtpd_sasl Optionen in der Datei. SASL ist das Protokoll, über welches Dovcot und Postfix miteinander kommunizieren. Dank des unter Ubuntu verfügbaren Metapakets mail-stack-delivery, welches im letzten Artikel installiert wurde, ist der Großteil der Konfiguration bereits erledigt.

myhostname, mydestination und mynetworks definieren, wer der Mailserver ist und wo (in welchem Netz) sich dieser befindet. Die erste Variable sollte als erstes den FQDN enthalten und nachfolgend einige alternative Namen, unter denen der Mailserver erreichbar ist. Die letzte Variable enthält die Netzadresse in CIDR-Notation. Ihr Wert kann meist so belassen werden, wie man ihn vorfindet.

Mit den smtpd Parametern geht es ans Eingemachte. Denn diese Parameter nehmen direkten Einfluss auf die Arbeitsweise des Mailservers.

Die Option smtpd_banner legt fest, wie sich der Server gegenüber anderen Mailservern identifiziert. Bei Ubuntu enthält diese Option meist noch die Variablen $myhostname und $mail_name zusammen mit dem Zusatz Ubuntu. Um möglichen Angreifern so wenig wie möglich über das eigene System zu verraten, kann diese Option auf das absolut notwendige Minimum gekürzt werden.

smtpd_banner = $myhostname ESMTP

smtpd_helo_required = yes sorgt dafür, dass sich andere SMTP-Server erst identifizieren müssen, bevor Postfix SMTP-Kommandos von diesen akzeptiert. Mit Hilfe dieser und der nächsten Option wird festgelegt, wie Postfix entscheidet, ob Mails akzeptiert oder abgewiesen werden. So wird mit smtpd_helo_restrictions festgelegt, welche HELO Nachrichten akzeptiert werden. permit_mynetworks legt fest, dass Clients aus dem eigenen Netz übermitteln dürfen, was sie wollen. Die übrigen Optionen sind weitestgehend selbsterklärend. Sie weisen den Mailserver an, allen Servern, die einen Namen übermitteln, der nicht über einen DNS-Lookup aufgelöst werden kann, das internationale Zeichen der Freundschaft zu zeigen.

SSL/TLS

Jetzt wird das SSL Zertifikat eingebaut. Zuerst wird mit der Option smtpd_tls_ask_ccert = yes festgelegt, dass Postfix andere Server auffordert, sich mit einem Zertifikat zu identifizieren. Die beiden Optionen smtpd_tls_cert_file und smtpd_tls_key_file enthalten den vollständigen Pfad zum SSL-Zertifikat und der Datei mit dem privaten Schlüssel, welcher zum Zertifikat gehört. smtpd_tls_CAfile enthält den vollständigen Pfad /etc/ssl/certs/ca-certificates.crt und hilft Postfix, die Zertifikate anderer Server zu überprüfen.

Die Option smtp_tls_ciphers = high verbietet Postfix, schwache Verschlüsselungs-Chiffren zu verwenden. smtpd_tls_security_level = may weist Postfix an, SSL/TLS zu verwenden, wenn der entfernte Server dies ebenfalls unterstützt. Damit folgt die Konfiguration dem RFC 2487.

master.cf

Es gibt noch eine Konfigurationsdatei, welche bearbeitet werden muss. /etc/postfix/master.cf steuert, wie Postfix mit anderen Diensten, wie z.B. Dovecot, interagiert. Hier wird festgelegt, dass Postfix auch auf Port 587 auf eingehende E-Mails lauscht und wie er sich mit Dovecot verbindet. Dazu sind zwei Änderungen notwendig.

Die folgende Zeile ist durch Entfernen des # einzukommentieren:

#submission inet n       -       -       -       -       smtpd

Am Ende der Datei wird der folgende Code eingefügt. Wichtig dabei ist, den Zeileneinzug der zweiten und dritten Zeile beizubehalten:

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver
  -f ${sender} -d ${recipient}

Map Files

In den Postfix Konfigurationsdateien finden sich Verweise auf „maps“ und „hashes“. Dies sind Orte, wo Postfix Informationen speichert. Diese werden im Folgenden näher erläutert.

Die Datei /etc/aliases legt fest, welche lokalen Benutzerkonten welchen E-Mail Adressen zugeordnet sind. Damit kann gesteuert werden, an welche E-Mail Adressen Statusmeldungen gesendet werden, die von unterschiedlichen Anwendungen generiert werden. Ich habe meine Datei nach dem folgenden Muster aufgebaut:

postmaster: webmaster@yourdomain.com
root: webmaster@yourdomain.com
www-data: webmaster@yourdomain.com

Damit werden alle lokalen Mails an eine echte E-Mail Adresse gesendet.

Postfix liest seine Informationen jedoch aus einer Binärdatei. Diese wird mit dem folgenden Befehl erstellt.

sudo newaliases

Virtuelle Benutzer

Jetzt geht es darum, wie Postfix entscheidet, wie und wohin er E-Mails zustellt.

Zuerst wird die Datei /etc/postfix/virtual-mailbox-domains erstellt, welche die Domain(s) beinhaltet, für die der Mailserver zuständig ist. Der Inhalt der Datei ist simpel und sieht wie folgt aus.

yourdomain.tld		OK

Aus dieser Map machen wir mit dem folgenden Kommando eine Hash-Datei.

postmap /etc/postfix/virtual-mailbox-domains

Als nächstes wird die Datei /etc/postfix/virtual-mailbox-users erstellt, welche Postfix mitteilt, für welche Benutzer er zuständig ist. Diese Datei besteht aus zwei Spalten. Ganz einfach ausgedrückt wird damit sichergestellt, dass wenn man sich als „name@domainname.tld“ am Dovecot anmeldet, Postfix weiß, dass man E-Mails von der Adresse „name@domainname.tld“ aus versenden darf.

Beispielinhalt der Datei:

you@domainname.tld			you@domainname.tld
postbot@domainname.tld			postbot@domainname.tld
webmaster@domainname.tld		webmaster@domainname.tld

Wenn die Datei angelegt ist, führt man erneut das postmap-Kommando aus.

postmap /etc/postfix/virtual-mailbox-users

Zuletzt wird noch die Map /etc/postfix/virtual erstellt. Mit Hilfe dieser Map können Alias-E-Mail Adressen den echten E-Mail Adressen zugeordnet werden. Die Aliase stehen dabei in der ersten, die ihnen zugeordneten „echten“ E-Mail Adressen in der zweiten Spalte.

Beispiel:

you@domainname.tld		you@domainname.tld
postbot@domainname.tld		postbot@domainname.tld
webmaster@domainname.tld	webmaster@domainname.tld
postmaster@domainname.tld	webmaster@domainname.tld
root@mail.domainname.tld	webmaster@domainname.tld
root@domainname.tld		webmaster@domainname.tld
abuse@domainname.tld		webmaster@domainname.tld
hostmaster@domainname.tld	webmaster@domainname.tld

Benötigt man eine sogenannte Catch-All Adresse, fügt man noch folgende Zeile in die soeben erstellte Datei ein:

@domainname.tld              you@domainname.tld

Ist man mit der Erstellung der Datei fertig, ist es wieder Zeit für postmap:

postmap /etc/postfix/virtual

Ok. Zeit kurz durchzuatmen. Als nächstes legen wir einen Benutzer und ein Verzeichnis an, wo die Mails für unsere virtuellen Benutzer abgelegt werden. Ich halte mich hier an das Tutorial von ars technica und verwende für den benötigten lokalen Benutzer ebenfalls die UID 5000 und die GID 5000.[4. Lee Hutchinsoen: Taking e-mail back, part 2: Arming your server with Postfix and Dovecot:
Our self-hosting e-mail series continues as we get our ducks—and doves—in a row.
] Im Dateisystem des Linux Root-Servers existiert bereits das Verzeichnis /var/mail. Hier landen die Mails für die lokalen Benutzer des Systems. Hier wird auch ein Verzeichnis angelegt, wo zukünftig alle Mails der virtuellen Benutzer landen. Dazu werden die beiden folgenden Befehle in einer root shell ausgeführt.

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail/vmail -m

Jetzt geht es Dovecot an den Kragen.

Als erstes öffnet man die Datei /etc/dovecot/conf.d/10-ssl.conf und kommentiert die Zeilen 12 und 13 aus. Dies erspart Ärger mit der SSL-Konfiguration. Schließlich soll das eigens für den Mailserver erstellte SSL-Zertifikat verwendet werden.

Bevor es an die eigentliche Konfiguration geht, werden noch einige Zeilen in ein paar anderen Konfigurationsdateien auskommentiert, damit die Konfiguration später nicht durch diese Optionen überschrieben wird.

  • Zeile mail_location in 10-mail.conf auskommentieren
  • Zeile auth_mechanisms = plain in 10-auth.conf auskommentieren
  • Die Sektion passdb in der Datei auth-system.conf.ext auskommentieren
  • Die Sektion userdb in der Datei auth-systems.conf.ext ebenfalls auskommentieren

Ist das erledigt, geht es nun der Datei 99-mail-stack-delivery.conf an den Kragen. Nach der Bearbeitung sollte diese wie folgt aussehen.
# /etc/dovecot/conf.d/99-mail-stack-delivery.conf
# Some general options
protocols = imap sieve
disable_plaintext_auth = yes
ssl = yes
ssl_cert = </etc/ssl/private/ssl-chain-mail-cert.pem
ssl_key = </etc/ssl/private/private-ssl.key
ssl_client_ca_dir = /etc/ssl/certs
ssl_cipher_list = ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:R
SA+AES:RSA+3DES:!ADH:!AECDH:!MD5:!DSS
mail_home = /var/mail/vmail/%d/%n
mail_location = maildir:/var/mail/vmail/%d/%n/mail:LAYOUT=fs
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@

# IMAP configuration
protocol imap {
mail_max_userip_connections = 10
imap_client_workarounds = delay-newmail tb-extra-mailbox-sep
}

# LDA configuration
protocol lda {
postmaster_address = webmaster@my-it-brain.de
mail_plugins = sieve
quota_full_tempfail = yes
deliver_log_format = msgid=%m: %$
rejection_reason = Your message to <%t> was automatically rejected:%n%r
}

# Managesieve configuration
#protocol managesieve {
#listen = 127.0.0.1:2000
#login_executable = /usr/lib/dovecot/managesieve-login
#mail_executable = /usr/lib/dovecot/managesieve
#managesieve_max_line_length = 65536
#}

# Plugins configuration
plugin {
sieve=~/.dovecot.sieve
sieve_dir=~/sieve
sieve_before = /var/mail/vmail/sieve-before
sieve_after = /var/mail/vmail/sieve-after
}

# Authentication configuration
auth_mechanisms = plain login

passdb {
driver = passwd-file
args = username_format=%u scheme=ssha512 /etc/dovecot/passwd.db
deny = no
master = no
pass = no
skip = never
result_failure = continue
result_internalfail = continue
result_success = return-ok
}

userdb {
driver = static
args = uid=5000 gid=5000 home=/var/mail/vmail/%d/%n
}

# Log all failed authentication attempts
auth_verbose=yes

service auth {
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/dovecot-auth {
mode = 0660
user = postfix
group = postfix
}
}

Was ist hier alles passiert?

Als Erstes wurde das POP3 Protokoll entfernt, da ich nur IMAP und Sieve nutzen werde. Sieve ermöglicht die Erstellung umfangreicher und flexibler Mailfilter-Regeln. Doch mehr dazu in Teil 3.

Als Nächstes wird SSL aktiviert und Dovecot der Ort des SSL-Zertifikats, des privaten Schlüssels und das Verzeichnis mit den Zertifikaten der Root CAs mitgeteilt.

Die mail_home und mail_location Direktiven legen fest, wo Dovecot die E-Mails zustellt. Hier sind zwei Variablen enthalten. „%d“ steht für die genutzte Maildomain. „%n“ steht für den Namen der virtuellen Benutzer. Dies bedeutet, dass eine E-Mail an „webmaster@domainname.tld“ im Verzeichnis /var/mail/vmail/domainname.tld/webmaster zugestellt wird.

Die mail_location Direktive legt fest, dass das „maildir“ Format[5. Wikipedia: Maildir] genutzt wird. Das bedeutet, der Posteingang und weitere Verzeichnisse existieren auf dem Server in Form ganz normaler Verzeichnisse. Maildir ist eines von zwei weit verbreiteten E-Mail Speicherverfahren. Das andere ist MBOX, welches alle Nachrichten in einer einzigen langen Datei speichert. Ich habe mich für die Verwendung von Maildir entschieden, da ich so besser einzelne Nachrichten auf der Kommandozeile behandeln kann. Dies ist von Vorteil bei der Konfiguration und dem Training des Anti-Spam Systems in Teil 3 dieser Artikelreihe.

In der Sektion passdb wird definiert, wie und wo die Passwörter der virtuellen Benutzer gespeichert werden. Die Optionen in dieser Sektion stellen sicher, dass ein Benutzer, der ein falsches Passwort eingibt, keinen Zugriff auf ein Postfach erhält.

Mit den Optionen unter userdb wird festgelegt, dass ein virtueller Benutzer namens „vmail“ verwendet wird.

Bevor die Konfiguration von Dovecot beendet werden kann, sind noch die Passwörter für die virtuellen Benutzer zu vergeben, so dass diese sich mit einem Mailclient mit dem Server verbinden können, um E-Mails zu versenden und zu empfangen. Die Passwörter werden in diesem Fall in der verschlüsselten Datei /etc/dovecot/passwd.db gespeichert. Die Passwörter werden interaktiv in der Konsole generiert, damit sie nicht in der Bash-History gespeichert werden. Dabei hilft das doveadm Tool:

doveadm pw -s SSHA512

Das Tool fordert dazu auf, ein Passwort einzugeben und dieses zu bestätigen. Anschließend gibt es den verschlüsselten und gesalzenen String aus. Anschließend wird die Datei /etc/dovecot/passwd.db erstellt und nach diesem Muster gefüllt:

you@yourdomain.com:{SSHA512}OeR5ulGD3LZ0OHuj9muNqSvKB7hxsxnTquSd8AjK8QXrtOAGqxhxdRs093CzcuaX1PXmOkBGXbQCftYc0tpbo83uZ7Y=
postbot@yourdomain.com:{SSHA512}BPhYH6qtRAtcpCpHxZ919HAve7GGYc4QIIGPIIPCQ2JHhsfVJkzbEsITNL9dvf20YsPNec68LjfLi+TXwS35RrOnElE=
webmaster@yourdomain.com:{SSHA512}o0LG4pTPeHkTZDvqeQufuULcY07YPb2EyA46M5yYtZOAcLI2k4Ee7ADkHSePl/mYdinapCkc7ZEYDvOsi3wg/ungtos=

Jede Zeile startet mit der E-Mail Adresse des dazugehörigen E-Mail Kontos, gefolgt von einem Doppelpunkt und dem kompletten String für das verschlüsselte Passwort.

Der Posteingang und alles Andere

Die wirklich letzte zu bearbeitende Datei ist 15-mailboxes.conf, wo konfiguriert wird, welche Verzeichnisse für jeden virtuellen Benutzer erstellt werden. Hier wird sichergestellt, dass jeder Benutzer seinen eigenen Gesendet-, Entwürfe-, Spam-Ordner und Papierkorb bekommt. Es befinden sich bereits Ordnerdefinitionen in dieser Datei. Diesen fügen wir die Zeile auto = subscribe hinzu. Die Datei sollte ohne Kommentare in etwa wie folgt aussehen:

namespace inbox {
	mailbox Drafts {
		special_use = \Drafts
		auto = subscribe
	}
	mailbox Junk {
		special_use = \Junk
		auto = subscribe
	 }
	mailbox Trash {
		special_use = \Trash
		auto = subscribe
	}
	mailbox Sent {
		special_use = \Sent
		auto = subscribe
	  }
}

Dovecot wird neugestartet und anschließend testet man die Konfiguration mit

dovecot -n

Ähnelt die Ausgabe der folgenden, ist alles korrekt.

$ dovecot -n
# 2.2.9: /etc/dovecot/dovecot.conf
# OS: Linux 3.13.0-042stab092.3 x86_64 Ubuntu 14.04.1 LTS reiserfs
auth_mechanisms = plain login
auth_verbose = yes
mail_home = /var/mail/vmail/%d/%n
mail_location = maildir:/var/mail/vmail/%d/%n/mail:LAYOUT=fs
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date ihave
namespace inbox {
  inbox = yes
  location = 
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Junk {
    auto = subscribe
    special_use = \Junk
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox Trash {
    auto = subscribe
    special_use = \Trash
  }
  prefix = 
}
passdb {
  args = username_format=%u scheme=ssha512 /etc/dovecot/passwd.db
  driver = passwd-file
}
plugin {
  sieve = ~/.dovecot.sieve
  sieve_after = /var/mail/vmail/sieve-after
  sieve_before = /var/mail/vmail/sieve-before
  sieve_dir = ~/sieve
}
protocols = imap sieve
service auth {
  unix_listener /var/spool/postfix/private/dovecot-auth {
    group = postfix
    mode = 0660
    user = postfix
  }
}
ssl_cert =  was automatically rejected:%n%r
}
protocol imap {
  imap_client_workarounds = delay-newmail tb-extra-mailbox-sep
  mail_max_userip_connections = 10
}

Damit ist das Ende von Teil 2 erreicht. Postfix und Dovecot sind fast vollständig konfiguriert. Was ist noch zu tun?

In Teil 3 dieser Artikelreihe geht es um DNS. Es werden DNS Einträge benötigt, damit Clients den Mailserver finden und auch E-Mails an den richtigen Server geroutet werden können. Außerdem wird es noch um ein paar spezielle DNS-Records gehen, die anderen Servern beweisen sollen, dass wir legitime E-Mails und keinen Spam versenden.

Ebenfalls wird es um eine Anti-Spam Lösung gehen. Spamassassin in Kombination mit einem Virenscanner. Der Mailserver wird nochmal auf Herz und Nieren geprüft und dann im großen weiten Internet bekannt gemacht.

Zum guten Schluss geht es in Teil 4 darum, wie der Webmailer Roundcube installiert und konfiguriert wird. Dieser Teil ist optional, da der Webserver bereist am Ende von Teil 3 fertig für den produktiven Einsatz ist. Aber mal ehrlich, was ist ein Mailsystem schon ohne Webmail?

Bis nächste Woche.

Der eigene Mailserver – Start der Artikelreihe

Wie man den eigenen Mailserver mit eigener Domain möglichst sicher im Internet betreibt wird Gegenstand einer kleinen Artikelreihe sein.

Die Idee dazu kam mir, nachdem ich eine englischsprachige Artikelreihe zum Thema auf ars technica gelesen habe.[1. Hutchinson, Lee (17.02.2014). How to run your own e-mail server with your own domain, part 1: Gmail? Apple? The cloud? Forget ‚em all—in this series, we take your e-mail back.] Ich werde nach dem Muster von Lee einen Linux Mailserver aufsetzen und zur Nutzung mit einer eigenen Domain konfigurieren. Die dazu erforderlichen Schritte werde ich in den kommenden Artikeln festhalten. Sie sollen mir als Dokumentation und euch als Leitfaden dienen. Fangen wir an.

Ein paar Worte vorweg

Einen Mailserver im Internet zu betreiben ist eine verantwortungsvolle Aufgabe. Arbeitet man hier nicht sorgfältig, schafft man leicht ein sogenanntes Open Relay, welches sehr schnell als Spamschleuder missbraucht werden wird. Um genau dies zu verhindern, muss man bei jedem Arbeitsschritt die Sicherheit des Systems im Hinterkopf behalten und die eigene Konfiguration permanent auf mögliche Schwachstellen hin überprüfen.

Mit der Installation und Konfiguration ist es nicht getan. Der dauerhafte Betrieb eines Mailservers bringt einige wiederkehrende Aufgaben mit sich. Der Server ist regelmäßig zu warten. Sicherheitsupdates müssen installiert werden, die verwendeten Dienste sollten stets auf die aktuellste Version aktualisiert werden und von Zeit zu Zeit sollte man die Logdateien auf ungewöhnliche Vorkommnisse hin überprüfen.

Diese Artikelreihe wird keine Schritt-für-Schritt Anleitung. Grundlegende Kenntnisse in Linux, der Arbeit in einem Terminal, der Nutzung eines Texteditors und der Umgang mit der Paketverwaltung werden vorausgesetzt. Auch solltet ihr in der Lage sein, euch eure eigene Domain zu shoppen. ;-)

Wer auf all dies keine Lust hat, hört am besten hier zu lesen auf. Allen anderen wünsche ich viel Spaß und Erfolg auf dem Weg zum eigenen Mailserver.

Wie ist diese Reihe aufgebaut?

Dieser Artikel gibt eine Einführung in die E-Mail Terminologie. Anschließend gehe ich auf das verwendete Betriebssystem und die Dienste ein, welche zur Realisierung des Mailservers zum Einsatz kommen.

Die Links im Text führen euch auf Seiten, die weiterführende Informationen zum verwendeten Begriff bieten. Die für diese Artikelreihe verwendeten Quellen werden als Fußnoten am Ende des jeweiligen Artikels aufgeführt. Benötigt ihr zur Durchführung einzelner Schritte weitere Informationen, so helfen euch diese Quellen weiter.

Die folgenden Artikel führen durch die Tiefen der Konfiguration, der hier vorgestellten Rollen und Dienste und beschreiben, wie man sein System härtet, um es so gut wie möglich vor Missbrauch zu schützen.

Die Terminologie

Ein Mailserver ist kein einzelner Dienst. Vielmehr setzt sich ein Mailsystem aus unterschiedlichen Komponenten zusammen, die nicht einmal auf demselben Rechner laufen müssen (und es bei größeren Installationen meist auch nicht tun).[2. Mailserver-Einführung]

Diese Artikelreihe orientiert sich an der Terminologie aus der Mailserver-Einführung im Wiki von ubuntuusers.de. Die wichtigsten Begriffe möchte ich hier wiedergeben.

  • MTA (Mail Transfer Agent)/SMTP-Server: zuständig für den Transport der Mail von einem System zum anderen (mehr zu MTA und SMTP)
  • MDA (Mail Delivery Agent): stellt die Post auf dem lokalen System zu (mehr zu MDA)
  • MRA (Mail Retrieval Agent): holt Post von einem entfernten Server ab (mehr zu MRA)
  • IMAP-/POP3-Server: hält die Post für den Endbenutzer bereit, damit er sie mit seinem Mailprogramm (MUA – Mail User Agent) abholen und lesen kann (mehr zu IMAP, POP3 und MUA)

Der Server – Das Betriebssystem

Für einen echten E-Mailserver benötigt man einen Server mit einer öffentlichen IP-Adresse, welche im Internet geroutet wird. Hostingprovider, welche diese Server für eine monatliche Gebühr anbieten, findet man mit der Suchmaschine seiner Wahl reichlich im Netz.

Bei der Auswahl eines Hostingproviders kann man sich das erste Mal Gedanken über die Sicherheit machen. Hier empfiehlt es sich auf einen Anbieter setzen, der sich nach dem internationalen Standard ISO 27001 zertifizieren lässt. Diese Norm spezifiziert Anforderungen für die Implementierung geeigneter Sicherheitsmechanismen. So hosten z.B. auch Großbanken ihre Dienste in Rechenzentren, die sich an den Vorgaben der ISO 27001 orientieren.

Wenn man sich einen Root-Server sucht, sollte man außerdem darauf achten, dass der Provider neben der normalen IPv4 Adresse dem Server auch eine IPv6 Adresse spendiert. So stellt man von Anfang an sicher, dass der eigene Mailserver auch über das neue IP-Protokoll erreichbar ist.

Als Betriebssystem für einen Linux Mailserver kann im Prinzip jede beliebige Linux-Distribution dienen, solange die im nächsten Abschnitt genannten Pakete für die gewählte Distribution verfügbar sind.

Aufgrund persönlicher Vorlieben habe ich mich für Ubuntu Server 14.04.1 LTS entschieden. Diese Version verfügt über Long Term Support und wird bis April 2019 mit Sicherheitsaktualisierungen versorgt.

Darüber hinaus ist Ubuntu eine sehr beliebte Distribution, die bei fast allen Hostingunternehmen zur Verfügung steht. Ubuntu stellt dabei ein Metapaket bereit, welches es uns ermöglicht, zügig und sicher ein vollständiges Mailsystem aufzusetzen. Doch später mehr dazu.

Hat man seinen Root-Server bestellt und das Betriebssystem installiert, erfolgt der Zugriff darauf meist via SSH. Der SSH-Dienst wird über die Datei /etc/ssh/sshd_config konfiguriert. Bei Ubuntu ist die Standardkonfiguration schon ganz akzeptabel und bei Verwendung eines starken Passworts auch ausreichend sicher. Statt der Authentifizierung über Benutzername und Passwort kann man sich alternativ auch via Pulbic-Key[3. Authentifizierung über Public Keys] authentifizieren. Damit ist man selbst vor dem unwahrscheinlichen Fall geschützt, dass jemand das verwendete Passwort errät.

Darüber hinaus werden noch einige Optionen in der /etc/ssh/sshd_config wie folgt gesetzt (Erklärung siehe Kommentar im Code):

# Niemand kann sich direkt als root einloggen.
PermitRootLogin no
# Nur die hier aufgeführten Benutzer dürfen sich einloggen.
AllowUsers JohnDoe JaneDoe
# Hiermit wird die Anmeldung mit Benutzername und Passwort deaktiviert.
PasswordAuthentication no 

Anschließend nicht vergessen, die geänderte Konfiguration neu zu laden.

Auf dem Server läuft außer dem OpenSSH-Server noch kein weiterer Dienst. Ob dies so ist, kann man mit dem Kommando netstat überprüfen, welches folgende Ausgabe liefern sollte:

john@server:~$ sudo netstat -tulpen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          150403263   1527/sshd       
tcp6       0      0 :::22                   :::*                    LISTEN      0          150403265   1527/sshd       
john@server:~$

Ok. Damit ist der Root-Server soweit, dass er nur auf SSH-Verbindungen wartet und diese nur akzeptiert, wenn sich ein autorisierter Benutzer mittels publickey authentifiziert.

Der SSH-Dienst ist ein beliebtes Ziel für Brute-Force-Angriffe. Um auch für diese gerüstet zu sein und den Server im Fall einer Attacke etwas zu entlasten, kann man noch zusätzlich das Paket fail2ban[4. Manual Fail2Ban 0.8] installieren. Mit diesem Paket ist es möglich, Brute-Force-Angriffe zu erkennen und die IP-Adresse des oder der Angreifer für eine gewisse Zeit zu blockieren. Hierzu setzt fail2ban automatisch die benötigten iptables-Regeln.

Was wird sonst noch benötigt?

Neben dem Betriebssystem benötigt man noch eine ganze Reihe weiterer Dinge. Da sind

  • Postfix, der MTA zum Senden und Empfangen von E-Mail
  • Dovecot, der MDA, welcher uns das Protokoll IMAP bereitstellen wird
  • SpamAssassin, um unseren Posteingang frei von Spam zu halten
  • ClamAV, um auch etwas gegen die Viren zu tun
  • Sieve, damit konfigurieren wir Filterregeln
  • Roundcube, da ein guter Webmailer in keinem Mailsystem fehlen darf
  • NGINX und PHP-FPM, um Roundcube auch ausliefern zu können

All diese Dienste gilt es zu härten und abzusichern. Die Kommunikationsverbindungen werden mit SSL/TLS gesichert. Für die eigene Maildomain werden DKIM und SPF konfiguriert.

Und ganz am Ende haben wir nicht nur einiges über Linux und die Absicherung von Diensten im Internet gelernt, sondern sind ebenfalls im Besitz unseres eigenen Mailservers.

Bevor es jetzt weitergehen kann, müssen die beiden folgenden Voraussetzungen erfüllt sein:

  1. Root-Server mit öffentlicher IP-Adresse und installierten Betriebssystem steht bereit.
  2. Man ist im Besitz einer eigenen Domain und hat einen DNS-Record gesetzt, welcher auf den eigenen Root-Server zeigt.

Und ab dafür

Hat man sich bei der Wahl des Betriebssystems für Ubuntu entschieden, hat man es jetzt leicht. Denn hier gibt es ein Metapaket, welches postfix und dovecot in einem Rutsch installiert und beide Anwendungen so konfiguriert, dass sie miteinander spielen mögen. Dazu führt man folgenden Befehl aus.

:~$ sudo apt-get install mail-stack-delivery

Nach einem kleinen Augenblick erscheint ein Bildschirm, der dazu auffordert, zu entscheiden, ob man ein selbstsigniertes SSL-Zertifikat für Dovecot nutzen möchte oder nicht.

Konfiguriere dovecot-core: Wollen Sie ein selbstsigniertes SSL-Zertifikat erstellen?

Konfiguriere dovecot-core: Wollen Sie ein selbstsigniertes SSL-Zertifikat erstellen?

Für eine reine Testumgebung reicht ein selbstsigniertes Zertifikat aus. Möchte man den Server mit eigener Domain im Internet betreiben, wählt man hier lieber „No“. In Teil 2 dieser Artikelreihe werde ich noch darauf eingehen, wie man an ein SSL-Zertifikat kommt, dem die gängigen Browser und Betriebssysteme vertrauen.

Einen Moment später erscheint eine Konfigurationsabfrage zu Postfix. Hier wählt man die Option „Internet Site“ aus, um später im Internet E-Mails senden und empfangen zu können.

Postfix Configuration: Internet Site

Postfix Configuration: Internet Site

Der nächste Konfigurationsdialog fordert dazu auf, den Domain-Namen des E-Mailsystems anzugeben. Hier wird der Name der eigenen Domain eingetragen. Möchte man den Server ausschließlich in einer Testumgebung im lokalen LAN betreiben, kann man hier auch so etwas wie testdom.local eintragen.

Postfix Configuration: System-E-Mail-Name

Postfix Configuration: System-E-Mail-Name

Anschließend lässt man die Installation bis zu Ende durchlaufen.

Weiter geht es in Teil 2 dieser Artikelreihe. Dort werde ich beschreiben, wie man ein SSL/TLS Zertifikat bekommt sowie wo und wie die Namen und Kennwörter von E-Mail Benutzern samt der zugehörigen Postfächer gespeichert werden. Am Ende von Teil 2 ist das Mailsystem schon fast voll funktionsfähig. Doch ich bin noch lang nicht fertig.

Denn es fehlt noch an AntiSpam, AntiVirus, Filter-Regeln, DKIM, SPF und unser Webmailer Roundcube. Also bleibt dran, es gibt noch viel zu entdecken.

Automatische Installation von Sicherheitsupdates

Wie bei jedem Betriebssystem sollten auch bei Ubuntu regelmäßig Updates installiert werden. Dabei handelt es sich um Fehlerkorrekturen, welche die Stabilität des Systems verbessern und insbesondere potenzielle oder erwiesene Sicherheitslücken schließen.[1. Ubuntuusers Wiki: Konfiguration der automatischen Aktualisierung]

Die Installation von Sicherheitsupdates ist eine Aufgabe, die man hervorragend automatisieren kann, um administrativen Aufwand zu sparen. Dazu installiert man unter Ubuntu das folgende Paket:

sudo apt-get install unattended-upgrades

Um die automatischen Updates zu aktivieren, wird die Datei /etc/apt/apt.conf.d/10periodic angelegt bzw. bearbeitet. Diese sollte mindestens die folgenden Einträge enthalten:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "1";

In der Datei /etc/apt/apt.conf.d/50unattended-upgrades wird festgelegt, welche Art von Updates automatisch installiert werden sollen. Möchte man ausschließlich Sicherheitsupdates automatisch installieren lassen, so ist dies mit der folgenden Konfiguration möglich:

// Automatically upgrade packages from these (origin:archive) pairs
Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}-security";
//      "${distro_id}:${distro_codename}-updates";
//      "${distro_id}:${distro_codename}-proposed";
//      "${distro_id}:${distro_codename}-backports";
};

Damit ist schon alles Nötige getan. Unter /var/log/unattended-upgrades findet man noch ein Log, um überprüfen zu können, welche Änderungen am System durch die automatische Updateinstallation durchgeführt wurden.

Der Unterschied zwischen einem Systembenutzer und einem normalen Benutzer

Mit den Kommandozeilenwerkzeugen adduser und useradd kann man neben normalen Usern auch sogenannte Systemuser anlegen.

Viele fragen sich hierbei, was eigentlich der Unterschied zwischen diesen beiden Arten von Benutzerkonten ist. Da auch ich mir diese Frage schon ein paar Mal gestellt habe, möchte ich sie mit diesem Artikel endgültig beantworten.

Ich beginne dabei mit ein paar kleinen Auszügen aus der Manpage. Anschließend werde ich für jeden Benutzertyp ein Konto anlegen, um beide direkt miteinander vergleichen zu können.

Die Theorie

In der Manpage von adduser finden sich folgende Einträge:

 Add a normal user
       If  called  with  one  non-option  argument and without the --system or
       --group options, adduser will add a normal user.

       adduser will choose the first available UID from  the  range  specified
       for  normal users in the configuration file.  The UID can be overridden
       with the --uid option.
[...]
 Add a system user
       If called with one non-option argument and the --system option, adduser
       will add a system user. If a user with the same name already exists  in
       the  system uid range (or, if the uid is specified, if a user with that
       uid already exists), adduser will exit with a warning. This warning can
       be suppressed by adding "--quiet".

       adduser  will  choose  the first available UID from the range specified
       for system  users  in  the  configuration  file  (FIRST_SYSTEM_UID  and
       LAST_SYSTEM_UID).  If  you want to have a specific UID, you can specify
       it using the --uid option.

Auf den ersten Blick scheint der Unterschied in der Vergabe von UID und GID zu liegen. Welcher Bereich dabei für die jeweiligen Benutzer gilt, wird in einer Konfigurationsdatei festgelegt. Unter Ubuntu ist dies z.B. die Datei /etc/adduser.conf:

# FIRST_SYSTEM_[GU]ID to LAST_SYSTEM_[GU]ID inclusive is the range for UIDs
# for dynamically allocated administrative and system accounts/groups.
# Please note that system software, such as the users allocated by the base-passwd
# package, may assume that UIDs less than 100 are unallocated.
FIRST_SYSTEM_UID=100
LAST_SYSTEM_UID=999

FIRST_SYSTEM_GID=100
LAST_SYSTEM_GID=999

# FIRST_[GU]ID to LAST_[GU]ID inclusive is the range of UIDs of dynamically
# allocated user accounts/groups.
FIRST_UID=1000
LAST_UID=29999

FIRST_GID=1000
LAST_GID=29999

So liegen die UID und GID von Systembenutzern in diesem Fall zwischen 100 und 999 und die der normalen Benutzer zwischen 1000 und 29999.

Des Weiteren wird laut Manpage für normale Benutzer eine Gruppe mit gleichem Namen wie das Benutzerkonto angelegt. System-Benutzer werden hingegen standardmäßig in die Gruppe nogroup einsortiert.

Die Praxis

Nach der Theorie kommt bekanntlich die Praxis. Diese beginnt mit der Erstellung eines normalen Test-Benutzers.

:~$ sudo adduser test
Adding user `test' ...
Adding new group `test' (1004) ...
Adding new user `test' (1003) with group `test' ...
Creating home directory `/home/test' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for test
Enter the new value, or press ENTER for the default
        Full Name []: Vorname Nachname
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y
:~$

Der neue Benutzer test wird automatisch einer Gruppe mit dem gleichen Namen zugewiesen. Der User bekommt dabei die UID 1003, während die Gruppe die GID 1004 erhält. Es wird ein Home-Verzeichnis erstellt und die Standardkonfigurationsdateien werden aus dem Verzeichnis /etc/skel in das Home-Verzeichnis kopiert. Anschließend werden noch ein paar allgemeine Informationen zum Benutzer abgefragt, bevor dieser endgültig erstellt wird.

Wird ein System-Benutzer angelegt, sieht das ganze wie folgt aus:

:~$ sudo adduser --system test2
Adding system user `test2' (UID 114) ...
Adding new user `test2' (UID 114) with group `nogroup' ...
Creating home directory `/home/test2' ...
:~$

Oh Wunder, die Manpage hat recht behalten. Der Benutzer test2 wird mit der UID 114 angelegt und der Gruppe nogroup zugewiesen. Anschließend wird noch das Home-Verzeichnis erstellt und schon ist Schluss. Ach ja, es wurde gar kein Passwort vergeben. Warum eigentlich nicht?

System-Benutzer werden meist von Programmen und Diensten für ihre Ausführung benötigt. Da es sich dabei um keine echten Benutzer handelt, wird auf die Abfrage des vollständigen Namen etc. verzichtet. Auf ein Passwort wird ebenfalls verzichtet. Denn es wäre sehr unpraktisch, dieses jedes Mal eingeben zu müssen, wenn ein Dienst auf eine Datei zugreifen möchte. Und bevor man das Passwort im Klartext in einer Textdatei speichert, vergibt man besser erst gar keins. ;-) Doch ob dies die einzigen Unterschiede sind, wird sich gleich noch zeigen.

Mit der Anlage eines Benutzers werden Einträge in /etc/passwd und /etc/groups hinzugefügt. Die beiden soeben erstellten Test-Benutzer haben dort folgende Einträge:

:~$ cat /etc/passwd | grep test
test:x:1003:1004:Vorname Nachname,,,:/home/test:/bin/bash
test2:x:114:65534::/home/test2:/bin/false

:~$ cat /etc/group | grep test
test:x:1004:
:~$

Der Blick in die Datei /etc/passwd offenbart, dass der normale Benutzer test über eine Login-Shell (/bin/bash) verfügt. Dieser Benutzer ist also in der Lage, sich interaktiv an einem Terminal oder einer SSH-Sitzung anzumelden. Dem System-Benutzer hingegen wurde keine Login-Shell zugewiesen (/bin/false). Dieser ist daher im Gegensatz zum normalen Benutzer nicht in der Lage, sich an einem Terminal oder über SSH am System anzumelden.

Ein Blick in die Gruppe /etc/group offenbart, dass die Gruppe test mit der GID 1004 erstellt wurde, während es für test2 keine Gruppe gibt.

Fazit

Normale Benutzerkonten werden in der Regel für echte Benutzer eines Systems erstellt. Mit Ihnen kann man sich am System anmelden und in einer Shell oder grafischen Oberfläche arbeiten.

System-Benutzer hingegen werden in der Regel für Programme und Dienste angelegt, welche sich nicht interaktiv am System anmelden müssen. Daher besitzen sie weder eine Login-Shell noch ein Passwort.

Sonst unterscheiden sich die beiden Benutzertypen nur darin, aus welchem Bereich ihre UIDs und GIDs stammen. An diesen kann man auch recht einfach erkennen, ob es sich bei einem Benutzer um einen normalen oder System-Benutzer handelt.

Den Pi nach Update Fehler wiederbeleben

Nach einem routinemäßigen

sudo apt-get update && sudo apt-get upgrade

hatte es sich zunächst „ausgepied“. Bis auf die rote LED zeigte mein Pi nach dem Reboot keine Lebenszeichen mehr.

In diesem Artikel beschreibe ich kurz und dreckig, wie ich meinen Raspberry Pi nach missglücktem Update wiederbelebt habe, ohne ihn komplett neu installieren zu müssen.

Das Problem
Das Problem trat auf, als ich meinem Pi nach einem Routine-Update neugestartet habe. Ein Blick in die Datei /var/log/apt/term.log zeigt die letzte Update-Ausgabe:

Vorbereitung zum Ersetzen von gnupg 1.4.12-7+deb7u3 (durch .../gnupg_1.4.12-7+deb7u4_armhf.deb) ...
Ersatz für gnupg wird entpackt ...
Trigger für man-db werden verarbeitet ...
Trigger für install-info werden verarbeitet ...
gnupg (1.4.12-7+deb7u4) wird eingerichtet ...
raspberrypi-bootloader (1.20140618-1) wird eingerichtet ...
Memory split is now set in /boot/config.txt.
You may want to use raspi-config to set it
Keine Umleitung »Umleitung von /boot/bootcode.bin durch rpikernelhack«, keine entfernt.
Keine Umleitung »Umleitung von /boot/fixup.dat durch rpikernelhack«, keine entfernt.
Keine Umleitung »Umleitung von /boot/fixup_cd.dat durch rpikernelhack«, keine entfernt.
Keine Umleitung »Umleitung von /boot/fixup_x.dat durch rpikernelhack«, keine entfernt.
»Umleitung von /boot/kernel.img zu /usr/share/rpikernelhack/kernel.img durch rpikernelhack« wird entfernt
»Umleitung von /boot/kernel_cutdown.img zu /usr/share/rpikernelhack/kernel_cutdown.img durch rpikernelhack« wird entfernt
»Umleitung von /boot/kernel_emergency.img zu /usr/share/rpikernelhack/kernel_emergency.img durch rpikernelhack« wird entfernt
»Umleitung von /boot/start.elf zu /usr/share/rpikernelhack/start.elf durch rpikernelhack« wird entfernt
»Umleitung von /boot/start_cd.elf zu /usr/share/rpikernelhack/start_cd.elf durch rpikernelhack« wird entfernt
»Umleitung von /boot/start_x.elf zu /usr/share/rpikernelhack/start_x.elf durch rpikernelhack« wird entfernt
libraspberrypi0 (1.20140618-1) wird eingerichtet ...
libraspberrypi-bin (1.20140618-1) wird eingerichtet ...
libraspberrypi-dev (1.20140618-1) wird eingerichtet ...
libraspberrypi-doc (1.20140618-1) wird eingerichtet ...
Log ended: 2014-06-26  21:00:56

Leider hat mir diese Ausgabe nicht wirklich geholfen, die Fehlerursache genau zu identifizieren. Da der Pi jedoch den Bootvorgang verweigerte, musste der Fehler irgendwo in der Partition /boot liegen.

Meine Lösung
Diese Lösung mag nicht die Beste sein. Jedoch hat sie funktioniert. ;-) Ich benötigt dafür ein Ubuntu-System mit Cardreader. (Ein anderes Linux wird es sicherlich auch tun.)

  1. Aktuelles Raspbian Image von www.raspberrypi.org herunterladen.
  2. Zip-Archiv entpacken und das enthaltene Image im Ubuntu Filesystem einhängen.
  3. SD-Karte des Raspberry Pi einlegen und die enthaltenen Partitionen ebenfalls einhängen.
  4. Nun vergleichen wir den Inhalt der beiden /boot-Partitionen.

Bei dem Vergleich fiel mir auf, dass die folgenden vier Dateien in der /boot Partition meiner SD-Karte fehlten:

-rwxr-xr-x 1 root root   17824 Jun 19 21:59 bootcode.bin
-rwxr-xr-x 1 root root    2090 Jun 19 21:59 fixup_cd.dat
-rwxr-xr-x 1 root root    5845 Jun 19 21:59 fixup.dat
-rwxr-xr-x 1 root root    8822 Jun 19 21:59 fixup_x.dat

Diese habe ich dann einfach aus dem gemounteten Image auf die /boot-Partition der SD-Karte kopiert, die SD-Karte wieder in meinen Raspi gesteckt, ihn eingeschaltet und mich gefreut. Der Pi bootet wieder. Meine Daten und installierten Dienste funktionieren alle noch wie gewohnt. Mission accomplished. :-)