Ондрюк предложил обратное соединение для получения простого SSH-соединения с кем-то другим (для удаленной помощи). Чтобы это работало, требуется дополнительный пользователь, чтобы принять соединение. Этот пользователь должен иметь возможность перенаправлять свой порт через сервер (сервер действует как прокси).
Как создать пользователя с ограниченными правами, который не может сделать ничего, кроме описанного выше?
Новый пользователь не должен иметь возможность:
- выполнять команды оболочки
- получить доступ к файлам или загрузить файлы на сервер
- использовать сервер в качестве прокси (например, webproxy)
- доступ к локальным службам, которые в противном случае не были общедоступными из-за брандмауэра
- убить сервер
Подводя итог, как мне создать ограниченного пользователя SSH, который может подключаться только к серверу SSH без привилегий, чтобы я мог подключиться через это соединение к его компьютеру?
ssh
security
port-forwarding
Lekensteyn
источник
источник
Ответы:
TL; DR - перейти к нижней части ответа «Применение ограничений»
Добавление ограниченного пользователя состоит из двух частей: 1. Создание пользователя. 2. Настройка демона SSH (sshd).
Конфигурирование sshd
Лучшее место, чтобы узнать о возможностях SSH, читая соответствующие страницы руководства:
Где SSH-клиент может выполнять действия?
Прежде чем вы сможете что-то ограничить, вам нужно знать особенности SSH. Плевание по страницам справочника дает:
Из раздела Аутентификация страницы руководства по sshd (8) :
Варианты ограничения функций 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-agent (1).AllowTcpForwarding
ForceCommand
- «Принудительно выполняет команду, указанную ForceCommand, игнорируя любую команду, предоставленную клиентом, и ~ / .ssh / rc, если он присутствует. Команда вызывается с использованием оболочки входа пользователя с параметром -c.»GatewayPorts
- "Указывает, разрешено ли удаленным хостам подключаться к портам, перенаправленным для клиента. По умолчанию sshd (8) связывает перенаправления удаленных портов с адресом обратной связи. Это не позволяет другим удаленным хостам подключаться к перенаправленным портам. GatewayPorts можно использовать для указания что sshd должен позволять перенаправлениям удаленных портов связываться с нециклическими адресами, что позволяет другим хостам подключаться ».PermitOpen
:PermitTunnel
- Указывает, разрешена ли пересылка устройства tun (4). По умолчанию «нет»X11Forwarding
- Указывает, разрешена ли пересылка X11. По умолчанию «нет»Применение ограничений
Изменение общесистемного файла конфигурации
/etc/ssh/sshd_config
позволяет применять конфигурацию даже в том случае, если применяется проверка подлинности на основе пароля или~/.ssh/authorized_keys
случайное снятие ограничений . Если вы изменили глобальные значения по умолчанию, вы должны соответствующим образом раскомментировать параметры.Теперь добавьте пользователя:
Эта опция
ForceCommand
может быть опущена, если для оболочки задана не-оболочка типа/bin/false
(или/bin/true
), так как/bin/false -c [command]
ничего не будет делать.Теперь клиент может подключаться только к порту 62222 по адресу обратной связи сервера через SSH (он не будет прослушивать общедоступный IP-адрес)
Отключение
AllowTcpForwarding
также запретило бы использование-R
, тем самым исключив использование такой ограниченной учетной записи для переадресации одного порта.PermitOpen localhost:62222
предполагается, что порт 62222 на сервере никогда не используется, потому что клиент может счастливо подключиться к нему и прослушивать его тоже.Если пересылка TCP разрешена в общесистемной конфигурации и отключена аутентификация на основе пароля, вы также можете использовать настройки для каждого ключа. Отредактируйте
~/.ssh/authorized_keys
и добавьте следующие параметры передssh-
(с пробелом между параметрами иssh-
):проверить
Чтобы быть уверенным, что все работает как положено, необходимо выполнить несколько тестов. В приведенных ниже командах
host
должен быть заменен реальным логином, если он не установлен в~/.ssh/config
. За командой показана команда, которая должна быть выполнена либо на клиенте, либо на сервере (как указано).Заключение
Контрольный список: пользователь SSH не должен:
источник
useradd
должен быть разблокирован. Это можно сделать, заменив пароль/etc/shadow
на звездочку (*
) или установив пароль с помощьюsudo passwd limited-user
.sftp-server
команду. С помощьюForceCommand
этой команды больше не будет выполняться.from=
опция вauthorized_keys
. Это позволяет ограничить использование ключа источниками с определенным IP-адресом или именем хоста. Пример,from="1.1.1.1"
илиfrom="10.0.0.?,*.example.com"
. См. Раздел «ФОРМАТ ФАЙЛА AUTHORIZED_KEYS» на странице руководства ( linux.die.net/man/8/sshd ) для получения информации о всех параметрах авторизованных ключей .Host * ControlMaster auto
на ваш~/.ssh/config
файл при соединении сssh -N
. Если вам это нужно, используйтеssh -N -o ControlMaster=no
Я уверен, что есть много решений для этого, и гораздо более надежных, чем тот, который я предлагаю. Однако этого может быть достаточно для ваших нужд. Для того, чтобы сделать это, я предполагаю, что пользователь может выполнить аутентификацию на основе ключей ssh (замазка или любой Unix ssh должен поддерживать это).
Добавьте пользователя как обычно («adduser» или любой другой инструмент)
Создайте пользователей .ssh dir и .ssh / authorized_keys
Теперь единственный способ, которым пользователь может войти в вашу систему, - это получить доступ к соответствующему ключу ssh, и ssh запустит для них «/ bin / bash -c 'read a'», независимо от того, что они пытаются запустить. «read a» будет просто читать до новой строки, а затем оболочка завершится, поэтому пользователю просто нужно нажать «enter», чтобы разорвать соединение.
Есть много других вещей, которые вы могли бы сделать в 'command ='. Смотрите
man authorized_keys
и ищите «команду» для получения дополнительной информации.Если вам не нравится тот факт, что нажатие клавиши enter уничтожает соединение, вы можете использовать что-то вроде следующего для записи 'command =':
Это просто создает временный fifo в домашнем каталоге пользователя, а затем пытается прочитать его. Ничего не будет писать в этот файл, так что это будет зависать бесконечно. Кроме того, если вы хотите принудительно разорвать это соединение, вы можете сделать что-то вроде:
Это должно использовать очень мало ресурсов, и в этом сценарии не должно быть ошибок, которые не заканчиваются завершением оболочки.
Я не видел, как вы можете разрешить пользователю удаленную пересылку вперед (
ssh -R
), но limit (ssh -L
). Возможно, можно использовать 'allowopen'. Поиск в Google не очень помог. Казалось бы, что-то вроде «no-port-forwarding, allowremoteopen = 10001» было бы полезно разрешитьssh -R 6901:localhost:6901
.Это решение. Это может быть определенно улучшено, и любое открытие удаленных портов должно быть тщательно изучено. Если бы моей целью было позволить моей бабушке подключиться к моей локальной сети, чтобы я мог использовать vnc для просмотра ее экрана, а доступ к этим клавишам был ограничен для нее, я лично чувствовал бы себя в достаточной безопасности. Если бы это было для предприятия, более тщательное расследование было бы необходимо. Следует помнить , что оболочка вообще не запрашивает оболочку, поэтому код command = не выполняется.
ssh -N
Другие, возможно, более безопасные механизмы могут включать создание пользовательской оболочки и даже блокировку ее с помощью apparmour.
источник
ssh
для-N
выбора. Должен быть более чистый способ сделать это.ssh -N
команда вообще не выполняется, нет проблем сcommand="something"
закрытием сессии.chsh ssh_forwarder -s /bin/false
это все, что нужно.