PermitRootLogin是基于UID还是用户名?


17

手册页指出 PermitRootLogin

指定root是否可以使用进行登录ssh(1)

但是,尚不清楚此检查是基于用户名("root")还是UID(0)。

如果将根帐户重命名为,会发生什么"admin"?将"admin"能够登录的时候PermitRootLogin=no

如果有两个帐户的UID = 0,即"root"和,会发生什么"admin"?他们两个都可以登录吗?

Answers:


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在shell中
Dezza

1
@Dezza可能取决于/ etc / passwd中列出的顺序行(如:查找UID = 0的第一个条目)。
TripeHound16年

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
雅库耶

内核可以,但是您假设OpenSSH也可以。例如,Apache基本身份验证也不允许root登录,对吗?感谢您提供的链接,我已经修改了您的答案以包含该链接。
mtak

1
如果以其他方式执行此操作,则将存在潜在的安全风险。
雅库耶

3
@Bakuriu以及为什么会pw从其他内容创建上下文。该openssh代码是开源的,有兴趣的读者可以阅读整个代码。每种身份验证方法的代码都具有类似的构造。如果您grep遍历代码,将永远找不到strcmp('root', pw->pw_name),如果它可以使您更加可靠。
雅库耶
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.