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 (meines Wissens nach) 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.

Kleine Vim-Tips

Wenn Sie in Ihre .vimrc die Zeile
	:iab  dts strftime("%Y-%m-%d")
eintragen, koennen Sie im Text durch Tippen von
dts
das aktuelle Datum einfuegen.
oradfelder / 2017-04-05

Regular Expressions in der bash

Das ist der empfohlene Weg: Den regulären Ausdruck einer Variablen zuweisen und dann in doppelten eckigen Klammern ohne doppelte Anführungszeichen darauf zugreifen:

RE="^list|depl$"
[[ "$SSH_ORIGINAL_COMMAND" =~ $RE ]] || exit 1

Copy And Paste

Im Netz finden sich mancherlei Seiten, auf denen Kommandos zu markieren sind, um sie direkt in die Kommandozeile zu kopieren. Kopieren Sie einmal die folgende Zeile und pasten Sie sie in das Eingabefeld darunter.

echo cool stuff for lazy $(echo and stupid) admins

oder gleich in die Kommandozeile. Dass an der Stelle $(echo and stupid) genauso gut etwas sehr gefährliches stehen könnte, versteht sich von selbst. Also Obacht...