6.3. 将 Squid 设置为带有 kerberos 身份验证的缓存代理
您可以将 Squid 配置为使用 Kerberos 向活动目录(AD)验证用户的缓存代理。此流程配置仅经过身份验证的用户可以使用代理。
先决条件
-
流程假设
/etc/squid/squid.conf文件是由squid软件包提供的。如果您在之前编辑了这个文件,请删除该文件并重新安装该软件包。
流程
安装以下软件包:
yum install squid krb5-workstation
# yum install squid krb5-workstationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以 AD 域管理员身份进行身份验证:
kinit administrator@AD.EXAMPLE.COM
# kinit administrator@AD.EXAMPLE.COMCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为 Squid 创建一个 keytab,将其存储在
/etc/squid/HTTP.keytab文件中,并将HTTP服务主体添加到 keytab 中:export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab net ads keytab CREATE -U administrator net ads keytab ADD HTTP -U administrator
# export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab # net ads keytab CREATE -U administrator # net ads keytab ADD HTTP -U administratorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:如果系统最初是使用领域加入到 AD 域(通过
adcli)的,请使用以下说明来添加HTTP主体,并为 squid 创建一个 keytab 文件:将
HTTP服务主体添加到默认的 keytab 文件/etc/krb5.keytab中,并验证:adcli update -vvv --domain=ad.example.com --computer-name=PROXY --add-service-principal="HTTP/proxy.ad.example.com" -C klist -kte /etc/krb5.keytab | grep -i HTTP
# adcli update -vvv --domain=ad.example.com --computer-name=PROXY --add-service-principal="HTTP/proxy.ad.example.com" -C # klist -kte /etc/krb5.keytab | grep -i HTTPCopy to Clipboard Copied! Toggle word wrap Toggle overflow 加载
/etc/krb5.keytab文件,删除除HTTP以外的所有服务主体,并将剩余的主体保存到/etc/squid/HTTP.keytab文件中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
ktutil的交互式 shell 中,您可以使用不同的选项,直到所有不需要的主体都从 keytab 中删除了,例如:ktutil: delent 1
ktutil: delent 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告如果 SSSD 或 Samba/winbind 将更新机器帐户密码,则
/etc/krb5.keytab中的密钥可能会被更新。更新后,/etc/squid/HTTP.keytab中的密钥将停止工作,您需要再次执行ktutil步骤来将新密钥复制到 keytab 中。
将 keytab 文件的拥有者设为
squid用户:chown squid /etc/squid/HTTP.keytab
# chown squid /etc/squid/HTTP.keytabCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:验证 keytab 文件是否包含代理服务器的完全限定域名(FQDN)的
HTTP服务主体:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/etc/squid/squid.conf文件:要配置
negotiate_kerberos_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.COMCopy to Clipboard Copied! Toggle word wrap Toggle overflow 下面描述了在上例中传给
negotiate_kerberos_auth帮助工具的参数:-
-k file设置 keytab 文件的路径。请注意,squid 用户必须拥有这个文件的读取权限。 -s HTTP/host_name@kerberos_realm设置 Squid 使用的 Kerberos 主体。另外,您可以通过将以下一个或多个参数传给帮助工具来启用日志:
-
-i记录信息,如验证用户。 -d启用调试日志记录。Squid 将帮助工具中的调试信息记录到
/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-authCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要在
http_access deny all规则前指定这些设置。删除以下规则以禁止绕过
localnetACL 中指定的 IP 范围的代理身份验证:http_access allow localnet
http_access allow localnetCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下 ACL 存在于默认配置中,并将
443定义为使用 HTTPS 协议的端口:acl SSL_ports port 443
acl SSL_ports port 443Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果用户也可以在其它端口上使用 HTTPS 协议,请为每个端口添加 ACL:
acl SSL_ports port port_number
acl SSL_ports port port_numberCopy 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 443Copy to Clipboard Copied! Toggle word wrap Toggle overflow 默认情况下,配置包含
http_access deny !Safe_ports规则,该规则定义禁止对定义在Safe_portsACL 中端口的访问。在
cache_dir参数中配置缓存类型、缓存目录的路径、缓存大小以及特定于其它缓存类型的设置:cache_dir ufs /var/spool/squid 10000 16 256
cache_dir ufs /var/spool/squid 10000 16 256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有了这些设置:
-
squid 使用
ufs缓存类型。 -
Squid 将其缓存存储在
/var/spool/squid/目录中。 -
缓存增长到
10000MB。 -
Squid 在
/var/spool/squid/目录中创建16level-1 子目录。 Squid 在每个 level-1 目录中创建
256个子目录。如果您没有设置
cache_dir指令,Squid 会在内存中存储缓存。
-
squid 使用
如果您在
cache_dir参数中设置了与/var/spool/squid/不同的缓存目录:创建缓存目录:
mkdir -p path_to_cache_directory
# mkdir -p path_to_cache_directoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 配置缓存目录的权限:
chown squid:squid path_to_cache_directory
# chown squid:squid path_to_cache_directoryCopy 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_directoryCopy 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 --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
squid服务:systemctl enable --now squid
# systemctl enable --now squidCopy 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"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
curl没有显示任何错误,并且当前目录中存在index.html文件,则代理工作正常。
故障排除步骤
为 AD 帐户获取一个 Kerberos 票据:
kinit user@AD.EXAMPLE.COM
# kinit user@AD.EXAMPLE.COMCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:显示票据:
klist
# klistCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
negotiate_kerberos_auth_test工具测试身份验证:/usr/lib64/squid/negotiate_kerberos_auth_test proxy.ad.example.com
# /usr/lib64/squid/negotiate_kerberos_auth_test proxy.ad.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果助手工具返回令牌,则身份验证成功:
Token: YIIFtAYGKwYBBQUCoIIFqDC...
Token: YIIFtAYGKwYBBQUCoIIFqDC...Copy to Clipboard Copied! Toggle word wrap Toggle overflow