16.3. 使用 Kerberos 身份验证将 Squid 设置为缓存代理
这部分论述了 Squid 作为缓存代理的基本配置,它使用 Kerberos 向 Active Directory(AD)验证用户。此流程配置仅经过身份验证的用户可以使用代理。
先决条件
- 这个过程假设
/etc/squid/squid.conf
文件是 squid 软件包提供的。如果您在之前编辑了这个文件,请删除该文件并重新安装该软件包。 - 要安装 Squid 的服务器是 AD 域的成员。详情请参阅《Red Hat Enterprise Linux 7 系统管理员指南》中的将 Samba 设置为域成员 。
流程
- 安装以下软件包:
yum install squid krb5-workstation
# yum install squid krb5-workstation
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以 AD 域管理员身份进行身份验证:
kinit administrator@AD.EXAMPLE.COM
# kinit administrator@AD.EXAMPLE.COM
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 为 Squid 创建一个 keytab,并将其存储在
/etc/squid/HTTP.keytab
文件中:export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab net ads keytab CREATE -U administrator
# export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab # net ads keytab CREATE -U administrator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 在 keytab 中添加
HTTP
服务主体:net ads keytab ADD HTTP -U administrator
# net ads keytab ADD HTTP -U administrator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 将 keytab 文件的所有者设置为
squid
用户:chown squid /etc/squid/HTTP.keytab
# chown squid /etc/squid/HTTP.keytab
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 另外,还可验证 keytab 文件是否包含代理服务器的完全限定域名(FQDN)的
HTTP
服务主体:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 编辑
/etc/squid/squid.conf
文件:要配置consberos_auth
帮助程序程序,请在/etc/squid/squid.conf
的顶部添加以下配置条目:auth_param negotiate program /usr/lib64/squid/negotiate_kerberos_auth -k /etc/squid/HTTP.keytab -s HTTP/proxy.ad.example.com@AD.EXAMPLE.COM
auth_param negotiate program /usr/lib64/squid/negotiate_kerberos_auth -k /etc/squid/HTTP.keytab -s HTTP/proxy.ad.example.com@AD.EXAMPLE.COM
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 下面描述了传递给上例中协商_kerberos_auth
帮助程序的参数:-k file
设置密钥选项卡文件的路径。请注意,squid
用户必须具有此文件的读取权限。-s HTTP/host_name@kerberos_realm
设置 Squid 使用的 Kerberos 主体。
另外,您可以通过将以下一个或多个参数传递给帮助程序来启用日志:-i
记录信息性消息,如身份验证用户。-d
启用调试日志记录。
Squid 将 helper 实用程序中的调试信息记录到/var/log/squid/cache.log
文件。- 添加以下 ACL 和规则来配置 Squid 只允许经过身份验证的用户使用代理:
acl kerb-auth proxy_auth REQUIRED http_access allow kerb-auth
acl kerb-auth proxy_auth REQUIRED http_access allow kerb-auth
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要在 http_access 拒绝所有规则前指定这些设置。 - 删除以下规则以禁用从 localnet ACL 中指定的 IP 范围禁用代理身份验证:
http_access allow localnet
http_access allow localnet
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 默认配置中存在以下 ACL,并将 443 定义为使用 HTTPS 协议的端口:
acl SSL_ports port 443
acl SSL_ports port 443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果用户也可以在其它端口上使用 HTTPS 协议,请为每个端口添加 ACL:acl SSL_ports port port_number
acl SSL_ports port port_number
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 更新 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
acl Safe_ports port 21 acl Safe_ports port 80 acl Safe_ports port 443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,配置中包含 http_access deny !Safe_ports 规则,该规则定义对 Safe_ports ACL 中没有定义的端口的访问拒绝。 - 在
cache_dir
参数中配置缓存类型、缓存目录的路径、缓存大小以及进一步缓存特定于类型的设置:cache_dir ufs /var/spool/squid 10000 16 256
cache_dir ufs /var/spool/squid 10000 16 256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用这些设置:- Squid 使用ufs 缓存类型.
- Squid 将其缓存存储在
/var/spool/squid/
目录中。 - 缓存最多增长 10000 MB。
- Squid 在
/var/spool/squid/
目录中创建 16 级-1 子目录。 - Squid 在每个级别 1 目录中创建 256 个子目录。
如果您没有设置cache_dir
指令,Squid 会将缓存保存在内存中。
- 如果您在
cache_dir
参数中设置与/var/spool/squid/
不同的缓存目录:- 创建缓存目录:
mkdir -p path_to_cache_directory
# mkdir -p path_to_cache_directory
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 配置缓存目录的权限:
chown squid:squid path_to_cache_directory
# chown squid:squid path_to_cache_directory
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果您以 enforcing 模式运行 SELinux,请为缓存目录设置
squid_cache_t
上下文:semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?" restorecon -Rv path_to_cache_directory
# semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?" # restorecon -Rv path_to_cache_directory
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的系统中没有semanage
工具,请安装 policycoreutils-python-utils 软件包。
- 在防火墙中打开 3128 端口:
firewall-cmd --permanent --add-port=3128/tcp firewall-cmd --reload
# firewall-cmd --permanent --add-port=3128/tcp # firewall-cmd --reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 启动
squid
服务:systemctl start squid
# systemctl start squid
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 在系统引导时启用
squid
服务自动启动:systemctl enable squid
# systemctl enable squid
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证步骤
要验证代理是否正常工作,请使用
curl
实用程序下载网页:
curl -O -L "https://www.redhat.com/index.html" --proxy-negotiate -u : -x "proxy.ad.example.com:3128"
# curl -O -L "https://www.redhat.com/index.html" --proxy-negotiate -u : -x "proxy.ad.example.com:3128"
如果
curl
没有显示任何错误,并且 index.html
文件存在于当前目录中,则代理可以正常工作。
故障排除步骤
手动测试 Kerberos 身份验证:
- 为 AD 帐户获取 Kerberos ticket:
kinit user@AD.EXAMPLE.COM
# kinit user@AD.EXAMPLE.COM
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 显示 ticket(可选):
klist
# klist
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 使用
talk_kerberos_auth_test
工具来测试身份验证:/usr/lib64/squid/negotiate_kerberos_auth_test proxy.ad.example.com
# /usr/lib64/squid/negotiate_kerberos_auth_test proxy.ad.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果帮助程序返回令牌,则身份验证成功。Token: YIIFtAYGKwYBBQUCoIIFqDC...
Token: YIIFtAYGKwYBBQUCoIIFqDC...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow