Ця відповідь розвивається як із обраної відповіді , додаючи більше безпеки.
Ця відповідь обговорювала загальну форму
<command that makes output> | \
ssh <user A>@<host A> <command that maps stdin to clipboard>
Там , де безпека може бути відсутнім в той ssh
дозвіл дозволяє <user B>
на host B>
до ssh
в host A
і виконати будь-яку команду.
Звичайно, B
для A
доступу вже може бути відкритий ssh
ключ, і він навіть може мати пароль. Але інший рівень безпеки може обмежувати область допустимих команд, які B
можна виконувати A
, наприклад, таким чином, що rm -rf /
їх не можна викликати. (Це особливо важливо, якщо в ssh
ключі немає пароля.)
На щастя, ssh
є вбудована функція під назвою обмеження команд або примусова команда . Див ssh.com , або цей ServerFault.com питання .
Наведене нижче рішення показує загальне рішення форми разом із застосованим ssh
обмеженням команд .
Приклад рішення з додаванням обмеження команди
Це розширене рішення щодо безпеки відповідає загальній формі - дзвінок із ssh
сеансу далі host-B
просто:
cat <file> | ssh <user-A>@<host A> to_clipboard
У решті цього розділу показано налаштування, щоб змусити його працювати.
Налаштування обмеження команд ssh
Припустимо, що в обліковому записі користувача B
є user-B
, а в B є ключ ssh id-clip
, створений звичайним способом ( ssh-keygen
).
Тоді в user-A
ssh каталозі є файл
/home/user-A/.ssh/authorized_keys
який розпізнає ключ id-clip
і дозволяє ssh
з'єднання.
Зазвичай вміст кожного рядка authorized_keys
є саме публічним дозволом, наприклад, вмістом id-clip.pub
.
Однак, щоб застосувати обмеження команд, що вміст відкритого ключа є попередньою (на тому ж рядку) командою, яка виконується.
У нашому випадку:
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>
Позначена команда "/home/user-A/.ssh/allowed-commands.sh id-clip"
та лише ця призначена команда виконується кожного разу, коли id-clip
використовується ключ , ініціює ssh
з'єднання host-A
- незалежно від того, до якої команди написано ssh
командний рядок .
Команда вказує файл сценарію allowed-commands.sh
, а також вміст цього файлу сценарію
#/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
Початковий дзвінок ssh
на машині B
був
... | ssh <user-A>@<host A> to_clipboard
Рядок to-clipboard
передається allowed-commands.sh
змінною оточення SSH_ORIGINAL_COMMAND
. Крім того, ми передали ім'я ключа id-clip
, з рядка, до authorized_keys
якого доступ лише id-clip
.
Лінія
notify-send "ssh to-clipboard, from ${Id}"
це лише спливаюче вікно повідомлень, яке дозволяє вам знати, що написаний буфер обміну - це, мабуть, і хороша функція безпеки. ( notify-send
працює на Ubuntu 18.04, можливо, не на інших).
У рядку
cat | xsel --display :0 -i -b
параметр --display :0
необхідний, оскільки у процесу немає власного X-дисплея з буфером обміну, тому його слід чітко вказати. Це значення :0
працює на Ubuntu 18.04 з віконним сервером Wayland. Для інших налаштувань це може не працювати. Для звичайного X-сервера ця відповідь може допомогти.
host-A
/etc/ssh/sshd_config
параметри
Нарешті, кілька параметрів у /etc/ssh/sshd_config
хості, A
які слід встановити для забезпечення дозволу на підключення та дозволу на використання ssh
-key лише без пароля:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A
Щоб sshd
сервер перечитав конфіг
sudo systemctl restart sshd.service
або
sudo service sshd.service restart
висновок
Для її налаштування to-clipboard
потрібні певні зусилля, але крім того, інші функції можуть бути побудовані паралельно в тому ж самому рамках.
:'<,'>w !ssh desktop pbcopy