如何为一个用户设计多级密码安全

如何为一个用户设计多级密码安全

我想知道是否有可能有一个增强版本来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命令。

我们现在将任何对sudoby的调用替换为从via到 的john两步ssh访问,后者执行初始命令。您在此链中放置的中间人的数量定义了密码步骤的数量。我将在我的示例中坚持使用其中之一。johnmiddlemansudousersudo

如果有人直接su访问sudousermiddleman,这些帐户的密码将被锁定。sudouser将被授予无密码sudo权限,middleman其存在的唯一目的是添加密码屏障。

我们将对其进行设置,以便无需密码john即可访问,然后使用密码 RSA 密钥来访问。即密码将是 RSA 密钥的密码。 (所以请注意:每个中间人都需要一个密码 RSA 密钥)sshmiddlemanmiddlemansudouser


1.添加sudouser到sudoers文件

我假设你知道这一点 - 但出于完整性原因我添加了它。我们将通过向/etc/sudoerswith添加一行来授予无密码 sudo 命令visudo

 sudouser ALL=(ALL) NOPASSWD: ALL

现在这是一个非常危险的用户,所以让我们停用其密码(如root):

 passwd -l sudouser

我们对任何中间人执行相同的操作,以直接抑制su最后一个中间人,从而跳过密码步骤。


2. 创建 ssh 密钥对

又是标准操作。对于两者johnmiddlemando ssk-keygen- 请注意,middleman必须有一个 RSA 密钥的密码,以便我们实现密码身份验证。这不是必需的,john但可以完成(可能仅在用于此目的的特定 RSA 密钥中,它只是添加另一个密码步骤)。


ssh3.使用强制命令设置-access

现在这是有趣的部分:我们使用强制命令添加johnmiddleman's ,即当我们通过from访问时,只会执行 this 和 this 命令:~/.ssh/authorized_keysmiddlemansshjohn

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以增强安全性。

对于sudouserauthorized_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

因此middlemansudouser只能通过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)?)。

但是,再一次,不要这样做。如果您不了解安全性,请使用系统的默认设置,而不是将它们搞得更糟。

相关内容