我想知道是否有可能有一个增强版本来PAM
实现使用多级密码的登录。
例如,我感兴趣的是,运行任务时需要连续输入 3 个不同的密码,而不是 1 个sudo
:
[user@hostname][/home]# sudo echo ok
[sudo] password 1 for user:
[sudo] password 2 for user:
[sudo] password 3 for user:
ok
答案1
我建议使用ssh
作为解决方法。
基本思路
假设你创建了用户sudouser
(允许执行sudo
命令) 和中间用户middleman
。原始用户 ( john
) 也都middelman
不允许执行sudo
命令。
我们现在将任何对sudo
by的调用替换为从via到 的john
两步ssh
访问,后者执行初始命令。您在此链中放置的中间人的数量定义了密码步骤的数量。我将在我的示例中坚持使用其中之一。john
middleman
sudouser
sudo
如果有人直接su
访问sudouser
或middleman
,这些帐户的密码将被锁定。sudouser
将被授予无密码sudo
权限,middleman
其存在的唯一目的是添加密码屏障。
我们将对其进行设置,以便无需密码john
即可访问,然后使用密码 RSA 密钥来访问。即密码将是 RSA 密钥的密码。 (所以请注意:每个中间人都需要一个密码 RSA 密钥)ssh
middleman
middleman
sudouser
1.添加sudouser
到sudoers文件
我假设你知道这一点 - 但出于完整性原因我添加了它。我们将通过向/etc/sudoers
with添加一行来授予无密码 sudo 命令visudo
:
sudouser ALL=(ALL) NOPASSWD: ALL
现在这是一个非常危险的用户,所以让我们停用其密码(如root
):
passwd -l sudouser
我们对任何中间人执行相同的操作,以直接抑制su
最后一个中间人,从而跳过密码步骤。
2. 创建 ssh 密钥对
又是标准操作。对于两者john
和middleman
do ssk-keygen
- 请注意,middleman
必须有一个 RSA 密钥的密码,以便我们实现密码身份验证。这不是必需的,john
但可以完成(可能仅在用于此目的的特定 RSA 密钥中,它只是添加另一个密码步骤)。
ssh
3.使用强制命令设置-access
现在这是有趣的部分:我们使用强制命令添加john
到middleman
's ,即当我们通过from访问时,只会执行 this 和 this 命令:~/.ssh/authorized_keys
middleman
ssh
john
cat /home/middleman/.ssh/authorized_keys
command="ssh -t sudouser@localhost $SSH_ORIGINAL_COMMAND" <john's public key> john@localhost
因此,这将直接启动 ssh 会话来sudouser
转发我们在第一步中指定的命令(通过$SSH_ORIGINAL_COMMAND
)。
john
请注意,仅允许这样做localhost
- 出于安全原因,所有其他访问均被拒绝。您可以再次通过 - 添加转发限制command"...",no-port-forwarding,no-x11-forwarding,no-agent-forwarding
以增强安全性。
对于sudouser
的authorized_keys
文件,我们仅允许来自middleman
以下位置的访问localhost
:
cat /home/middleman/.ssh/authorized_keys
ssh-rsa <middleman's public key> middleman@localhost
现在/etc/ssh/sshd_config
我们稍微锁定一下访问权限:
Match User middleman,sudouser
PasswordAuthentication no
AuthenticationMethods publickey
因此middleman
,sudouser
只能通过ssh
使用 RAS 公钥以及authorized_keys
文件中给出的强制命令来访问 和 。PasswordAuthentication no
由于我们之前锁定了用户密码,因此设置可能是多余的。
4. 别名sudo
现在sudo
命令需要替换为:
ssh -t middleman@localhost "sudo <command>"
为此,一个简单的 shell 脚本和一个别名即可:
#sudo_alias_script.sh
#!/bin/bash
ssh -t middleman@localhost "sudo $@"
和
alias sudo='/home/john/.bin/sudo_alias_script.sh'
我已经和两个中间人成功尝试过这个。它体积庞大,但可以满足您的需求。如果您想要某些文本输出,可以将强制命令替换为echo
文本脚本,然后继续下一步ssh
。我无法判断整个事情是否真的提高了安全性。
答案2
这不是您问题的答案,但如果您想增强安全性,可以使用 2-Factor Authentication 进行登录和 sudo。欲了解更多信息,您可以访问此网站:
https://www.linux.com/learn/how-set-2-factor-authentication-login-and-sudo
答案3
这不会增加安全性。看https://security.stackexchange.com/questions/89533/would-requiring-multiple-passwords-enhance-security和与暴力破解相比,双重加密会提高密码的安全性吗?。简而言之,做更多相同的事情并不能提高安全性:要么你以前做的事情很好,做得更多是多余的,要么你以前做的事情不好,做两次也救不了你。此外,复杂性始终是安全性的敌人,因为它增加了实现错误的风险,也因为它减少了用户按照预期行事的机会,因此,如果某件事不能提高安全性,那么这样做的成本是有害的为了安全。
要求两个密码与要求一个密码相同,但先输入前半部分,然后再输入后半部分。通过分割密码,您可以更轻松地破解密码,因为两半可以独立破解。所以你降低了安全性。
话虽这么说,你所要求的事情是可以完成的。我再说一遍,这是一个坏主意,但如果你想搬起石头砸自己的脚,请按照以下步骤操作。请记住,它不会让你跑得更快。
在大多数 Unix 变体上,身份验证是通过以下方式配置的聚丙烯酰胺。处理密码验证的 PAM 模块是pam_unix
。您可以添加一个或多个对其他密码检查模块的调用,例如pam_pwdfile
查询另一个密码数据库(参见是否可以在Linux中更改密码数据库文件(/etc/passwd)?)。
但是,再一次,不要这样做。如果您不了解安全性,请使用系统的默认设置,而不是将它们搞得更糟。