Linux下的NFS快速配置教程與安全策略
原創(chuàng)【51CTO專稿】在Linux下實(shí)現(xiàn)文件共享有多種方式,NFS就是其中之一。網(wǎng)絡(luò)文件系統(tǒng)(NFS)協(xié)議是由Sun MicroSystem在20世紀(jì)80年代為了提供對共享文件的遠(yuǎn)程訪問而設(shè)計(jì)和實(shí)現(xiàn)的。該協(xié)議采用Client/Server模型,通過使用Sun開發(fā)的遠(yuǎn)程過程調(diào)用協(xié)議(RPC Protocol)來實(shí)現(xiàn)運(yùn)行在一臺計(jì)算機(jī)上的程序來調(diào)用在另一臺遠(yuǎn)程機(jī)器上運(yùn)行的子程序,并且,它提供的外部數(shù)據(jù)表示(XDR)可以使得數(shù)據(jù)在不同平臺上的計(jì)算機(jī)上進(jìn)行交換。該協(xié)議可以在TCP協(xié)議或者是UDP協(xié)議上運(yùn)行,而在此基礎(chǔ)上,NFS在數(shù)據(jù)的傳送過程中需要RPC命令得到確認(rèn),而且在需要的時候?qū)貍鳌?/p>
1、NFS原理
NFS比較復(fù)雜,包括很多組件,通過特殊的協(xié)議進(jìn)行交互。不同的組件在操作系統(tǒng)當(dāng)中都使用不同的配置文件以及狀態(tài)文件。下圖說明了NFS的主要組件及配置文件。
圖 網(wǎng)絡(luò)文件系統(tǒng)原理示意圖
NFS分為服務(wù)器和客戶機(jī)兩部分,每個主機(jī)都有自己的內(nèi)核級服務(wù):外部數(shù)據(jù)表示(XDR,eXternal Data Representation)、遠(yuǎn)程過程調(diào)用(RPC,Remote Procedure Call)、I/O監(jiān)控程序和鎖監(jiān)控程序。每個主機(jī)還有自己的用戶級服務(wù)。內(nèi)核級服務(wù)和用戶級服務(wù)都依賴于主機(jī)的功能:NFS客戶機(jī)或者是NFS服務(wù)器。當(dāng)然,還要依賴于每個主機(jī)使用的不同功能的配置文件(如果是服務(wù)器,則用的是/etc/exports配置文件,如果是客戶機(jī),則用的是/etc/fstab配置文件)。如果一臺主機(jī)既是服務(wù)器又是客戶機(jī),那么它需要運(yùn)行兩個部分的服務(wù)。
在服務(wù)器端,portmap、 mountd、 nfsd三個監(jiān)控程序?qū)⒃诤笈_運(yùn)行。portmap監(jiān)控程序用來注冊基于rpc的服務(wù)。當(dāng)一個RPC的監(jiān)控程序啟動的時候,它告訴portmap監(jiān)控程序它在哪一個端口進(jìn)行偵聽,并且它在進(jìn)行什么樣的RPC服務(wù)。當(dāng)一個客戶機(jī)向服務(wù)器提出一個RPC請求,那么它就會和portmap監(jiān)控程序取得聯(lián)系以確定RPC消息應(yīng)該發(fā)往的端口號。而Mountd監(jiān)控程序的功能是來讀取服務(wù)器端的/etc/exportfs文件并且創(chuàng)建一個將服務(wù)器的本地文件系統(tǒng)導(dǎo)出的主機(jī)和網(wǎng)絡(luò)列表,因而客戶機(jī)的掛接(mount)請求都被定位到mountd監(jiān)控程序(daemon)。當(dāng)驗(yàn)證了服務(wù)器確實(shí)具有掛接所請求的文件系統(tǒng)的權(quán)限以后,mountd為請求的掛接點(diǎn)返回一個文件句柄。而nfsd監(jiān)控程序則被服務(wù)器用來處理客戶機(jī)端發(fā)過來的請求,由于服務(wù)器需要同時處理多個客戶機(jī)的請求,所以在缺省情況下,在Linux當(dāng)中將會自動啟動八個nfsd線程。當(dāng)然,如果NFS服務(wù)器特別忙的時候,系統(tǒng)有可能根據(jù)實(shí)際情況啟動三十個線程。
2、NFS安裝
在網(wǎng)絡(luò)環(huán)境下,使用yum安裝NFS的命令如下:
#yum –y install nfs
3、NFS配置和使用
在安裝好NFS后,需要對其進(jìn)行配置才能正常使用,主要包括服務(wù)器配置和客戶機(jī)配置兩個步驟,下面詳細(xì)對它們加以說明。
#p#
服務(wù)器配置
編輯/etc/exports,在文件中列出,要共享的目錄。書寫規(guī)則是:共享目錄主機(jī)(參數(shù))。并且每條規(guī)則占據(jù)一行。例如:
/mnt/mp3 192.168.10.168(ro,sync, no_root_squash)
上面的規(guī)則代表將/mnt/mp3目錄以讀寫同步方式共享給主機(jī)192.168.10.168。如果登陸到NFS主機(jī)的用戶是root,那么該用戶就具有NFS主機(jī)的root用戶的權(quán)限。
具體的可選參數(shù)如下所示:
- rw:可讀寫的權(quán)限
- ro:只讀的權(quán)限
- no_root_squash:登入到NFS主機(jī)的用戶如果是ROOT用戶,他就擁有ROOT的權(quán)限
- root_squash:在登入NFS主機(jī)使用目錄的使用者如果是root時,那么這個使用者的權(quán)限將被壓縮成為匿名使用者,通常他的UID與GID都會變成nobody那個身份
- all_squash:不管登陸NFS主機(jī)的用戶是什么都會被重新設(shè)定為nobody
- anonuid:將登入NFS主機(jī)的用戶都設(shè)定成指定的userid,此ID必須存在于/etc/passwd中
- anongid:同anonuid,但是變成groupID就是了
- sync資料同步寫入存儲器中
- async:資料會先暫時存放在內(nèi)存中,不會直接寫入硬盤
- insecure允許從這臺機(jī)器過來的非授權(quán)訪問
客戶機(jī)配置
客戶機(jī)配置相對簡單,只需要使用下述命令mount NFS文件系統(tǒng)即可:
#mount -t nfs 192.168.10.168:/home /mnt/mp3
上述命令將遠(yuǎn)程的共享目錄掛接到本地的/home目錄下,用戶可以直接對該目錄進(jìn)行操作,從而獲取遠(yuǎn)程的共享資源。
啟動NFS服務(wù)
#service portmap start # service nfs start
下面通過一個具體的例子來介紹NFS的安全性配置。假設(shè)在某個網(wǎng)站上有某個目錄名為/popgame目錄可以開放給NFS客戶機(jī)來進(jìn)行下載共享等工作,而這臺服務(wù)器的IP地址為:202.168.10.8,它可以開放目錄給的主機(jī)的IP地址為202.168.10.10、202.168.10.13(當(dāng)然可以提供給更多的服務(wù)器,而且他們的IP地址也可以各式各樣,現(xiàn)在舉的例子有點(diǎn)像局域網(wǎng)中的情況,不過原理相同)。那么我們首先就需要對服務(wù)器端的/etc/exports文件進(jìn)行編寫:
我們先進(jìn)入目錄/etc,然后vi exports,那么就會進(jìn)入到該文件的編輯界面,我們輸入如下的內(nèi)容:
/popgame 202.168.10.10(ro) 202.168.10.13(ro)
我們可以清楚的看到,目錄/popgame只能導(dǎo)出到IP地址為上述的客戶機(jī)上,而且他們的權(quán)限也只能是只讀,因?yàn)樗麄冎皇切枰唵蔚墓蚕硐螺d游戲的功能,并不需要具備創(chuàng)建目錄、修改文件的功能,而且如果提供了的話,那將會出現(xiàn)安全隱患。下面接著配置客戶機(jī)的/etc/fstab文件,進(jìn)入該文件你將需要加入如下的內(nèi)容,原文件上已經(jīng)有的內(nèi)容不要隨意更改,否則會影響系統(tǒng)配置,影響文件系統(tǒng):
202.168.10.8: /popgame /mnt/game nfs ro 0 0
其中的/mnt/game目錄是你要將服務(wù)器上的/popgame目錄掛接到你的客戶機(jī)上的本地目錄,也就是說,當(dāng)共享了NFS文件系統(tǒng)以后,你可以通過訪問本地目錄/mnt/game來訪問共享的文件。因?yàn)楝F(xiàn)在有兩臺客戶機(jī),所以每一臺上都要如上配置。
配置完成以后,就需要在客戶機(jī)上將服務(wù)器的NFS掛接到本地客戶機(jī)上了,命令如下所示:
mount –t nfs 202.168.10.8: /popgame /mnt/game
特別需要注意的是:在執(zhí)行命令之前,你必須先要關(guān)掉本地客戶機(jī)上的防火墻,否則也不會掛接成功。原因是防火墻將會阻礙遠(yuǎn)程過程調(diào)用。現(xiàn)在你就可以放心的使用遠(yuǎn)程的網(wǎng)絡(luò)資源了。
最后,我們介紹一下使用中需要注意的安全問題。
#p#
4、使用中需要注意的安全問題
通常來說,我們要保護(hù)好NFS,首先就要關(guān)閉最大的漏洞。在操作系統(tǒng)當(dāng)中,當(dāng)系統(tǒng)啟動的時候,將會有很多的后臺系統(tǒng)服務(wù)程序在運(yùn)行,而且有些端口是缺省打開的。如果不對這種情況進(jìn)行處理的話,一方面會不必要的消耗大量系統(tǒng)資源,另一方面則會給我們的系統(tǒng)帶來安全隱患。因此,我們要保護(hù)NFS,必須解決好如下問題:
◆要考慮好總體的安全,拒絕所有的訪問,只有在需要的時候才提供訪問。也就是說,不要把NFS導(dǎo)出到任何主機(jī),而只應(yīng)該將它導(dǎo)出到所需要的主機(jī),尤其是避免將文件系統(tǒng)導(dǎo)出到不信任的主機(jī)。并且要盡量使用只讀(ro)權(quán)限導(dǎo)出文件系統(tǒng),盡量不要使用(rw)或者是(no_root_squash)權(quán)限;
◆不要提供太多的根用戶賬號。特別要注意保證任何用戶都沒有NFS客戶機(jī)的根用戶賬號,因?yàn)槿绻哂械脑?,那么該客戶機(jī)將會具有最高的權(quán)限,將會引起很大的安全問題,它可以修改任何它想修改的東西,這顯然是不安全的。而且應(yīng)該在NFS服務(wù)器上使用(root_squash)和(ro)選項(xiàng);
◆盡量使用限制性的NFS客戶機(jī)方掛接選項(xiàng),用只讀(ro)選項(xiàng)掛接文件系統(tǒng),除非確實(shí)有必要,要不然不要允許設(shè)置UID二進(jìn)制文件(nosuid)、設(shè)備(nodev)和執(zhí)行文件(noexec)。
◆要嚴(yán)格地控制好導(dǎo)出的目錄文件。這主要包括導(dǎo)出的數(shù)量以及導(dǎo)出的安全選項(xiàng)。導(dǎo)出的數(shù)量依據(jù)實(shí)際情況而定,避免到處過多的和不必要的選項(xiàng)。另外,要嚴(yán)格地控制好導(dǎo)出的安全選項(xiàng),安全選項(xiàng)就是上面所描述的只讀(ro)、可寫(rw)、根用戶擠壓(root_squash)等選項(xiàng),這樣做就可以使得每個目錄都有各自的訪問權(quán)限,而通常情況下這樣也是很合理的,因?yàn)樗幸獙?dǎo)出的目錄訪問權(quán)限都是一樣的,這幾乎是不可能的。比如說,現(xiàn)在NFS服務(wù)器上有三個目錄需要導(dǎo)出,一個是/popmusic,一個是/doc,而一個是/digest。這三個目錄當(dāng)中,第一個目錄和第三個目錄不但允許客戶機(jī)共享,而且允許客戶機(jī)上載自己的文件,但是第二個只允許讀取,這樣第一個和第三個目錄的訪問權(quán)限就要設(shè)為rw,而第二個則只能設(shè)為ro。
◆在導(dǎo)出的文件系統(tǒng)下的目錄的設(shè)置過程當(dāng)中應(yīng)當(dāng)要注意一些控制的問題。通常情況下,應(yīng)該要將訪問權(quán)限一致的目錄和文件作為父目錄、子目錄,而訪問權(quán)限不一致的就另開一個目錄進(jìn)行導(dǎo)出,這實(shí)際上就是一個管理的粒度問題。舉個例子,現(xiàn)有四個目錄要進(jìn)行導(dǎo)出,它們依次是 /direct1 、/direct2 、/direct3 、/direct4 。其中前兩個目錄的訪問權(quán)限是只讀,而后面兩個是可讀寫,那么,我們在導(dǎo)出的時候可以這樣做,將 /direct2作為 /direct1的子目錄,放入/direct1中進(jìn)行導(dǎo)出,然后設(shè)置共享權(quán)限為只讀,同樣的,可以將 /direct4 作為/direct3的子目錄,設(shè)置它的共享權(quán)限為可讀寫,然后導(dǎo)出。這樣,客戶機(jī)在訪問服務(wù)器數(shù)據(jù)的時候就不會出現(xiàn),在一個目錄當(dāng)中,整個父目錄的權(quán)限與子目錄的訪問權(quán)限不相同。解決了這個設(shè)置的問題,共享起來也比較方便,而且便于管理。
【編輯推薦】