Proxy Server - 启动使用者认证机制

参考文件

当 Proxy Server 有很多 Client 在使用时,或许您会想要开始做认证机制,也就是说当使用者在输入帐号密码之后才可以使用 Proxy 服务,同时,藉由帐号密码的管制,也可以了解使用者大部份都是连到那一个网站,并且做适当的流量控管。

Squid 支援使用者认证的方法有很多,包含了以 htpasswd 方式的帐号密码档认证 (NCSA)、LDAP、PAM、SASL、SMB (就是 Samba)、YP (就是 NIS)和 MSNT 等方式,在这里我示范 NCSA 的基本方式,当然若有时间的话我将会测试 LDAP 的方式来认证,届时将会归类到 LDAP 应用。

重新编译 NCSA Module

若您的 Proxy 已经上线的话,那么要重新编译整个 squid 再安装似乎是一件不可能的事,这个时候或许你可以直接编译 NCSA 这个模组并挂载上去就可以了。

重新编译

若你要重新编译整个 squid 套件,可以参考 Proxy Server - 安装与基本设定 (New window),当然,你还必需加入 --enable-auth="basic" 和 --enable-basic-auth-helpers="NCSA" 这两个选项。

root # ./configure --enable-auth="basic" --enable-basic-auth-helpers="NCSA"

只编译 NCSA 套件

在同一个版本的 squid 套件中,请到 squid 原始码的目录里找到 helpers/basic_auth/NCSA 目录,执行 make 后再复制到 squid 的模组目录里就可以了。我的 squid 是在 /usr/local/squid 目录里。

root # cd /misc/squid-2.6.STABLE3/helpers/basic_auth/NCSA
root # make
root # cp ncsa_auth /usr/local/squid/libexec

如此就可以了。

取得 htpasswd 程式

htpasswd 是在 Apache 套件里的一个小程式,主要的用法你可以在 Apache 安全设定 (New window) 参考到。你可以从别的 Apache Server 取得 (但是要注意相关的 library),或是直接再载 Apache 然后编译 htpasswd 这个程式。

若你从别台机器复制过来的 htpasswd 无法用的话,请使用 ldd 看看有没有缺少的 library。

root # ldd htpasswd
libz.so.1 => /usr/lib/libz.so.1 (0x00781000)
libssl.so.4 => /lib/libssl.so.4 (0x00a6c000)
libcrypto.so.4 => /lib/libcrypto.so.4 (0x008b4000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x0089e000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x00814000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x00793000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x0087b000)
libresolv.so.2 => /lib/libresolv.so.2 (0x007d3000)
librt.so.1 => /lib/tls/librt.so.1 (0x007a3000)
libm.so.6 => /lib/tls/libm.so.6 (0x0075c000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x00111000)
libnsl.so.1 => /lib/libnsl.so.1 (0x007fc000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x007e8000)
libdl.so.2 => /lib/libdl.so.2 (0x00756000)
libc.so.6 => /lib/tls/libc.so.6 (0x0062b000)
/lib/ld-linux.so.2 (0x00612000)
root #

若你要重新编译 Apache 的话,在编译完成之后,可以在 support 目录找到一个 htpasswd 这个程式可以直接使用。

root # cp support/htpasswd /usr/bin

设定 squid.conf

我的 squid.conf 是放在 /usr/local/squid/etc 目录里,所以以下只要说到 squid.conf 都是在这个目录中编辑。你可以先看看 squid.conf 的设定是怎么样子。

下面是去掉注解并加入行号的样子。

root # cat squid.conf | sed -e '/^#.*/d' -e '/^$/d' | nl
     1  http_port 3128
     2  hierarchy_stoplist cgi-bin ?
     3  acl QUERY urlpath_regex cgi-bin \?
     4  cache deny QUERY
     5  acl apache rep_header Server ^Apache
     6  broken_vary_encoding allow apache
     7  cache_dir ufs /usr/local/squid/var/cache 100 16 256
     8  access_log /usr/local/squid/var/logs/access.log squid
     9  refresh_pattern ^ftp:           1440    20%     10080
    10  refresh_pattern ^gopher:        1440    0%      1440
    11  refresh_pattern .               0       20%     4320
    12  acl all src 0.0.0.0/0.0.0.0
    13  acl manager proto cache_object
    14  acl localhost src 127.0.0.1/255.255.255.255
    15  acl to_localhost dst 127.0.0.0/8
    16  acl SSL_ports port 443 563
    17  acl Safe_ports port 80          # http
    18  acl Safe_ports port 21          # ftp
    19  acl Safe_ports port 443 563     # https, snews
    20  acl Safe_ports port 70          # gopher
    21  acl Safe_ports port 210         # wais
    22  acl Safe_ports port 1025-65535  # unregistered ports
    23  acl Safe_ports port 280         # http-mgmt
    24  acl Safe_ports port 488         # gss-http
    25  acl Safe_ports port 591         # filemaker
    26  acl Safe_ports port 777         # multiling http
    27  acl CONNECT method CONNECT
    28  http_access allow manager localhost
    29  http_access deny manager
    30  http_access deny !Safe_ports
    31  http_access deny CONNECT !SSL_ports
    32  acl l-penguin src 192.168.1./24
    33  http_access allow l-penguin
    34  http_access deny all
    35  http_reply_access allow all
    36  icp_access allow all
    37  cache_effective_user nobody
    38  coredump_dir /usr/local/squid/var/cache
root #

你列出设定档之后,应该更了清楚的看到到底设定了那些东西,现在就来加入 ncsa 支援。

root # vi squid.conf
---------------------------------------------------------------
# 认证时出现的提示
auth_param basic realm Welcome to l-penguin's proxy service, please enter your name and password.
# 指定是由 ncsa_auth 认证,帐号密码档为 squid-passwd
auth_param basic program /usr/local/squid/libexec/ncsa_auth /usr/local/squid/etc/squid-passwd

# 设定使用 proxy_auth
acl squid-passwd proxy_auth REQUIRED
# 允许通过认证的者用者使用用 Proxy
http_access allow squid-passwd
---------------------------------------------------------------
root #

请注意,在设定 http_access allow squid-passwd 时,一定要放在 http_access deny all 的前面,否则会全部都被 deny 掉。

新增一个使用者

因为在刚刚的设定档里我指定了帐号密码档是放在 /usr/local/squid/etc/squid-passwd 这个档案里面,所以现在就使用 htpasswd 这个程式来新增使用者。

root # cd /usr/local/squid/etc; htpasswd -c squid-passwd steven
New password: your_password <- 不会显示出来
Re-type new password: your_password <- 不会显示出来
Adding password for user steven
root #

好了,现在请重新开启 squid,所有设定都会生效。

root # /usr/local/squid/bin/RunCache &
root #

请注意,若是在启动中发现任错误,可以查看 /usr/local/squid/var/squid.out 这档案的记录。

测试

现在,请使用者开启 Browser 看看,在连线之前会寻问帐号密码。

若是验证不成功就会出现以下画面。

Squid - The example of access denied.

查看使用者的动作

我想一个忙碌的管理员应该不会去看那个使用看了那些网站,但除非必要,还是可以查得出来那些使用者浏