Ausführbare SSH-Kommandos per authorized keys einschränken

Aus Thomas-Krenn-Wiki
Zur Navigation springen Zur Suche springen

Der OpenSSH Secure Shell Server ermöglicht einen sicheren, verschlüsselten Fernzugriff auf Linux und Unix Systeme. Server-seitig dient die Datei authorized_keys im .ssh Ordner eines Benutzers in erster Linie zur Konfiguration einer Public-Key-Authentifizierung. Normalerweise erhält ein Benutzer dabei Voll-Zugriff auf das System, auf dem die Authentifizierung eingerichtet wurde. In einigen Fällen wie automatisierten Backupvorgängen ist es jedoch sinnvoll, dass der Zugriff auf einige wenige oder sogar nur auf ein einzelnes Kommando eingeschränkt wird. Die erforderlichen Konfigurationsschritte dazu erläutert dieser Artikel.

Verwendungszweck

Die Einschränkung der über SSH ausführbaren Kommandos wird vor allem bei automatisierten Sicherungsvorgängen bzw. Backups eingesetzt. Zumeist besitzen dedizierte Backup-User einen privaten Schlüssel ohne Schlüsselphrase bzw. Keyphrase, um automatisierte Sicherungen durchzuführen. Am Backup-Ziel-Server wird der öffentliche Schlüssel dieses Benutzers in die Datei authorized_keys gegeben, damit dieser sich ohne Passwort-Eingabe verbinden kann. Eigentlich hätte ab diesem Zeitpunkt der Benutzer Voll-Zugriff auf den Backup-Server, obwohl er z.B. stets nur das Kommando rsync aufruft.

Eine Kommando-Einschränkung für den Benutzer verhindert, dass bei einer Kompromittierung des privaten Schlüssels automatisch auch der Backup-Server kompromittiert ist. Da der Benutzer auf ein Kommando in der authorized_keys Datei beschränkt wird, darf er auch kein anderes Kommando ausführen bzw. eine Terminal-Session über SSH aufbauen.

Auf einzelnes Kommando in authorized_keys einschränken

Die Datei /~/.ssh/authorized_keys beinhaltet den öffentlichen Schlüssel des Benutzers, der sich verbinden darf (s.a. Public-Key-Authentifizierung):

:~$ cat .ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCj98R[...]

Um den Benutzer auf ein einzelnes Kommando einzuschränken, wird der Parameter command= vor den Schlüssel eingetragen. Danach wird beim Versuch des Aufbaus einer SSH-Verbindung immer nur dieses Kommando ausgeführt, auch wenn z.B. ein anderes Kommando übergeben wurde.[1] Im folgenden Beispiel wird der Benutzer dailybackup zu Demonstrationszwecken auf das Kommando date eingeschränkt. Dazu wird am SSH-Server der Paramater command=date definiert:

:~$ cat .ssh/authorized_keys 
command="date" ssh-rsa AAAA[...]

Vom Client-Rechner aus, der sich zum Server per SSH verbindet, ist daraufhin nur mehr das Kommando date für den Benutzer ausführbar:

:~$ ssh dailybackup@192.168.56.105
Wed Apr 30 14:46:53 CEST 2014
Connection to 192.168.56.105 closed.
:~$ ssh dailybackup@192.168.56.105 "tail /etc/passwd"
Wed Apr 30 14:47:02 CEST 2014

Ausgeführtes Kommando am SSH-Server analysieren

Die Analyse, welches Kommando in authorized_keys eingetragen werden muss, wird durch die Umgebungsvariable $SSH_ORIGINAL_COMMAND erleichtert:

command="/bin/echo You invoked: $SSH_ORIGINAL_COMMAND" ssh-rsa AAAAB[..]

Beim Aufruf eines Kommandos vom Client aus wird dann zu Analysezwecken das am Server ausgeführte Kommando ausgegeben:

:~$ ssh dailybackup@192.168.56.105 tail /etc/passwd
You invoked: tail /etc/passwd

Manche Kommandos wie z.B. rsync führen beim obigen command jedoch zu einer Fehlermeldung. Über einen Umweg unter Zuhilfenahme eines Skriptes am SSH-Server, kommt man jedoch auch an das ausgeführte Kommando:[1]

:~$ vi logssh.sh
#!/bin/sh
if [ -n "$SSH_ORIGINAL_COMMAND" ]
then
  echo "`/bin/date`: $SSH_ORIGINAL_COMMAND" >> $HOME/ssh-command-log
  exec $SSH_ORIGINAL_COMMAND
fi
:~$ vi .ssh/authorized_keys
command="/home/dailybackup/logssh.sh" ssh-rsa AAAAB3N[...]

Der Client ruft anschließend rsync auf:

:~/tmp$ rsync -avz test.txt dailybackup@192.168.56.105:/home/dailybackup
sending incremental file list
[...]

Am SSH-Server scheint das über SSH ausgeführte Kommando in der Log-Datei auf. Dieses Kommando kann dann über command= wieder zur Einschränkung verwendet werden:

:~$ cat ssh-command-log 
Wed Apr 30 15:10:54 CEST 2014: rsync --server -vlogDtprze.iLsf . /home/dailybackup

Hinweis: Bei Problemen mit Ausgabe-Umleitungen kann anstatt exec eval verwendet werden.

Auf mehrere Kommandos in authorized_keys einschränken

Grundsätzlich ist es über zusätzliche Skripte möglich, mehrere Kommandos für ein Schlüsselpaar zu erlauben.

Für die größtmögliche Sicherheit ist es jedoch einfacher, für jedes gewünschte Kommando ein eigenes Schlüsselpaar zu erzeugen und das entsprechende Kommando zu hinterlegen.

Einzelnachweise


Foto Georg Schönberger.jpg

Autor: Georg Schönberger

Georg Schönberger, Abteilung DevOps bei der XORTEX eBusiness GmbH, absolvierte an der FH OÖ am Campus Hagenberg sein Studium zum Bachelor Computer- und Mediensicherheit, Studium Master Sichere Informationssysteme. Seit 2015 ist Georg bei XORTEX beschäftigt und arbeitet sehr lösungsorientiert und hat keine Angst vor schwierigen Aufgaben. Zu seinen Hobbys zählt neben Linux auch Tennis, Klettern und Reisen.


Das könnte Sie auch interessieren

OpenSSH Konfiguration
SSH Login unter Debian mit fail2ban absichern
SSH-Login mit 2-Faktor-Authentifizierung absichern