Mehr Sicherheit fuer die eigenen Daten – SSH Key Authentifizierung und pam_wheel

Dieses ist der sechste Teil einer Serie von Blogeintraegen, die sich als Reaktion auf die NSA Affaere um den Kontext Sicherheit fuer die eigenen Daten und Verschluesselung drehen.

Links zu den ersten fuenf Artikeln befinden sich am Ende des Blogposts. Im diesem sechsten Teil dreht es sich darum, wie man sich auf seinen Servern mit SSH aber ohne Passwort sicher authentifizieren kann.

Wie in meinem letzten Artikel geschrieben sind sichere und auch ueberall unterschiedliche Passwoerter im Rahmen des machbaren. Wenn man allerdings wie ich Systemadministrator ist und viele viele viele Server verwaltet, wuerde man sofort an Grenzen stossen wenn man sich fuer jeden Server ein eigenes Passwort merken muesste. Aus diesem Grund moechte ich hier noch einmal auf SSH Keys zur Authentifizierung sowie pam_wheel eingehen.

SSH-Key erzeugen

Wer es noch nicht weiss: Man kann bei SSH nicht nur Passwoerter sondern auch Keys zur Authentifizierung einsetzen. Das ist nicht nur extrem praktisch, sondern bei korrekter Nutzung auch sicherer als Passwoerter.

Einen eigenen SSH-Key mit dem Namen „example“ erzeugt man sich mit dem folgenden Kommando:

ssh-keygen -t rsa -f ~/.ssh/example

Dabei wird zur Eingabe und Bestaetigung eines Passworts aufgefordert. Hier sollte man ein definitiv eines eingeben und auch ein sicheres waehlen. Anschliessend hat man zwei neue Dateien:

  1. ~/.ssh/example -> der private und geheime Key
  2. ~/.ssh/example.pub -> der public Schluessel dazu

Wenn ich mich nun an einem Server mit diesem Schluessel anmelden moechte, dann muss ich den oeffentlichen Teil davon auf dem gewuenschten System in die ~./ssh/authorized_keys hinzufuegen. Das kann ich entweder ueber copy & paste machen, oder besser mit dem Befehl ssh-copy-id:

ssh-copy-id -i ~/.ssh/example.pub user@host:

Anschliessend kann ich mich mit dem Key und dem fuer diesen Key notwendigen Passwort an dem Server authentifizieren:

ssh -i ~/.ssh/example user@host

Wenn man moechte, kann man sich das ganze auch in der ~/.ssh/config noch ablegen. Vor allem praktisch, wenn man mehrere verschiedene Keys hat. Ein entsprechender Eintrag kann wie folgt aussehen:

Host                    foo
HostName                foo.example.org
User                    bar
IdentityFile            /home/user/.ssh/example
IdentitiesOnly          yes

SSH-Server absichern

Den SSH Server kann man dann auch absichern. Ich nutze grundsaetzlich die Konfigurationsoption nur den Nutzern einer bestimmten Nutzergruppe Zugriff per SSH zu erlauben. Dazu:

  • Benutzergruppe anlegen:
    addgroup ssh-allow
  • Den gewuenschten Nutzer der Gruppe hinzufuegen:
    adduser USERNAME ssh-allow
  • und dann den SSH-Zugriff auf diese Gruppe beschraenken, indem die folgende Zeile in die /etc/ssh/sshd_config hinzufuegegt wird:
    AllowGroups     ssh-allow

Merke: Testen ob es funktioniert solange man noch angemeldet ist, sonst kann es unangenehm werden ;-)

Weiter kann man auch die Passwortauthentifizierung fuer SSH komplett abschalten. Dann kann man sich nur noch per Key Authentifizieren. Ob man das moechte sei jedem dahingestellt, denn man muss seinen Key natuerlich auch immer dabei haben. Ich habe es bei einigen Maschinen im Einsatz. Dafuer muss in der /etc/ssh/sshd_config der Parameter

PasswordAuthentication no

gesetzt sein. Spannend ist in diesem Kontext noch zu erwaehnen, dass man das mit dem Match Block zum Beispiel fuer bestimmte IP-Adressen oder Netze Ausnahmen erlauben kann. So kann der Zugriff per Passwort deaktiviert sein, aber von einer (VPN) IP, einem bestimmten (Root)-Server oder dem Firmennetz dennoch erlaubt sein. Der Eintrag AM ENDE der sshd_config waere dann:

PasswordAuthentication no
 
Match address 1.2.3.4/16
    PasswordAuthentication yes

SSH-Agent nutzen

Damit das ganze auch noch komfortabel ist und man nicht permanent das sichere Passwort fuer seinen SSH-Key eingeben muss, gibt es den praktischen ssh-agent. Dieser wird unter Linux in der Regel beim Starten des bevorzugten Desktop Environments mit gestartet. Man kann mit einem Agent mehrere Keys verwalten. Der Agent haelt die privaten Keys im Speicher und man kann diese dann zur Authentifizierung nutzen. Bei mir ist es inzwischen zur Routine geworden morgens nach dem starten meines Arbeitsplatzrechners ein Terminal zu oeffnen und die Keys fuer die Arbeit zu laden.
Der SSH-Agent wird mit dem Befehl ssh-add gesteuert. Folgende Befehle sind wichtig zu kennen:

  1. Auflistung der im Agent geladenen Keys:
    ssh-add -l
  2. Key nach Eingabe des korrekten Passworts in den Speicher laden:
    ssh-add ~/.ssh/example
  3. Entfernen aller Keys aus dem Agentspeicher:
    ssh-add -D

Aus der Praxis dazu noch die folgenden beiden Informationen:

  1. Wenn man auf einem Server ohne X mit einem SSH-Key arbeiten moechte und man den ssh-agent starten muss, dann geht das mit:
    exec ssh-agent bash
  2. Wenn man kurzfristig seinen ssh-agent mitnehmen moechte, dann geht das mit dem ssh Parameter -A. So kann man sich mit seinem Agent dann auf Host A authentifizieren, und wenn der Key auch auf Host B erlaubt ist kann man sich von Host A dann auf Host B ohne weitere Passworteingabe verbinden. Diese Option aber nur mit Vorsicht auf vertrauten Systemen einsetzen, da ein Angreifer mit root Rechten ansonsten auf Host A Angriffe auf die Keys im Speicher fahren koennte. Beispielaufruf des sehr praktischen Features:
    ssh -p 12345 -A user@foo.example.org

pam_wheel konfigurieren

Zu guter letzt noch ein Hinweis auf pam_wheel. Das PAM Modul erlaubt – sofern aktiviert – nur Mitgliedern der Gruppe wheel root Rechte zu erlangen. Das kann man sehr praktisch dazu nutzen auch root Rechte zu bekommen ohne das Passwort einzugeben. Wenn man zum Beispiel SSH nur Key Authentifizierung erlaubt und ein 20 Stellen bcrypt Hash als Passwort gesetzt ist und man sich diesen nicht merken moechte, dann kann man folgendes machen:

  • Gruppe anlegen:
    addgroup wheel
  • Nutzer hinzufuegen:
    adduser USERNAME wheel
  • die folgenden beiden Zeilen der /etc/pam.d/su oben bei den anderen auth Eintraegen hinzufuegen:
    auth requisite pam_wheel.so group=wheel
    auth sufficient pam_wheel.so group=wheel trust use_uid

Auch hier gilt wieder. Ausprobieren solange man angemeldet ist, ansonsten kann es unangenehm werden.

Vorherige Blogposts:

  • Der erste Teil war fuer mich das Aufraeumen, einen Ueberblick zu bekommen sowie Strukturen zu schaffen, auf denen ich aufbauen kann.
  • Der zweite Teil bestand darin einen Ort zu schaffen, in dem ich Keys und Passwoerter sicher aufbewahren und gleichzeitig alles in ein vernuenftiges Backup schieben kann.
  • Der dritte Teil bezog sich auf das erzeugen von Zertifikaten und Einrichten von verschluesselten Verbindungen zu Apache vHosts.
  • Der vierte Teil drehte sich um das Thema Komfort im Webbrowser und verwies in dem Kontext auf einen Artikel zum selbst gehosteten Firefox Sync Server.
  • Im fuenften Teil habe ich etwas zu meinen Ueberlegungen zu sicheren Zugangsdaten und Passwoertern geschrieben.

Mehr Sicherheit fuer die eigenen Daten – sichere Zugangsdaten / Passwoerter

Dieses ist der fuenfte Teil einer Serie von Blogeintraegen, die sich als Reaktion auf die NSA Affaere um den Kontext Sicherheit fuer die eigenen Daten und Verschluesselung drehen.

Links zu den ersten vier Artikeln befinden sich am Ende des Blogposts. Im diesem fuenften Teil schreibe ich etwas zu meinen Ueberlegungen zu sicheren Zugangsdaten und Passwoertern.

Ich gebe zu: Ich war faul! Ja, ich hatte Standardpasswoerter unterschiedlicher Staerke und unterschiedlichen Typs, die ich an verschiedenen Stellen wiederholt habe. Ich weiss, es ist boese, ich habe es aber trotzdem getan.

Wenn man ueber Einbrueche bei Diensten im Internet und die damit verbundene Aufforderung doch bitte sein Passwort zu aendern liesst, dann wird meistens gesagt, das wenn man die Kombination aus Benutzername und Passwort noch woanders genutzt hat, das man ueberall dort zur Sicherheit das Passwort aendern muss. Daraus ist relativ einfach zu schliessen, dass man die Kombination aus Benutzernamen und Passwort nie zweimal verwenden sollte. Der Haken an der Sache ist aber, das man sich die ganzen Passwoerter ja auch merken koennen muss. Aus diesem Grund kann man entweder ein Passwortschema benutzen, oder man generiert wirklich konsequent Zufallspasswoerter. Diese Passwoerter kann mann dann zum Beispiel im Webbrowser speichern oder man notiert sie sich in einer Datei in einem verschluesselten Container.

Ich habe mich fuer eine Kombination aus verschiedenen Modellen entschieden, die fuer mich am praktischsten ist. Als erstes verwende ich bei Diensten als Benutzername nach Moeglichkeit eine Emailadresse. Da ich alle meine Emails ueber einen eigenen Mailserver versende lege ich mir fuer jeden neuen Account einen neuen Alias an. Das ist zwar zu Anfang nervig, hat aber den witzigen Nebeneffekt, das man sofort mitbekommt wo die eigene Emailadresse unautorisiert weitergegeben wurde ;-). Der Zugangsname ist also in der Regel unterschiedlich.

Bei den Passwoertern habe ich lange ueberlegt wie ich es mache, und habe mich am Ende fuer einen webbasierten Passwortgenerator entschieden, den ich bei mir auf meinem eigenen Server installieren kann. Dort wird aus der Kombination von Benutzername, Domain und eigenem Passwortstring ein bcrypt Hash gebildet, den ich dann als Passwort nutze. Weitere Informationen zu dem Tool gibt es hier:

Leider sind die bcrypt Hashes in der freien Wildbahn manchmal schon zu sicher, da sie Zeichen enthalten, die bestimmte Dienste nicht erlauben. Dies liegt (meistens) an der verwendeten Programmiersprache. In WordPress ist zum Beispiel kein Backslash erlaubt. Diese unerlaubten Zeichen filtere ich von Hand aus dem generierten Hash heraus. Da ich die Passwoerter ja aber sicher abgespeichert habe muss ich sie nicht oft generieren. Wenn ja, muss ich fuer zusaetzliche Sicherheit damit leben, dass ich mir manche Passwoerter erst zusammenbasteln muss.

Am Ende habe ich aber wieder zwei Arten von Passwoertern. Einmal die bcrypt Hashes, die ich nach Moeglichkeit ueberall verwende. Aber mal ehrlich, wer moechte sich Passwoerter wie:

  • B1-r6UF9s:Mb<% (test, test, test im Generator)

schon gerne merken um es bei Firefox als Masterpasswort oder beim verschluesselten Container als decrypt Phrase einzugeben? Ich nicht! Aus diesem Grund existiert auch weiterhin ein einfach zu merkendes, aber dennoch nach den Regeln der Kunst sicheres Passwort in meinem Kopf, das je nach genutztem Dienst noch etwas hinten dran bekommt.

Durch die Kombination aus moeglichst jeweils unterschiedlichem Loginnamen, bcrypt Hashes als Passwoertern und nur ganz minimal gebrauchtem sicheren Passwort in meinem Kopf habe ich einiges an Sicherheit gewonnen. Nach und nach wechsle ich nun ueberall meine Passwoerter auf dieses neues System.

 

Vorherige Blogposts:

  • Der erste Teil war fuer mich das Aufraeumen, einen Ueberblick zu bekommen sowie Strukturen zu schaffen, auf denen ich aufbauen kann.
  • Der zweite Teil bestand darin einen Ort zu schaffen, in dem ich Keys und Passwoerter sicher aufbewahren und gleichzeitig alles in ein vernuenftiges Backup schieben kann.
  • Der dritte Teil bezog sich auf das erzeugen von Zertifikaten und Einrichten von verschluesselten Verbindungen zu Apache vHosts.
  • Der vierte Teil drehte sich um das Thema Komfort im Webbrowser und verwies in dem Kontext auf einen Artikel zum selbst gehosteten Firefox Sync Server.

Mehr Sicherheit fuer die eigenen Daten – Komfort mit Firefox Sync + Masterpasswort

Dieses ist der vierte Teil einer Serie von Blogeintraegen, die sich als Reaktion auf die NSA Affaere um den Kontext Sicherheit fuer die eigenen Daten und Verschluesselung drehen.

Links zu den ersten drei Artikeln befinden sich am Ende des Blogposts. Im diesem vierten Teil moechte ich auf das Thema Komfort im Webbrowser eingehen und dabei auf meinen frueheren Artikel zum selbst gehosteten Firefox Sync verweisen.

Es gibt eine ganze Menge an Webbrowsern dort draussen, das sind zum Beispiel Google Chrome, Apple Safari, Microsoft Internet Explorer oder halt auch Mozilla Firefox. Ich bevorzuge den letzten weil er erstens OpenSource ist, zweitens gut unter Linux laeuft und drittens mich nicht versucht in irgendwelche Services zu zwingen. Ich nehme dabei bewusst in Kauf, dass die Performance der JavaScript Engine nicht so gut ist, wie zum Beispiel verglichen mit der von Google Chrome. Auf Annehmlichkeiten wie synchronisierte Lesezeichen oder Chronik moechte ich aber dennoch nicht verzichten. Ich persoenlich synchronisiere damit Daten zwischen drei Geraeten, davon ein Mobiltelefon.

Aus diesem Grund habe ich bereits vor laengerer Zeit mir einen selbst gehosteten Firefox Sync Server installiert. Dort ist alles in meiner Hand, auf meinen Servern, ich kann verschluesseln, und meine Passwoerter schwirren wenn ueberhaupt dann gesichert durchs Netz.

Im Prinzip ist bei mir alles noch genauso, wie ich es in der Anleitung damals beschrieben habe. Der einzige Unterschied ist der Apache vHost, der nun ueber SSL geht:

<VirtualHost *:443>
        ServerName ffsync.example.org
        ServerAdmin webmaster@example.org
        DocumentRoot /opt/ffsync/server-full
 
        SSLEngine on
        SSLCertificateFile /path/to/ffsync.example.org.crt
        SSLCertificateKeyFile /path/to/example.org.key
 
                Order deny,allow
                Allow from all
 
        WSGIProcessGroup ffsync
        WSGIDaemonProcess ffsync user=ffsync group=ffsync processes=2 threads=25
        WSGIPassAuthorization On
        WSGIScriptAlias / /opt/ffsync/server-full/sync.wsgi
 
        CustomLog /var/log/apache2/ffsync_access.log combined
        ErrorLog /var/log/apache2/ffsync_error.log
</VirtualHost>

Weiter habe ich in der etc/sync.conf die URL des fallback node auf https:// abgeaendert.

Ganz wichtig dabei ist natuerlich: WENN Passwoerter im Webbrowser abgespeichert werden, DANN MUSS ein Masterpasswort gesetzt sein. Das gilt fuer Mozilla Firefox genauso wie fuer Mozilla Thunderbird. Wenn KEIN Masterpasswort gesetzt ist, kann JEDER der Zugriff auf den laufenden Webbrowser oder das laufende Thunderbird hat mit fuenf Klicks ALLE gespeicherten Passwoerter einsehen. Diese fuenf Klicks sind:

  1. Firefox
  2. Einstellungen
  3. Sicherheit
  4. Gespeicherte Passwoerter
  5. Passwoerter anzeigen

An der gleichen Stelle kann man uebrigens auch das Masterpasswort setzen. In Thunderbird ist es auch Einstellungen -> Sicherheit -> Passwoerter…

Vorherige Blogposts:

  • Der erste Teil war fuer mich das Aufraeumen, einen Ueberblick zu bekommen sowie Strukturen zu schaffen, auf denen ich aufbauen kann.
  • Der zweite Teil bestand darin einen Ort zu schaffen, in dem ich Keys und Passwoerter sicher aufbewahren und gleichzeitig alles in ein vernuenftiges Backup schieben kann.
  • Der dritte Teil bezog sich auf das erzeugen von Zertifikaten und Einrichten von verschluesselten Verbindungen zu Apache vHosts.

Mehr Sicherheit fuer die eigenen Daten – Zertifikate

Dieses ist der dritte Teil einer Serie von Blogeintraegen, die sich als Reaktion auf die NSA Affaere um den Kontext Sicherheit fuer die eigenen Daten und Verschluesselung drehen.

Der erste Teil war fuer mich das Aufraeumen, einen Ueberblick zu bekommen sowie Strukturen zu schaffen, auf denen ich aufbauen kann. Der zweite Teil bestand darin einen Ort zu schaffen, in dem ich Keys und Passwoerter sicher aufbewahren und gleichzeitig alles in ein vernuenftiges Backup schieben kann. Der dritte Teil hier bezieht sich auf das erzeugen von Zertifikaten und Einrichten von verschluesselten Verbindungen zu Apache vHosts.

Oft probiere ich eine Software aus, erstelle mir fix eine Subdomain, richte einen vHost ein, und entweder das was ich ausprobiere ist gut und es geht in meinen digitalen Alltag ueber, oder eben nicht. Zurueck bleiben verwaiste Subdomains, deaktivierte vHosts und dann natuerlich Applikationen die ich taeglich nutze, und zu denen ich eine unverschluesselte Verbindung aufbaue, obwohl ich es selbst in der Hand habe die Verschluesselung einzustellen.

Ich habe mich an dieser Stelle bewusst gegen eine eigene CA entschieden. Das ist hinten raus sicherlich praktisch, haette meine Einstiegshuerde aber wieder zu hoch gelegt und ich bin mit frueheren Versuchen daran bisher immer an mir selbst und fehlender Kontinuitaet gescheitert. Schlichte einfache selbst signierte Zertifikate sind fuer mich immer noch am einfachsten.

Was ich jedoch gemacht habe, ist, das ich alle Zertifikate bei CAcert signieren lassen habe. Das hat fuer mich den Vorteil, dass ich ueber alle Zertifikate einen Ueberblick habe, und wenn ich will, kann ich mir auch das CAcert Rootzertifikat importieren und einfach denen vertrauen. Gemacht wie folgt:

  1. Key erzeugen:
    openssl genrsa -out example.org.key 4096
  2. CSR erzeugen:
    openssl req -new -key example.org.key -out example.org.csr

    Bei den Fragen ist nur wichtig, dass der „Common Name“ der Name der Domain oder Subdomain ist, die man sichern moechte. Ein Passwort ist nicht einzugeben.

Bei CACert dann den Inhalt der example.org.csr Datei eingeben und das Zertifikat was man angezeigt und per Email zugesendet bekommt unter example.org.crt abspeichern.

Ein einfacher Apache vHost mit SSL sieht wie folgt aus:

<VirtualHost *:443>
ServerAdmin webmaster@example.org
ServerName example.org
DocumentRoot /var/www/example.org
 
SSLEngine on
SSLCertificateFile /path/to/example.org.crt
SSLCertificateKeyFile /path/to/example.org.key
 
CustomLog /var/log/apache2/example.org-access.log combined
</VirtualHost>

Wenn man auf den Dienst nur ueber https zugreifen moechte und eine einfache Weiterleitung von  HTTP auf HTTPS einrichten moechte, kann man das zum Beispiel mit einem kleinen vHost und einer entsprechenden rewrite Regel machen:

<VirtualHost *:80>
ServerAdmin webmaster@example.org
ServerName example.org
DocumentRoot /var/www/example.org
 
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
 
CustomLog /var/log/apache2/example.org-access.log combined
</VirtualHost>

Wenn man Zugriff auf ein Nagios hat, dann ergibt es Sinn das Ablaufdatum des SSL Zertifikates mit zu Ueberwachen, damit man da nicht irgendwann in Probleme rennt. Das folgende Kommando und der folgende Check warnen einen sobald das Zertifikat nur noch 30 Tage gueltig ist.

Command Definition:

define command{
        command_name    check_ssl_certexpire
        command_line    $USER1$/check_http -H $HOSTNAME$ -p $ARG1$  -C 30
        }

Check:

define service{
        use                             my-service
        host_name                       example.org
        service_description             SSL-Cert root
        check_command                   check_ssl_certexpire!443
        }