Чи можливо запустити sshd як звичайний користувач?


39

Я маю на меті запустити другу 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Лінія явно випирає, але він не помре , поки він не намагається прийняти з'єднання.

Відповіді:


35

Після трохи копання навколо я зрозумів це.

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

РЕДАКТУВАННЯ: Через декілька моментів після з'ясування цього хтось ще твітнув мені це посилання, яке підтверджує, що це правильний спосіб зробити це: http://cygwin.com/ml/cygwin/2008-04/msg00363.html


1
Також потрібно відключити PAM, встановивши UsePamна no.
haridsv

@bjeanes це працює для вас? Ви можете поділитися своїм файлом sshd_config? він скаржиться, що "Set" не є дійсною командою для мене, коли я намагаюся на ubuntu.
жоджо

@jojo Я не запускаю цю конфігурацію, тому у мене немає файлу для спільного доступу. Вам потрібно буде почати з відомого робочого файлу та підлаштувати під свої потреби.
Bo Jeanes

1
Відключення PAM річ лише для конкретних випадків. Працює для мене у Fedora, не псуючи налаштування пам. Дивіться пов’язане повідомлення електронної пошти у відповіді, щоб отримати ще кілька ідей, що ще потрібно змінити, щоб все було добре. Невдовзі я оновлю свої замітки, як я змусив це працювати на docker : hub.docker.com/r/aosqe/ssh-git-server (будь ласка, дозвольте за пару днів до його читання)
akostadinov

6

Як оновлення цього потоку, OpenSSH у версії 7.5 припинив опцію UsePrivilegeSeparation, унеможлививши відключення розділення привілеїв. Здається, що запустити SSHD як користувач зараз неможливо.

Дивіться https://www.openssh.com/releasenotes.html


Залежно від конфігурації сервера, це може бути не так. У мене немає проблем із запуском sshd як звичайного користувача, вказуючи "UsePrivilegeSeparation так" або "UsePrivilegeSeparation sandbox" у моєму файлі конфігурації sshd.
a3nm

Ну, я ще не пробував цього, але я думаю, що це зараз "виправлено": "sshd (8): коли запускається без привілеїв root, не потрібно вимагати існування користувача або шляху до відокремлення. Полегшує запуск тестів регресії. не торкаючись файлової системи. "
Даніель Сантос

2

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

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

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

Спроба записати записи для входу некористувачем (перервавши)

Я перевірив вихідний код, щоб побачити, чи можна вирішити проблему без зміни вихідного коду. Дивіться код тут . Деяка частина коду, що викликає переривання програми:

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

Він перевіряє привілей користувача, (geteuid() != 0)і тут викликає проблему.


1

Якщо припустити, що @magiclantern зазначив вище, і якщо припустити, що ви не хочете виправити sshd, чимось, як Dropbear, вам підійде ? Він використовується в багатьох вбудованих пристроях, які хочуть ssh-сервер із меншою площею (та меншою кількістю функцій / конфігурацій).


1
dropbear -E -F -R -w -g -a -p 2222 -P ./dbearPID # робить трюк
dotbit

1

Ось сценарій bash 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 (тестується з тим самим місцевим та віддаленим користувачем)

Я все ще бачу: "debug1: setgroups () не вдалося: операція не дозволена"
dotbit

Гарне рішення, але вам слід зробити, щоб команди виглядали краще. Некрасивий.
MAChitgarha
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.