我必须承认,在某些情况下我喜欢没有密码的服务器。典型的服务器很容易受到任何对其进行物理访问的人的攻击。因此,在某些情况下,物理上锁定它是可行的,然后信任任何物理访问。
基本概念
理论上,当我实际到达这样的服务器时,我应该能够在没有密码的情况下通过简单地输入root
登录名来执行管理任务,并且不应该要求我输入密码。这同样适用于用户帐户,但人们不会真正以物理方式访问它们。因此(偶尔)本地访问不需要系统密码。
当远程访问服务器时,无论是为了管理还是为了用户帐户,我希望始终使用 SSH 私钥。为刚刚创建的帐户设置 SSH 密钥非常容易,因此(常规)远程访问不需要系统密码。
# user=...
#
# useradd -m "$user"
# sudo -i -u "$user"
$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"
结论是,理论上,我们不需要任何类似用例的系统密码。所以问题是,我们如何配置系统和用户帐户,使其以一致且安全的方式发生。
本地访问详细信息
如何保证root账户无需密码即可本地访问?我不认为我们可以使用它passwd -d
,因为这会使 root 访问过于宽松,而非特权用户可以转变免费root,这是错误的。我们无法使用,passwd -l
因为它阻止我们登录。
请注意,本地访问仅涉及使用本地键盘的访问。因此有效的解决方案一定不允许任何用户切换(无论使用su
或sudo
)。
远程访问详细信息
直到最近,上述解决方案仍然有效,但现在 SSH 开始检查锁定的用户帐户。passwd -d
出于同样的原因,我们可能无法使用。我们不能使用它passwd -u
,因为它只是抱怨它会导致什么passwd -d
结果。
这部分有一个使用虚拟密码的解决方法。
user=...
echo -ne "$user:`pwgen 16`\n" | chpasswd
也可以完全关闭 SSH 中的锁定帐户检查,但最好保留对锁定帐户的支持并能够解锁它们。
最后的笔记
我感兴趣的是一个解决方案,它允许您本地登录 root 帐户以及远程登录包括 root 在内的所有帐户,而无需任何密码。另一方面,解决方案不得影响安全性,除非以明确描述的方式,特别是不允许远程用户访问根帐户或其他用户的帐户。该解决方案应该足够强大,这样才不会间接导致安全问题。
接受和授予的答案可能会也可能不会描述各个工具的详细配置,但必须包含实现既定目标的关键点。请注意,这可能无法通过常规使用passwd
、ssh
、su
等工具来解决sudo
。
阅读第一个答案后有更多想法
只是一个想法 - 可以通过启动 root shell 而不是登录进程来实现本地 root 访问。但仍然需要只锁定密码验证,而不是公钥验证。
答案1
我将提供解决方案的要求,作为要点:
- 无密码根控制台登录
- 预授权用户无密码 root 远程登录
- 预授权用户指定帐户的无密码远程登录
- 预授权用户的任何帐户均可无密码远程登录
以下示例基于 Debian,因为这是我在这里进行测试的示例。然而,我认为这些原则没有理由不能应用于任何发行版(或者实际上任何基于 PAM 的 *ix 衍生品)。
无密码根控制台登录
我认为解决此问题的方法是利用 PAM 和/etc/securetty
配置文件。
作为先决条件,必须设置“足够安全”的 root 密码。这对于控制台登录来说不是必需的,但存在是为了使暴力破解尝试变得不现实。否则该帐户是一个完全正常的根帐户。
我/etc/pam.d/login
有以下用于身份验证的标准行集(以关键字开头的行auth
):
auth optional pam_faildelay.so delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth requisite pam_nologin.so
@include common-auth
auth optional pam_group.so
引用的common-auth
包含文件包含以下相关行:
auth [success=1 default=ignore] pam_unix.so nullok_secure
auth requisite pam_deny.so
auth required pam_permit.so
auth optional pam_cap.so
如果“UNIX 登录”成功,该common-auth
文件指示 PAM 跳过一条规则(拒绝)。通常这意味着 中的匹配/etc/shadow
。
该auth ... pam_securetty.so
线路配置为阻止 root 登录,但在 中指定的 tty 设备上除外/etc/securetty
。 (此文件已包含所有控制台设备。)
通过稍微修改此auth
行,可以定义允许 root 登录的规则没有密码来自 中指定的 tty 设备/etc/securetty
。success=ok
需要修改该参数,以便ok
将 替换为auth
匹配成功时要跳过的行数。在此处所示的情况中,该数字是3
,它会跳到以下auth ... pam_permit.so
行:
auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
预授权用户无密码 root 远程登录
这是将授权用户的 ssh 密钥直接包含到根authorized_keys
文件中。
预授权用户指定帐户的无密码远程登录
这也是直接包含授权用户的 ssh 密钥,将其添加到适当且相应的用户.ssh/authorized_keys
文件中。 (典型的远程用户 chris 希望无密码登录本地用户 chris设想。)
请注意,帐户在创建后可以保持默认锁定状态(即仅!
在密码字段中/etc/shadow
),但允许基于 SSH 密钥的登录。这需要 root 将密钥放入新用户的.ssh/authorized_keys
文件中。什么是不太明显是这种方法仅UsePAM Yes
在 中设置时才可用/etc/ssh/sshd_config
。 PAM 区分为!
“帐户因密码而被锁定,但可能允许其他访问方法”和!...
“帐户被锁定。仅此而已”。 (如果UsePAM No
设置了,则 OpenSSH 会考虑任何!
启动密码字段的存在来表示锁定的帐户。)
预授权用户的任何帐户均可无密码远程登录
我不太清楚你是否想要这个设施。也就是说,某些授权用户无需密码即可通过 ssh 登录任何本地帐户。
我无法测试这种情况,但我相信这可以通过 OpenSSH 5.9 或更高版本来实现,它允许authorized_keys
在/etc/ssh/sshd_config
.编辑配置文件以包含第二个名为/etc/ssh/authorized_keys
.将您选择的授权用户的公钥添加到此文件中,确保该文件由 root 拥有并且只有 root 具有写入权限 (0644)。
答案2
听起来您想要具有 ssh 密钥和完全NOPASSWD
访问权限的真实(非 root)用户帐户sudo
(目前大多数 Linux 发行版默认都提供该帐户,并且手动安装也很简单)。您可以为每个用户帐户设置空白密码(这不能远程工作),然后用户要么运行sudo -s
,要么用户~/.bash_profile
仅包含该命令。
须藤
将每个用户添加到sudo
UNIX 组(例如usermod -a -G sudo USERNAME
,尽管较旧的系统执行此操作的方式不太直观;最坏的情况是/etc/groups
直接编辑)。
在/etc/sudoers
or中/etc/sudoers.d/local
,您需要这样的行:
%sudo ALL=(ALL:ALL) NOPASSWD: ALL
如果您想要自动 root 访问权限,请将其添加到用户的配置文件中。对于bash
,那就是~/.bash_profile
:
sudo -s
这将允许您查看谁已登录(尝试who
或last
)并将日志保留在 中/var/log/auth.log
。
无密码登录
在更旧的系统上,您可以只编辑/etc/passwd
(或在稍微旧的系统上,/etc/shadow
)并删除散列,因此例如bob:$1$salt$hash:12345:0:99999:7:::
变成只是bob::12345:0:99999:7:::
。这就是你所需要的。现代系统不喜欢这样。可能还有其他方法可以做到这一点,但我刚刚验证的方法如下(来源:狮子座的随机物品):
使用真实信息开设/etc/shadow
并观察账户。这将包括由美元符号 ( $
) 分隔的三个元素。这些代表了哈希机制,那么盐,然后是哈希值。注意盐,然后运行:
openssl passwd -1 -salt SALT
(这使用 MD5 作为哈希机制。它是一个空白密码,所以您不应该介意。)当提示输入密码时,按 Enter 键。保存该字符串,包括所有尾随点,并将其粘贴到该用户所在行的第一个冒号之后/etc/shadow
(这应该替换第一个冒号和第二个冒号之间的任何预先存在的内容)。 (请不要真正用作SALT
盐!)
SSH
您的ssh
守护程序配置位于/etc/sshd_config
或中/etc/ssh/sshd_config
。为了获得适当的安全性,我建议它包含以下几行:
PermitRootLogin no
PermitEmptyPasswords no
请参阅安全 安全外壳有关其他安全措施的文章,您可以添加到 ssh 配置中,以更好地防御复杂的攻击者。
现在你的用户不能由于密码为空而通过via登录ssh
(这是必要的安全措施)。这意味着他们只能使用 ssh 密钥登录。
每个用户应该为每个客户端系统创建一个 ssh 密钥对,例如
ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -o -a 100 -C "Bob Roberts on his laptop"
这会产生一个私钥$HOME/.ssh/id_rsa
和一个公钥$HOME/.ssh/id_rsa.pub
。让该用户向您发送他们的公钥并将其附加到该服务器的公钥$HOME/.ssh/authorized_keys
(请注意,每个用户的$HOME/.ssh
模式必须为 700,例如mkdir -p ~user/.ssh && chmod 700 ~user/.ssh
)。
不需要 ssh 密钥的用户可以转到物理系统。在那里,他们的空白密码将使他们登录,此时他们可以passwd
从 shell 中输入并设置密码,从而允许他们进行远程访问。
(实际上,当我管理 IT 部门时,我就使用了这种技术来让人们访问一组系统。它强制用户使用 ssh 密钥,而我不必向他们提供密码。他们的首字母~/.bash_profile
在底部有两行: passwd
然后mv ~/.bash_profile.real ~/.bash_profile
他们在首次登录时设置新密码。)
风险
您完全信任您的用户。没有什么可以阻止用户弄乱另一个用户的~/.ssh/authorized_keys
文件,从而改变您撤销和审核访问权限的能力,但如果您授予完全 root 访问权限,这是不可避免的。
结论
每个用户现在都是该组织的成员须藤组并拥有对 root shell 的完全无密码访问。这些用户的帐户没有密码,可以使用 ssh 密钥远程登录。
如果您失去了一名员工,您可以删除他/她的帐户。如果您员工的一台笔记本电脑被盗,您可以从该用户的authorized_keys
文件中删除该笔记本电脑的 ssh 密钥。如果您存在安全漏洞,您的日志会显示谁登录了。