Czy PermitRootLogin jest oparty na UID lub nazwie użytkownika?

17

Strona podręcznika stwierdza, że PermitRootLogin

Określa, czy root może się zalogować przy użyciu ssh(1).

Nie jest jednak jasne, czy ta kontrola opiera się na nazwie użytkownika ( "root") czy UID ( 0).

Co się stanie, jeśli nazwa konta root zostanie zmieniona na "admin"? Będą "admin"mogli zalogować się, kiedy PermitRootLogin=no?

Co się stanie, jeśli istnieją dwa konta o UID = 0, tj. "root"I "admin"? Czy któryś z nich będzie mógł się zalogować?

ge0rg
źródło

Odpowiedzi:

16

Wygląda na to, że kontrola odbywa się na UID (testowany na OpenSSH_6.7p1 Debian-5+deb8u3, OpenSSL 1.0.1t 3 May 2016):

Wyłącz PermitRootLogin:

mtak@pdv1:~$ grep PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin no

Upewnij się, że użytkownik o nazwie adminjest utworzony z UID 0:

mtak@pdv1:~$ sudo grep admin /etc/passwd
admin:x:0:0:Root User:/root:/bin/bash

Upewnij się, że użytkownika można użyć do zalogowania się do systemu:

mtak@pdv1:~$ su - admin
Password: 
root@pdv1:~# 

Sprawdź, czy możemy zalogować się do systemu za pomocą SSH:

mtak@rubiks:~$ ssh admin@pdv1
admin@pdv1's password: 
Permission denied, please try again.

Jeśli włączymy PermitRootLogin:

mtak@pdv1:~$ grep PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin yes

I spróbuj się zalogować:

mtak@rubiks:~$ ssh admin@pdv1
admin@pdv1's password: 
Linux pdv1 4.4.8-1-pve #1 SMP Tue May 17 16:14:08 CEST 2016 x86_64
Last login: Wed Aug 24 12:05:28 2016 from xxx
root@pdv1:~# 
mtak
źródło
Ciekawe, że chociaż identyfikator UID 0 ma nazwę użytkownika admin, nadal pojawia się jak root@pdv1w powłoce
Dezza
1
@Dezza Prawdopodobnie zależy od wierszy zamówienia wymienionych w / etc / passwd (jak w: znajdź pierwszy wpis o UID = 0).
TripeHound,
19

Doceniam podejście @mtak w drugiej odpowiedzi, ale odpowiedź jest oczywista nawet bez tych prób.

Opiera się on na UID, jak widać w kodzie źródłowym openssh:

if (authctxt->pw->pw_uid == 0 &&
            !auth_root_allowed(auth_method))
authenticated = 0;

Również każda metoda uwierzytelniania pokazuje coś takiego

if (pw->pw_uid == 0 && options.permit_root_login != PERMIT_YES)
    ok = 0;

grep- w dalszej części kodu możesz zauważyć, że nie ma żadnej strcmp('root', pw->pw_name)alternatywy, jeśli to ci wystarczy.

Jakuje
źródło
Skąd wiesz , żesshd sprawdza UID 0? Nie używasz żadnej argumentacji na poparcie swojego oświadczenia.
mtak
2
Unix definiuje superużytkownika przez jego UID = 0. Jako inny przykład może być kod źródłowy z openssh.
Jakuje
Jądro działa, ale zakładałeś, że OpenSSH również. Na przykład podstawowe uwierzytelnianie Apache również nie pozwala na logowanie roota, prawda? Dziękuję za link, zmodyfikowałem twoją odpowiedź, aby to uwzględnić.
mtak
1
Gdyby zrobił to w inny sposób, stanowiłoby potencjalne zagrożenie bezpieczeństwa.
Jakuje
3
@ Bakuriu i dlaczego stworzy pwkontekst z czegoś innego. opensshKod jest open source i zainteresowani czytelnicy mogą przejść przez cały kod. Podobne konstrukcje są w całym kodzie dla każdej metody uwierzytelniania. Jeśli grepprzejrzysz kod, nigdy go nie znajdziesz strcmp('root', pw->pw_name), czy dzięki temu będzie bardziej wiarygodny.
Jakuje