linux下实现针对windows域身份认证的代理服务器

  公司使用的代理服务器是基于Linux系统的,经常会出现一些或多或少的问题。直接影响到用户正常的Internet访问。因为是以前的同事做的,再加上,本人一直忙于其它的项目,没时间去调整,优化。前不久,Linux系统突然无法进入GNU/GNOME桌面环境,促使我下定决心重新规划并部署一台符合当前应用环境需要的代理服务器系统来。

  在部署之前,我们先来看看现有的代理服务器的系统环境:该代理服务器采用的是基于Redhat Linux 8.x操作系统的以NCSAR为认证模式的Squid 2.3 代理服务器。因系统比较陈旧,稳定性有所欠缺,同时还存在以下不足之处:

  1. 因Squid配置的问题,系统无法自动释放Squid的Cache及日志所占用磁盘空间,经常会因为磁盘空间不足而导致Squid停止服务,需要人为的去删除cache及日志以释放磁盘空间。

  2. 需要在代理服务器上,为不同的用户设置不同的密码,以前公司职员并不多,倒不是很麻烦,但,随着公司的发展,职员的数量大幅增加,加重了IT管理人员的工作负担,同时,也非常难以保证与Windows域账户的一致知性;

  3. 客户端不能使用AD集成的账户认证模式,用户每次访问Internet都需要重复的输入用户名及密码,大大降低了用户使用感受。

  4. 没有实现针对不同Internet访问群体,设置不同的用户权限;

  5. 无法监督用户访问Internet的行为,直接影响到公司网络的正常商业行为。

  据此,我们不难发现,此代理服务器需要经常对其进行维护,非常影响IT工作人员的工作效率。从公司现阶段的实际情况出发,对代理服务器的功能重新规划如下:

  1. 能够在一点条件下,自动回收被Squid占用的磁盘空间;

  2. 利用AD服务器上的用户账号信息对用户的身份进行验证,避免重复的设置用户信息;

  3. 提供三种用户权限:

  1. 拒绝所有权限;

  2. 允许访问Internet,但不允许下载视频、音频、可执行文件等;

  3. 不受限,可访问任意Internet资源;

  4. IT管理人员可以查看用户访问Internet的日志,监督用户访问Internet的行为;

  既然我们的目标已经非常明确了,我们就不再废话,开始主题吧!

  I. 系统环境:

  1. CentOS 5.0 Linux

  2. squid-2.6.STABLE6-4.el5

  3. samba-3.0.23c-2.el5.2.0.2

  4. sarg-2.2.1-1.el5.rf

  5. winbind

  6. krb5

  II. 修改kerberos 5身份验证服务的配置文件(非特殊说明,均工作在root用户模式下):

  执行下列命令:

[root@proxy ~]# vim /etc/krb5.conf

修改后的krb5.conf为:

1 [logging]

2  default = FILE:/var/log/krb5libs.log

3  kdc = FILE:/var/log/krb5kdc.log

4  admin_server = FILE:/var/log/kadmind.log

5

6 [libdefaults]

7  default_realm = COMPANY.COM              #默认的域名(Realm)

8  dns_lookup_realm = false

9  dns_lookup_kdc = false

10  ticket_lifetime = 24h

11  forwardable = yes

12

13 [realms]

14  COMPANY.COM = {

15  kdc = adsrv.company.com:88               #此处指定KDC服务器的名称或IP地址

16  admin_server = adsrv.company.com:749     #此处指定管理服务器的名称或IP地址

17  default_domain = company.com             #默认的域名(domain)

18  }

19

20 [domain_realm]                             #domain与realm的对应关系

21  .company.com = COMPANY.COM

22  company.com = COMPANY.COM

23

24 [kdc]

25 profile = /var/kerberos/krb5kdc/kdc.conf

26

27 [appdefaults]

28  pam = {

29    debug = false

30    ticket_lifetime = 36000

31    renew_lifetime = 36000

32    forwardable = true

33    krb4_convert = false

34  }

III. 利用Kinit工具测试krb5的设置是否正确

  执行下列命令:

[root@proxy ~]# kinit administrator@COMPANY.COM

  提示输入用户administrator的密码,正确输入密码之后返回以下信息:

kinit: NOTICE: ticket renewable lifetime is 1 week

  或直接返回到命令行状态,其它提示信息均可能是出错信息。请务必确认您的Linux系统与Windows域服务器的时间及时区设置一致,否则将无法正常与活动目录服务器正常通信。

IV. Samba配置

  因为我们此处并不涉及到真正的samba服务器的配置,所以并没有将整个的配置内容放在这里,而仅仅只放了架设Squid代理服务器所需要的部分,如下所示:

1 [global]

2 idmap gid = 10000-20000

3 idmap uid = 10000-20000

4 password server = 192.168.21.21

5 workgroup = COMPANY                       #域的NetBios名

6 os level = 20

7 encrypt passwords = yes

8 security = ads                            #设置为Windows活动目录安全-ADS验证

9 realm = COMPANY.COM                       #验证域realm,必须大写

10 winbind use default domain = yes

  以上列出来的项目均需要根据实际情况改动。

V.     通过ntlm验证程序来测试之前所做的配置是否正确

在做测试之前,如必要时,请重新启动Linux服务器。不过,你也可以尝试仅重新启动samba及winbind服务来达到同样的目的(呵呵……这得看运气!):

[root@proxy ~]# service winbind restart

[root@proxy ~]# service smb restart

  重启系统或以上服务之后,执行以下命令:

[root@proxy ~]# ntlm_auth –username=administrator

  提示输入用户administrator的密码,正确输入密码之后返回以下信息:

NT_STATUS_OK: NT_STATUS_OK (0x0)

当返回的结果如上面所描述的话,则说明域账号administrator已经通过了AD的认证。可以开始接下来的工作了。

VI. 配置NSS(Name Service Switch)

  NSS是Name Service Switch的缩写,具体功能请参考维基百科中的解释http://en.wikipedia.org/wiki/Name_Service_Switch,具体配置如下:

passwd: files winbind

group: files winbind

  其它部份无需改变。

VII. Squid的配置

  既然是做代理服务器,Squid的设置当然是重中之重,下面,根据具体实现功能的不同,分别讲述Squid的设置:

1.     为Squid配置第三方身份验证程序

1 #启用squid-2.5-ntlmssp做为ntlm验证模式的辅助协议

2 auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp

3 auth_param ntlm children 5

4 auth_param ntlm keep_alive on

5

6 #启用squid-2.5-basic做为基本验证模式的辅助协议

7 auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic

8 auth_param basic children 5

9 auth_param basic realm Squid proxy-caching web server

10 auth_param basic credentialsttl 2 hours

11 auth_param basic casesensitive off

12

13 #下面的这句参数是重点,保证了Squid可以针对不同的用户组进行不同的访问控制策略

14 external_acl_type NT_global_group %LOGIN /usr/lib/squid/wbinfo_group.pl

2.     用户访问控制列表的设置

1 #将AD中的internet全局组映射到ProxyUsers

2 acl ProxyUsers external NT_global_group internet

3 #将AD中的nolimitedinternet全局组映射到noLimited

4 acl NoLimited external NT_global_group nolimitedinternet

5 #此句保证了所有用户必须经过身份验证

6 acl AuthenticatedUsers proxy_auth REQUIRED

7 #定义不允许下载的文件类型

8 acl InvalidFiles urlpath_regex -i \.mp3$ \.avi$ \.rmvb$ \.mpg$ \.rm$ \.wma$ \.wmv$ \.scr$ \.exe$ \.ocx$ \.dll$ \.com$

9 #定义不允许访问的域名及IP地址,其存放于文件“denyDomain.list”与“denyIP.list”中

10 acl denyDomain dstdomain "/etc/squid/denyDomain.list"

11 acl denyIP dst "/etc/squid/denyIP.list"

12

13 #允许NoLimited用户访问任意Internet资源

14 http_access allow AuthenticatedUsers NoLimited

15 http_access deny denyDomain

16 http_access deny denyIP

17 http_access deny InvalidFiles

18

19 #禁止用户访问denyDomain.list以及denyIP.list中的域名及IP地址,并禁止下载InvalidFiles指定的文件类型

20 http_access allow AuthenticatedUsers ProxyUsers

21 acl all src 0.0.0.0/0.0.0.0

22 acl manager proto cache_object

23 acl localhost src 127.0.0.1/255.255.255.255

24 acl to_localhost dst 127.0.0.0/8

25 acl SSL_ports port 443

26 acl Safe_ports port 80          # http

27 acl Safe_ports port 21          # ftp

28 acl Safe_ports port 443         # https

29 acl Safe_ports port 70          # gopher

30 acl Safe_ports port 210         # wais

31 acl Safe_ports port 1025-65535 # unregistered ports

32 acl Safe_ports port 280         # http-mgmt

33 acl Safe_ports port 488         # gss-http

34 acl Safe_ports port 591         # filemaker

35 acl Safe_ports port 777         # multiling http

36 acl CONNECT method CONNECT

  请注意此配置中的两条语句的位置。第一条“http_access allow AuthenticatedUsers NoLimited”,第二条“http_access allow AuthenticatedUsers ProxyUsers”,此两条语句都是将权限应用到用户组,但不同的是位置,在Squid的ACL配置语句中,先后顺序决定了其权限的不同。大家一定要多注意,细细去揣摩。

VIII. 更改winbind管道的权限

  一定不能忘记这一点,没有winbind管道的足够的权限,系统是没办法对用户的身份进行验证的。其命令如下:

[root@proxy ~]# chown –R root:squid /var/cache/samba/winbindd_privileged

[root@proxy ~]# chmod –R 750 /var/cache/samba/winbindd_privileged

IX.   重启所有相关服务

  命令如下:

[root@proxy ~]# service smb restart

[root@proxy ~]# service winbind restart

[root@proxy ~]# service squid restart

  到此为止,我们已经成功地完成了squid代理服务器的配置。接下来,我们还需要给予IT管理员查看并监督用户访问Internet行为的能力。

X.  Sarg的安装与配置

  为了简单起见,我们直接下载二进制的安装包,执行下列命令获得二进制安装包:

[root@proxy ~]# http://dag.wieers.com/rpm/packag ... 1-1.el5.rf.i386.rpm

  安装当然更简单了啦,没什么好说的,执行下列命令即可:

[root@proxy ~]# rpm –Uvh sarg-2.2.1-1.el5.rf.i386.rpm

  安装完后,重新启动一下Apache服务器当然是再好不过了。