Я уверен, что для этого есть много решений, и многие из них более надежны, чем то, которое я предлагаю. Однако этого может быть достаточно для ваших нужд. Для того, чтобы сделать это, я предполагаю, что пользователь имеет возможность выполнять аутентификацию на основе ключа ssh (putty или любой ssh unix должен поддерживать это).
Добавьте пользователя, как обычно ("adduser" или любой другой инструмент)
Создайте каталог users .ssh и .ssh/authorized_keys
your_user $ sudo -Hu ssh_forwarder /bin/bashssh_forwarder $ cd ~ssh_forwarder $ mkdir .sshssh_forwarder $ ( umask 066 && cat > .ssh/authorized_keys ) <<EOFno-agent-forwarding,no-X11-forwarding,command="read a; exit" ssh-rsa AAAB3NzaC1y....2cD/VN3NtHw== smoser@brickiesEOF
- Отключите доступ по паролю к этой учетной записи.
your_user $ sudo usermod --lock ssh_forwarder
Теперь единственный способ, которым пользователь может попасть в вашу систему, - это получить доступ к соответствующему ssh-ключу, и ssh будет запускать для них "/ bin /bash -c 'read a'", независимо от того, что они пытаются запустить. "read a" будет просто считываться до новой строки, а затем оболочка завершит работу, поэтому пользователю просто нужно нажать "enter", чтобы прервать соединение.
Есть много других вещей, которые вы могли бы сделать в 'command='. Видеть man authorized_keys
и найдите "команду" для получения дополнительной информации.
Если вам не нравится тот факт, что нажатие enter прерывает соединение, вы можете использовать что-то вроде следующего для ввода 'command=':
command="f=./.fifo.$$ && mkfifo $f && trap \"rm -f $f\" EXIT && read a <$f && echo $a; exit;"
Это просто создает временный файл fifo в домашнем каталоге пользователей, а затем пытается выполнить чтение из него. Ничто не будет записываться в этот файл, так что это будет зависать на неопределенный срок. Кроме того, если вы хотите принудительно прервать это соединение, вы можете сделать что-то вроде:
your_user$ echo GOODBYE | sudo tee ~ssh_forwarder/.fifo.*
Это должно использовать очень мало ресурсов, и в этом сценарии не должно быть ничего неправильного, что не привело бы к завершению работы оболочки.
sleep 1h; echo You have been here too long. Good bye.
Я не видел, как вы могли бы разрешить пользователю удаленную переадресацию (ssh -R
) , но ограничить (ssh -L
). Возможно, можно было бы использовать "permitopen". Поиск в Google было не очень полезно. Казалось бы, что-то вроде 'no-port-forwarding,permitremoteopen=10001' было бы полезно разрешить ssh -R 6901:localhost:6901
.
Это a решение. Его определенно можно улучшить, и любое открытие удаленных портов должно быть тщательно изучено. Если бы моя цель состояла в том, чтобы позволить моей бабушке подключиться к моей локальной сети, чтобы я мог использовать vnc для просмотра ее экрана, и доступ к этим ключам был ограничен только ею, лично я чувствовал бы себя в достаточной безопасности. Если бы это касалось предприятия, потребовалось бы более тщательное расследование. Одна вещь, о которой нужно знать, это ssh -N
вообще не запрашивает оболочку, поэтому код 'command=' не выполняется.
Другие, возможно, более безопасные механизмы могут включать создание пользовательской оболочки для пользователя и даже блокировку ее с помощью apparmour.