pam_ssh_agent_auth.so
在通过 ssh pubkey 进行身份验证时,我正在尝试配置为使用 sudo 为某些用户提供无密码体验。
我开始查看gentoo wiki,它建议使用
...
auth [success=3 default=ignore] pam_ssh_agent_auth.so file=/etc/ssh/sudo_authorized_keys
auth include system-auth <- 1st skipped
account include system-auth <- 2nd skippedm
session include system-auth <- 3rd skipped
... <- should continue from here
我在 Fedora 上,/etc/pam.d/sudo
看起来如下所示:
auth [success=3 default=ignore] pam_ssh_agent_auth.so file=/etc/ssh/sudo_authorized_keys
auth include system-auth
account include system-auth
password include system-auth
session optional pam_keyinit.so revoke
session required pam_limits.so
session include system-auth
我不是 PAM 专家,但是查看手册页时,我将其解释success=3
为“如果此规则成功,则跳过接下来的 3 行”,因此如果用户正确登录并且存在代理,我希望不会询问密码。
唉,这是行不通的:无论如何都在询问密码。
[success=3 default=ignore]
如果我只使用而不是使用,则身份验证按预期工作sufficient
- 我相信这基本上是相同的,在这种情况下我无法分辨出任何区别,因为模块堆栈由接下来的 3 个模块组成。
显然,使用[success=3 default=ignore]
和sufficient
不是一回事,因为我没有得到相同的结果。
有人可以向我解释实际差异是什么以及为什么前者在这种情况下不起作用?
谢谢
首先,
include
一行不是 PAM 模块。而不是计算作为要跳过的一项,PAM 库将
auth include
用auth
来自/etc/pam.d/system-auth
. 因此,要确定跳过了哪些 3 行[success=3 default=ignore]
,您需要首先将include
语句替换为system-auth
文件的适当内容,然后计算要跳过的行数。其次,我认为
[success=3 default=ignore]
不会跨模块类型工作。在对用户进行身份验证时,应用程序将首先调用
pam_authenticate()
,在此期间 PAM 库将只处理该auth
类型的条目。一旦用户成功通过身份验证,应用程序就可以调用pam_acct_mgmt()
,这将只处理该account
类型的条目。一旦完成,pam_open_session()
将只处理该session
类型的条目。由于身份验证通过、帐户管理通过和会话设置通过是三个不同的操作,我认为
auth [success=3 default=ignore]
只会跳过接下来的 3 行typeauth
only。在您的情况下,将被跳过的行将在/etc/pam.d/system-auth
文件中。当您使用
auth sufficient
时,这意味着如果该行列出的模块报告验证成功,则该auth
行的处理将立即停止。auth sufficient
这意味着文件auth
中的所有行都system-auth
将被跳过,无论有多少行。当您使用
auth [success=3 default=ignore]
时,下一auth
行中有include
一行,您还必须调查包含的文件以准确了解会发生什么。当您这样做时仍然询问密码这一事实表明您的文件中显然有超过 3auth
行。system-auth
从手册页:
在您的情况下,一旦它检查了“授权密钥”文件,它就会立即返回成功。
在fedora 示例中,如果它成功检查了“授权密钥”文件,它会跳过接下来的两个步骤并执行一些会话检查,例如pam_limits.so 设置sudo 用户可以使用多少资源的限制。