與Windows AD實現透明驗證的squid代理伺服器

火星人 @ 2014-03-04 , reply:0


與Windows AD實現透明驗證的squid代理伺服器

在FreeBSD上搭建了一台squid代理伺服器,與Windows 2003域實現透明的用戶驗證。也就是說,客戶端如果以域用戶登錄的話,可以直接通過代理上網瀏覽;如果非域用戶的話,則必須輸入域用戶密碼後方可上網。
網上雖然有這方面的介紹,但可能環境各不相同,所以不一定適用。我也是摸索了好幾天才搞成功的,有些地方還是一知半解,將來慢慢研究。先把整個安裝配置過程寫下來,供需要的人多一種參考。
操作系統是FreeBSD 7.2版。主機名是bsd1.abc.com;Kerberos5和OpenLDAP是必須的;其他好像沒什麼要求。
Windows域名為abc.com,NetBIOS名是ABC

一、配置Kerberos5
1. Kerberos5的配置文件是/etc/krb5.conf,內容如下:

default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/lrb5kdc.log
admin_server = FILE:/var/log/kadmind.log


default_realm = ABC.COM  # Windows域名,必須大寫

# 如果FreeBSD所配置的是Windows域的DNS伺服器,下面dns_lookup兩項可以設為true,即自動通過DNS查詢域控制器等信息;
# 否則設為false,通過後面段的配置設定域控制器等信息
dns_lookup_realm = false
dns_lookup_kdb = false


ABC.COM = {
kdc = dc1.abc.com:88 dc2.abc.com:88   # 域控制器,可以寫IP,多個dc之間以空格分開。如果前面的dns_lookup兩項參數設為了true,則這個參數就不需要了。
default_domain = ABC.COM # Windows域名,必須大寫
}

2. 用kinit驗證一下kerberos配置是否成功。順利的話輸入命令得到結果如下:
bsd1# kinit administrator  (驗證Windows域管理員administrator用戶)
administrator@ABC.COM's Password:  (輸入administrator的密碼)
kinit: NOTICE: ticket renewable lifetime is 1 week (看見這一行的話,恭喜你,kerberos配置成功了)

二、安裝配置Samba
我用的是3.3.4版,從Samba官方網站下載的源碼包。——為什麼不用FreeBSD自帶的?——因為沒搞定。:)

1. 解壓源碼包,編譯安裝。很簡單,大家都會吧
bsd1# tar zxvf samba-3.3.4.tar.gz
bsd1# cd samba-3.3.4/source
bsd1# ./configure --with-ads --with-winbind  (--with-ads --with-winbind這兩個參數是實現與Windows AD驗證必須的)
bsd1# make
bsd1# make install

2. Samba安裝完成,開始配置samba。FreeBSD下的samba配置文件是/usr/local/samba/lib/smb.conf。內容如下:

netbios name = BSD1  # 本機在Windows網路中的NetBIOS名
workgroup = ABC   # Windows域的NetBIOS名
realm = ABC.COM   # 域名,與之前krb5.conf中的一致
server string = PROXY SERVER # 機器的說明信息,無關緊要
encrypt passwords = yes
security = ADS   # 使用AD驗證
wins server = 192.168.0.10 # WINS伺服器地址。根據網上資料,這個參數似乎不是必須的,但我之前一直搞不定,直到加上這條后才成功的。不明白……
password server = dc1.abc.com dc2.abc.com #域控制器,多台之間用空格分開
log level = 3
log file = /var/log/samba/%m.log
max log size = 50
dns proxy = NO
ldap ssl = NO
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind use default domain = YES # 啟用winbind,這樣才能實現透明的用戶認證

3. Samba配置完成,依次啟動nmbd、smbd、winbindd
bsd1# cd /usr/local/samba/sbin
bsd1# ./nmbd -D
bsd1# ./winbindd -D
bsd1# ./smbd -D

4. 將本機加入到Windows域
bsd1# /usr/local/samba/bin/net ads join -U administrator
需要輸入administrator密碼。如果成功的話就可以在Windows域管理工具中找到bsd1這個計算機帳戶了。
在本機中則可用下列命令確認:
bsd1# /usr/local/samba/bin/wbinfo -t
checking the trust secret via RPC calls succeeded (出現這句話就表明加入域成功了)
bsd1# /usr/local/samba/bin/wbinfo -u  (這條命令可以列出域中的用戶帳戶)

三、安裝配置squid
我用的是2.7STABLE6版本,從squid官方網站下載的源碼包。

1. 解壓源碼包,編譯安裝
bsd1# tar zxvf squid-2.7.STABLE6.tar.gz
bsd1# cd squid-2.7.STABLE6
bsd1# ./configure --enable-auth=basic,ntlm (將basic和ntlm驗證模塊編譯進來)
bsd1# make
bsd1# make install

2. 安裝squid完成。squid的初始化配置略(可參閱彭勇華譯的《Squid中文權威指南》,我都是照著這個指南做的,除了winbind驗證的部分。squid從2.6版起不再帶winbind模塊了,而是直接使用samba的winbind)。
squid的配置文件是/usr/local/squid/etc/squid.conf,認證相關配置參數如下(其他參數略,請參閱《Squid中文權威指南》):

# 指定使用samba的ntlm驗證模塊
auth_param ntlm program /usr/local/samba/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 20
auth_param basic program /usr/local/samba/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 10
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
acl all src 0/0
acl NTLMUsers proxy_auth REQUIRED # 強制要求用戶驗證
http_access allow all NTLMUsers  # 通過驗證的用戶則允許訪問
http_access deny all  # 其他的均禁止訪問

3. 啟動squid
bsd1# /usr/local/squid/sbin/squid
好了,可以用客戶端上網試試了。但是,失敗。:(
用戶上網就會跳出要求輸入用戶名密碼的對話框,輸入了卻通不過驗證。

檢查log發現,是對/usr/local/samba/var/locks/winbindd_privileged沒有訪問許可權,原來這個目錄的owner是root,默認許可權是750,而squid是以nobody許可權運行的。
把許可權改為777試試,還是不行,奇怪。改回到750,再把目錄的owner改為nobody,然後重啟squid。哈哈,這下成功了!
且慢高興,重啟伺服器后發現又不行了,winbindd啟動不了了,原來還是/usr/local/samba/var/locks/winbindd_privileged許可權的問題。winbindd是以root許可權啟動的,而winbindd_privileged的owner已經改成了nobody。那就把所有者和所屬組分別設為root和nobody:
# chown -R root:nobody /usr/local/samba/var/locks/winbindd_privileged

重新啟動服務,這下總算好了。:)

[ 本帖最後由 ahocat 於 2009-11-26 16:39 編輯 ]
《解決方案》

樓主的這個裡面沒有對用戶分組,我是做了用戶分組,我的問題是:
1:現在客戶端ie設置了代理,打開ie上網時需要輸入用戶名和密碼,使用正確的用戶和密碼可以認證通過;但是客戶端的用戶是使用域用戶登錄的客戶端機器;
不是透明的,每次用戶必須要輸入域上的用戶和密碼驗證才能上網;
squid.conf的配置
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 5 hour

auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 5
auth_param ntlm keep_alive on

external_acl_type wingroup %LOGIN /usr/lib/squid/wbinfo_group.pl

acl ntpass external wingroup  wwwjtproxy wwwmjproxy
acl password  proxy_auth REQUIRED
http_access allow  ntpass password
《解決方案》

回復 #2 xjjjk 的帖子

還沒試過對用戶分組。
你如果不分組的話能夠實現透明認證碼?要是還不行的話也許問題是在samba/winbind的設置。net ads join的運行成功嗎?wbinfo -t能夠驗證碼?
《解決方案》

原帖由 xjjjk 於 2009-6-4 19:36 發表 http://bbs3.chinaunix.net/images/common/back.gif
樓主的這個裡面沒有對用戶分組,我是做了用戶分組,我的問題是:
1:現在客戶端ie設置了代理,打開ie上網時需要輸入用戶名和密碼,使用正確的用戶和密碼可以認證通過;但是客戶端的用戶是使用域用戶登錄的客戶 ...

external_acl_type ldap_group ttl=0 children=50 %LOGIN \
        /usr/local/libexec/squid/squid_ldap_group -b \
        "ou=ABC,dc=abc,dc=com" -f \
        "(&(cn=%a)(member=%v)(objectClass=group))" -F "(|(samAccountName=%s)(cn=%s))" -h \
        192.168.0.53 -D ldap@abc.com -w password -v3 -S

acl Web_LDAP external ldap_group Web_User

http_access allow Web_LDAP

給你參考一下,ldap@abc.com為查詢AD的帳號, Web_User組的用戶允許訪問。squid要是代理模式,透明代理的模式好像不支持,不知道新版的squid是否在透明代理上也支持了,還沒試過。我在公司就是這麼用的,代理近1000台機器的web訪問。
《解決方案》

謝謝arone指點,待會測試下;
《解決方案》

這個問題是,  windows 電腦能夠通過,  LINUX 電腦的 FIREFOX 無法通過...  

請問用 Linux 測試過嗎? 我的 windows 沒有問題,但 Linux 不可以
《解決方案》

原帖由 signmem 於 2009-6-11 21:57 發表 http://bbs2.chinaunix.net/images/common/back.gif
這個問題是,  windows 電腦能夠通過,  LINUX 電腦的 FIREFOX 無法通過...  

請問用 Linux 測試過嗎? 我的 windows 沒有問題,但 Linux 不可以

linux沒試過,OpenSolaris+FireFox是可以的(這個回帖就是用它發的),我想LINUX沒理由不行吧?

輸入的用戶名前面需要加上域名,就像這樣: domain\username
《解決方案》

我這裡的系統為debian 5.0,配置后出現以下錯誤
Jun 27 00:08:19 cache squid: Squid Parent: child process 2041 started
Jun 27 00:08:19 cache squid: The wbinfo_group_helper helpers are crashing too rapidly, need help!
Jun 27 00:08:19 cache squid: Squid Parent: child process 2041 exited due to signal 6
Jun 27 00:08:19 cache squid: Exiting due to repeated, frequent failures
^C

cache:~#
cache:~# net ads join -U administrator@cetr.net
Enter administrator@cetr.net's password:
libads/kerberos.c:ads_kinit_password(356)
  kerberos_kinit_password administrator@cetr.net@CETR.NET failed: Malformed representation of principal
Failed to join domain: failed to connect to AD: Malformed representation of principal
cache:~#
是debian系統的問題嗎;

[ 本帖最後由 xjjjk 於 2009-6-27 00:56 編輯 ]
《解決方案》

回復 #8 xjjjk 的帖子

加入域的這句命令中,把用戶名后的域名後綴「@cetr.net」去掉,即:
cache:~# net ads join -U administrator
《解決方案》

cache:~# net ads join -U administrator
Enter administrator's password:
libads/kerberos.c:ads_kinit_password(356)
  kerberos_kinit_password markoradministrator@CETR.NET failed: Cannot resolve network address for KDC in requested realm
Failed to join domain: failed to connect to AD: Cannot resolve network address for KDC in requested realm
dns已經設置了看錯誤提示是DNS的問題;




[火星人 via ] 與Windows AD實現透明驗證的squid代理伺服器已經有394次圍觀

http://www.coctec.com/docs/service/show-post-14707.html