Неможливо увійти через SSH до будь-яких облікових записів, використовуючи / bin / bash shell у Synology NAS


30

Я намагаюся встановити bash як оболонку за замовчуванням на ARM Linux, що працює на вбудованому пристрої (Synology DS212 + NAS). Але щось справді не так, і я не можу зрозуміти, що це таке.

Симптоми:

1) Root має / bin / bash як оболонку за замовчуванням, і може нормально входити через SSH:

$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash

$ ssh root@NAS
root@NAS's password:
Last login: Sun Dec 16 14:06:56 2012 from desktop
# 


2) joeuser має / bin / bash як оболонку за замовчуванням і отримує "Дозвіл відхилено" при спробі входу через SSH:

$ grep joeuser /etc/passwd
joeuser:x:1029:100:Joe User:/home/joeuser:/bin/bash

$ ssh joeuser@localhost
joeuser@NAS's password:
Last login: Sun Dec 16 14:07:22 2012 from desktop
Permission denied, please try again.
Connection to localhost closed.


3) зміна оболонки joeuser назад до / bin / sh:

$ grep joeuser /etc/passwd
joeuser:x:1029:100:Joe User:/home/joeuser:/bin/sh

$ ssh joeuser@localhost
Last login: Sun Dec 16 15:50:52 2012 from localhost
$ 


Щоб зробити речі ще більш дивними, я можу ввійти як joeuser, використовуючи /bin/bashпослідовну консоль (!). Крім того, su - joeuserяк root працює чудово, так і сам бінарний файл bash працює чудово.

У відчаї я змінив uid joeuser на 0 on / etc / passwd, але також не працював, тому, здається, це не було щось, що стосується дозволу.

Здається, що bash робить додаткову перевірку того, що sshd не сподобалось, і блокує з'єднання для не-root користувачів. Можливо, якась перевірка обґрунтованості - або термінальна емуляція - це запускає SIGCHLD, але лише при виклику через ssh.

Я вже проходив кожен елемент на sshd_config, а також перевів SSHD в режим налагодження, але нічого дивного не знайшов. Ось моє /etc/ssh/sshd_config:

LogLevel DEBUG
LoginGraceTime 2m
PermitRootLogin yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys
ChallengeResponseAuthentication no
UsePAM yes
AllowTcpForwarding no
ChrootDirectory none
Subsystem       sftp    internal-sftp -f DAEMON -u 000


Ось результат з /usr/syno/sbin/sshd -d, показує невдалу спробу joeuser, що намагається увійти, з / bin / bash як оболонка:

debug1: Config token is loglevel
debug1: Config token is logingracetime
debug1: Config token is permitrootlogin
debug1: Config token is rsaauthentication
debug1: Config token is pubkeyauthentication
debug1: Config token is authorizedkeysfile
debug1: Config token is challengeresponseauthentication
debug1: Config token is usepam
debug1: Config token is allowtcpforwarding
debug1: Config token is chrootdirectory
debug1: Config token is subsystem
debug1: HPN Buffer Size: 87380
debug1: sshd version OpenSSH_5.8p1-hpn13v11
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug1: read PEM private key done: type DSA
debug1: private host key: #1 type 2 DSA
debug1: read PEM private key done: type ECDSA
debug1: private host key: #2 type 3 ECDSA
debug1: rexec_argv[0]='/usr/syno/sbin/sshd'
debug1: rexec_argv[1]='-d'
Set /proc/self/oom_adj from 0 to -17
debug1: Bind to port 22 on ::.
debug1: Server TCP RWIN socket size: 87380
debug1: HPN Buffer Size: 87380
Server listening on :: port 22.
debug1: Bind to port 22 on 0.0.0.0.
debug1: Server TCP RWIN socket size: 87380
debug1: HPN Buffer Size: 87380
Server listening on 0.0.0.0 port 22.

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: 4, 4
Connection from 127.0.0.1 port 52212
debug1: HPN Disabled: 0, HPN Buffer Size: 87380
debug1: Client protocol version 2.0; client software version OpenSSH_5.8p1-hpn13v11
SSH: Server;Ltype: Version;Remote: 127.0.0.1-52212;Protocol: 2.0;Client: OpenSSH_5.8p1-hpn13v11
debug1: match: OpenSSH_5.8p1-hpn13v11 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.8p1-hpn13v11
debug1: permanently_set_uid: 1024/100
debug1: MYFLAG IS 1
debug1: list_hostkey_types: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: AUTH STATE IS 0
debug1: REQUESTED ENC.NAME is 'aes128-ctr'
debug1: kex: client->server aes128-ctr hmac-md5 none
SSH: Server;Ltype: Kex;Remote: 127.0.0.1-52212;Enc: aes128-ctr;MAC: hmac-md5;Comp: none
debug1: REQUESTED ENC.NAME is 'aes128-ctr'
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: expecting SSH2_MSG_KEX_ECDH_INIT
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: KEX done
debug1: userauth-request for user joeuser service ssh-connection method none
SSH: Server;Ltype: Authname;Remote: 127.0.0.1-52212;Name: joeuser
debug1: attempt 0 failures 0
debug1: Config token is loglevel
debug1: Config token is logingracetime
debug1: Config token is permitrootlogin
debug1: Config token is rsaauthentication
debug1: Config token is pubkeyauthentication
debug1: Config token is authorizedkeysfile
debug1: Config token is challengeresponseauthentication
debug1: Config token is usepam
debug1: Config token is allowtcpforwarding
debug1: Config token is chrootdirectory
debug1: Config token is subsystem
debug1: PAM: initializing for "joeuser"
debug1: PAM: setting PAM_RHOST to "localhost"
debug1: PAM: setting PAM_TTY to "ssh"
debug1: userauth-request for user joeuser service ssh-connection method password
debug1: attempt 1 failures 0
debug1: do_pam_account: called
Accepted password for joeuser from 127.0.0.1 port 52212 ssh2
debug1: monitor_child_preauth: joeuser has been authenticated by privileged process
debug1: PAM: establishing credentials
User child is on pid 9129
debug1: Entering interactive session for SSH2.
debug1: server_init_dispatch_20
debug1: server_input_channel_open: ctype session rchan 0 win 65536 max 16384
debug1: input_session_request
debug1: channel 0: new [server-session]
debug1: session_new: session 0
debug1: session_open: channel 0
debug1: session_open: session 0: link with channel 0
debug1: server_input_channel_open: confirm session
debug1: server_input_global_request: rtype no-more-sessions@openssh.com want_reply 0
debug1: server_input_channel_req: channel 0 request pty-req reply 1
debug1: session_by_channel: session 0 channel 0
debug1: session_input_channel_req: session 0 req pty-req
debug1: Allocating pty.
debug1: session_new: session 0
debug1: session_pty_req: session 0 alloc /dev/pts/1
debug1: server_input_channel_req: channel 0 request shell reply 1
debug1: session_by_channel: session 0 channel 0
debug1: session_input_channel_req: session 0 req shell
debug1: Setting controlling tty using TIOCSCTTY.

debug1: Received SIGCHLD.
debug1: session_by_pid: pid 9130
debug1: session_exit_message: session 0 channel 0 pid 9130
debug1: session_exit_message: release channel 0
debug1: session_by_tty: session 0 tty /dev/pts/1
debug1: session_pty_cleanup: session 0 release /dev/pts/1
Received disconnect from 127.0.0.1: 11: disconnected by user
debug1: do_cleanup
debug1: do_cleanup
debug1: PAM: cleanup
debug1: PAM: closing session
debug1: PAM: deleting credentials


Тут ви отримуєте повний вихід sshd -dd разом з ssh -vv .

Bash:

# bash --version
GNU bash, version 3.2.49(1)-release (arm-none-linux-gnueabi)
Copyright (C) 2007 Free Software Foundation, Inc.

Бінарний біс був схрещений з джерела. Я також спробував скористатися заздалегідь складеним двійковим файлом з дистрибутива Optware , але в мене була точно така ж проблема. Я перевірив наявність відсутніх спільних бібліотек за допомогою objdump -x, але вони всі є.

Будь-які ідеї, що може спричинити це "У дозволі відмовлено, будь ласка, спробуйте ще раз. " Я ледь не пірнаю у вихідний код bash, щоб розслідувати, але намагаюся уникати годин переслідувати щось, що може бути дурним.

EDIT: додавання додаткової інформації про bash та систему

$ ls -la /bin/bash
-rwxr-xr-x    1 root     root        724676 Dec 15 23:57 /bin/bash

$  file /bin/bash
/bin/bash: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.14, stripped

$  uname -a
Linux NAS 2.6.32.12 #2661 Mon Nov 12 23:10:15 CST 2012 armv5tel GNU/Linux synology_88f6282_212+

$ grep bash /etc/shells
/bin/bash
/bin/bash2

2
ls -l /bin/bash
Майкл Хемптон

Чи вказано / bin / bash у / etc / shell?
тинк

Так, це вказано в / etc / shell. І дозволи 0755, додані вище.
Gui Ambros

Швидше за все, у його файлі .bashrc щось запущено. Чи можете ви котити ~ joeuser / .bashrc і обміняти його сценарії профілю? Ви також можете спробувати запустити / bin / bash під час входу в систему як він.
vicfn

Без ~ joeuser / .ssh та без сценаріїв профілю. Я просто створив користувача для тестування.
Гай Амброс

Відповіді:


39

Для подальшої довідки: після того, як занадто багато годин досліджували та налагоджували цю проблему, я нарешті виявив першопричину.

Версія OpenSSH, що використовується Synology, - це спеціально налаштована версія, яка не поводиться як оригінальний код. У ньому багато хакерів та спеціальних налаштувань - наприклад, додаткова перевірка перед прийняттям входу, щоб побачити, чи включена служба SSH у веб-інтерфейсі, або вилучення спеціальних символів (;, |, ') з команд rsync або .. Зачекайте цього ... уникаючи постійних користувачів використовувати оболонку, відмінну від / bin / sh або / bin / ash . Так, важко закодований у двійковій.

Ось фрагмент коду з OpenSSH 5.8p1, розподілений Synology у вихідному коді (DSM4.1 - відділення 2636) , файл session.c:

void do_child(Session *s, const char *command)
{
...

#ifdef MY_ABC_HERE
   char szValue[8];
   int RunSSH = 0;
   SSH_CMD SSHCmd = REQ_UNKNOWN;

   if (1 == GetKeyValue("/etc/synoinfo.conf", "runssh", szValue, sizeof(szValue))) {
           if (strcasecmp(szValue, "yes") == 0) {
                   RunSSH = 1;
           }
   }

   if (IsSFTPReq(command)){
           SSHCmd = REQ_SFTP;
   } else if (IsRsyncReq(command)){
           SSHCmd = REQ_RSYNC;
   } else if (IsTimebkpRequest(command)){
           SSHCmd = REQ_TIMEBKP;
   } else if (RunSSH && IsAllowShell(pw)){
           SSHCmd = REQ_SHELL;
   } else {
           goto Err;
   }

   if (REQ_RSYNC == SSHCmd) {
           pw = SYNOChgValForRsync(pw);
   }
   if (!SSHCanLogin(SSHCmd, pw)) {
           goto Err;
   }
   goto Pass;

 Err:
   fprintf(stderr, "Permission denied, please try again.\n");
   exit(1);

 Pass:
   #endif /* MY_ABC_HERE */
...
}


Як ви можете уявити, IsAllowShell(pw)винуватець:

static int IsAllowShell(const struct passwd *pw)
{
     struct passwd *pUnPrivilege = NULL;
     char *szUserName = NULL;
     if (!pw || !pw->pw_name) {
             return 0;
     }
     szUserName = pw->pw_name;
     if(!strcmp(szUserName, "root") || !strcmp(szUserName, "admin")){
             return 1;
     }
     if (NULL != (pUnPrivilege = getpwnam(szUserName))){
             if (!strcmp(pUnPrivilege->pw_shell, "/bin/sh") || 
                     !strcmp(pUnPrivilege->pw_shell, "/bin/ash")) {
                     return 1;
             }
     }
     return 0;
}


Недарма, чому я переживав таку дивну поведінку. Лише оболонки / bin / sh та / bin / ash приймаються для користувачів, відмінних від root або admin . І це незалежно від uid (я тестував також, що робив joeuser uid = 0, і це не спрацювало. Тепер очевидно, чому).

Виявивши причину, виправити це було просто: просто видаліть виклик до IsAllowShell () . У мене знадобився певний час, щоб отримати правильну конфігурацію для перехресного компіляції opensh та всіх його залежностей, але в кінцевому підсумку це спрацювало добре.

Якщо хтось зацікавлений у тому, щоб зробити те саме (або намагається схрестити компіляцію інших модулів ядра або бінарних файлів для Synology), ось моя версія Makefile . Він був протестований з джерелом OpenSSH-5.8p1 і добре працює з моделями, на яких працює Marvell Kirkwood mv6281 / mv6282 CPU (як DS212 +). Я використовував хост під управлінням Ubuntu 12.10 x64.

Підсумок: погана практика, жахливий код та чудовий приклад того, що не потрібно робити. Я розумію, що іноді виробникам оригінальних виробів потрібно розробляти спеціальні налаштування, але вони повинні подумати двічі, перш ніж копати занадто глибоко. Це не тільки призводить до неможливого коду для них, але й створює всілякі непередбачені проблеми в дорозі. На щастя, GPL існують, щоб підтримувати їх чесними - і відкритими.


4
Зоряна робота, сер, розслідуючи це питання і відтягуючи штору назад від етапу Synology. Я повинен визнати, що до цього часу я досить високо думав про свою Diskstation, оскільки вона була дуже корисною, і коли вона завантажилася, вона навіть виконує деякі сценарії для мене в новому планувальнику завдань. Але ви виявили тут деякі недоліки в недалекоглядному дизайні. Я все ще задоволений Diskstation, але буду мати на увазі вашу посаду. Оголошено і допис, і відповідь.
Бернард Ді

Захищені за зусилля. Якщо я не хочу заважати робити з'єднання з зерновими, я просто хочу змінити оболонку за замовчуванням на /bin/sh, чи є спосіб це зробити?
Vicary

Чому синологія зробила б це зовсім поза мене :(
Герхард Бургер

Я перейменував /bin/ashв /bin/ash.realі пов'язаний zshна /bin/ash... до сих пір все здається нормально ... Їм
x1a0

7

Щоб обійти проблему, і оскільки я встановив bash через ipkg і не можу бути впевненим, що / opt завжди буде доступний (встановлений правильно), я просто вкладаю наступне у свій .profile

[ -x /opt/bin/bash ] && exec /opt/bin/bash

while / etc / passwd містить / bin / ash як оболонку.


1

Подивимось. Він ізольований до однієї оболонки, плюс ви дивитесь на вихід налагодження в sshd, тому це не є проблемами з дозволом, які можна записати у світі з ~ joeuser / .ssh. Це той, який отримує більшість людей.

Ви спробували створити додаткового нормального користувача (тобто не joeuser), щоб переконатися, що він відчуває ту ж проблему? Це виокремить його до конфігурації користувача проти конфігурації загальної системи.

Якщо це загальносистемна проблема, наступне, на що я звернувся б, - це спільні файли конфігурації, такі як / etc / profile, які отримують усі. Можливо, є умовний блок, який не спрацьовує, якщо ім'я користувача root. (не ефективний userid, оскільки ви вже тестували на це)

Перевірте dmesg на наявність повідомлень про помилки сегментації, якщо ви цього ще не зробили, на всякий випадок, якщо відбувається щось навіть більш дивне.


Дякую Андрію. Також перевірив dmesg, і абсолютно нічого. Створення абсолютно нового користувача також не допомогло, тому очевидно, що це проблема в цілому. І joeuser може нормально увійти, якщо я поверну оболонку назад на / bin / ash, що виключає будь-який / etc / profile чи інший (що я також перевірив, btw). Це просто з не-root, використовуючи bash, через ssh. Оскільки цей момент навіть не є справжнім питанням (я можу жити з ним так, як зараз), але мені дратує визнати, що я не зміг знайти причину цієї дивної поведінки. Зрештою, це детермінована система; там повинна бути якась - то пояснення ...
Гуй Ambros

1

спробуйте / etc / ssh / sshd_config
шукати AllowUsers

якщо це там, спробуйте додати туди joeuser, просто ім'я користувача

також він може бути заблокований у пам’яті… Я не пригадую, який це файл…


Не справа. Якщо це була проблема з AllowUsers, вона не дозволила б мені увійти з joeuser, коли я міняю оболонку на / bin / ash. Здається, це не пов’язано ні з чим, пов’язаним із безпекою, або будь-яким іншим конфігурацією. Це, мабуть, якесь те, як bash обробляє псевдотермінали через ssh, ash as, csh тощо.
Gui Ambros

1

Їх змінена версія opensh шукає /bin/shоболонку?

Легке рішення тоді:

ln -fs / bin / bash / bin / sh


Це змінило б оболонку для всіх користувачів, і не лише тих, хто потребував bash. Також будь-яке нове оновлення видалить символічне посилання (навіть незважаючи на те, що виправлення openssh також має ту саму проблему). У будь-якому випадку це було вирішено, як описано вище.
Gui Ambros

Гаразд правда, але оскільки я єдиний користувач в моєму NAS, це рішення працює для мене. У будь-якому випадку дякую, що вказали на те, що ви відкрили.
Ponytech

0

Спробуйте перевстановити Bash і подивіться, чи це допомагає.


Nops, я отримав bash з двох різних джерел (один з дистрибутиву Optware, і я також склав 3.2 з source) і та сама проблема. Я підійшов до крайності, навіть отримавши баш 4.2 та застосувавши патчі (всього 39), і перехресне складання. Точна ж поведінка. Працює з коренем, у дозволі відмовлено іншим. Моя остання здогадка - це двійковий файл OpenSSH, який той самий встановлений за замовчуванням мікропрограмним забезпеченням Synology. Це єдиний твір, якого я ще не торкнувся. Я спробую завантажити останнє джерело та перехресне складання, щоб побачити, що відбувається.
Gui Ambros

2
Як не дивно, але це, мабуть, проблема authconfig. Чи також ldap працює на сервері? Чи можете ви надіслати мені в режимі реального часу вихід із захищеного файлу та повідомлення повідомлення під час відмови входу
Пратап

2
Також увійдіть як сервер на сервер, і дозвольте оболонці користувача бути / bin / bash та спробуйте перейти на користувача за допомогою su - ім'я користувача. Покажіть мені і результат цього.
Пратап

0

Якщо хтось наткнеться на це, тому що вони зробили ту саму помилку, що і я:

так: $ sudo usermod -s /bin/bash your_username

ні: $ sudo usermod -s bash your_username

2-й призведе до відмови у дозволі під час ssh'ing.

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