6.3. 将 Squid 设置为带有 kerberos 身份验证的缓存代理


您可以将 Squid 配置为使用 Kerberos 向活动目录(AD)验证用户的缓存代理。此流程配置仅经过身份验证的用户可以使用代理。

先决条件

  • 流程假设 /etc/squid/squid.conf 文件是由 squid 软件包提供的。如果您在之前编辑了这个文件,请删除该文件并重新安装该软件包。

流程

  1. 安装以下软件包:

    # yum install squid krb5-workstation
    Copy to Clipboard Toggle word wrap
  2. 以 AD 域管理员身份进行身份验证:

    # kinit administrator@AD.EXAMPLE.COM
    Copy to Clipboard Toggle word wrap
  3. 为 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
    Copy to Clipboard Toggle word wrap
  4. 可选:如果系统最初是使用领域加入到 AD 域(通过 adcli)的,请使用以下说明来添加 HTTP 主体,并为 squid 创建一个 keytab 文件:

    1. 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
      Copy to Clipboard Toggle word wrap
    2. 加载 /etc/krb5.keytab 文件,删除除 HTTP 以外的所有服务主体,并将剩余的主体保存到 /etc/squid/HTTP.keytab 文件中:

      # ktutil
      ktutil:  rkt /etc/krb5.keytab
      ktutil:  l -e
      slot | KVNO | Principal
      -----------------------------------------------------------------------------
      1 |    2 |            PROXY$@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96)
      2 |    2 |            PROXY$@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96)
      3 |    2 |         host/PROXY@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96)
      4 |    2 |         host/PROXY@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96)
      5 |    2 | host/proxy.ad.example.com@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96)
      6 |    2 | host/proxy.ad.example.com@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96)
      7 |    2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96)
      8 |    2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96)
      Copy to Clipboard Toggle word wrap

      ktutil 的交互式 shell 中,您可以使用不同的选项,直到所有不需要的主体都从 keytab 中删除了,例如:

      ktutil:  delent 1
      Copy to Clipboard Toggle word wrap
      ktutil:  l -e
      
      slot | KVNO | Principal
      -------------------------------------------------------------------------------
      1 |   2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96)
      2 |   2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96)
      
      ktutil:  wkt /etc/squid/HTTP.keytab
      ktutil:  q
      Copy to Clipboard Toggle word wrap
      警告

      如果 SSSD 或 Samba/winbind 将更新机器帐户密码,则 /etc/krb5.keytab 中的密钥可能会被更新。更新后,/etc/squid/HTTP.keytab 中的密钥将停止工作,您需要再次执行 ktutil 步骤来将新密钥复制到 keytab 中。

  5. 将 keytab 文件的拥有者设为 squid 用户:

    # chown squid /etc/squid/HTTP.keytab
    Copy to Clipboard Toggle word wrap
  6. 可选:验证 keytab 文件是否包含代理服务器的完全限定域名(FQDN)的 HTTP 服务主体:

    # klist -k /etc/squid/HTTP.keytab
    Keytab name: FILE:/etc/squid/HTTP.keytab
    KVNO Principal
    ---- ---------------------------------------------------
    ...
       2 HTTP/proxy.ad.example.com@AD.EXAMPLE.COM
    ...
    Copy to Clipboard Toggle word wrap
  7. 编辑 /etc/squid/squid.conf 文件:

    1. 要配置 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
      Copy to Clipboard Toggle word wrap

      下面描述了在上例中传给 negotiate_kerberos_auth 帮助工具的参数:

      • -k file 设置 keytab 文件的路径。请注意,squid 用户必须拥有这个文件的读取权限。
      • -s HTTP/host_name@kerberos_realm 设置 Squid 使用的 Kerberos 主体。

        另外,您可以通过将以下一个或多个参数传给帮助工具来启用日志:

      • -i 记录信息,如验证用户。
      • -d 启用调试日志记录。

        Squid 将帮助工具中的调试信息记录到 /var/log/squid/cache.log 文件。

    2. 添加以下 ACL 和规则来配置 Squid 只允许经过身份验证的用户使用代理:

      acl kerb-auth proxy_auth REQUIRED
      http_access allow kerb-auth
      Copy to Clipboard Toggle word wrap
      重要

      http_access deny all 规则前指定这些设置。

    3. 删除以下规则以禁止绕过 localnet ACL 中指定的 IP 范围的代理身份验证:

      http_access allow localnet
      Copy to Clipboard Toggle word wrap
    4. 以下 ACL 存在于默认配置中,并将 443 定义为使用 HTTPS 协议的端口:

      acl SSL_ports port 443
      Copy to Clipboard Toggle word wrap

      如果用户也可以在其它端口上使用 HTTPS 协议,请为每个端口添加 ACL:

      acl SSL_ports port port_number
      Copy to Clipboard Toggle word wrap
    5. 更新 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
      Copy to Clipboard Toggle word wrap

      默认情况下,配置包含 http_access deny !Safe_ports 规则,该规则定义禁止对定义在 Safe_ports ACL 中端口的访问。

    6. cache_dir 参数中配置缓存类型、缓存目录的路径、缓存大小以及特定于其它缓存类型的设置:

      cache_dir ufs /var/spool/squid 10000 16 256
      Copy to Clipboard Toggle word wrap

      有了这些设置:

      • squid 使用 ufs 缓存类型。
      • Squid 将其缓存存储在 /var/spool/squid/ 目录中。
      • 缓存增长到 10000 MB。
      • Squid 在 /var/spool/squid/ 目录中创建 16 level-1 子目录。
      • Squid 在每个 level-1 目录中创建 256 个子目录。

        如果您没有设置 cache_dir 指令,Squid 会在内存中存储缓存。

  8. 如果您在 cache_dir 参数中设置了与 /var/spool/squid/ 不同的缓存目录:

    1. 创建缓存目录:

      # mkdir -p path_to_cache_directory
      Copy to Clipboard Toggle word wrap
    2. 配置缓存目录的权限:

      # chown squid:squid path_to_cache_directory
      Copy to Clipboard Toggle word wrap
    3. 如果您在 enforcing 模式下运行 SELinux,请为缓存目录设置 squid_cache_t 上下文:

      # semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?"
      # restorecon -Rv path_to_cache_directory
      Copy to Clipboard Toggle word wrap

      如果系统上没有 semanage 工具,请安装 policycoreutils-python-utils 软件包。

  9. 在防火墙中打开 3128 端口:

    # firewall-cmd --permanent --add-port=3128/tcp
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap
  10. 启用并启动 squid 服务:

    # systemctl enable --now squid
    Copy to Clipboard Toggle word wrap

验证

  • 要验证代理是否正常工作,请使用 curl 工具下载网页:

    # curl -O -L "https://www.redhat.com/index.html" --proxy-negotiate -u : -x "proxy.ad.example.com:3128"
    Copy to Clipboard Toggle word wrap

    如果 curl 没有显示任何错误,并且当前目录中存在 index.html 文件,则代理工作正常。

故障排除步骤

  1. 为 AD 帐户获取一个 Kerberos 票据:

    # kinit user@AD.EXAMPLE.COM
    Copy to Clipboard Toggle word wrap
  2. 可选:显示票据:

    # klist
    Copy to Clipboard Toggle word wrap
  3. 使用 negotiate_kerberos_auth_test 工具测试身份验证:

    # /usr/lib64/squid/negotiate_kerberos_auth_test proxy.ad.example.com
    Copy to Clipboard Toggle word wrap

    如果助手工具返回令牌,则身份验证成功:

    Token: YIIFtAYGKwYBBQUCoIIFqDC...
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat