1、實驗環境
公司部署有微軟的活動目錄,假設域名爲wyd.com,一臺Web服務器,運行在Red hat Enterpise Linux 5.5上,該網站原本只在內網訪問,現由於業務的發展,需要發佈到互聯網上,以便銷售人員和維護人員通過互聯網隨時能訪問到,但由於該網站的內容涉及商業數據,不能讓非公司人員隨意訪問到。
2、實驗目的
爲了保證數據的安全,需要在Apache上做身份驗證,如果用傳統的Apache的認證機制的話就會給用戶帶來麻煩,因爲用戶要輸入額外的用戶名和密碼來登錄網站。最理想的方式就是在公司內網裏用戶不用輸入用戶名和密碼,可以直接登錄;從互聯網訪問時,則需要輸入用戶名和密碼,而這個賬戶密碼就是登錄公司域的賬戶名和密碼。
3、實現原理
用戶登錄活動目錄時使用的是Kerberos協議,因此Apache的驗證方式就使用Kerberos協議,用戶登錄活動目錄後會獲得一個Kerberos票據,這個Kerberos票據就可以用來登錄Apache,如果用戶不在公司內網裏,在登錄Apache時只需要輸入活動目錄的用戶名和密碼即可。
4、實現步驟
a. 安裝Apache,PHP,mod_auth_kerb
PHP環境根據需要安裝,mod_auth_kerb就是Apache的Kerberos認證模塊,配置好YUM倉庫後可以使用yum工具來安裝,也可以直接使用rpm命令:
[root@test ~]#yum install httpd php* mod_auth_kerb -y
b.配置Kerberos
使用vim編輯/etc/krb5.conf文件,該文件是參照example.com域來配置的,把example.com全部替換成自己的域名即可,注意Kerberos是區分大小寫的,需要修改的內容如下:
[libdefaults]
default_realm = WYD.COM
[realms]
WYD.COM = {
kdc = dc1.wyd.com:88
default_domain = wyd.com
}
[domain_realm]
test.wyd.com = WYD.COM
wyd.com = WYD.COM
其中,test.wyd.com是Apache服務器的FQDN名,kdc的值要設置成域中的DC。
設置好Kerberos後,可以驗證一下配置是否正確,使用kinit命令,參數爲AD中的一個賬戶
[root@test ~]#kinit [email protected]
注意大小寫,該命令會提示你輸入密碼,命令成功執行後不會有任何提示,可以使用klist命令查看獲得的Kerberos票據
c.爲test.wyd.com主機創建HTTP服務憑據
首先需要在AD中創建一個用來映射HTTP service的賬戶,此例中爲apache。其次登錄到DC中,使用命令行工具ktpass將apache賬戶映射到HTTP/[email protected],並把憑據導出到一個keytab文件。(ktpass命令在support tools中,需要安裝),命令如下:
C:\>ktpass -princ HTTP/[email protected] -mapuser apache -crypto rc4-hmac-nt -ptype KRB5_NT_SRV_HST -pass wyd -out c:\apache.keytab
命令成功執行後,將c:\apache.keytab文件拷貝到WEB服務器,確保apache進程對該文件有讀權限。
d.配置httpd.conf使用mod_auth_kerb模塊進行身份驗證
alias /test /www/myweb
<Location /test>
AuthType Kerberos
AuthName "Kerberos Login"
KrbMethodNegotiate On
KrbMethodK5Passwd Off
KrbAuthRealms WYD.COM
Krb5KeyTab /etc/httpd/apache.keytab
KrbServiceName HTTP
require valid-user
</Location>
e.配置IE瀏覽器
IE瀏覽器默認已經支持“集成windows身份驗證”,只需要把該網站加入到“本地Intranet”區域即可。注意訪問時不能使用ip地址,必須使用前面ktpass命令中使用的FQDN名,此例爲test.wyd.com
5、測試
到此,實驗完成,域內用戶訪問不需要輸入密碼,不在域內或未登錄域訪問只需輸入域賬號密碼即可。可以使用下面這段PHP代碼測試:
<?php
echo "You have log in as ".$_SERVER['REMOTE_USER'];
?>
參考文檔:http://www.grolmsnet.de/kerbtut/