我正在使用 Squid 和 SquidGuard 配置 Linux 代理来过滤互联网流量。
我知道如何在 Squid 中根据 Active Directory 对用户进行身份验证,然后如何使用 SquidGuard 过滤用户访问权限。
问题:如何在 SquidGuard 中使用 Active Directory 组而不是普通用户名?
我的目标是能够配置诸如“该组的成员可以去任何地方”或“该组的成员只能访问某些站点”之类的规则。
我知道 SquidGuard 不能直接管理组成员身份,但它可以自行进行 LDAP 搜索;但查找用户是否属于给定组的成员的语法似乎非常神秘,而且我找不到任何好的文档。
答案1
解决了。
假设如下:
- Domain name: "domain.com"
- Group name: "Internet Users"
- User name: "UserName"
- Path to group: "domain.com\OU1\OU2\Internet Users"
检查用户是否是该组成员的查询将是:
(&(memberOf=CN=Group Name,OU=OU2,OU=OU1,DC=domain,DC=com)(SAMAccountName=UserName))
因此,您必须将以下内容添加到 squidGuard.conf 中以识别该组的成员(“%s”是 squidGuard.conf 中“客户端用户名”的占位符):
src Internet_Users {
ldapusersearch ldap://dc.domain.com/DC=domain,DC=com?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=CN=Internet Users,OU=OU2,OU=OU1,DC=domain,DC=com))
}
警告:如果按上述方式编写,它将不起作用,并会给出简洁的“语法错误”消息;这是因为(部分)语句被视为 URL,因此您必须转义逗号和空格等特殊字符;因此正确的形式应为:
src Internet_Users {
ldapusersearch ldap://dc.domain.com/DC=domain,DC=com?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=CN=Internet%20Users%2cOU=OU2%2cOU=OU1%2cDC=domain%2cDC=com))
}
另外,为了避免 Active Directory 引用问题(有时 DC 会将您重定向到另一个 DC,即使您在其管理的同一域中),查询全局目录可能会很有用:
src Internet_Users {
ldapusersearch ldap://gc.domain.com:3268/DC=domain,DC=com?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=CN=Internet%20Users%2cOU=OU2%2cOU=OU1%2cDC=domain%2cDC=com))
}
答案2
免责声明:我没有这样做过,也不熟悉 SquidGuard。话虽如此,这里有一些可行的方法。
1) 如果您将 squid 机器添加到域中,您将能够解析 AD 组并通过 nss 查找 AD 组成员身份,因此您应该能够使用 squid_unix_group 帮助程序。根据其手册页,它甚至有一个用于剥离 AD 组的域部分的开关。
2)鉴于 AD 是一种 LDAP 服务器,我怀疑您可以使用 squid_ldap_group,根据手册页:
“正如 Squid 的 external_acl 构造所预期的那样,在指定用户名和组并跟上新行之后,此助手程序将在下一行生成 OK 或 ERR,以显示用户是否是指定组的成员。”
3) 即使这不起作用,您也应该能够使用 squid external_acl_type 生成功能等效的函数。
4)退房http://etutorials.org/Server+Administration/Squid.+The+definitive+guide/Chapter+12.+Authentication+Helpers/12.5+External+ACLs/这提到了一些帮助程序(wbinfo_group,winbindd_group),它们似乎没有在我正在运行的 squid 版本中构建/安装。
至于查询某个用户是否是 LDAP 组的成员,这取决于 LDAP 组的类型,因为不同的组使用不同的属性来定义成员资格。
一些示例查询过滤器如下:要查看某人是否是 groupOfUniqueNames 的成员:
(&(cn=<GROUP_CN>)(objectClass=groupOfUniqueNames)(uniqueMember=<MEMBER_DN>))
要查看 uid 是否是 posixGroup 的成员:
(&(cn=<GROUPCN>)(objeCtclass=posixGroup)(memberUid=<UID>))
如果匹配,它们将返回您指定的组条目或组属性(如果您指定)。
希望能帮助到你。