🔗 配置 Squid 和 Webwasher 代理链
作者:Christoph Haas
🔗 目录
Squid 是一款出色的缓存代理软件。但它缺少内容过滤组件。Squid 管理员经常接到阻止下载病毒感染文件或过滤成人内容的命令。市面上存在像 Dansguardian 或 Squidguard 这样的软件,它们试图做到这一点。但在企业环境中,这根本不够。
Squid 3.x 包含一个 ICAP 客户端,至少可以连接支持 ICAP 的内容过滤器。但即使是 Squid 2.x,您也可以将其他代理连接到“代理链”中。因此,本文将介绍 Webwasher 代理软件(由 Secure Computing 出品)的集成。
免责声明:Webwasher 是一款价格相对昂贵的软件。如果您想在家保护孩子免受色情网站的侵害,本文不适合您。本文存在的目的是因为我们在工作中使用了它。它不代表任何广告。此设置比较复杂,您应该熟悉 Squid 和 LDAP 的基本知识。
🔗 示例设置
我们的做法是根据 LDAP 数据库对用户进行身份验证。由于不同用户在互联网上需要允许访问的内容不同,因此有几个 LDAP 组为用户分配特定的配置文件。例如:不允许任何人使用公共电子邮件服务,但邮件服务器管理员组被授予此权限,以便他们可以从互联网上测试自己的服务器。
下面描述的设置大致如下:
- 用户将其浏览器指向 Squid 代理
- 访问代理时,系统会要求用户进行身份验证(通过 LDAP 验证凭据)
- 一旦用户通过身份验证并根据 ACL 允许访问,请求将被转发到 Webwasher
- Webwasher 获取 Squid 提供的经过身份验证的用户名,并分配一个配置文件(通过查找 LDAP 组)
- 传输的内容(请求和响应)由分配的配置文件的规则进行检查,并被允许或阻止
全局图

Webwasher 的功能
- 病毒扫描
- URL 阻止(庞大的 URL 数据库,允许您阻止特定类别,如 Web 邮件、色情内容或匿名代理)
- 扫描活动内容,如 Javascript、Java 或 ActiveX。它会分析 Javascript 或 Java 的实际行为,并可以阻止尝试访问硬盘的脚本。
- 检查允许的内容类型(它不仅仅接受浏览器发送的内容类型,而是通过所谓的“魔术字节”检查实际内容,这与 UNIX 的 **file** 命令使用的技术相同)
- 完整性检查:存档的深度和大小、Microsoft Authenticode(大多数签名不正确的脚本似乎来自 Microsoft 本身)
Webwasher 目前不具备的功能
- 配置文件的概念与 Squid 的 ACL 概念非常不同。使用 ACL 和 **http_access** 语句,您会从上到下运行这些规则,第一个匹配的条目决定是否允许访问。而配置文件则定义是否启用某个过滤器。一个默认配置文件可能会禁止访问成人网站。但另一个配置文件可能允许这样做。主要缺点是您无法在配置文件中使用继承。无法做到“我想要默认配置文件,但也想允许访问成人网站”。您只能复制默认配置文件并更改某些设置。但如果稍后更改了默认配置文件,则派生自默认配置文件的其他配置文件将不知道该更改。因此,您使用配置文件的时间越长,就越不清楚每个配置文件在做什么。
🔗 Squid 配置
Squid 代理主要用于复杂的 ACL。一些用户/客户端 IP 不需要进行身份验证。某些 URL 被手动阻止。Squid 的 ACL 非常适合这项工作。
🔗 LDAP 身份验证和授权
首先定义 LDAP 身份验证的工作方式
auth_param basic children 50
auth_param basic realm Proxy
auth_param basic credentialsttl 1 minute
auth_param basic program /usr/lib/squid/ldap_auth -b o=ourcompany -h ldapserver -D cn=proxyauth,o=ourcompany -w secretpassword -f (&(objectclass=person)(cn=%s))
有趣的部分是 **ldap_auth** 调用。以下是相应参数的含义:
| o=ourcompany | 定义 LDAP 树的起点 DN(专有名称) |
| ldapserver | 用于查询的 LDAP 服务器的 DNS 名称或 IP 地址 |
| cn=proxyauth,o=ourcompany | 用于验证用户用户名和密码的 LDAP 用户的 DN |
| secretpassword | 上述 LDAP 用户查询 LDAP 服务器所需的密码 |
| (&(objectclass=person)(cn=%s)) | 一个 LDAP 表达式,用于限制您正在搜索的 LDAP 对象/用户的类型 |
如果您希望 Squid 查询 LDAP 数据库以确定某个用户是否属于某个 LDAP 组,您还需要定义 LDAP 查询。
external_acl_type ldapgroup ttl=60 concurrency=20 %LOGIN /usr/lib/squid/squid_ldap_group \
-b o=ourcompany -f (&(objectclass=person)(cn=%v)(groupMembership=cn=%a,ou=groupcontainer,o=ourcompany)) \
-D cn=proxyauth,o=ourcompany -w secretpassword -h ldapserver
这里有趣的部分是 **(&(objectclass=person)(cn=%v)(groupMembership=cn=%a,ou=groupcontainer,o=ourcompany))**。这个 LDAP 表达式用于查询 (1) 所有人员,其中 (2) 名称为 **%v** [这将在稍后的 ACL 中定义],以及 (3) 您在 ou=groupcontainer,o=ourcompany 分支内的组中进行查找。
使用身份验证的最小 ACL/http_access 配置如下所示:
acl ldap-auth proxy_auth REQUIRED
http_access deny !ldap-auth
http_access allow all
可选
您可能希望创建一个特殊的 LDAP 组,其中包含允许通过代理浏览的用户。也许您有一个 LDAP 目录,其中列出了所有用户,并且您不想允许每个人访问互联网。因此,您可以创建一个 LDAP 组 **user_can_surf**,并将所有特权用户列在那里。示例配置:
acl ldap-auth proxy_auth REQUIRED
http_access deny !ldap-auth
acl ldapgroup-enabled external ldapgroup user_can_surf
deny_info denied-ldapenabled ldapgroup-enabled
http_access deny !ldapgroup-enabled
http_access allow all
为了告诉用户访问被拒绝的原因,您应该考虑使用 **deny_info** 语句来定义自己的错误页面。有关详细信息,请参阅您的 squid.conf。
🔗 代理链
现在 Squid 的用户身份验证工作已完成,并且 Squid 已决定允许访问,您希望将请求转发到 Webwasher。这可以通过“代理链”来实现。在您的 squid.conf 中设置一个缓存对等体:
cache_peer localhost parent 9090 0 no-query no-digest default login=*:foobar
您可以将 Webwasher 进程与 Squid 运行在同一台主机上。这就是为什么对等主机是 localhost。附加选项 **no-query** 和 **no-digest** 告诉 Squid Webwasher 不了解 ICP 查询和对等关系。但这里有一个特殊之处:**login=*:foobar**。此选项会将 HTTP **Proxy-Authorization** 头转发到父代理,但会将用户的密码替换为字符串 **foobar**。这样,Webwasher 稍后就可以使用当前 Squid 用户的名称来分配特定的配置文件。
还要告诉您的 Squid,您希望所有请求都转发到 Webwasher 代理,而无需直接获取 URL。
never_direct allow all
如果您有某些 URL 希望直接查询,因为它们是您的内部网站点,或者因为 Webwasher 对该网站存在问题,您始终可以使用 **always_direct allow …** 将特定类型的查询直接从 Squid 发送到 Web 服务器。
🔗 Webwasher 配置
由于 Web 界面中的配置选项在版本 5.x 和 6.x 之间有所变动,因此我将不详细描述具体路径。如果您不知道在哪里找到某个选项,只需使用右上角的搜索框即可。
首先,定义您的配置文件。您可能已经对不同类型的用户有所了解,并为每种用户创建一个配置文件。
🔗 LDAP 授权
在 Web 界面中找到“策略管理”选项。然后选择“Web 映射”。在这里,您可以定义将哪个配置文件分配给特定用户。您可以通过以下方式实现:
- IP 映射:配置文件根据用户客户端 PC 的 IP 地址分配。在 squid.conf 中设置 **forwarded_for on** 以使用此功能。
- 用户名映射:将 Squid 验证的用户名称考虑在内。
- 映射方法:从“用户名”映射 / 通过“LDAP 查询”映射
- 从以下位置提取用户信息:标准请求头(Proxy-Authorization)
- 映射选项:使用请求头时不验证密码(这很重要,只需将 Proxy-Authorization 中提供的用户名映射到配置文件,而无需再次检查密码)
- 当前规则:在此处设置映射。在左侧选择要分配的配置文件。在右侧输入包含应分配此配置文件的用户的 LDAP 组名称。
当然,您需要已经配置好 LDAP。设置取决于您的 LDAP 软件。这是一个示例配置:
- 用户
- 要提取的属性:cn
- 组对象
- 要提取的属性:cn
- 组对象的基 DN:ou=proxygroups,o=ourcompany
- 组会员属性名称:uniqueMember
- 组的对象类:groupOfNames
(使用 ethereal/ethershark 进行 LDAP 查询调试非常有用。)
🔗 常见问题解答
- 为什么要使用 Squid?看起来 Webwasher 可以在没有 Squid 的情况下满足您的所有需求。
- Squid 用于缓存以及其灵活的 ACL。如果您不需要这些,也可以只使用 Webwasher,让它进行身份验证。
⚠️ Disclaimer: Any example presented here is provided "as-is" with no support
or guarantee of suitability. If you have any further questions about
these examples please email the squid-users mailing list.
类别: ConfigExample
导航:网站搜索、网站页面、分类、🔼 向上