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 会以此用户的身份绑定到该目录以验证身份验证。

流程

  1. 安装 squid 软件包:

    # dnf install squid
  2. 编辑 /etc/squid/squid.conf 文件:

    1. 要配置 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。
    2. 添加以下 ACL 和规则来配置 Squid 只允许经过身份验证的用户使用代理:

      acl ldap-auth proxy_auth REQUIRED
      http_access allow ldap-auth
      重要

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

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

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

      acl SSL_ports port 443

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

      acl SSL_ports port port_number
    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

      默认情况下,配置包含 http_access deny !Safe_ports 规则,该规则定义拒绝访问 Safe_ports ACL 中未定义的端口。

    6. 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 会在内存中存储缓存。

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

    1. 创建缓存目录:

      # mkdir -p path_to_cache_directory
    2. 配置缓存目录的权限:

      # chown squid:squid path_to_cache_directory
    3. 如果您在 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 软件包。

  4. 将 LDAP 服务用户的密码存储在 /etc/squid/ldap_password 文件中,并为该文件设置合适的权限:

    # echo "password" > /etc/squid/ldap_password
    # chown root:squid /etc/squid/ldap_password
    # chmod 640 /etc/squid/ldap_password
  5. 在防火墙中打开 3128 端口:

    # firewall-cmd --permanent --add-port=3128/tcp
    # firewall-cmd --reload
  6. 启用并启动 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 工具是否正常工作:

  1. 使用您在 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
  2. 输入一个有效的用户名和密码,然后按 Enter 键:

    user_name password

    如果 helper 工具返回 OK,则身份验证成功。