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

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

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

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

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

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

TL;DR - перейдите к нижней части ответа, "Применение ограничений"

Добавление ограниченного пользователя состоит из двух частей:1. Создание пользователя 2. Настройка демона SSH (sshd)

Настройка sshd

Лучшее место для ознакомления с возможностями SSH - это чтение соответствующих страниц руководства:

Где SSH-клиент может выполнять действия?

Прежде чем вы сможете что-то ограничить, вам нужно знать особенности SSH. Пролистывание страниц руководства дает:

  • Выполнение команд оболочки
  • Загрузка файлов через sftp
  • Перенаправление портов
    • Клиент пересылает (неиспользуемый) порт на сервер
    • Сервер пересылает свой порт клиенту
    • Сервер пересылает порт другого хоста клиенту (прокси-сервер)
  • Переадресация X11 (переадресация дисплея)
  • Перенаправление агента аутентификации
  • Перенаправление туннельного устройства

Из Идентификация раздел о страница руководства по sshd(8):

Если клиент успешно аутентифицирует себя, вводится диалоговое окно для подготовки сеанса. В это время клиент может запросить такие вещи, как выделение псевдо-tty, переадресация соединений X11, переадресация TCP-соединений или переадресация подключения агента аутентификации по защищенному каналу.

После этого клиент либо запрашивает командную оболочку или выполнение команды. Затем стороны переходят в режим сеанса. В этом режиме любая сторона может отправлять данные в любое время, и такие данные пересылаются в/из командной оболочки или команды на стороне сервера и пользовательского терминала на стороне клиента.

Варианты ограничения функций SSH

Файлы и их параметры, которые изменяют поведение, являются:

  • ~/.ssh/authorized_keys - содержит ключи, которые разрешено подключать, которым могут быть предоставлены опции:
    • command="command" - Команда, предоставленная пользователем (если таковая имеется), игнорируется. Обратите внимание, что клиент может указать переадресацию TCP и/или X11, если они явно не запрещены. Обратите внимание, что этот параметр применяется к выполнению командной строки, команды или подсистемы.
    • no-agent-forwarding - Запрещает пересылку агента аутентификации, когда этот ключ используется для аутентификации.
    • no-port-forwarding - Запрещает пересылку TCP, когда этот ключ используется для аутентификации
    • no-X11-forwarding - "Запрещает пересылку X11, когда этот ключ используется для аутентификации".
    • permitopen="host:port" - Ограничьте переадресацию локального порта 'ssh -L' таким образом, чтобы он мог подключаться только к указанному хосту и порту.
  • ~/.ssh/environment - Этот файл считывается в среду при входе в систему (если он существует). Обработка среды по умолчанию отключена и управляется с помощью параметра PermitUserEnvironment
  • ~/.ssh/rc - Содержит процедуры инициализации, которые должны быть запущены до того, как домашний каталог пользователя станет доступным.
  • /etc/ssh/sshd_config - общесистемный конфигурационный файл
    • AllowAgentForwarding - Указывает, разрешена ли переадресация ssh-агента(1).
    • AllowTcpForwarding
    • ForceCommand - "Принудительно выполняет команду, указанную ForceCommand, игнорируя любую команду, предоставленную клиентом, и ~/.ssh/rc, если она присутствует. Команда вызывается с помощью командной строки входа пользователя с параметром -c."
    • GatewayPorts - "Указывает, разрешено ли удаленным хостам подключаться к портам, перенаправленным для клиента. По умолчанию sshd(8) привязывает переадресацию удаленных портов к адресу обратной связи. Это предотвращает подключение других удаленных узлов к перенаправленным портам. GatewayPorts можно использовать, чтобы указать, что sshd должен разрешать пересылку удаленных портов для привязки к адресам без обратной связи, что позволяет подключаться другим хостам."
    • PermitOpen:

      Указывает пункты назначения, к которым разрешена переадресация TCP-портов. Спецификация пересылки должна быть одной из следующих форм:

      PermitOpen host:portPermitOpen IPv4_addr:portPermitOpen [IPv6_addr]:port

      Можно указать несколько переадресаций, разделив их пробелами. Аргумент 'any' может быть использован для снятия всех ограничений и разрешения любых запросов на пересылку. По умолчанию разрешены все запросы на перенаправление портов.

    • PermitTunnel - Указывает, разрешена ли переадресация устройства tun(4). Значение по умолчанию - "нет"
    • X11Forwarding - Указывает, разрешена ли переадресация X11. Значение по умолчанию - "нет"

Применение ограничений

Изменение общесистемного конфигурационного файла /etc/ssh/sshd_config позволяет применять конфигурацию, даже если применяется проверка подлинности на основе пароля или если ограничения в ~/.ssh/authorized_keys случайно удаляются. Если вы изменили глобальные значения по умолчанию, вам следует соответствующим образом раскомментировать параметры.

Match User limited-user   #AllowTcpForwarding yes   #X11Forwarding no   #PermitTunnel no   #GatewayPorts no   AllowAgentForwarding no   PermitOpen localhost:62222   ForceCommand echo 'This account can only be used for [reason]'

Теперь добавьте пользователя:

sudo useradd -m limited-user

Возможность ForceCommand может быть опущен, если оболочка установлена на не-оболочку, например /bin/false (или /bin/true) как /bin/false -c [command] ничего не будет делать.

Теперь клиент может подключаться только к порту 62222 по обратному адресу сервера по SSH (он не будет прослушивать общедоступный IP-адрес)

Отключение AllowTcpForwarding также запретило бы использование -R, что исключает использование такой ограниченной учетной записи для пересылки одного порта. PermitOpen localhost:62222 предполагается, что порт 62222 на сервере никогда не используется, потому что клиент может с радостью подключиться к нему и прослушивать его тоже.

Если в общесистемной конфигурации разрешена переадресация TCP и отключена проверка подлинности на основе пароля, вы также можете использовать настройки для каждого ключа. Редактировать ~/.ssh/authorized_keys и добавьте следующие параметры перед ssh- (с пробелом между параметрами и ssh-):

command="echo 'This account can only be used for [reason]'",no-agent-forwarding,no-X11-forwarding,permitopen="localhost:62222"

Проверить

Чтобы быть уверенным, что он работает должным образом, необходимо запустить некоторые тестовые примеры. В приведенных ниже командах, host должен быть заменен фактическим логином, если он не установлен в ~/.ssh/config. За командой отображается команда, которая должна быть выполнена либо на клиенте, либо на сервере (как указано).

# connection closed:ssh host# connection closed (/bin/date is not executed):ssh host /bin/date# administratively prohibited (2x):ssh host -N -D 62222 # client: curl -I --socks5 localhost:62222 example.comssh host -N -L 8080:example.com:80 # client: curl -I localhost:8080sftp host# should be possible because the client should forward his SSH serverssh host -N -R 8080:example.com:80 # server: curl -I localhost:8080# This works, it forwards the client SSH to the serverssh host -N -R 62222:localhost:22# unfortunately, the client can listen on that port too. Not a big issuessh host -N -L 1234:localhost:62222

Вывод

Контрольный список: Пользователь SSH не должен иметь возможности:

  • выполнение команд оболочки - сделано
  • доступ к файлам или загрузка файлов на сервер - сделано
  • используйте сервер в качестве прокси-сервера (например, webproxy) - сделано
  • доступ к локальным службам, которые в противном случае были бы недоступны для общественности из-за брандмауэра - частично, клиент не может получить доступ к другим портам, кроме 62222, но может прослушивать и подключаться к порту 62222 на сервере
  • убейте сервер - сделано(обратите внимание, что эти проверки ограничены SSH-сервером. Если у вас есть другая уязвимая служба на компьютере, это может позволить возможному злоумышленнику запускать команды, отключать сервер и т.д. )

Я уверен, что для этого есть много решений, и многие из них более надежны, чем то, которое я предлагаю. Однако этого может быть достаточно для ваших нужд. Для того, чтобы сделать это, я предполагаю, что пользователь имеет возможность выполнять аутентификацию на основе ключа 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.

Попробуй command="exit"

Это заставило бы пользователей использовать эту команду для переноса вперед

ssh -NfR EXTERNAL_PORT:localhost:INTERNAL_PORT usr@server -i key

См. Эту ссылку. В нем кратко излагаются мои experience