Ta odpowiedź rozwija obie na wybraną odpowiedź , dodając więcej bezpieczeństwa.
Ta odpowiedź dotyczyła ogólnej formy
<command that makes output> | \
ssh <user A>@<host A> <command that maps stdin to clipboard>
Gdzie zabezpieczenie może być brak jest w ssh
uprawnienia pozwalające <user B>
na host B>
na ssh
na host A
i wykonać dowolną komendę.
Oczywiście B
do A
dostępu mogą być już ogrodzony przez ssh
klucz, a nawet może mieć hasło. Ale inna warstwa zabezpieczeń może ograniczyć zakres dozwolonych poleceń, które B
mogą być wykonywane A
, np. Tak, że rm -rf /
nie można ich wywołać. (Jest to szczególnie ważne, gdy ssh
klucz nie ma hasła).
Na szczęście ssh
ma wbudowaną funkcję o nazwie ograniczenie poleceń lub polecenie wymuszone . Zobacz ssh.com lub to pytanie serverfault.com .
Poniższe rozwiązanie przedstawia ogólne rozwiązanie formularza wraz z ssh
ograniczeniami poleceń wymuszonym .
Przykład Rozwiązanie z ograniczeniami poleceń dodanymi
To ulepszone rozwiązanie pod względem bezpieczeństwa ma ogólną formę - połączenie z ssh
sesji host-B
to po prostu:
cat <file> | ssh <user-A>@<host A> to_clipboard
Reszta tego pokazuje konfigurację, aby to zadziałało.
Konfiguracja ograniczenia polecenia ssh
Załóżmy, że konto użytkownika na B
to user-B
, a B ma klucz ssh id-clip
, który został utworzony w zwykły sposób ( ssh-keygen
).
Następnie w user-A
katalogu ssh znajduje się plik
/home/user-A/.ssh/authorized_keys
który rozpoznaje klucz id-clip
i umożliwia ssh
połączenie.
Zwykle zawartość każdego wiersza authorized_keys
jest dokładnie autoryzowanym kluczem publicznym, np. Zawartość id-clip.pub
.
Jednak aby wymusić ograniczenie poleceń , zawartość klucza publicznego jest poprzedzona (w tym samym wierszu) poleceniem, które ma zostać wykonane.
W naszym przypadku:
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>
Wyznaczone polecenie "/home/user-A/.ssh/allowed-commands.sh id-clip"
i tylko to wyznaczone polecenie jest wykonywane za każdym razem, gdy klawisz id-clip
jest używany do zainicjowania ssh
połączenia host-A
- bez względu na to, jakie polecenie jest zapisane w ssh
wierszu poleceń .
Polecenie wskazuje plik skryptu allowed-commands.sh
, a zawartość tego pliku to
#/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
Pierwotnym wezwaniem ssh
na maszynę B
było
... | ssh <user-A>@<host A> to_clipboard
Ciąg to-clipboard
jest przekazywany do allowed-commands.sh
zmiennej środowiskowej SSH_ORIGINAL_COMMAND
. Dodatkowo przekazaliśmy nazwę klucza id-clip
z linii, do authorized_keys
której ma dostęp tylkoid-clip
.
Linia
notify-send "ssh to-clipboard, from ${Id}"
to tylko wyskakujące okienko z wiadomością, które informuje, że trwa pisanie schowka - to prawdopodobnie dobra funkcja bezpieczeństwa. ( notify-send
działa na Ubuntu 18.04, może nie inne).
W linii
cat | xsel --display :0 -i -b
parametr --display :0
jest niezbędny, ponieważ proces nie ma własnego wyświetlacza X ze schowkiem, więc musi być wyraźnie określony. Ta wartość :0
działa na Ubuntu 18.04 z serwerem okien Wayland. W innych konfiguracjach może nie działać. W przypadku standardowego serwera X ta odpowiedź może pomóc.
host-A
/etc/ssh/sshd_config
parametry
Na koniec kilka parametrów /etc/ssh/sshd_config
na hoście, A
które należy ustawić, aby zapewnić pozwolenie na połączenie i pozwolenie na używanie ssh
-key tylko bez hasła:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A
Aby sshd
serwer ponownie odczytał plik config
sudo systemctl restart sshd.service
lub
sudo service sshd.service restart
wniosek
Konfiguracja to-clipboard
wymaga pewnego wysiłku, ale inne funkcje oprócz tego mogą być konstruowane równolegle w tym samym frameworku.
:'<,'>w !ssh desktop pbcopy