3.2. 使用 LDAP 身份验证将 Squid 设置为缓存代理
您可以将 Squid 配置为使用 LDAP 验证用户身份的缓存代理。此流程配置仅经过身份验证的用户可以使用代理。
先决条件
-
流程假设
/etc/squid/squid.conf
文件是由squid
软件包提供的。如果您在之前编辑了这个文件,请删除该文件并重新安装该软件包。 -
LDAP 目录中存在一个服务用户,如
uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com
。Squid 只使用此帐户搜索验证用户。如果存在身份验证用户,Squid 会以此用户的身份绑定到该目录以验证身份验证。
流程
安装
squid
软件包:# dnf install squid
编辑
/etc/squid/squid.conf
文件:要配置
basic_ldap_auth
帮助工具,请在/etc/squid/squid.conf
的顶部添加以下配置条目:auth_param basic program /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389
下面描述了在上面示例中传给
basic_ldap_auth
帮助工具的参数:-
-b base_DN
设置 LDAP 搜索基础。 -
-D proxy_service_user_DN
设置 Squid 用来搜索目录中验证用户的帐户的可分辨名称(DN)。 -
-W path_to_password_file
设置包含代理服务用户密码的文件路径。使用密码文件可防止在操作系统的进程列表中看到密码。 -f LDAP_filter
指定 LDAP 搜索过滤器。Squid 将%s
变量替换为验证用户提供的用户名。示例中的
(&(objectClass=person)(uid=%s))
过滤器定义用户名必须与uid
属性中设置的值匹配,并且与包含person
对象类的目录条目匹配。-ZZ
使用STARTTLS
命令强制实现通过 LDAP 协议的 TLS 加密连接。在以下情况下省略-ZZ
:- LDAP 服务器不支持加密的连接。
- URL 中指定的端口使用 LDAPS 协议。
- -H LDAP_URL 参数指定协议、主机名或 IP 地址以及 LDAP 服务器的端口,格式为 URL。
-
添加以下 ACL 和规则来配置 Squid 只允许经过身份验证的用户使用代理:
acl ldap-auth proxy_auth REQUIRED http_access allow ldap-auth
重要在
http_access deny
所有规则前指定这些设置。删除以下规则以禁止绕过
localnet
ACL 中指定的 IP 范围的代理身份验证:http_access allow localnet
以下 ACL 存在于默认配置中,并将
443
定义为使用 HTTPS 协议的端口:acl SSL_ports port 443
如果用户也可以在其它端口上使用 HTTPS 协议,请为每个端口添加 ACL:
acl SSL_ports port port_number
更新
acl Safe_ports
规则列表,以配置 Squid 可对哪个端口建立连接。例如,若要配置使用代理的客户端只能访问端口 21(FTP)、80(HTTP)和 443(HTTPS)上的资源,请在配置中只保留以下acl Safe_ports
语句:acl Safe_ports port 21 acl Safe_ports port 80 acl Safe_ports port 443
默认情况下,配置包含
http_access deny !Safe_ports
规则,该规则定义拒绝访问Safe_ports ACL
中未定义的端口。在
cache_dir
参数中配置缓存类型、缓存目录的路径、缓存大小以及特定于其它缓存类型的设置:cache_dir ufs /var/spool/squid 10000 16 256
有了这些设置:
-
squid 使用
ufs
缓存类型。 -
Squid 将其缓存存储在
/var/spool/squid/
目录中。 -
缓存增长到
10000
MB。 -
Squid 在
/var/spool/squid/
目录中创建16
level-1 子目录。 Squid 在每个 level-1 目录中创建
256
个子目录。如果您没有设置
cache_dir
指令,Squid 会在内存中存储缓存。
-
squid 使用
如果您在
cache_dir
参数中设置了与/var/spool/squid/
不同的缓存目录:创建缓存目录:
# mkdir -p path_to_cache_directory
配置缓存目录的权限:
# chown squid:squid path_to_cache_directory
如果您在
enforcing
模式下运行 SELinux,请为缓存目录设置squid_cache_t
上下文:# semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?" # restorecon -Rv path_to_cache_directory
如果系统上没有
semanage
工具,请安装policycoreutils-python-utils
软件包。
将 LDAP 服务用户的密码存储在
/etc/squid/ldap_password
文件中,并为该文件设置合适的权限:# echo "password" > /etc/squid/ldap_password # chown root:squid /etc/squid/ldap_password # chmod 640 /etc/squid/ldap_password
在防火墙中打开
3128
端口:# firewall-cmd --permanent --add-port=3128/tcp # firewall-cmd --reload
启用并启动
squid
服务:# systemctl enable --now squid
验证
要验证代理是否正常工作,请使用 curl
工具下载网页:
# curl -O -L "https://www.redhat.com/index.html" -x "user_name:password@proxy.example.com:3128"
如果 curl 没有显示任何错误,并且 index.html
文件已下载到当前目录中,则代理工作正常。
故障排除步骤
验证 helper 工具是否正常工作:
使用您在
auth_param
参数中使用的相同设置手动启动 helper 工具:# /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389
输入一个有效的用户名和密码,然后按 Enter 键:
user_name password
如果 helper 工具返回
OK
,则身份验证成功。