使用 SSH 提供一致且安全的无密码帐户方法

使用 SSH 提供一致且安全的无密码帐户方法

我必须承认,在某些情况下我喜欢没有密码的服务器。典型的服务器很容易受到任何对其进行物理访问的人的攻击。因此,在某些情况下,物理上锁定它是可行的,然后信任任何物理访问。

基本概念

理论上,当我实际到达这样的服务器时,我应该能够在没有密码的情况下通过简单地输入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因为它阻止我们登录。

请注意,本地访问仅涉及使用本地键盘的访问。因此有效的解决方案一定不允许任何用户切换(无论使用susudo)。

远程访问详细信息

直到最近,上述解决方案仍然有效,但现在 SSH 开始检查锁定的用户帐户。passwd -d出于同样的原因,我们可能无法使用。我们不能使用它passwd -u,因为它只是抱怨它会导致什么passwd -d结果。

这部分有一个使用虚拟密码的解决方法。

user=...

echo -ne "$user:`pwgen 16`\n" | chpasswd

也可以完全关闭 SSH 中的锁定帐户检查,但最好保留对锁定帐户的支持并能够解锁它们。

最后的笔记

我感兴趣的是一个解决方案,它允许您本地登录 root 帐户以及远程登录包括 root 在内的所有帐户,而无需任何密码。另一方面,解决方案不得影响安全性,除非以明确描述的方式,特别是不允许远程用户访问根帐户或其他用户的帐户。该解决方案应该足够强大,这样才不会间接导致安全问题。

接受和授予的答案可能会也可能不会描述各个工具的详细配置,但必须包含实现既定目标的关键点。请注意,这可能无法通过常规使用passwdsshsu等工具来解决sudo

阅读第一个答案后有更多想法

只是一个想法 - 可以通过启动 root shell 而不是登录进程来实现本地 root 访问。但仍然需要只锁定密码验证,而不是公钥验证。

答案1

我将提供解决方案的要求,作为要点:

  1. 无密码根控制台登录
  2. 预授权用户无密码 root 远程登录
  3. 预授权用户指定帐户的无密码远程登录
  4. 预授权用户的任何帐户均可无密码远程登录

以下示例基于 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/securettysuccess=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仅包含该命令。

须藤

将每个用户添加到sudoUNIX 组(例如usermod -a -G sudo USERNAME,尽管较旧的系统执行此操作的方式不太直观;最坏的情况是/etc/groups直接编辑)。

/etc/sudoersor中/etc/sudoers.d/local,您需要这样的行:

%sudo    ALL=(ALL:ALL) NOPASSWD: ALL

如果您想要自动 root 访问权限,请将其添加到用户的配置文件中。对于bash,那就是~/.bash_profile

sudo -s

这将允许您查看谁已登录(尝试wholast)并将日志保留在 中/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 密钥。如果您存在安全漏洞,您的日志会显示谁登录了。

相关内容