Можно ли запустить sshd как обычный пользователь?

Вопрос или проблема

Я собираюсь запустить второй экземпляр sshd на непривилегированном порту (например, 2222) с собственным конфигурационным файлом.

Очевидно, процесс sshd не может setuid, поэтому войти как пользователи, кроме того, кто запускает демон sshd, явно невозможно.

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

Я пытался запустить экземпляр sshd с собственным конфигом и ключом хоста, и процесс sshd запускается (нет жалоб на отсутствие прав root, как у некоторых команд), однако, когда я пытаюсь подключиться к этому порту, процесс sshd завершается.

$ /usr/sbin/sshd -dD -h .ssh/id_rsa -p 2222 
debug1: sshd version OpenSSH_5.6p1
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug1: setgroups() failed: Operation not permitted
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-dD'
debug1: rexec_argv[2]='-h'
debug1: rexec_argv[3]='.ssh/id_rsa'
debug1: rexec_argv[4]='-p'
debug1: rexec_argv[5]='2222'
debug1: Bind to port 2222 on 0.0.0.0.
Server listening on 0.0.0.0 port 2222.
debug1: Bind to port 2222 on ::.
Server listening on :: port 2222.
debug1: fd 6 clearing O_NONBLOCK
debug1: Server will not fork when running in debugging mode.
debug1: rexec start in 6 out 6 newsock 6 pipe -1 sock 9
debug1: inetd sockets after dupping: 5, 5
Connection from ::1 port 57670
debug1: Client protocol version 2.0; client software version OpenSSH_5.6
debug1: match: OpenSSH_5.6 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.6
debug1: list_hostkey_types: 
No supported key exchange algorithms
debug1: do_cleanup
debug1: do_cleanup
debug1: audit_event: unhandled event 12

Строка debug1: setgroups() failed: Operation not permitted очевидно выделяется, но он не завершает работу, пока не пытается принять подключение.

Запустите процесс с sshd -f ~/.ssh/sshd_config, где ~/.ssh/sshd_config – это новый файл, который вы создали. Среди других опций (таких как другой ключ хоста, другой порт и т. д.) необходимо добавить строку UsePrivilegeSeparation no. Это предотвратит попытку процесса sshd выполнять любые вызовы setuid или setgid и позволит ему продолжать работать как ваш пользователь и принимать подключения как ваш пользователь.

(Эта ссылка подтверждает, что это правильный способ: http://cygwin.com/ml/cygwin/2008-04/msg00363.html )

Вот скрипт на bash, основанный на ответе Бо Джианеса, который:

  • Создает рабочую директорию в домашнем каталоге
  • Генерирует ключи сервера в рабочей директории
  • Генерирует базовый конфигурационный файл с файлом pid, расположенным в рабочей директории
  • Запускает демон SSH
mkdir ${HOME}/custom_ssh
ssh-keygen -f ${HOME}/custom_ssh/ssh_host_rsa_key -N '' -t rsa
ssh-keygen -f ${HOME}/custom_ssh/ssh_host_dsa_key -N '' -t dsa

cat << EOF > ${HOME}/custom_ssh/sshd_config
Port 2222
HostKey ${HOME}/custom_ssh/ssh_host_rsa_key
HostKey ${HOME}/custom_ssh/ssh_host_dsa_key
AuthorizedKeysFile  .ssh/authorized_keys
ChallengeResponseAuthentication no
UsePAM yes
Subsystem   sftp    /usr/lib/ssh/sftp-server
PidFile ${HOME}/custom_ssh/sshd.pid
EOF

/usr/bin/sshd -f ${HOME}/custom_ssh/sshd_config
echo "----- Process ID : ${HOME}/custom_ssh/sshd.pid -------"
  • OpenSSH_7.9p1, OpenSSL 1.1.1a 20 Nov 2018
  • pam auth (тестировалось с одним и тем же локальным и удалённым пользователем)

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

Смотрите https://www.openssh.com/releasenotes.html

Предполагая, что отметил @magiclantern выше и предполагая, что вы не хотите патчить sshd, подойдет ли вам что-то вроде Dropbear? Используется во многих встроенных устройствах, которым нужен ssh-сервер с меньшим объемом (и меньшим количеством функций/настроек).

Я подробно проверил возможность запуска сервиса sshd как обычного пользователя. Подробности о версии программы:

sshd version OpenSSH_7.4, OpenSSL 1.0.2k

Наконец, после решения множества ошибок, я пришел к тому, что SSHD завершился с ошибкой:

Попытка записи записей входа некорневым пользователем (завершение)

Я проверил исходный код, чтобы выяснить, возможно ли решить проблему без изменения исходного кода. Смотрите код здесь. Часть кода, вызывающая aborto программы:

#ifndef HAVE_CYGWIN
    if (geteuid() != 0) {
        logit("Попытка записи записей входа некорневым пользователем (завершение)");
        return (1);
    }
#endif

Он проверяет привилегии пользователя с помощью (geteuid() != 0) и здесь возникает проблема.

Для пользователей ubuntu ответ выше (https://serverfault.com/a/946877/994202) должен быть:

mkdir ${HOME}/custom_ssh
ssh-keygen -f ${HOME}/custom_ssh/ssh_host_rsa_key -N '' -t rsa
ssh-keygen -f ${HOME}/custom_ssh/ssh_host_dsa_key -N '' -t dsa


cat << EOF > ${HOME}/custom_ssh/sshd_config
Port 6666
HostKey ${HOME}/custom_ssh/ssh_host_rsa_key
HostKey ${HOME}/custom_ssh/ssh_host_dsa_key
PidFile ${HOME}/custom_ssh/sshd.pid
EOF

/usr/sbin/sshd -f ${HOME}/custom_ssh/sshd_config 

Затем введите ssh -p 6666 your_not_root_user_name@your_ip в локальной оболочке.

Я пытался следовать ответу выше, но столкнулся с ошибками отказа в доступе (publickey), с которыми не мог разобраться.

Но это дало мне идею получить больше логов, добавив

SyslogFacility AUTH
LogLevel DEBUG

в файл ${HOME}/custom_ssh/sshd_config, и запуск (на стороне сервера) sshd -f ${HOME}/custom_ssh/sshd_config -D -e дал мне много выходных данных, которые быстро привели меня к проблеме.

Мне просто нужно было добавить открытый ключ в .ssh/authorized_keys, сделав cat ${HOME}/custom_ssh/ssh_host_rsa_key.pub > .ssh/authorized_keys.

Ответ или решение

Возможность запуска sshd как обычного пользователя

Запуск демона SSH sshd от имени обычного пользователя, а не от <code>root</code>, вызывает интерес и ряд вопросов. Эта задача оказалась вполне выполнимой, но с определенными ограничениями, о которых важно знать.

1. Основы работы SSHD

По умолчанию, для запуска sshd требуются привилегии суперпользователя (root). Это связано с тем, что SSH использует порты менее 1024 (например, 22), а также требует возможности записи логов входящих подключений, что также требует прав суперпользователя.

2. Работа на нестандартном порту

Запуск второй инстанции sshd на повышенном порту (например, 2222) и с отдельным конфигурационным файлом возможен. Чтобы сделать это, выполните следующие действия:

  • Создайте новый каталог для хранения конфигураций и ключей SSH:

    mkdir ${HOME}/custom_ssh
  • Генерируйте ключи хоста в этом каталоге:

    ssh-keygen -f ${HOME}/custom_ssh/ssh_host_rsa_key -N '' -t rsa
    ssh-keygen -f ${HOME}/custom_ssh/ssh_host_dsa_key -N '' -t dsa
  • Создайте конфигурационный файл sshd_config:

    cat << EOF > ${HOME}/custom_ssh/sshd_config
    Port 2222
    HostKey ${HOME}/custom_ssh/ssh_host_rsa_key
    HostKey ${HOME}/custom_ssh/ssh_host_dsa_key
    AuthorizedKeysFile .ssh/authorized_keys
    ChallengeResponseAuthentication no
    UsePAM yes
    PidFile ${HOME}/custom_ssh/sshd.pid
    EOF

3. Непривилегированные операции

Для того чтобы процесс sshd не вызывал ошибок, связанных с недостатком привилегий, стоит отключить разделение привилегий, добавив следующую строку в конфигурационный файл:

UsePrivilegeSeparation no

Однако, важно отметить, что начиная с версии OpenSSH 7.5 эта опция была депрецирована, и отключить разделение привилегий уже невозможно. В результате, запуск sshd как обычного пользователя стал практически невозможным.

4. Сообщение об ошибке

При попытке запуска sshd, если происходит ошибка, например setgroups() failed: Operation not permitted, это указывает на необходимость привилегий для выполнения некоторых системных вызовов, что еще раз подтверждает, что работать с sshd от имени обычного пользователя станет затруднительно.

5. Альтернативные подходы

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

Заключение

С запуском sshd как обычного пользователя связано множество ограничений и трудностей, вызванных изменениями в архитектуре SSH и требованиями безопасности. Хотя теоретически возможно запустить sshd на нестандартном порту с определенной конфигурацией, на практике лучше использовать специализированные инструменты или настраивать SSH-серверы с использованием стандартных подходов, чтобы избежать проблем с привилегиями и пустых усилий.

Оцените материал
Добавить комментарий

Капча загружается...