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