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

77

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

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

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

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

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

    
задан Lekensteyn 10.06.2011 в 22:04
источник

2 ответа

130

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

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

Настройка sshd

Лучшим местом, чтобы узнать о возможностях SSH, является чтение связанных страниц руководства:

  • ssh (1)
  • ssh_config (5)
  • sshd (8)
  • sshd_config (5)

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

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

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

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

  

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

     

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

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

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

  • ~/.ssh/authorized_keys - содержит ключи, которые разрешено подключать, которым могут быть предоставлены параметры:
    • command="command" - команда, предоставленная пользователем (если есть), игнорируется. Обратите внимание, что клиент может указать пересылку TCP и / или X11, если они явно запрещены . Обратите внимание, что этот параметр применяется к выполнению оболочки, команды или подсистемы.
    • no-agent-forwarding - переадресация агента пересылки, когда этот ключ используется для аутентификации.
    • no-port-forwarding - запрещает пересылку TCP, когда этот ключ используется для аутентификации
    • no-X11-forwarding - «Forbids 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) связывает удаленные переадресации портов с адресом loopback, что предотвращает подключение других удаленных хостов к пересылаемым портам. GatewayPorts может быть используется для указания того, что sshd должен позволять удаленным переадресациям портов связываться с адресами без обратной связи, тем самым позволяя другим хостам подключаться. "
    • %код%:
        

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

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

      Несколько форвардов можно указать, разделив их на   пробельные. Аргумент «any» может быть использован для удаления всех   ограничения и разрешать любые запросы на пересылку. По умолчанию все   разрешено перенаправление портов.

    •   
    • PermitOpen - Указывает, разрешена ли пересылка устройства tun (4). По умолчанию используется значение «нет»
    •   
    • PermitTunnel - Указывает, разрешена ли пересылка X11.По умолчанию используется значение «нет»
    •   
  •   

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

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

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

Опция ~/.ssh/authorized_keys может быть опущена, если оболочка установлена ​​в не-оболочку, например ForceCommand (или /bin/false ), поскольку /bin/true ничего не сделает.

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

Отключение /bin/false -c [command] также запретит использование AllowTcpForwarding , тем самым побеждая использование такой ограниченной учетной записи для пересылки одного порта. -R предполагает, что порт 62222 на сервере никогда не используется, потому что клиент может с радостью подключиться к нему и слушать его тоже.

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

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

Verify

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

# 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.com
ssh host -N -L 8080:example.com:80 # client: curl -I localhost:8080
sftp host
# should be possible because the client should forward his SSH server
ssh host -N -R 8080:example.com:80 # server: curl -I localhost:8080
# This works, it forwards the client SSH to the server
ssh host -N -R 62222:localhost:22
# unfortunately, the client can listen on that port too. Not a big issue
ssh host -N -L 1234:localhost:62222

Заключение

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

  • выполнить команды оболочки - сделано
  • получить доступ к файлам или загрузить файлы на сервер - сделано
  • используйте сервер как прокси (например, webproxy) - сделано
  • доступ к локальным службам, которые в противном случае не были общедоступны из-за брандмауэра - частично , клиент не может получить доступ к другим портам, чем 62222, но может прослушивать и подключаться к порту 62222 на сервере.
  • убить сервер - сделано (обратите внимание, что эти проверки ограничены сервером SSH. Если у вас есть другая уязвимая служба на машине, это может позволить злоумышленнику запускать команды, убивать сервер и т. д.).
ответ дан Lekensteyn 22.06.2011 в 11:11
источник
2
___ tag123ssh ___ SSH, иначе известный как «Защищенная оболочка», является методом безопасного подключения к удаленному компьютеру. ___ qstntxt ___

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

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

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

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

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

    
___ answer50000 ___

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

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

Настройка sshd

Лучшим местом, чтобы узнать о возможностях SSH, является чтение связанных страниц руководства:

  • ssh (1)
  • ssh_config (5)
  • sshd (8)
  • sshd_config (5)

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

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

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

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

  

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

     

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

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

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

  • man authorized_keys - содержит ключи, которые разрешено подключать, которым могут быть предоставлены параметры:
    • ssh -R - команда, предоставленная пользователем (если есть), игнорируется. Обратите внимание, что клиент может указать пересылку TCP и / или X11, если они явно запрещены . Обратите внимание, что этот параметр применяется к выполнению оболочки, команды или подсистемы.
    • ssh -L - переадресация агента пересылки, когда этот ключ используется для аутентификации.
    • ssh -R 6901:localhost:6901 - запрещает пересылку TCP, когда этот ключ используется для аутентификации
    • ssh -N - «Forbids X11 переадресация, когда этот ключ используется для аутентификации».
    • %code% - Ограничить локальную пересылку порта 'ssh -L' таким образом, чтобы он мог подключаться только к указанному хосту и порту.
  • %code% - этот файл читается в среде при входе в систему (если он существует). Обработка среды по умолчанию отключена и контролируется с помощью опции PermitUserEnvironment
  • %code% - Содержит подпрограммы инициализации, которые будут выполняться до того, как станет доступен домашний каталог пользователя.
  • %code% - системный файл конфигурации
    • %code% - Указывает, разрешена ли пересылка ssh-agent (1).
    • %code%
    • %code% - «Заставляет выполнить команду, указанную ForceCommand, игнорируя любую команду, предоставленную клиентом, и ~ / .ssh / rc, если она есть. Команда вызывается с помощью оболочки входа пользователя с параметром -c."
    • %code% - «Указывает, разрешено ли удаленным хостам подключаться к портам, перенаправленным для клиента. По умолчанию sshd (8) связывает удаленные переадресации портов с адресом loopback, что предотвращает подключение других удаленных хостов к пересылаемым портам. GatewayPorts может быть используется для указания того, что sshd должен позволять удаленным переадресациям портов связываться с адресами без обратной связи, тем самым позволяя другим хостам подключаться. "
    • %код%:
        

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

      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== [email protected]
      EOF
      
           

      Несколько форвардов можно указать, разделив их на   пробельные. Аргумент «any» может быть использован для удаления всех   ограничения и разрешать любые запросы на пересылку. По умолчанию все   разрешено перенаправление портов.

    •   
    • %code% - Указывает, разрешена ли пересылка устройства tun (4). По умолчанию используется значение «нет»
    •   
    • %code% - Указывает, разрешена ли пересылка X11.По умолчанию используется значение «нет»
    •   
  •   

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

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

your_user $ sudo usermod --lock ssh_forwarder

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

command="f=./.fifo.$$ && mkfifo $f && trap \"rm -f $f\" EXIT && read a <$f && echo $a; exit;"

Опция %code% может быть опущена, если оболочка установлена ​​в не-оболочку, например %code% (или %code% ), поскольку %code% ничего не сделает.

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

Отключение %code% также запретит использование %code% , тем самым побеждая использование такой ограниченной учетной записи для пересылки одного порта. %code% предполагает, что порт 62222 на сервере никогда не используется, потому что клиент может с радостью подключиться к нему и слушать его тоже.

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

 your_user$ echo GOODBYE | sudo tee ~ssh_forwarder/.fifo.*

Verify

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

sleep 1h; echo You have been here too long. Good bye.

Заключение

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

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

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

  • Добавьте пользователя, как обычно («adduser» или любой другой инструмент)

  • Создайте пользователей .ssh dir и .ssh / authorized_keys

%pre%
  • Отключить доступ к паролю к этой учетной записи.
%pre%

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

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

Если вам не нравится тот факт, что нажатие вводит соединение, вы можете использовать для записи «command =» следующее:

%pre%

Это создает временный fifo в домашнем каталоге пользователей, а затем пытается прочитать его. Ничто не будет писать в этот файл, так что это будет длиться бесконечно. Кроме того, если вы хотите принудительно прекратить это соединение, вы можете сделать что-то вроде:

%pre%

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

%pre%

Я не видел, как вы можете позволить удаленному пользователю ( %code% ), но ограничить ( %code% ). Возможно, можно использовать «разрешительный аппарат». Googling не очень помог. Казалось бы, что-то вроде «no-port-forwarding, permitremoteopen = 10001» было бы полезно, чтобы разрешить %code% .

Это a решение. Он может быть определенно улучшен, и любое открытие удаленных портов должно быть тщательно изучено. Если бы моя цель состояла в том, чтобы позволить моей бабушке подключиться к моей локальной сети, чтобы я мог использовать vnc для просмотра ее экрана, и доступ к этим ключам был ограничен ею, я лично чувствовал бы себя достаточно безопасным. Если это было для предприятия, потребуется более тщательное расследование. Одна вещь, о которой нужно знать, это %code% не запрашивает оболочку вообще, поэтому код `command = 'не выполняется.

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

    
___ tag123security ___ Безопасность охватывает широкий набор тем, включая пользователей, разрешения, аутентификацию, авторизацию, обновления, брандмауэр, упрочнение и т. д. ___ tag123portforwarding ___ Вопросы по настройке, настройке и сохранению конфигураций переадресации портов. Убедитесь, что вопрос действительно связан с Ubuntu каким-то образом. ___ qstnhdr ___ Как создать ограниченного пользователя SSH для перенаправления портов? ___
ответ дан smoser 21.06.2011 в 15:09