NFS(Network File System,網絡文件系統)是一種在企業內部網絡使用比較普遍的文件共享服務,主要用於Linux以及類UNIX系統之間的文件共享。它採用C/S工做模式,在NFS服務器上將某個目錄設置爲共享目錄,而後在客戶端能夠將這個目錄掛載到本地使用。NFS服務誕生於上世紀80年代,雖然在CentOS7.6系統中採用的是目前最新的NFSv4版本,但因爲NFS服務自己比較簡單,尤爲是在權限設置方面功能比較弱,因此若是對NFS服務設置不當,將會在企業網絡中產生比較嚴重的安全隱患。本文就NFS服務的用戶身份映射問題進行了分析,並給出了推薦的配置和使用方法。文中準備了兩臺Linux虛擬機來搭建實驗環境,虛擬機所使用的操做系統版本爲CentOS7.6。其中名爲Server的虛擬機IP地址是192.168.80.10,名爲Client的虛擬機IP地址是192.168.80.101。vim
NFS服務在CentOS7系統中默認已經安裝,但並未運行,於是首先須要在虛擬機Server中執行「systemctl start nfs」命令啓動服務,而後再執行「systemctl enable nfs」命令將服務設置爲開機自動運行。
在服務器端新建一個/var/share目錄,並在其中建立一個測試文件test.txt。安全
[root@server ~]# mkdir /var/share [root@server ~]# echo 'hello,world!' > /var/share/test.txt
下面將/var/share目錄設置爲NFS共享,並容許全部客戶端訪問。
NFS服務的主配置文件是/etc/exports,在/etc/exports文件中,每一行定義一個共享目錄。利用vi編輯器打開配置文件/etc/exports,在其中增長下面的一行:服務器
[root@server ~]# vim /etc/exports /var/share *(ro,sync)
在設置項中,「/var/share」表示要共享的目錄,「」表示全部客戶端均可以訪問該共享目錄,選項「ro」用於定義客戶端的權限爲read-only(只讀),選項「sync」表示啓用同步模式,能夠將內存中的數據實時寫入到磁盤中。
修改完配置文件以後,重啓NFS服務生效。[root@server ~]# systemctl restart nfs
而後在客戶端就能夠將共享目錄掛載到本地使用。網絡
[root@client ~]# mkdir /mnt/nfs #建立掛載點目錄 [root@client ~]# mount -t nfs 192.168.80.10:/common /mnt/nfs #掛載共享目錄 [root@client ~]# ls /mnt/nfs #查看共享目錄中的文件 test.txt
因爲NFS服務自己並不具有用戶身份驗證的功能,而僅支持基於客戶端IP進行認證。也就是說,咱們在對NFS服務進行權限設置時,不能針對用戶來分配權限,而只能針對客戶端IP進行權限分配。因此若是但願IP地址爲192.168.80.101的客戶端能夠對共享目錄執行寫入操做,那麼能夠在服務器端對配置文件進行以下修改,添加客戶端的IP,並設置權限選項爲「rw(read-write)」:編輯器
[root@server ~]# vim /etc/exports /var/share *(ro,sync) 192.168.80.101(rw,sync)
修改完成後,須要重啓NFS服務生效。可是若是NFS共享正在被某些服務器使用的話,那麼NFS服務是不容許隨便重啓的,因此在CentOS系統中提供了exportfs命令,能夠在不重啓NFS服務的狀況下,從新加載/etc/exports文件,使得新的設置項生效。exportfs命令的經常使用選項有:-a(所有掛載或所有卸載)、-r(從新掛載)、-v(顯示詳細信息),一般都是將這三個選項組合使用。下面經過exportfs命令使得咱們剛纔所作的設置生效。ide
[root@server ~]# exportfs -arv exporting 192.168.80.101:/var/share exporting *:/var/share
在客戶端先將共享目錄卸載,而後再從新掛載,以使得服務器端的設置生效。但在對共享目錄進行寫入測試時失敗。測試
[root@Client ~]# umount /mnt/share #卸載共享目錄 [root@Client ~]# mount 192.168.80.10:/var/share /mnt/share #從新掛載共享目錄 [root@Client ~]# touch /mnt/share/a.txt #寫入測試失敗 touch: 沒法建立"/mnt/share/a.txt": 只讀文件系統
這是因爲雖然在服務器端的配置文件/etc/exports中設置了容許用戶對/var/share目錄具備讀寫權限,但在操做系統層面,用戶對/var/share目錄卻不具有寫入權限。於是要實現對共享目錄的寫入操做,必需要保證在NFS服務和操做系統兩個層面所有都具備寫入權限才能夠。
如何使得客戶端能夠在操做系統層面對共享目錄具備寫入權限,這就要涉及到用戶身份映射問題。ui
NFS服務雖然不具有用戶身份驗證的功能,可是NFS提供了一種身份映射的機制來對用戶身份進行管理。當客戶端訪問NFS服務時,服務器會根據狀況將客戶端用戶的身份映射成NFS匿名用戶nfsnobody。nfsnobody是由NFS服務在系統中自動建立的一個程序用戶帳號,該帳號不能用於登陸系統,專門用做NFS服務的匿名用戶帳號。操作系統
[root@Server ~]# grep nfsnobody /etc/passwd #查看nfsnobody用戶的信息。 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
所謂用戶身份映射,是指當客戶端訪問NFS服務器時,會自動被視做服務器中的nfsnobody用戶,並按照該用戶的權限設置去執行操做。可是並不是全部的客戶端都會被映射爲nfsnobody用戶,在/etc/exports配置文件中提供瞭如下選項,以決定是否將NFS客戶端映射爲nfsnobody用戶:rest
咱們以前之因此沒法在客戶端執行寫入操做,是由於尚未在系統層面賦予nfsnobody用戶對共享目錄/var/share具備寫入權限。這裏經過設置ACL規則賦予nfsnobody用戶rwx權限。
`[root@Server ~]# setfacl -m u:nfsnobody:rwx /var/share``
而後在客戶端從新掛載共享目錄,並測試可否寫入。
[root@Client ~]# umount /mnt/share [root@Client ~]# mount -t nfs 192.168.80.10:/var/share /mnt/share [root@Client ~]# touch /mnt/share/b.txt
能夠看到此時客戶端能夠寫入,而且所建立文件的全部者正是nfsnobody。
[root@Client ~]# ll /mnt/share/b.txt -rw-r--r--. 1 nfsnobody nfsnobody 0 3月 21 07:39 /mnt/share/b.txt
因爲客戶端當前所使用的用戶身份是root,默認狀況下,當客戶端訪問NFS服務器時,在服務器端會將其用戶身份映射爲nfsnobody,因此在服務器端只要賦予nfsnobody用戶對共享目錄具備寫入權限,那麼客戶端天然就能夠寫入了。
下面咱們再驗證一下no_root_squash設置項,即root用戶不進行身份映射。
首先在服務器端修改配置文件/etc/exports,爲/var/share共享目錄添加no_root_squash選項。
[root@server ~]# vim /etc/exports #修改配置文件 /var/share *(rw,no_root_squash,sync) [root@Server ~]# exportfs -arv #從新加載服務 exporting *:/var/share
而後去掉對共享目錄/var/share所設置的ACL規則,取消nfsnobody用戶對該目錄的寫入權限。[root@Server ~]# setfacl -b /var/share
最後在客戶端從新掛載共享目錄,並測試可否寫入。
[root@Client ~]# umount /mnt/share [root@Client ~]# mount -t nfs 192.168.80.10:/var/share /mnt/share [root@Client ~]# touch /mnt/share/c.txt [root@Client ~]# ll /mnt/share/c.txt -rw-r--r--. 1 root root 0 4月 14 17:08 /mnt/share/c.txt
能夠發現,此時客戶端仍然是能夠寫入的。由於對於NFS服務器而言,訪問共享目錄的客戶端就是服務器中的root用戶,對共享目錄具備徹底權限。因此no_root_squash選項會產生很大的安全隱患,通常狀況下都不建議採用。
若是客戶端所使用的用戶身份不是root,而是一個普通用戶,那麼默認狀況下在服務器端會將其視做其它用戶(other)。下面在客戶端以普通用戶的身份繼續進行測試。
首先在服務器端修改配置文件/etc/exports,將共享目錄/var/share中的no_root_squash選項去掉,從新加載服務以後,再次經過設置ACL規則的方式賦予nfsnobody用戶讀寫執行權限。
[root@server ~]# vim /etc/exports #修改配置文件 /var/share *(rw,sync) [root@Server ~]# exportfs -arv #從新加載服務 exporting *:/var/share #經過設置ACL賦予nfsnobody用戶rwx權限 [root@Server ~]# setfacl -m u:nfsnobody:rwx /var/share
在客戶端從新掛載共享,並測試以root用戶身份能夠正常寫入。
[root@Client ~]# umount /mnt/share [root@Client ~]# mount 192.168.80.10:/var/share /mnt/share [root@Client ~]# touch /mnt/share/d.txt [root@Client ~]# ll /mnt/share/d.txt -rw-r--r--. 1 nfsnobody nfsnobody 0 4月 14 17:29 /mnt/share/d.txt
下面在客戶端建立一個admin用戶,並設置密碼。
[root@Client ~]# useradd admin [root@Client ~]# echo 123 | passwd --stdin admin
切換到admin用戶身份,嘗試向共享目錄中寫入文件,寫入失敗,可是能夠讀取目錄中的內容。於是若是客戶端是以普通用戶的身份訪問NFS共享,那麼默認狀況下在服務器端並不將其映射爲nfsnobody,而是視做其餘用戶(other)。
[root@Client ~]# su - admin [admin@Client ~]$ touch /mnt/share/e.txt touch: 沒法建立"/mnt/share/e.txt": 權限不夠 [admin@Client ~]$ cat /mnt/share/e.txt
下面在服務器端繼續修改配置文件/etc/exports,在共享設置中添加「all_squash」選項,將全部客戶端用戶均映射爲nfsnobody。
[root@server ~]# vim /etc/exports #修改配置文件 /var/share *(rw,sync,all_squash) [root@Server ~]# exportfs -arv #從新加載服務 exporting *:/var/share
而後在客戶端再次從新掛載共享(具體操做從略),此時以admin用戶身份就能夠寫入了,而且能夠發現所建立文件的全部者一樣是nfsnobody。
[admin@Client ~]$ touch /mnt/share/e.txt [admin@Client ~]$ ll /mnt/share/e.txt -rw-rw-r--. 1 nfsnobody nfsnobody 0 4月 14 17:37 /mnt/share/e.txt
在使用NFS共享的過程當中,有時還可能會遇到用戶身份重疊的問題。所謂用戶身份重疊,是指在NFS服務採用默認設置(用戶身份映射選項爲root_squash)時,若是在服務器端賦予某個用戶對共享目錄具備相應權限,並且在客戶端剛好也有一個具備相同uid的用戶,那麼當在客戶端以該用戶身份訪問共享時,將自動具備服務器端對應用戶的權限。下面舉例予以說明。
首先在服務器端將/var/share共享還原爲默認設置,而且取消/var/share目錄針對nfsnobody用戶的ACL規則,具體操做從略。
假設服務器端存在一個名爲teacher的用戶帳號,uid爲1246,將該用戶設置爲共享目錄的全部者。
[root@Server ~]# id teacher #查看teacher用戶的身份信息` uid=1246(teacher) gid=1246(teacher) 組=1246(teacher #將teacher用戶設置爲/var/share目錄的全部者 [root@Server ~]# chown teacher /var/share [root@Server ~]# ll -d /var/share drwxr-xr-x. 2 teacher root 45 4月 14 17:37 /var/share
下面在客戶端進行操做。首先還是從新掛載共享目錄,而後將原先admin用戶的uid也改成1246。
[root@Client ~]# usermod -u 1246 admin [root@Client ~]# id admin uid=1246(admin) gid=1002(admin) 組=1002(admin)
而後以admin用戶身份測試可否對共享目錄執行寫入操做,發現能夠正常寫入,而且所建立文件的全部者是admin。
[root@Client ~]# su - admin [admin@Client ~]$ touch /mnt/share/f.txt [admin@Client ~]$ ll /mnt/share/f.txt -rw-rw-r--. 1 admin admin 0 4月 14 17:47 /mnt/share/f.txt
在服務器端查看admin用戶所建立的文件,發現全部者則是teacher。
[root@Server ~]# ll /var/share/f.txt -rw-rw-r--. 1 teacher 1002 0 4月 14 17:47 /var/share/f.txt
這是由於對於Linux系統而言,區分不一樣用戶的惟一標識就是uid,至於用戶名只是爲了方便人類理解。因此在系統層面,不管是teacher用戶仍是admin用戶,只要他們的uid同樣,就認爲是同一個用戶。但也正是由於這個緣由,纔會致使出現用戶身份重疊的問題,對於NFS服務而言,這也是一個比較嚴重的安全隱患。
如何避免用戶身份重疊呢?能夠從如下兩個方面着手: