Squid Web Cache Wiki

Squid Web Cache 文档

🔗 使用摘要 LDAP 身份验证助手

🔗 摘要

许多将密码存储在 LDAP 数据库中的用户在使用基本机制时感到不自在,因为它会将密码以明文形式发送给 Squid(一个 base64 编码的字符串),有时还会通过 NTLM 与 CIFS 服务器通信。本文档的目的是展示如何使用摘要机制配置 Squid 中的身份验证助手,并将密码(或在这种情况下,摘要)存储在 LDAP 中。

🔗 环境以及预期您拥有或已经知道的内容

测试中使用的环境由两台 Debian Sarge 服务器组成,一台充当互联网网关(运行 Squid 2.5.9),另一台托管 LDAP 数据库(运行 OpenLDAP)并作为 Samba 域的 PDC。您的服务如何或在哪里运行并不重要,但阅读本文的人应该期望

🔗 实现方法**

用于操作 LDAP 中的属性的是 `ldap-utils` 包中的工具(那些以 `ldap*` 开头的,用于在运行时操作数据库,非常标准)。有多种方法可以做到这一点,例如通过 LDIF 文件填充数据库、使用带有 Web 界面的管理工具,这里不展示这些。LDAP 可以用各种不同的形式填充,因此,预期您的可能与我的略有不同(这里使用了 Idealx 的 `smbldap-populate` 脚本所用的结构以及 Debian 设置管理员账户的方式)。

我使用了一个名为“l”(在 `core.schema` 中定义)的属性来存储摘要,它不是专门为此设计的,但我找不到更合适的,但这没关系。您有时会看到一个名为“fileserver”的主机(因为我的 Squid 和 LDAP + Samba 不在同一主机上)。我的 LDAP 管理员的 DN 是 `cn=admin,dc=minharede,dc=lan`,密码是 `temppass`,这是可以对数据库中的任何内容进行操作的账户。

摘要是如何计算的以及期望在数据库中是什么

数据库需要包含一个属性,该属性包含一个对,即 realm 和 H(A1),它们由一个分隔符(如 `realm:H(A1)`)分隔,然后是代表用户名(distinguished name)的唯一标识名。其中 H(A1) 是 `username:realm:password` 的摘要值。

🔗 安装和测试助手

  1. 获取 Squid 源代码,编译 `digest_ldap_auth` 助手,并将其与其他 Squid 助手放在一起。
     ./configure --enable-auth-digest=LDAP
     make && make install
    
  2. 在一个账户中创建一个哈希值以进行测试。从 shell 运行它。
     REALM="Squid proxy-caching web server" HASH=`echo -n "usuario1:$REALM:password" | md5sum | cut -f1 -d' '` ldapmodify -x -D "cn=admin,dc=minharede,dc=lan" -w "temppass" << EOF
     dn: uid=usuario1,ou=Users,dc=minharede,dc=lan
     l: $REALM:$HASH
     EOF
    
  3. 从命令行测试助手。
     echo '"usuario1":"Squid proxy-caching web server"' | /usr/lib/squid/digest_ldap_auth -b "ou=Users,dc=minharede,dc=lan" -u "uid" -A "l" -D "cn=admin,dc=minharede,dc=lan" -w "temppass" -e -v 3 -h fileserver -d
     Connected OK
     searchbase 'uid=usuario1, ou=Users,dc=minharede,dc=lan'
     password: 6f9e1772bc8ed55bfe157071e169bf19
     6f9e1772bc8ed55bfe157071e169bf19
    
  4. 在 LDAP 中创建一个“简单安全对象”。它将用于绑定和读取摘要。在使用摘要时,用户不会在数据库中进行身份验证,因此仅授予他们访问权限是无效的,并且您不希望任何人查看整个数据库的摘要。
     PASS=`slappasswd -s "digestpass"` ldapadd -x -D "cn=admin,dc=minharede,dc=lan" -w "temppass" << EOF
     dn: uid=digestreader,dc=minharede,dc=lan
     objectClass: top
     objectClass: account
     objectClass: simpleSecurityObject
     uid: digestreader
     userPassword: $PASS
     EOF
    
  5. 保护摘要属性,使其只能被应该访问的用户读取和/或写入。更改您的 `slapd.conf`。
     access to attrs=l
             by dn="cn=admin,dc=minharede,dc=lan" write
             by dn="uid=digestreader,dc=minharede,dc=lan" read
             by anonymous auth
             by self write
             by * none
    
  6. 重启您的 OpenLDAP。
  7. 将对象的密码放入一个文件并加以保护。
     echo "digestpass" > /etc/digestreader_cred
     chown proxy:proxy /etc/digestreader_cred
     chmod 440 /etc/digestreader_cred
    

    在 Debian 中,Squid 以 `proxy` 用户身份运行,因此助手也以 `proxy` 用户身份执行。

  8. 使用创建的用于绑定到数据库的对象以及包含密码的文件再次测试助手。
     echo '"usuario1":"Squid proxy-caching web server"' | /usr/lib/squid/digest_ldap_auth -b "ou=Users,dc=minharede,dc=lan" -u "uid" -A "l" -D "uid=digestreader,dc=minharede,dc=lan" -W "/etc/digestreader_cred" -e -v 3 -h fileserver -d
     Connected OK
     searchbase 'uid=usuario1, ou=Users,dc=minharede,dc=lan'
     password: 6f9e1772bc8ed55bfe157071e169bf19
     6f9e1772bc8ed55bfe157071e169bf19
    
  9. 配置 Squid 以使用 LDAP 摘要助手。在 `squid.conf` 中。
     ...
     auth_param digest program /usr/lib/squid/digest_ldap_auth -b "ou=Users,dc=minharede,dc=lan" -u "uid" -A "l" -D "uid=digestreader,dc=minharede,dc=lan" -W "/etc/digestreader_cred" -e -v 3 -h fileserver
     auth_param digest children 5
     auth_param digest realm Squid proxy-caching web server
     ...
    

    此处未使用“-d”调试标志,我们不再调试。

🔗 摘要同步

  1. 修改 idealx 的 `smbldap-passwd` 脚本。
     ...
     ################ CHANGE THIS CODE ################
     # use Digest::MD5 qw(md5);
     use Digest::MD5 qw(md5 md5_hex md5_base64);
     ######### END OF THE CODE TO BE CHANGED ##########
     ...
     # Update 'userPassword' field
     my $modify = $ldap_master->modify ( "$dn", changes => [
                                                replace => [userPassword => "$hash_password"]
                                                ]
                                       );
     $modify->code && warn "Unable to change password : ", $modify->error ;
     ################ INSERT THIS CODE ################
     my $realm = "Squid proxy-caching web server";
     # Creates the digest.
     my $HA1digest = md5_hex("$user:$realm:$pass");
     my $realmdigest = "$realm:$HA1digest";
     # Add the attribute, if it already exists it will be overwritten.
     $modify = $ldap_master->modify ( "$dn",
           changes => [
              replace => [l => $realmdigest]
           ]
     );
     $modify->code && warn "Unable to create the H(A1) hash : ", $modify->error ;
     ######### END OF THE CODE TO BE INSERTED #########
     # take down session
     $ldap_master->unbind;
     exit 0;
     ...
    

    您可以做一些更复杂的事情,比如从配置文件读取 realm,创建一个标志来执行同步等等。代码的版本可能会略有不同,但关键是它只是一个 perl 脚本,很容易添加一点代码来创建另一个包含摘要的属性。

  2. 使用 Samba 中的“passwd program”选项来利用已修改的脚本。

    在 `smb.conf` 中。

     # ldap passwd sync = Yes
     unix password sync = Yes
     passwd program = /usr/sbin/smbldap-passwd -u %u
     passwd chat = "Changing password for*\nNew password*" %n\n "*Retype new password*" %n\n
    

🔗 结果

此时,您的 Windows 客户端可以从 Windows 内部更改其密码,Linux 客户端可以使用 `smbldap-passwd` 更改其密码。所有密码和摘要将保持同步。* * *

类别: 知识库

导航: 站点搜索站点页面类别🔼 向上