Я уверен, что есть много решений для этого, и гораздо более надежных, чем тот, который я предлагаю. Однако этого может быть достаточно для ваших нужд. Для того, чтобы сделать это, я предполагаю, что пользователь может выполнить аутентификацию на основе ключей ssh (замазка или любой Unix ssh должен поддерживать это).
your_user $ sudo -Hu ssh_forwarder /bin/bash
ssh_forwarder $ cd ~
ssh_forwarder $ mkdir .ssh
ssh_forwarder $ ( umask 066 && cat > .ssh/authorized_keys ) <<EOF
no-agent-forwarding,no-X11-forwarding,command="read a; exit" ssh-rsa AAAB3NzaC1y....2cD/VN3NtHw== smoser@brickies
EOF
- Отключить пароль доступа к этой учетной записи.
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
), но limit ( ssh -L
). Возможно, можно использовать 'allowopen'. Поиск в Google не очень помог. Казалось бы, что-то вроде «no-port-forwarding, allowremoteopen = 10001» было бы полезно разрешить ssh -R 6901:localhost:6901
.
Это решение. Это может быть определенно улучшено, и любое открытие удаленных портов должно быть тщательно изучено. Если бы моей целью было позволить моей бабушке подключиться к моей локальной сети, чтобы я мог использовать vnc для просмотра ее экрана, а доступ к этим клавишам был ограничен для нее, я лично чувствовал бы себя в достаточной безопасности. Если бы это было для предприятия, более тщательное расследование было бы необходимо. Следует помнить , что оболочка вообще не запрашивает оболочку, поэтому код command = не выполняется.ssh -N
Другие, возможно, более безопасные механизмы могут включать создание пользовательской оболочки и даже блокировку ее с помощью apparmour.