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


13

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

基本概念

从理论上讲,当我物理上到达这样的服务器时,只需键入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在内的所有帐户。另一方面,除非明确说明,否则解决方案不得影响安全性,尤其是不允许远程用户访问根帐户或其他用户的帐户时。该解决方案应足够健壮,以免间接引起安全问题。

公认的答案可能会或可能不会描述单个工具的详细配置,但必须包含要达到既定目标的关键点。请注意,这可能无法通过常规使用的一样的工具来解决passwdsshsusudo等。

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

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


使用自定义的PAM配置无需密码即可进行本地访问,对sudo和SSH登录也是如此。
2015年

Answers:


5

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

  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

common-auth如果“ UNIX登录”成功,该文件指示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远程登录

对于那些被添加到根authorized_keys文件中的授权用户,这是ssh密钥的直接包含。

来自预授权用户的指定帐户的无密码远程登录

对于将授权用户添加到适当的相应用户.ssh/authorized_keys文件中的ssh密钥,这也很简单。(典型的远程用户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。将选定的授权用户的公共密钥添加到此文件,以确保权限由根拥有,并且仅由根具有写访问权限(0644)。


我将不得不更仔细地检查#1并进行测试。即使它仍然需要配置(强)密码,它看起来也很有趣。#3尚不完善,因为如今默认情况下,也会通过SSH登录锁定新创建的用户。我并不是真的要求第4点,但是无论如何它看起来都很有趣,实际上我可能会用到这种方法。
PavelŠimerda15年

root的强密码是必需的,但从未使用过。我以为您知道如何实施#3;让我知道您是否需要更多细节。在(Debian)系统上,只要.ssh/authorized_keys文件包含相关的公钥,就可以进入尚未定义密码的新帐户。这有帮助吗?
roaima

我认为我需要一种很好的标准方法来恢复您在Debian上看到的行为,即,一个新创建的帐户仅被锁定用于密码验证而不是公共密钥。
PavelŠimerda15年

对于我创建的用于确认上一条注释中的ssh语句的测试用户帐户,我!在的密码字段中看到一个/etc/shadow。根据手册页,这表明没有密码可以匹配的有效帐户。
roaima

1
很有意思,至少起码没有那么明显了,谢谢。
PavelŠimerda'15

1

听起来好像您想要具有ssh密钥并NOPASSWD通过的完全访问权限的真实(非root用户)用户帐户sudo(这些天在大多数Linux发行版中默认都可用,并且手动安装也很简单)。您可以为每个用户帐户使用空白密码(该密码不能远程运行),然后用户要么运行,sudo -s要么用户~/.bash_profile仅包含该命令。

须藤

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

/etc/sudoers或中/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:::变为just bob::12345:0:99999:7:::。这就是您所需要的。现代系统不喜欢这样。可能还有其他方法可以执行此操作,但是我刚刚验证的方法如下(来源:Leo's Random Stuff

开立/etc/shadow并观察具有真实信息的帐户。这将包括三个以美元符号($)分隔的元素。这些代表哈希机制,然后是salt,然后是哈希。注意盐,然后运行:

openssl passwd -1 -salt SALT

(这使用MD5作为哈希机制。它是空密码,因此您不必介意。)当系统提示您输入密码时,请按Enter。保存该字符串(包括所有尾随点),并将其粘贴到该用户行中的第一个冒号之后/etc/shadow(这将替换第一个和第二个冒号之间的所有先前存在的内容)。(请不要从字面上使用SALT盐!)

SSH协议

您的ssh守护程序配置位于/etc/sshd_config或中/etc/ssh/sshd_config。为了获得适当的安全性,我建议您包括以下几行:

PermitRootLogin no
PermitEmptyPasswords no

有关可以添加到ssh配置中的其他安全措施的信息,请参阅Secure Secure Shell文章,以更好地对复杂的攻击者进行加固。

现在,由于密码为空,您的用户无法通过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从外壳键入内容并设置密码,从而允许他们远程访问。

(实际上,当我运行IT部门时,我曾使用此技术使人们能够访问一系列系统。它迫使用户使用ssh密钥,而我不必给他们提供密码。他们的首字母~/.bash_profile底部有两行: passwd然后mv ~/.bash_profile.real ~/.bash_profile让他们在首次登录时设置新密码。)

风险性

您完全信任用户。没有什么可以阻止用户弄乱另一个用户的~/.ssh/authorized_keys文件,从而改变您撤消和审核访问的能力,但这是不可避免的,如果您要提供完全的root用户访问权限。

结论

现在,每个用户都是sudo组的成员,并且具有对root shell的完全无密码访问权限。这些用户的帐户没有密码,可以使用ssh密钥远程登录。

如果您失去一名员工,则可以删除其帐户。如果您员工的一台笔记本电脑被盗,则可以从该用户的authorized_keys文件中删除该笔记本电脑的ssh密钥。如果存在安全漏洞,则将显示显示谁登录的日志。


关于sudo的部分遗漏了这个问题,因为它只与新登录有关,而不是切换用户。修改了问题,使其更加清晰。关于无密码登录的部分表现出与问题中完全相同的错误行为passwd -d,从而允许su在没有密码的情况下切换到该用户。风险部分描述了两件事(与其他用户的数据打交道并获得root访问权),这是问题的重点。因此,尽管各个部分写得很好,但这绝不是问题的答案。
PavelŠimerda'15

我假设您先添加用户,然后再限制用户。
亚当·卡兹
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.