PermitRootLogin 是基于 UID 还是用户名?

ge0*_*0rg 17 ssh root openssh

手册页指出 PermitRootLogin

指定 root 是否可以使用ssh(1).

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

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

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

Jak*_*uje 19

我很欣赏@mtak 在另一个答案中的方法,但即使没有这个试验,答案也是显而易见的。

它基于UID,如您在openssh的源代码中所见:

if (authctxt->pw->pw_uid == 0 &&
            !auth_root_allowed(auth_method))
authenticated = 0;
Run Code Online (Sandbox Code Playgroud)

此外,每种身份验证方法都显示类似

if (pw->pw_uid == 0 && options.permit_root_login != PERMIT_YES)
    ok = 0;
Run Code Online (Sandbox Code Playgroud)

grep- 在代码中进一步,您可能会注意到,没有strcmp('root', pw->pw_name)或有其他选择,如果它对您来说就足够了。

  • @Bakuriu 以及为什么它会从其他东西创建 `pw` 上下文。`openssh` 代码是开源的,有兴趣的读者可以浏览整个代码。类似的 [构造](https://github.com/openssh/openssh-portable/blob/master/auth-passwd.c#L96) 遍布每种身份验证方法的代码。如果你通过代码 `grep`,你将永远找不到 `strcmp('root', pw->pw_name)`,如果它会让你更可靠的话。 (3认同)
  • Unix 通过其 UID=0 定义超级用户。另一个例子可以是`openssh`的[源代码](https://github.com/openssh/openssh-portable/blob/master/monitor.c#L329)。 (2认同)

mta*_*tak 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
Run Code Online (Sandbox Code Playgroud)

确保admin创建的用户名为UID 0:

mtak@pdv1:~$ sudo grep admin /etc/passwd
admin:x:0:0:Root User:/root:/bin/bash
Run Code Online (Sandbox Code Playgroud)

确保该用户可用于登录系统:

mtak@pdv1:~$ su - admin
Password: 
root@pdv1:~# 
Run Code Online (Sandbox Code Playgroud)

检查我们是否可以使用SSH登录系统:

mtak@rubiks:~$ ssh admin@pdv1
admin@pdv1's password: 
Permission denied, please try again.
Run Code Online (Sandbox Code Playgroud)

如果我们打开 PermitRootLogin:

mtak@pdv1:~$ grep PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin yes
Run Code Online (Sandbox Code Playgroud)

并尝试登录:

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:~# 
Run Code Online (Sandbox Code Playgroud)