(2007-07-08)

eisfair :: HowTo – Mutt und GnuPG – Installation und Konfiguration

Wer gleich loslegen will, kann die ersten beiden Abschnitte überspringen und bei Punkt 3 weiterlesen.

Die Motivation

Noch ein HowTo über Mutt und GnuPG? Warum? Dazu muss man sagen, das war alles ganz anders geplant, doch zunächst, wieso überhaupt mutt?

Mein eisfair-Server läuft Tag und Nacht rund um die Uhr. Wenn ich gerade nicht direkt am PC arbeite, wozu benötige ich dann einen Rechner? Er spielt Musik ab, Mail-Programm und Browser sind an und der Instant Messenger läuft während vielleicht noch ein Chatroom offen ist. Nebenbei lese ich, bastel oder tue ähnliche Sachen, wo die Aufmerksamkeit nicht primär dem Rechner gilt. Warum also nicht die verbliebenen Aufgaben einem Rechner übertragen, der sowieso läuft? Musik ist kein Problem für eisfair dank des Music Player Daemon, Instant Messenger wird super durch mICQ und centericq abgedeckt, wobei letzterer auch IRC-Chat unterstützt (irssi hab ich wegen fehlerhaftem Perl leider noch nicht komplett kompilieren können). Wenn man mal ein paar Stunden auf den Browser verzichten kann, schaltet man alle anderen Rechner aus und bräuchte nur noch E-Mail, da die Mails sowieso auf dem Server liegen, fehlt nur noch das passende Programm: mutt! Daneben kann das auch noch ein zusätzlicher Vorteil sein, weil ein Kommandozeilenprogramm auch noch über eine langsame SSH-Verbindung bedienbar bleibt, wenn der fette Webmailer schon schnauft.

Die Motivation für GnuPG lasse ich hier mal außen vor. Warum es sinnvoll ist, seine Mails zu verschlüsseln und zu signieren wurde an vielen anderen Stellen erläutert. Gesagt sei hier nur, dass aktuelle Versionen der beteiligten Programme zum Einsatz kommen und sich daher die Einrichtung nicht mehr ganz so wie in den klassischen HowTos gestaltet. Zudem gehe ich noch speziell auf Eigenheiten von eisfair ein, deshalb ein neues HowTo.

Verwendete Versionen

Für die Einrichtung war es für mich zunächst notwendig einige Programme neu zu kompilieren. Da ich das zuvor auch bereits bei anderen so gehandhabt hatte, hab ich gleich eisfair-Pakete draus gemacht. Ich hatte darüber nachgedacht ähnlich wie beim muttrc builder auch was für das eisfair Setup-Menü zu basteln, aber da sich mutt sowieso eher an fortgeschrittene Nutzer wendet, die eigentlich gar nicht die Zielgruppe von eisfair sind, fand ich dort Aufwand und Nutzen in einem zu schlechten Verhältnis. Die vorkompilierte Software ist dennoch in Pakete gewandert, weil es das erstens einfacher macht, mein Produktivsystem sauber zu halten und zweitens dieses HowTo leichter nachzuvollziehen ist.

eisfair-Pakete (Mindestanforderungen)

  • mutt 0.1.4 (intern 1.5.16)
  • gnupg 0.3.4 (intern 1.4.7)
  • gnupg2 0.1.1 (intern 2.0.4)
  • pinentry 0.1.0 (intern 0.7.2)

Zu diesen Paketen kommen noch zahlreiche, die durch Paketabhängigkeiten abgedeckt und automatisch mit installiert werden. Ich habe bewusst aktuelle Pakete verwendet und beim Kompilieren von Mutt die native Unterstützung für S/MIME und PGP abgestellt, weil das durch GPGME übernommen wird. Das Problem daran: es gibt kaum brauchbare HowTos dazu im Internet, also war Doku lesen und ausprobieren angesagt. Ich fasse alles wichtige, um mutt mit GnuPG einzurichten nun zusammen.

GnuPG einrichten

Da mutt gegen GPGME kompiliert ist, erfolgt die Eingabe der Passphrase für GnuPG stets über gpg-agent und pinentry. gpg-agent ist Teil des Paketes gnupg2. Die Einrichtung wird nicht bei der Installation durchgeführt, sondern muss von Hand vorgenommen werden. Dazu muss im Homeverzeichnis (z.B. /home/nutzer/ ) in die Datei .profile folgendes eingefügt werden. Wenn .profile nicht existiert, einfach neu anlegen.

if /usr/bin/test -f ${HOME}/.gpg-agent-info && \
    /bin/kill -0 `/usr/bin/cut -d: -f 2 ${HOME}/.gpg-agent-info` 2>/dev/null
then
    GPG_AGENT_INFO=`/bin/cat ${HOME}/.gpg-agent-info`
    export GPG_AGENT_INFO
else
    eval `/usr/bin/gpg-agent --daemon`
    /bin/echo ${GPG_AGENT_INFO} >${HOME}/.gpg-agent-info
fi 

Dann ist es noch nötig pinentry zu installieren und in /home/nutzer/.gnupg/gpg.conf die Zeile # use-agent in use-agent zu ändern. Sollte die Datei nicht vorhanden sein, einfach mal gpg benutzen, dann wird die erzeugt. Pinentry selbst bringt nur die ncurses Version mit und ist praktisch fertig eingerichtet.

Automatisch öffentliche Schlüssel runterladen

Wenn man Mailinglisten wie die von Debian oder GnuPG abonniert, bekommt man recht viele signierte Mails. Damit man nicht jeden öffentlichen Schlüssel einzeln suchen und importieren muss, kann man GnuPG so einrichten, dass die automatisch von einem Keyserver bezogen werden. Dazu müssen folgende Zeilen in der gpg.conf auskommentiert oder eingefügt werden:

keyserver hkp://subkeys.pgp.net
keyserver-options auto-key-retrieve 

Das war's auch schon, GnuPG ist damit für mutt fertig konfiguriert.

Mutt einrichten

Konzept für ein- und ausgehende Mails

Bei eisfair und bei mir gibt es besondere Gegebenheiten, auf die ich in diesem HowTo Rücksicht nehme. Das ist zum einen die bereits skizzierte Einrichtung von GnuPG, zum anderen läuft auf vielen eisfair-Servern das Paket mail. Ich benutzte Beispielsweise den Server als IMAP-Server, um mit verschiedenen Clients von verschiedenen Rechnern meine Mails lesen zu können. Der Mail-Server sollte also der einzige sein, der Zugriff auf die Mail-Dateien hat. Daher wird mutt mit IMAP eingerichtet. Das ermöglicht zusätzlich die leichte Anpassung der Konfiguration, wenn gerade kein Mail-Paket installiert ist.

Für ausgehende Mail käme zunächst die Standardvariante mit sendmail in Frage, das Teil des Mail-Paketes ist. Das funktioniert, aber wenn jetzt doch kein Mailserver läuft, kommt man nicht weiter. Glücklicherweise unterstützt mutt seit einiger Zeit SMTP und das wird für dieses HowTo auch genutzt. Somit unterscheidet sich die Server-Konfiguration zwar von klassischen mutt-Installationen, dafür aber weniger von der meist bekannten Einrichtung z.B. eines Thunderbird.

Das dritte Augenmerk liegt auf der Konfiguration des Farbschemas für mutt. Da ich sehr häufig mit SSH unterwegs bin und mir oft nicht aussuchen kann (oder will) ob das Schema des SSH-Clients »schwarz auf weiß« oder »weiß auf schwarz« ist, sollte die Einrichtung der Farben dies berücksichtigen – dazu später mehr.

Struktur der Konfiguration

Theoretisch kann man die ganze Konfiguration von mutt in eine Datei $HOME/.muttrc packen. Praktisch kann man das auch besser strukturieren. Ich habe also in meinem Home-Verzeichnis das Unterverzeichnis .mutt angelegt. Die Kernteile der Konfiguration wandern dann in die Datei muttrc in diesem Ordner. Daneben habe ich noch folgende Dateien angelegt, die dann so nach und nach mit Inhalt gefüllt werden. Kleine Erinnerung: Ordner anlegen mit mkdir, Dateien anlegen mit touch, editieren auf eisfair mit joe, vi oder mcedit, wenn man den Midnight Commander installiert hat.

alex@poldy:alex> cd .mutt/
alex@poldy:.mutt> ls
aliases  certificates  colors  lists  muttrc  send-hooks 

Datei $HOME/.mutt/muttrc

Ich habe mir die Hauptdatei der Konfiguration (die muss übrigens genau so (!) heißen, damit mutt die findet) in verschiedene Abschnitte gegliedert. Im folgenden werden diese Abschnitte zunächst jeweils zitiert und dann besprochen. Man erhält seine muttrc, indem man den Inhalt jedes einzelnen Blocks nacheinander in die Datei schreibt… ;-) Wie die Konfiguration selbst funktioniert, d.h. was set und unset bedeuten, wann man welche Gänsefüßchen benutzt usw. kann man in der Doku von mutt nachlesen.

##### aliases ##########################################################
set alias_file= ~/.mutt/aliases
set sort_alias= alias
source $alias_file 

Aliases sind im Grunde Abkürzungen für Kontakte, man könnte das auch einfach als Adressbuch bezeichnen. Wenn mutt beim Starten wegen der Datei mault, einfach mit touch ~/.mutt/aliases anlegen. Einträge hinzufügen kann man später von mutt aus.

##### mail stuff #######################################################
set reverse_name
set realname    = 'Alexander Dahl'
set from        = "post@lespocky.de"
set use_from    = yes
alternates "post@alexander-dahl.de|lespocky@web.de"

set forward_format = "Fwd: %s" 

Dies hier dient der Handhabung von mehreren E-Mail-Adressen. Zunächst wird der Realname und die Adresse angegeben, die ich standardmäßig für ausgehende Nachrichten verwende. Allerdings bekomme ich auch Mails an post@alexander-dahl.de und lespocky@web.de. Damit beim Antworten gleich mal die Mail-Adresse als Absender angegeben ist, an die die urspüngliche Nachricht ging, gibt man diese alternates an. Die letzte Zeile setzt das Format der Betreff-Zeile für weitergeleitete Nachrichten. Muss man nicht setzen, der Default-Wert von mutt gefällt mir aber nicht.

##### encryption #######################################################
### crypto
set crypt_autoencrypt = no
set crypt_autopgp = yes
set crypt_autosign = yes # default: no
set crypt_autosmime = no # default: yes
set crypt_replyencrypt = yes
set crypt_replysign = yes # default: no
set crypt_replysignencrypted = yes # default: no
set crypt_timestamp = yes
set crypt_use_gpgme = yes # default: no
set crypt_verify_sig = yes
set pgp_auto_decode 

Dies sind die Optionen für das Zusammenspiel mit GnuPG. Es werden (bis auf eine Ausnahme) keine Optionen gebraucht, die mit 'pgp' oder 'smime' anfangen, da alles durch die Bibliothek GPGME abgewickelt wird, daher auch:
set crypt_use_gpgme = yes
Die anderen Optionen sagen so sinngemäß aus, dass alle ausgehenden Mails mit PGP (nicht aber mit SMIME) signiert aber nicht verschlüsselt werden. Antworten auf verschlüsselte Mails werden auch verschlüsselt und unterschrieben und alle Unterschriften (egal ob PGP/MIME oder klassisch inline) werden automatisch geprüft.

set certificate_file = ~/.mutt/certificates
unset ssl_starttls 

Will man die Mails verschlüsselt zu IMAP- oder SMTP-Server übertragen, wird es ein wenig kniffelig. Wenn man mutt auf der gleichen Maschine wie IMAP- und SMTP-Server laufen hat, ist das nicht unbedingt nötig. Da mutt aber per default erstmal versucht eine verschlüsselte Verbindung aufzubauen, muss man die Parameter wie oben setzen, um die Verschlüsselung auszuschalten. Ich selbst benutze ein Konfiguration mit Verschlüsselung. Bei Interesse bitte per Mail melden!

##### server ###########################################################
set imap_user = alex
unset imap_pass
set folder = imap://alex@localhost/
set spoolfile = +INBOX
set record = +Sent
set postponed = +Drafts

unset imap_passive # Don't wait to enter mailbox manually
# Automatically poll subscribed mailboxes for new mail (new in 1.5.11)
unset imap_check_subscribed
mailboxes =Lists/debian =Lists/eisfair =Lists/exfa =Lists/impuls-svn \
        =Lists/impuls-team =Lists/micq =Lists/micq-cvs =Lists/mtk \
        =Lists/mutt +INBOX
save-hook .* +Junk

# Reduce polling frequency to a sane level
set mail_check=90
set timeout=30
set move=no

set smtp_url = smtp://alex@localhost 

Die Konfiguration für den Zugriff auf den IMAP-Server erfordert einige Zeilen. Zunächst wird der Nutzer gesetzt. Passwort kann man auch in diese Konfigurationsdatei eintragen, ist aber natürlich ein Sicherheitsrisiko, deshalb hier nicht drin. Mit folder, spoolfile, record und postponed setzt man die wichtigsten IMAP-Ordner. Falls man auf eisfair das Paket archimap verwendet, ist unset imap_check_subscribed besonders wichtig. Das hindert mutt daran in allen Ordnern, also auch den archivierten, nach neuen Mails zu schauen. Das macht mutt deutlich schneller! Hinter mailboxes gebe ich dann die Ordner explizit an, die mutt regelmäßig auf neue Nachrichten checken soll.

Das save-hook danach ermöglicht mir mit zwei schnellen Tastendrücken eine Mail in den Junk-Ordner zu verschieben. Eigentlich dient die Taste 's' dazu, Mails in einen anderen Ordner zu verschieben, als Vorschlag für den Zielordner wird hier halt Junk ausgewählt, das lässt sich natürlich in mutt wieder ändern, letztlich also eine Bedienungsfrage.

Die zeile mit smtp_url ist selbsterklärend, sorgt darüber hinaus aber noch dafür, dass sendmail nicht verwendet wird. Die Zeilen darüber sind noch wichtig, damit regelmäßig nach neuen Mails geschaut wird und damit gelesene Mails in ihren Ordnern bleiben und nicht einfach verschoben werden.

##### appearance #######################################################
set sort=threads
set pager_index_lines = 5
set index_format = "%4C %Z %{%b %d} %-15.15F (%?l?%4l&%4c?) %s"

source ~/.mutt/colors

set history = 10
set history_file = ~/.mutt/history

ignore *
unignore from date subject to cc
unignore user-agent
hdr_order from date subject to cc user-agent 

Kommen wir zum spannenden Teil der Config, dem Look&Feel. Mutt macht schon sinnvolle Vorgaben, aber das lässt sich optimieren… ;-)
Die erste Zeile hier veranlasst mutt Mails in Baumstruktur anzuzeigen, gerade bei Mailinglisten ein unverzichtbares Feature. Die Zeile danach sorgt dafür, dass beim Anschauen einer Mail (der Teil der Bedienoberfläche heißt Pager in mutt) darüber noch ein Ausschnitt des Index, also der Liste mit den Mails im Ordner angezeigt wird. Danach habe ich den Teil verändert, der bestimmt, was in der Liste der Mails angezeigt wird. Im Grunde hab ich hier die Default-Einstellung nur in einem winzigen Punkt geändert. Da ich für Mails von Mailinglisten jeweils eigene Ordner habe, muss ich mir in einer Index-Zeile den Namen der Mailingliste nicht anzeigen lassen, sondern hab das auf den Absender korrigiert. D.h. im Grunde wird jetzt immer, auch bei Mails an Mailinglisten, der Absender angezeigt.

Nach der Zeile, die die Einstellung für die Farben einbindet (kommen wir gleich noch drauf), noch eine kleine Einstellung für die Bedienung von internen Eingabezeilen in mutt und dann der letzte Absatz: hier stelle ich ein, welche Header-Zeilen der Mail mutt mir anzeigen soll. Zunächst sag ich ihm mit ignore *, dass er gar keine Header-Zeile anzeigen soll. Danach sind die Header angegeben, die ich sehen will und dann nochmal in welcher Reihenfolge die angezeigt werden sollen.

##### mailing lists ####################################################
source ~/.mutt/lists

##### print ############################################################
set print_cmd = "a2ps" 

Dies sind noch die letzten Beiden Kommandos. Hier sieht man auch nochmal, wie weitere Dateien (mit dem gleichen Format) in die Konfiguration eingebunden werden und dann ist noch ein Kommando zum Drucken angegeben. An meinem Eis hängt am Parallelport direkt ein Postscript fähiger Laserdrucker, sodass es zum Drucken von Mails genügt, die nochmal durch a2ps zu jagen.

Farben in mutt

Mutt liefert in seinem Quellarchiv zwei »Farbschemen« mit. Das eine ist optimal für helle Schrift auf dunklem Grund, das andere für dunkle Schrift auf hellem Grund. Da man über SSH auf den unterschiedlichsten Konsolen arbeitet, bräuchte man ein Schema für beides und genau das hab ich versucht umzusetzen:

color index green default "~N|~O"
color index cyan default "~g !~N !~O"
color index brightdefault default "~G !~N !~O"
color index magenta default "~P"
color index red default "~D"

### header
color hdrdefault black cyan
color header brightyellow cyan ^From:
#color header black cyan ^To:
#color header black brightcyan ^Reply-To:
#color header black brightcyan ^Cc:
color header brightyellow cyan ^Subject:

### quoted text
color quoted green default
color quoted1 cyan default
color quoted2 green default
color quoted3 cyan default
color quoted4 green default
color quoted5 cyan default
color quoted6 green default
color quoted7 cyan default
color quoted8 green default
color quoted9 cyan default

### stuff
color signature brightmagenta default
color attachment black white
#color message default default
color error red white
#color indicator black red
color status brightgreen blue
#color tree white black
#color normal white black
#color markers red black
#color search white black
#color tilde brightmagenta black
#color index blue black ~F
#color index red black "~N|~O"

### higlighting
color body brightdefault default ' \*+[^*]+\*+ '
color body brightdefault default ' _+[^_]+_+ '
color body brightdefault default ' /+[^/]+/+ '

#color bold brightwhite default
#color underline brightwhite default 

In diesem Block steckt alles, was man an Farben konfigurieren kann. Ich persönlich komme damit sehr gut klar. Da der Rest beinahe selbsterklärend ist, noch kurz die Erklärung für den ersten Block: Im Index sind ungelesene Nachrichten grün, gelöschte Nachrichten rot. Von allen anderen sind signierte Nachrichten cyan, Nachrichten von mir selbst magenta und verschlüsselte Nachrichten hervorgehoben. Letzteres sieht auf jeder Konsole anders aus, so dass diese Hervorhebung auf einigen Konsolen nicht zu sehen ist, aber das ist nicht so wild.

Abschließende Worte

Zu guter letzt nochmal die Sache mit den Mailinglisten, ich will ja keinen dumm sterben lassen:

subscribe ^mutt-users@mutt\\.org$
lists @lists\\.sourceforge.net$
subscribe ^impuls-svn@lists\\.sourceforge\\.net$
subscribe ^dml@lists\\.solnet\\.ch$
subscribe ^micq-list@micq\\.org$
subscribe ^micq-cvs@micq\\.org$
lists @lists\\.debian\\.org$
subscribe ^debian-user-german@lists\\.debian\\.org$
subscribe ^gnupg-de@gnupg\\.org$ 

So das reicht dann aber auch hier. Wer Fehler findet, oder Anregungen und Kritik loswerden möchte, schreibt's mir per Mail, am besten mit mutt ;-)