Prof. Dr.-Ing. Oliver Radfelder
Informatik / Wirtschaftsinformatik
Hochschule Bremerhaven
sudo
Passwortloses ssh mit Gruppen, Leserechten und sudo

Wenn man in der Datei ~alice/.ssh/authorized_keys den mit ssh_keygen erzeugten Public-Key des Users bob einfügt und bob ist in der Gruppe, zu der die Datei ~alice/.ssh/authorized_keys gehört (typischerweise auch alice), dann darf die Datei ~alice/.ssh/authorized_keys keine Gruppen-Schreibrechte haben, sonst kann sich bob nicht passwortlos als alice anmelden. Das ergibt Sinn, man muss aber erst einmal drauf kommen. Am Besten setzt man die Rechte der authorized_keys-Dateien eh auf 600 (chmod 600 ~/.ssh/authorized_keys oder chmod go-rwx ~/.ssh/authorized_keys).

Wofür man solches wissen muss? Angenommen, einer Gruppe von Usern soll erlaubt werden, ein ganz konkretes Programm auch als User alice und nicht nur in der Gruppe alice ausführen zu dürfen, dann lässt sich dafür das viel (und oft aus falschen Gründen) gescholtene sudo nutzen, indem in /etc/sudoers vermittels sudo visudo

%alice ALL=(alice) NOPASSWD:/home/alice/bin/asalice.sh

eingetragen wird. Damit wird dafür gesorgt, dass Mitglieder der Gruppe alice (%alice) das Programm ~alice/bin/asalice.sh mit

sudo -u alice /home/alice/bin/asalice.sh

ausführen dürfen. Dabei muss natürlich darauf geachtet werden, dass in asalice.sh keine Sicherheitslöcher beispielsweise durch less entstehen. (! in less ermöglicht beliebige Shell-Kommandos - dann als User alice).

So vermeidet man, dass einer Gruppe von Usern für einzelne Aufgaben gleich der gesamte User-Account per ssh freigegeben werden muss, und ermöglicht sehr feingranulare Administrationsrechte, so dass passwortlos und daher automatisierbar, Skripte unter dem User alice ausgeführt werden können.

Wenn der User bob Ubuntu-typisch auch noch in der Gruppe sudo ist und dadurch Root-Rechte hat, muss der spezifischere Eintrag (%alice) nach dem allgemeineren (%sudo) stehen, sonst funktioniert der Aufruf nicht passwortlos.

Mit der Kombination ssh, git, sudo, Gruppen und Usern lassen sich recht komfortable und dennoch sichere Administrationskonzepte bauen.

Ein ähnliches Ergebnis erzielt man, indem in der Datei authorized_keys vor dem jeweiligen Schlüssel, der mit ssh-rsa beginnt,

command="auszufuehrendesprogramm"

in der gleichen Zeile eingetragen wird. Soll z.B. wieder bob passwortlos auf dem Server - diesmal als claire - nur ein spezielles Programm auführen dürfen, sieht das in der authorized_keys-Datei bei claire etwa so aus:

command="/home/claire/bin/asclaire_via_ssh.sh" ssh-rsa AAAA ....

Das Programm asclaire_via_ssh.sh wird dasjenige sein, das in jedem Falle ausgeführt wird, egal welches Programm als Argument an ssh übergeben wird. In dem Skript kann dann über die Variable SSH_ORIGINAL_COMMAND unterschieden werden, was konkret zu tun ist.

#!/bin/bash
#name: asclaire_via_ssh.sh
[ "$SSH_ORIGINAL_COMMAND" == 'list' ] && /home/claire/bin/list
[ "$SSH_ORIGINAL_COMMAND" == 'depl' ] && /home/claire/bin/depl

So kann nun bob per ssh das Programm asclaire_via_ssh.sh von seinem Account - auch von seinem lokalen Rechner aus, wenn die Public-Key Infrastruktur entsprechend eingerichtet ist - aufrufen, indem er scheinbar list oder depl aufruft:

ssh claire@server list
#hello bob incarnated as claire
#this is a list of available commands
list
depl

Auf den Namen als Remote-User lässt sich nicht direkt zugreifen. Jedoch lässt sich vermittels

command="/home/claire/bin/sshasclaire.sh",\
environment="REMOTE_USER=bob" ssh-rsa AAAA ....

eine passende Umgebung aufsetzen, wenn in der Konfiguration in /etc/ssh/sshd_conf die Zeile

PermitUserEnvironment yes

eingetragen ist.