Можно ли настроить ssh (в Linux), чтобы разрешить доступ только для туннелирования? Т.е. пользователь может настраивать туннели, но не может получить файлы оболочки / доступа?
Да, просто используйте /bin/false
в качестве оболочки и проинструктируйте пользователя запустить процесс туннелирования SSH без выполнения каких-либо удаленных команд (т.е. -N
флаг для OpenSSH):
ssh -N -L 1234:target-host:5678 ssh-host
В пользовательский файл .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», но другие могут быть полезны, если пользователь должен туннелировать только на определенные серверы.
См. Страницу руководства по sshd, чтобы узнать о дополнительных параметрах authorized_keys файл.
Обратите внимание, что опыт пользователя может выглядеть немного странным: когда они подключатся по ssh, это будет выглядеть так, как будто сеанс завис (поскольку они не получают pty). Все нормально. Если пользователь указал переадресацию портов, например, «-L3306: 192.168.1.10: 3306», переадресация порта все равно будет действовать.
В любом случае, попробуйте.
Предоставьте пользователю оболочку, которая позволяет ему только выходить из системы, например /bin/press_to_exit.sh
#!/bin/bash read -n 1 -p "Press any key to exit" key
Таким образом, он может оставаться в системе столько, сколько захочет, с активными туннелями, но не выполнять никаких команд. Ctrl-c
закрывает соединение.
Назначьте оболочку, которая не позволяет пользователю войти в систему.
например
#!/bin/sh
echo "No interactive login available."
sleep 60
exit 0
помешает им получить приглашение оболочки и даст им тайм-аут в 60 секунд - если нет активного соединения в течение 60 секунд, он выйдет и тем самым полностью отключит их (увеличьте число в соответствии с требованиями).
Они также не могут выполнить удаленную команду, потому что оболочка им этого не позволяет.
Мое решение - предоставить пользователю, который может только туннелировать, без интерактивной оболочки, чтобы установить эту оболочку в / 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/
##Create a new user
sudo useradd -m [user]
##Edit /etc/ssh/sshd_config
Match User [user]
#AllowTcpForwarding yes
#X11Forwarding no
#PermitTunnel no
GatewayPorts yes ##Enable listening on 0.0.0.0
AllowAgentForwarding no
PermitOpen localhost:2888 ##specify port
ForceCommand echo 'This account can only be used for Tunneling'