我正在设置 SquidGuard (1.4) 来根据 Active Directory 域验证用户并根据组成员身份应用 ACL;这是我的 squidGuard.conf 的一个示例:
src AD_Group_A {
ldapusersearch ldap://my.dc.name/dc=domain,dc=com?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=cn=Group_A%2cdc=domain%2cdc=com))
}
src AD_Group_B {
ldapusersearch ldap://my.dc.name/dc=domain,dc=com?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=cn=Group_B%2cdc=domain%2cdc=com))
}
dest dest_a {
domainlist dest_a/domains
urllist dest_b/urls
log dest_a.log
}
dest dest_b {
domainlist dest_b/domains
urllist dest_b/urls
log dest_b.log
}
acl {
AD_Group_A {
pass dest_a !dest_b all
redirect http://some.url
}
AD_Group_B {
pass !dest_a dest_b all
redirect http://some.url
}
default {
pass !dest_a !dest_b all
redirect http://some.url
}
}
如果用户是 Group_A 的成员,则一切正常或者Group_B。但如果用户是两个都组,则仅评估第一个源规则,因此仅应用第一个 ACL。
我理解这是由于 SquidGuard 中的源规则匹配的工作方式(如果一条规则匹配,则评估就停止,然后应用相关的 ACL);所以我也尝试了这个:
src AD_Group_A_B {
ldapusersearch ldap://my.dc.name/dc=domain,dc=com?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=cn=Group_A%2cdc=domain%2cdc=com))
ldapusersearch ldap://my.dc.name/dc=domain,dc=com?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=cn=Group_B%2cdc=domain%2cdc=com))
}
acl {
AD_Group_A_B {
pass dest_a dest_b all
redirect http://some.url
}
[...]
}
但这也不起作用:如果用户是其中一个组的成员,则整个源规则都会匹配,因此他可以到达两个目的地(这当然不是我想要的)。
到目前为止我发现的唯一解决方案是创建一个第三在 AD 中创建一个组,并为其分配一个源规则和一个 ACL;但是,如果目标集超过两个或三个,这种设置就会呈指数增长。
有没有什么办法可以更好地处理这个问题?
答案1
部分解决了。我完全忽略了你可以添加其他条件到 LDAP 查询...因此检查多个组的成员身份非常容易。
一些注意事项:
- 仍然需要为每个可能的组组合定义一个 SquidGuard ACL
- 您需要向 SquidGuard 配置至少添加另外两个指令:(
ldapbinddn
定义用于连接 AD 的用户名,并且您必须在此处使用用户对象的 DN,而不是普通的用户名!)和ldapbindpass
,定义用户的密码。 - SquidGuard 需要编译 LDAP 支持,但默认情况下不会编译该支持。
…但至少 AD 中的实际群体可以保持在最低限度。