在本文中,我將討論如何配置基於網路檔案系統的UNIX用戶端,通過RPCSEC_GSS協議使用Kerberos安全驗證來實現網路檔案系統下串連Windows伺服器。
傳統的網路檔案系統用戶端和伺服器使用系統整合認證安全驗證。它最重要的是允許用戶端向網路檔案系統伺服器發送表明UNIX使用者的使用者ID或使用者組ID的驗證資訊。每個網路檔案系統請求都在傳入請求中標明UNIX使用者的使用者ID或使用者組ID。這種驗證方式提供的安全性比較低,因為用戶端可以通過標明一個不同使用者的使用者ID或使用者組ID來欺騙請求。這種驗證方式也是很脆弱的,因為間於用戶端網路和伺服器網路之間的任何第三方都可能抓取網路檔案系統請求。
RPCSEC_GSS協議提供了一種通用的機制利用ONCRPC協議複合使用多種安全機制。現在的網路檔案系統伺服器支援在網路檔案系統中利用RPCSEC_GSS協議使用兩種Kerberos模式:krb5和krb5i。krb5在RPC請求層級上提供Kerberos驗證,而krb5i(Kerbero v5同時含有整合認證)則可以防止網路檔案系統負載被竊取。
要解釋如何在UNIX用戶端和運行網路檔案系統的Windows伺服器上設定Kerberos安全驗證,最好的方式就是通過一個簡單的例子來實現。在這次的教程中,我們先要明確以下的架構:
1、 名叫NFSDOMAIN.COM的windows域和活動目錄運行在一台名為nfsdomain-dc.nfsdomain.com的網域控制站上;
2、 運行網路檔案系統伺服器的Windows伺服器:windowsnfsserver.nfsdomain.com;
3、 UNIX用戶端:unixclient.nfsdomain.com;
4、 unixclient.nfsdomain.com上的UNIX使用者:unixuser1,使用者ID為500;
5、 unixclient.nfsdomain.com上的UNIX使用者組:unixgroup1,使用者組ID為500;
6、 Windows使用者:NFSDOMAIN/unixuser1;
7、 Windows使用者組:NFSDOMAIN/unixgroup1。
為了確保示範設定精靈,我們假設unixclient.nfsdomain.com啟動並執行系統是OpenSolaris。
前提:
首先,我們需要確認網域控制站、Windows網路檔案系統伺服器和UNIX用戶端間DNS解析正常。
對Solaris用戶端的一個提醒是主機名稱必須設定成域全名的第一部分。在unixclient.nfsdomain.com上運行“hostname”,應該僅顯示“unixclient”。如果顯示的不是這樣,那需要設定主機名稱為“unixclient”。
確認所有上面提到的使用者和使用者組已經建立完畢,同時NFSDOMAIN/unixuser1必須是NFSDOMAIN/unixgroup1的成員。我們必須為unixuser1設定一個密碼。如果在UNIX用戶端上的使用者ID和使用者組ID不同,就需要我們指定相應的項為對應的值,例如我們此次舉例的500。
將UNIX用戶端加入活動目錄:
現在我們要配置unix用戶端能從NFSDOMAIN.COM域上擷取Kerberos驗證憑證。這可以通過修改/etc/krb5/krb5.conf檔案來實現。在該檔案中,會有一些預留的索引值可供編輯。我們需要修改以下部分:“預設網域名稱default_realm”、“網域控制站名稱kdc”、“管理伺服器名稱admin_server”和“網路檔案系統網域名稱domain_realm”。我們也需要在"libdefaults"下添加兩項值“default_tkt_enctypes”和“default_tgs_encrypes”。我在後面會解釋為什麼需要添加這兩項。最後這個檔案會修改成下面樣子:
[libdefaults]
default_realm = NFSDOMAIN.COM
default_tkt_enctypes = arcfour-hmac-md5 des3-cbc-sha1-kd des-cbc-md5
default_tgs_enctypes = arcfour-hmac-md5 des3-cbc-sha1-kd des-cbc-md5
[realms]
NFSDOMAIN.COM = {
kdc = nfsdomain-dc.nfsdomain.com
admin_server = nfsdomain-dc.nfsdomain.com
}
[domain_realm]
nfsdomain.com = NFSDOMAIN.COM
在這個時候,我們可以測試在unixclient用戶端上使用NFSDOMAIN/unixuser1擷取驗證憑證:在unixclient用戶端上運行“kinit unixuser1”,然後輸入使用者密碼。
現在我們可以通過運行“klist”,來為unixuser1擷取驗證憑證。同時也可以運行“kdestroy”來登出驗證憑證。
網路檔案系統如何使用RPCSEC_GSS協議?
好了,我們現在已經完成了Kerberos的基本設定,下面我們從網路檔案系統的角度來介紹一下驗證工作的流程。
當unixclient用戶端需要完成與windowsnfsserver(Windows網路檔案系統伺服器)的驗證,它需要一些使用者來用於驗證,而在Kerberos協議中稱之為參與者。當網路檔案系統共用載入完成,用戶端會查詢網路檔案系統伺服器的域全名,然後使用"nfs/FQDN@domain_realm"作為參與者來試圖驗證。在我們此次介紹的情況下,unixclient用戶端將去尋找“nfs/windowsnfsserver.nfsdomain.com@NFSDOMAIN.COM”這樣的使用者去參與驗證。依據協議規定,UNIX機器將使用“root”身份執行一些網路檔案系統的初始化操作。在本文中,它是原生系統管理員帳戶。按協議規定的話,這個使用者全名是“root/unixclient.nfsdomain.com@NFSDOMAIN.COM”。
如何設定使用者及參與者?
對於“nfs/windowsnfsserver.nfsdomain.com@NFSDOMAIN.COM”這樣的使用者,我們只需要去使用活動目錄中已經存在的機器的帳戶,關鍵的是要為其建立一個別名。
對於nfsdomain-dc,我們執行:
setspn -A nfs/windowsnfsserver windowsnfsserver
setspn -A nfs/windowsnfsserver.nfsdomain.com windowsnfsserver
然後執行:
setspn -L windownfsserver
這樣我們就可以看到機器上所有帳戶的服務參與名。
如何設定unixclient的參與帳戶?
為了這些驗證參與帳戶,我們將在活動目錄中建立一些使用者。由於“/”對於活動目錄帳戶名稱是無效字元,所以我們必須設定不同的名字,然後使用setspn程式添加服務參與名。為了完整性的目的,我們在root系統管理員帳戶的基礎上再多建一對帳戶。在nfsdomain-dc上建立如下使用者,並為它們設定好密碼:
1、 unixclienthost(代表unixclient這台主機);
2、 unixclientroot(unixclient上root系統管理員帳戶);
3、 unixclientnfs(網路檔案系統伺服器在unixclient上使用的帳戶)。
建立完這些使用者後,右鍵每個使用者,選擇“屬性”。在“帳戶”選項卡下,分別修改“使用者登入名稱稱”為"host/unixclient.nfsdomain.com"、"root/unixclient.nfsdomain.com"和 "nfs/unixclient.nfsdomain.com"。下面我們對這些帳戶設定加密虛擬網:
setspn -A host/unixclient unixclienthost
setspn -A host/unixclient.nfsdomain.com unixclienthost
setspn -A root/unixclient unixclientroot
setspn -A root/unixclient.nfsdomain.com unixclientroot
setspn -A nfs/unixclient unixclientnfs
setspn -A nfs/unixclient.nfsdomain.com unixclientnfs
unixclient需要使用root/unixclient.nfsdomain.com@NFSDOMAIN.COM身份,但是並不需要真實地去輸入該身份對應的密碼。這是通過一個密鑰表來實現的。下面我們來對這些帳戶匯出密鑰表檔案。在nfsdomain-dc上運行:
ktpass -princ host/unixclient.nfsdomain.com@NFSDOMAIN.COM -mapuser unixclienthost -pass -out unixclienthost.keytab
ktpass -princ root/unixclient.nfsdomain.com@NFSDOMAIN.COM -mapuser unixclientroot -pass -out unixclientroot.keytab
ktpass -princ nfs/unixclient.nfsdomain.com@NFSDOMAIN.COM -mapuser unixclientnfs -pass -out unixclientnfs.keytab
然後,我們將上述檔案從nfsdomain-dc主機上移動到unixclient主機上。
在unixclient主機上,我們要將這些檔案整合到本機密鑰表檔案中。在我們放置這些複製過來的檔案的目錄下,我們可以使用“ktutil”命令來整合。在這個互動工具裡,我們執行如下命令:
rkt /etc/krb5/krb5.keytab
rkt unixclienthost.keytab
rkt unixclientroot.keytab
rkt unixclientnfs.keytab
wkt /etc/krb5/krb5.keytab
q
好了,現在unixclient應該可以為這些帳戶申請驗證憑證,而不用再輸入密碼了。我們可以做如下測試:
kinit -k host/unixclient.nfsdomain.com
kinit -k root/unixclient.nfsdomain.com
kinit -k nfs/unixclient.nfsdomain.com
每條命令都應該顯示成功擷取到驗證憑證。由於對驗證憑證進行編碼加密的底層的加密機制必須同時被nfsdomain-dc和unixclient支援並接受,因而在某些配置上還是比較微妙的。在krb5.conf檔案中添加"default_tkt_enctypes" 和 "default_tgs_enctypes"參數就是為了迴避OpenSolaris的一個漏洞。在使用ktpass程式時,我們可能需要明確指定加密類型。”-crypto DES-CBC-MD5”基本屬於被廣泛接受並支援的加密類型。鑒於我們應用環境中活動目錄版本 的問題,我們可能還需要檢查使用者屬性頁面上“使用者帳戶”選項卡下“對該帳戶使用Kerberos DES 加密類型”選項。檢查安全事件記錄也能協助我們診斷登入嘗試。
在unixclient用戶端上為Kerberos帳戶映射使用者ID或使用者組ID:
在這一節,我們將介紹unixclient上的網路檔案系統用戶端如何將它本地的使用者ID和使用者組ID映射到Kerberos帳戶上。
在unixclient上執行如下命令:
gsscred -m kerberos_v5 –a
gsscred -m kerberos_v5 –n host/unixclient.nfsdomain.com -u 0 –a
gsscred -m kerberos_v5 –n root/unixclient.nfsdomain.com -u 0 –a
gsscred -m kerberos_v5 –n nfs/unixclient.nfsdomain.com -u 0 –a
gsscred -m kerberos_v5 –n unixuser1 -u 500 –a
gsscred -m kerberos_v5 -n unixgroup1 -g 500 -a
這些命令將用於校正接入帳戶的公用認證表移入本機使用者帳戶。我們需要確保的就是在unixclient上要先允許”gssd”。
在網路檔案系統上啟用Kerberos安全校正:
網路檔案系統下的OpenSolaris預設禁用Kerberos。顯然,我們需要啟用它。我們可以編輯”/etc/nfssec.conf”,然後將所有含有krb的行取消批註,確保能夠完整執行。我們需要改成這樣:
krb5 390003 kerberos_v5 default - # RPCSEC_GSS
krb5i 390004 kerberos_v5 default integrity # RPCSEC_GSS
krb5p 390005 kerberos_v5 default privacy # RPCSEC_GSS
我們可以注意到網路檔案系統伺服器當前情況下不支援krb5p。
配置網路檔案系統伺服器的使用者ID或使用者組ID的映射:
在Windows這邊,我們還是需要配置UNIX使用者ID和使用者組ID與Windows帳戶的映射關係。網路檔案系統伺服器在每次收到網路檔案系統請求時,還是會使用Kerberos驗證的。然而網路檔案系統協議只會對像GETATTR(擷取屬性)和READDIR(擷取目錄資訊)的請求回複使用者ID和使用者組ID。如果不做映射,即使建立的檔案在windowsnfsserver上做過準確的安全性可視性描述,在unixclient上執行“ls –l”也將不能準確顯示使用者ID和使用者組ID。
如果需要瞭解網路檔案系統伺服器如何擷取Windows使用者和組資訊,可以查閱:
http://technet.microsoft.com/en-us/library/cc754514.aspx
而下面這篇博文則對瞭解活動目錄解析特性會很有協助:
http://blogs.msdn.com/sfu/archive/tags/Active+Directory+Lookup/default.aspx。
在windowsnfsserver上提供一個共用:
如何配置共用可以參與下面的配置文檔:
http://technet.microsoft.com/en-us/library/cc770569.aspx
在建立完“share”共用目錄後,確認所有打算要訪問它的使用者(包括unixuser1)都能訪問它。
載入共用:
最後,我們可以準備載入共用了。
在載入共用時,我們要記住使用伺服器的域全名。這也是為什麼unixclient可以在尋找windowsnfsserver時精準地指向相應帳戶。
在unixclient用戶端上以系統管理員root身份執行如下命令:
mount -o sec=krb5,vers=3,proto=tcp windowsnfsserver.nfsdomain.com:/share /mnt/share
一旦共用載入完畢,我們以unixuser1身份登入到unixclient用戶端上,並運行”kinit”,然後輸入密碼,接著就可以訪問“/mnt/share”共用了。如果所有東西都配置正確,那麼我們就能訪問共用。此時,我們終於可以說是可喜可賀了,因為我們的網路檔案系統串連現在已經十分安全了。
參考連結:
1、 Windows Server 2008 R2下網路檔案系統服務手把手設定精靈:
http://technet.microsoft.com/en-us/library/dd758767(WS.10).aspx;
2、 Windows/UNIX驗證配置:
http://blog.scottlowe.org/2006/08/08/linux-active-directory-and-windows-server-2003-r2-revisited/;
3、 活動目錄加密漏洞的重點補充程式解釋(如果已經打好補丁,就不需要看了):
http://support.microsoft.com/kb/951191;
4、 OpenSolaris加密漏洞:
http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6548599。
感謝原文作者: Jeff Biseda.
原文地址:
http://blogs.technet.com/b/filecab/archive/2010/05/13/using-kerberos-security-with-server-for-nfs.aspx