Как создать ограниченного пользователя SSH для перенаправления портов?

ændrük предложил обратное соединение для получения простого SSH-соединения с кем-то еще (для удаленной помощи). Для этого для приема соединения требуется дополнительный пользователь. Этот пользователь должен иметь возможность перенаправлять свой порт через сервер (сервер действует как прокси-сервер).

Как создать ограниченного пользователя, который может делать ничего, кроме описанного выше?

Новый пользователь не сможет:

выполнить команды оболочки, получить доступ к файлам или загрузить файлы на сервер, использовать сервер в качестве прокси-сервера (например, веб-прокси) для доступа к локальным службам, которые в противном случае не были общедоступны из-за брандмауэр убивает сервер

Обобщенный, как мне создать ограниченного пользователя SSH, который может подключаться только к SSH-серверу без привилегий, поэтому я могу подключиться через это соединение с его компьютером?

1
задан 13 April 2017 в 15:24

1 ответ

Я уверен, что есть много решений для этого, и многие более надежные, чем тот, который я предлагаю. Однако этого может быть достаточно для ваших нужд. Чтобы сделать это, я предполагаю, что пользователь может выполнить проверку подлинности на основе ssh (putty или любой unix ssh должен поддерживать это).

Добавить пользователя, как обычно ('adduser' или любой другой инструмент) Создайте пользователей .ssh dir и .ssh / authorized_keys
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
Добавьте пользователя, как обычно («adduser» или любой другой инструмент) [ ! d6]
your_user $ sudo usermod --lock ssh_forwarder

Теперь единственный способ, которым пользователь может попасть в вашу систему, - это доступ к правильному ssh-ключу, и ssh будет запускать «/ bin / bash -c» читать «» для них, нет что они пытаются запустить. «read a» будет просто читать до новой строки, а затем оболочка выйдет, поэтому пользователю просто нужно нажать «enter», чтобы убить соединение.

Есть много других вещей, которые вы могли бы сделать в 'команда ='. См. [F6] и найдите команду «command» для получения дополнительной информации.

Если вам не нравится тот факт, что попадание в игру убивает соединение, вы можете использовать для записи «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). Возможно, можно использовать «разрешительный аппарат». Гуглинг не очень помог. Казалось бы, что-то вроде «no-port-forwarding, allowremoteopen = 10001» было бы полезно, чтобы разрешить ssh -R 6901:localhost:6901.

Это решение. Он может быть определенно улучшен, и любое открытие удаленных портов должно быть тщательно изучено. Если бы моя цель состояла в том, чтобы позволить моей бабушке подключиться к моей локальной сети, чтобы я мог использовать vnc для просмотра ее экрана, и доступ к этим ключам был ограничен ею, я лично чувствовал бы себя достаточно безопасным. Если это было для предприятия, потребуется более тщательное расследование. Одна вещь, о которой нужно знать, - ssh -N, вообще не запрашивает оболочку, поэтому код «command =» не выполняется.

Другие, возможно, более безопасные механизмы могут включать создание настраиваемой оболочки для пользователя и даже блокировки с помощью apparmour.

2
ответ дан 25 May 2018 в 20:23
  • 1
    Это выглядит очень хаки, даже нет необходимости иметь оболочку, потому что не нужно выполнять команду. См. страницу руководства ssh для параметра -N. Должен быть более чистый способ добиться этого. – Lekensteyn 21 June 2011 в 18:41
  • 2
    Это правда. Я надеюсь увидеть и более чистое решение. Я действительно думаю, что authorized_keys в сочетании с no-port-forwarding было бы довольно хорошим решением, если бы была опция «allowremoteopen». – smoser 21 June 2011 в 18:51
  • 3
    Я провел некоторое исследование (см. Выше). Поскольку ssh -N не выполняет команду вообще, это не проблема, что command="something" закрывает сеанс. – Lekensteyn 22 June 2011 в 14:24

Другие вопросы по тегам:

Похожие вопросы: