我在 kubernetes 集群中有一个包含 Freeradius 的自定义 ubuntu 容器。由于容器的工作方式,Freeradius/AD 集成的常规 SAMBA/Winbind 方法不是一种选择,因此我编写了一个 BASH 脚本来验证用户凭据,并且还安装了 LDAP 模块以根据组成员身份授权用户使用特定服务。
目前,我只能将 Freeradius 配置为基于组成员身份进行授权,而无需根据脚本的结果做出决定。我尝试了许多不同的授权文件配置,但这里只介绍几种。这个配置即使密码错误也能授予访问权限:
DEFAULT Auth-Type = Accept
Exec-Program = "/path/to/script/auth.sh %{User-Name} %{User-Password}",
Fall-Through = Yes
DEFAULT Ldap-Group == "Admingroup", Auth-Type := Accept
Service-Type = Administrative-User,
cisco-avpair ='shell:priv-lvl=15'
DEFAULT Auth-Type := Reject
Reply-Message = "Authorization failed."
无论提供什么凭证,这个都会拒绝访问:
DEFAULT Ldap-Group == "Admingroup", Exec-Program = "/path/to/script/auth.sh %{User-Name} %{User-Password}", Auth-Type := Accept
Service-Type = Administrative-User,
cisco-avpair ='shell:priv-lvl=15'
DEFAULT Auth-Type := Reject
Reply-Message = "Authorization failed."
我知道我的脚本本身可以工作,因为我已经独立于 Freeradius 对其进行了测试,而且我知道 LDAP 模块本身的配置没有问题,因为它可以连接到 AD 来测试组成员身份。我主要怀疑授权文件的配置是这里的问题,但是请随意询问任何其他配置文件,我会说,除了 radiusd.conf、clients.conf 和 ldap 之外,所有其他文件都将处于安装时的默认状态。
答案1
我能够解决这个问题。这是授权的正确配置:
DEFAULT Ldap-Group == "Admingroup", Auth-Type := Accept
Exec-Program-Wait = "/path/to/script/auth.sh %{User-Name} %{User-Password}",
Service-Type = Administrative-User,
cisco-avpair ='shell:priv-lvl=15'
DEFAULT Auth-Type := Reject
Reply-Message = "Authorization failed."
此外,还必须在 /etc/freeradius/3.0/mods-enabled/exec 处修改 exec 模块。需要将“wait”变量设置为 yes,以便 freeradius 可以使用脚本的退出代码来确定是接受还是拒绝:
exec {
wait = yes
input_pairs = request
shell_escape = yes
timeout = 2
}