SSH туннелирование только доступ

31

Можно ли настроить SSH (в Linux), чтобы разрешить доступ только для туннелирования? Т.е. пользователь может настроить туннели, но не может получить шелл / доступ к файлам?

второй
источник

Ответы:

42

Да, просто используйте в /bin/falseкачестве оболочки и поручите пользователю запустить процесс туннелирования SSH без выполнения какой-либо удаленной команды (т. -NЕ. Флага для OpenSSH):

ssh -N -L 1234:target-host:5678 ssh-host
граф
источник
Хм, если пользователь не использует -N, у него есть доступ к оболочке. Это действительно не решает проблему и является опасным.
mlissner
12
@mlissner: Нет, если у вас есть /bin/falseоболочка, у вас не будет доступа к оболочке, так как каждый сеанс входа в систему будет немедленно прекращен.
Свен
10

В пользовательском файле .ssh / authorized_keys поместите что-то вроде следующего:

permitopen="192.168.1.10:3306",permitopen="10.0.0.16:80",no-pty ssh-rsa AAAAB3N...

Таким образом, в основном, вы должны находиться перед открытым ключом ssh пользователя, разделенным пробелом. В этом примере соединениям, использующим определенный открытый ключ, будет разрешено выполнять переадресацию порта SSH только на сервер MySQL 192.168.1.10 и веб-сервер 10.0.0.16, и не будет назначена оболочка (no-pty). Вы конкретно спрашиваете об опции «no-pty», но другие также могут быть полезны, если пользователь должен только туннелировать на определенные серверы.

Посмотрите man-страницу для sshd, чтобы узнать больше о параметрах файла авторизованных ключей .

Обратите внимание, что пользовательский опыт может выглядеть немного странно: когда он входит в ssh, это будет выглядеть так, как будто сеанс зависает (так как он не получает pty). Ничего страшного. Если пользователь указал переадресацию порта с помощью, например, «-L3306: 192.168.1.10: 3306», переадресация порта все еще будет действовать.

В любом случае, попробуйте.

CJC
источник
6
Это опасный совет ; no-ptyне предотвращает доступ к оболочке, просто не дает оболочке pty. Он не отображает приглашение (т. Е. «Кажется, что зависает»), но вы все равно можете давать команды просто отлично. Вам нужна command="..."опция, .ssh/authorized_keysесли вы хотите оттуда ограничить доступ к оболочке.
Алекси Торхамо
@ AleksiTorhamo правильно, но это начало; Вы также должны установить shell в / usr / sbin / nologin или / bin / false в / etc / passwd, чтобы полностью ограничить оболочку. Я отредактировал вышеприведенную запись, чтобы отразить это вместе с советами Алекси.
Джеймисон Беккер
4

Дайте пользователю оболочку, которая только позволяет ему выходить из системы, такой как /bin/press_to_exit.sh

#! / Bin / Баш
read -n 1 -p «Нажать любую клавишу для выхода»

Таким образом он может оставаться в системе сколько угодно, с активными туннелями, но не запускать никаких команд. Ctrl-cзакрывает соединение

Tinkerbell
источник
3
Я думаю, что, по крайней мере, теоретически, пользователь сможет нажать CTRL + C в нужный момент (между строками 1 и 2) и получить полную оболочку bash.
Андреас-ч
2

Назначьте оболочку, которая не позволяет пользователю войти в систему.

например

#!/bin/sh
echo "No interactive login available."
sleep 60
exit 0

будет препятствовать тому, чтобы они получали приглашение оболочки, и давал бы им тайм-аут 60 секунд - если в течение 60 секунд не будет никакого активного соединения, то он выйдет и тем самым полностью их отключит (увеличьте число в соответствии с требованиями).

Они также не могут выполнить удаленную команду, потому что эта оболочка не позволит им.

JRG
источник
4
Большинство установок Linux уже поставляются с этим. / sbin / nologin или / bin / false или аналогичные.
Рори
1
Что бы сделал Ctrl-C в приведенном выше примере?
Арджан
Арджан: Поскольку скрипт используется в качестве оболочки, Ctrl-C будет иметь тот же эффект, что и " logout" на обычном.
Гравитация
2
Мне действительно нравится ответ Эрла, с опцией «-N», но если вы хотите дать своему пользователю полезное, дружелюбное, информативное сообщение - и не давать им оставлять соединения SSH повсюду - тогда пользовательский скрипт хорош и понятен что он делает
JRG
2
@jrg Это обсуждение старое, и вы, возможно, изменили свое мнение :), но ИМХО опасно выпускать скрипты ручной работы. Уже есть /sbin/nologin, что вы можете настроить с помощью удобного сообщения в /etc/nologin.txt.
dr01
0

Мое решение состоит в том, чтобы предоставить пользователю, который может только туннелировать, без интерактивной оболочки , установить эту оболочку в / etc / passwd в / usr / bin / tunnel_shell .

Просто создайте исполняемый файл / usr / bin / tunnel_shell с бесконечным циклом .

Кроме того , воспользоваться AllowGroupsи Match Groupопцией.

Полностью объяснено здесь: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/

Даниэль В.
источник
2
Пользователь может выйти из исполняемого файла и покинуть оболочку. Вы абсолютно уверены, что ваш исполняемый файл не позволит это сделать?
dr01
2
@ dr01 Если честно, я не уверен, что это на 100% безопасно. Я предполагаю, что когда вы выходите из исполняемого файла, сеанс SSH также завершается. Я исследую это больше и могу прокомментировать здесь.
Дэниел У.