PermitRootLogin основан на UID или имени пользователя?


17

На странице руководства говорится, что PermitRootLogin

Указывает, может ли root войти в систему с помощью ssh(1).

Однако неясно, основана ли эта проверка на имени пользователя ( "root") или UID ( 0).

Что произойдет, если корневая учетная запись будет переименована "admin"? Сможете "admin"войти когда PermitRootLogin=no?

Что произойдет, если есть две учетные записи с UID = 0, т.е. "root"и "admin"? Сможет ли кто-нибудь из них войти в систему?

Ответы:


16

Кажется, проверка выполняется по UID (проверено OpenSSH_6.7p1 Debian-5+deb8u3, OpenSSL 1.0.1t 3 May 2016):

Отключите PermitRootLogin:

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

Убедитесь, что имя пользователя adminсоздано с UID 0:

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

Убедитесь, что пользователь может быть использован для входа в систему:

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

Проверьте, можем ли мы войти в систему, используя SSH:

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

Если мы включим PermitRootLogin:

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

И попробуйте войти в систему:

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:~# 

Интересно, что несмотря на то, что UID 0 имеет имя пользователя admin, он все равно отображается как root@pdv1в оболочке
Dezza

1
@Dezza Возможно, зависит от порядка строк, перечисленных в / etc / passwd (как в: найти первую запись с UID = 0).
TripeHound

19

Я ценю подход @mtak в другом ответе, но ответ очевиден даже без этих испытаний.

Он основан на UID, как вы можете видеть в исходном коде openssh:

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

Также каждый метод аутентификации показывает что-то вроде

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

grep-в дальнейшем в коде, вы можете заметить, что нет strcmp('root', pw->pw_name)или какой-либо альтернативы, если этого будет достаточно для вас.


Откуда вы знаете sshd чеки на UID 0? Вы не используете аргументацию в поддержку своего заявления.
mtak

2
Unix определяет суперпользователя по его UID = 0. В качестве другого примера может быть исходный код из openssh.
Jakuje

Ядро делает, но вы предполагали, что OpenSSH также. Например, обычная проверка подлинности Apache также не разрешает вход в систему root, не так ли? Спасибо за ссылку, я изменил ваш ответ, чтобы включить это.
mtak

1
Если бы это было сделано как-то иначе, это было бы потенциальным риском для безопасности.
Jakuje

3
@Bakuriu и почему это создаст pwконтекст из чего-то еще. opensshКод является открытым исходным кодом и заинтересованные читатели могут пройти через весь код. Подобные конструкции во всем коде для каждого метода аутентификации. Если вы grepчерез код, вы никогда не найдете strcmp('root', pw->pw_name), если это сделает его более надежным для вас.
Jakuje
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.