Diese Antwort entwickelt sich sowohl nach der gewählten Antwort, indem mehr Sicherheit hinzugefügt wird.
Diese Antwort erörterte die allgemeine Form
<command that makes output> | \
ssh <user A>@<host A> <command that maps stdin to clipboard>
Wo Sicherheit fehlt werden kann , ist in den ssh
Berechtigungen ermöglichen <user B>
auf host B>
bis ssh
zu host A
und führen jeden Befehl.
Natürlich kann B
der A
Zugriff bereits über einen ssh
Schlüssel erfolgen, und es kann sogar ein Passwort vorhanden sein. Eine andere Sicherheitsebene kann jedoch den Umfang der zulässigen Befehle einschränken, die ausgeführt werden B
können A
, z. B. so, dass rm -rf /
sie nicht aufgerufen werden können. (Dies ist besonders wichtig, wenn der ssh
Schlüssel kein Passwort hat.)
Glücklicherweise verfügt es ssh
über eine integrierte Funktion, die als Befehlsbeschränkung oder erzwungener Befehl bezeichnet wird . Siehe ssh.com oder diese serverfault.com-Frage .
Die folgende Lösung zeigt die allgemeine Formularlösung zusammen mit der ssh
Befehlsbeschränkung erzwungenen .
Beispiellösung mit Befehlsbeschränkung hinzugefügter
Diese sicherheitsverbesserte Lösung folgt der allgemeinen Form - der Aufruf ab der ssh
Sitzung host-B
lautet einfach:
cat <file> | ssh <user-A>@<host A> to_clipboard
Der Rest zeigt das Setup, damit das funktioniert.
Einrichtung der ssh-Befehlsbeschränkung
Angenommen, das Benutzerkonto B
ist user-B
aktiviert und B verfügt über einen SSH-Schlüssel id-clip
, der auf die übliche Weise erstellt wurde ( ssh-keygen
).
Dann gibt es im user-A
SSH-Verzeichnis eine Datei
/home/user-A/.ssh/authorized_keys
das erkennt den Schlüssel id-clip
und ermöglicht die ssh
Verbindung.
Normalerweise ist der Inhalt jeder Zeile authorized_keys
genau der öffentliche Schlüssel, der autorisiert wird, z. B. der Inhalt von id-clip.pub
.
Um jedoch die Befehlsbeschränkung zu erzwingen, wird dem auszuführenden Befehl der Inhalt des öffentlichen Schlüssels (in derselben Zeile) vorangestellt.
In unserem Fall:
command="/home/user-A/.ssh/allowed-commands.sh id-clip",no-agent-forwarding,no-port-forwarding,no-user-rc,no-x11-forwarding,no-pty <content of file id-clip.pub>
Der angegebene Befehl "/home/user-A/.ssh/allowed-commands.sh id-clip"
und nur dieser festgelegte Befehl wird immer dann ausgeführt, wenn mit dem Schlüssel id-clip
eine ssh
Verbindung hergestellt wird host-A
- unabhängig davon, welcher Befehl in der ssh
Befehlszeile geschrieben ist .
Der Befehl gibt eine Skriptdatei allowed-commands.sh
und den Inhalt dieser Skriptdatei an
#/bin/bash
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.
Id=${1}
case "$SSH_ORIGINAL_COMMAND" in
"to-clipboard")
notify-send "ssh to-clipboard, from ${Id}"
cat | xsel --display :0 -i -b
;;
*)
echo "Access denied"
exit 1
;;
esac
Der ursprüngliche Anruf ssh
an der Maschine B
war
... | ssh <user-A>@<host A> to_clipboard
Die Zeichenfolge to-clipboard
wird allowed-commands.sh
von der Umgebungsvariablen übergeben SSH_ORIGINAL_COMMAND
. Außerdem haben wir den Namen des Schlüssels id-clip
aus der Zeile übergeben, in authorized_keys
der nur von zugegriffen wirdid-clip
.
Die Linie
notify-send "ssh to-clipboard, from ${Id}"
ist nur eine Popup-Meldungsbox, die Sie darüber informiert, dass die Zwischenablage geschrieben wird - das ist wahrscheinlich auch eine gute Sicherheitsfunktion. ( notify-send
funktioniert unter Ubuntu 18.04, vielleicht nicht unter anderen).
In der Schlange
cat | xsel --display :0 -i -b
Der Parameter --display :0
ist erforderlich, da der Prozess keine eigene X-Anzeige mit einer Zwischenablage hat und daher explizit angegeben werden muss. Dieser Wert :0
funktioniert unter Ubuntu 18.04 mit Wayland Windows Server. Bei anderen Setups funktioniert es möglicherweise nicht. Bei einem Standard-X-Server kann diese Antwort hilfreich sein.
host-A
/etc/ssh/sshd_config
Parameter
Zum Schluss noch ein paar Parameter /etc/ssh/sshd_config
auf dem Host A
, die festgelegt werden sollten, um die Berechtigung zum ssh
Herstellen einer Verbindung und die Berechtigung zum Verwenden von -key nur ohne Kennwort sicherzustellen:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A
Damit der sshd
Server die Konfiguration erneut liest
sudo systemctl restart sshd.service
oder
sudo service sshd.service restart
Fazit
Es ist ein gewisser Aufwand, es einzurichten, aber andere Funktionen to-clipboard
können parallel zum selben Framework erstellt werden.
:'<,'>w !ssh desktop pbcopy