Вопрос или проблема
Я собираюсь запустить второй экземпляр 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 как пользователя теперь невозможен.
Предполагая, что отметил @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-серверы с использованием стандартных подходов, чтобы избежать проблем с привилегиями и пустых усилий.