如何让特定域下所有用户通过Kerberos认证SSH登录客户端?
问题解答
一、允许特定域所有用户通过SSH登录的方法
不用逐个编辑.k5login文件,有两种更高效的实现方式:
1. 通配符格式的.k5login文件
MIT Kerberos等主流实现支持在.k5login中用通配符匹配Kerberos主体。直接在目标用户主目录的.k5login里添加一行:
*@EXAMPLE.LOCAL
就能让EXAMPLE.LOCAL域下的所有用户登录到该系统账户。注意要设置正确的文件权限:所有者为目标用户,权限设为600,避免安全风险。
2. 用Kerberos的auth_to_local规则映射域用户到系统账户
如果希望域用户登录到同名的本地系统账户(比如user@EXAMPLE.LOCAL对应本地user),可以修改/etc/krb5.conf的规则:
[realms] EXTENSODATA.LOCAL = { auth_to_local = RULE:[1:$1](@EXAMPLE\.LOCAL$) auth_to_local = DEFAULT }
这条规则会提取EXAMPLE.LOCAL域用户主体的用户名部分,映射到同名本地用户。之后确保SSH开启Kerberos认证(在/etc/ssh/sshd_config中设置GSSAPIAuthentication yes),域用户即可直接登录对应本地账户。
二、你的auth_to_local规则分析
你编写的规则:
auth_to_local = RULE:[1:$1@$0](.*@EXAMPLE\.LOCAL)s/(\d+)@.*/root/
无法实现将EXAMPLE.LOCAL域下所有用户映射为root,问题出在:
- 替换逻辑的正则
(\d+)@.*仅匹配含数字+@的主体(比如123@EXAMPLE.LOCAL),普通用户名(如user@EXAMPLE.LOCAL)完全不匹配,不会执行替换。 - 规则格式存在逻辑漏洞,没有覆盖所有域用户的场景。
如果要把EXAMPLE.LOCAL域所有用户统一映射为root,正确的规则写法是:
[realms] EXTENSODATA.LOCAL = { auth_to_local = RULE:[0:$0](.*@EXAMPLE\.LOCAL)s/.*@EXAMPLE\.LOCAL/root/ auth_to_local = DEFAULT }
这条规则会匹配所有@EXAMPLE.LOCAL结尾的主体,直接替换为root。修改后需重启Kerberos相关服务和SSH服务生效。
内容的提问来源于stack exchange,提问作者Aalish Kshetry
相关产品推荐
相关产品推荐

