Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

16.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 软件包:
    # yum 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 helper 工具的参数:
      • -B base_DN 设置 LDAP 搜索基础。
      • -D proxy_service_user_DN 设置 Squid 所用帐户的可分辨名称(DN),以在 目录中搜索身份验证用户。
      • -W path_to_password_file 设置包含代理服务用户密码的文件路径。使用密码文件可防止密码在操作系统的进程列表中可见。
      • -f LDAP_filter 指定 LDAP 搜索过滤器。Squid 将 %s 变量替换为身份验证用户提供的用户名。
        示例中的(&(¹=person)(uid=%s) 过滤器定义用户名必须与 uid 属性中设置的值匹配,并且目录条目包含用户对象类
      • -ZZ 使用 STARTTLS 命令通过 LDAP 协议强制实施 TLS 加密的连接。在以下情况下省略 -ZZ
        • LDAP 服务器不支持加密的连接。
        • URL 中指定的端口使用 LDAPS 协议。
      • -H LDAP_URL 参数以 URL 格式指定协议、主机名或 IP 地址以及 LDAP 服务器的端口。
    2. 添加以下 ACL 和规则来配置 Squid 只允许经过身份验证的用户使用代理:
      acl ldap-auth proxy_auth REQUIRED
      http_access allow ldap-auth
      重要
      http_access 拒绝所有规则前指定这些设置
    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 级-1 子目录。
      • Squid 在每个级别 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 start squid
  7. 在系统引导时启用 squid 服务自动启动:
    # systemctl enable 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 参数中使用的相同设置手动启动帮助程序:
    # /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
    如果帮助程序返回 OK,则身份验证成功。