Я собираюсь запустить секунду 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 от имени пользователя теперь невозможно.
Вот сценарий пользователя bash, основанный на ответе Бо Джинса:
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
-------"
Я подробно проверил возможность запуска службы 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)
и здесь возникает проблема.