Linux下的NFS快速配置教程與安全策略

    在Linux下實現文件共享有多種方式,NFS就是其中之一。網絡文件系統(NFS)協議是由Sun MicroSystem在20世紀80年代爲了提供對共享文件的遠程訪問而設計和實現的。該協議採用Client/Server模型,經過使用Sun開發的遠程過程調用協議(RPC Protocol)來實現運行在一臺計算機上的程序來調用在另外一臺遠程機器上運行的子程序,而且,它提供的外部數據表示(XDR)可使得數據在不一樣平臺上的計算機上進行交換。該協議能夠在TCP協議或者是UDP協議上運行,而在此基礎上,NFS在數據的傳送過程當中須要RPC命令獲得確認,並且在須要的時候將會重傳。javascript

一、NFS原理

    NFS比較複雜,包括不少組件,經過特殊的協議進行交互。不一樣的組件在操做系統當中都使用不一樣的配置文件以及狀態文件。下圖說明了NFS的主要組件及配置文件。java

網絡文件系統原理示意圖 
圖 網絡文件系統原理示意圖node

    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服務器特別忙的時候,系統有可能根據實際狀況啓動三十個線程。服務器

二、NFS安裝

    在網絡環境下,使用yum安裝NFS的命令以下:網絡

#yum –y install nfs

三、NFS配置和使用

    在安裝好NFS後,須要對其進行配置才能正常使用,主要包括服務器配置和客戶機配置兩個步驟,下面詳細對它們加以說明。async

服務器配置ide

    編輯/etc/exports,在文件中列出,要共享的目錄。書寫規則是:共享目錄主機(參數)。而且每條規則佔據一行。例如:網站

/mnt/mp3 192.168.10.168(ro,sync, no_root_squash)

    上面的規則表明將/mnt/mp3目錄以讀寫同步方式共享給主機192.168.10.168。若是登錄到NFS主機的用戶是root,那麼該用戶就具備NFS主機的root用戶的權限。ui

    具體的可選參數以下所示:

  1. rw:可讀寫的權限
  2. ro:只讀的權限
  3. no_root_squash:登入到NFS主機的用戶若是是ROOT用戶,他就擁有ROOT的權限
  4. root_squash:在登入NFS主機使用目錄的使用者若是是root時,那麼這個使用者的權限將被壓縮成爲匿名使用者,一般他的UID與GID都會變成nobody那個身份
  5. all_squash:無論登錄NFS主機的用戶是什麼都會被從新設定爲nobody
  6. anonuid:將登入NFS主機的用戶都設定成指定的userid,此ID必須存在於/etc/passwd中
  7. anongid:同anonuid,可是變成groupID就是了
  8. sync資料同步寫入存儲器中
  9. async:資料會先暫時存放在內存中,不會直接寫入硬盤
  10. 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.十、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

    特別須要注意的是:在執行命令以前,你必須先要關掉本地客戶機上的防火牆,不然也不會掛接成功。緣由是防火牆將會阻礙遠程過程調用。如今你就能夠放心的使用遠程的網絡資源了。

    最後,咱們介紹一下使用中須要注意的安全問題。

四、使用中須要注意的安全問題

    一般來講,咱們要保護好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的子目錄,設置它的共享權限爲可讀寫,而後導出。這樣,客戶機在訪問服務器數據的時候就不會出現,在一個目錄當中,整個父目錄的權限與子目錄的訪問權限不相同。解決了這個設置的問題,共享起來也比較方便,並且便於管理。

相關文章
相關標籤/搜索