Назад | Перейти на главную страницу

Можно ли запустить 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

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

Видеть https://www.openssh.com/releasenotes.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
echo "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" > ${HOME}/custom_ssh/sshd_config
/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 ноября 2018 г.
  • pam auth (проверено с тем же локальным и удаленным пользователем)

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

sshd версия OpenSSH_7.4, OpenSSL 1.0.2k

Наконец, после решения многих ошибок я дошел до того, что SSHD прервался со следующей ошибкой:

Попытка записи логина пользователем без полномочий root (прерывание)

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

#ifndef HAVE_CYGWIN
    if (geteuid() != 0) {
        logit("Attempt to write login records by non-root user (aborting)");
        return (1);
    }
#endif

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

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