NFS如何限制可以獲取NFS輸出列表的IP和用戶

一、概要

NFS(Network File System)即網絡文件系統,是FreeBSD支持的文件系統中的一種,它允許網絡中的計算機之間通過TCP/IP網絡共享資源。NFS是一個使用RPC構造的客戶端/服務器應用程序,其客戶端通過向一臺NFS服務器發送RPC請求來訪問其中的文件。儘管這一工作可以使用一般的用戶進程來實現,即NFS客戶端可以是一個用戶進程,對服務器進行顯式調用在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件一樣。NFS本身沒有提供信息傳輸的協議和功能,但NFS卻能讓我們通過網絡進行資料的分享,就是因爲NFS使用了RPC提供的傳輸協議,可以說NFS就是使用PRC的一個程序。NFS依賴於RPC協議。所謂RPC遠程過程調用(Remote Procedure Call),是使客戶端能夠執行其他系統中程序的一種機制。NFS服務器在端口UDP2049接收作爲UDP數據包的客戶端請求.
目前NFS已具備了防止被利用導出文件夾的功能,但遺留系統中的NFS服務配置不當,則仍可遭到惡意攻擊者的利用。

二、安裝

#rpm -qa |grep nfs //檢查系統是否已經安裝
nfs4-acl-tools-0.3.3-13.el7.x86_64
nfs-utils-1.3.0-0.48.el7_4.x86_64 //必要安裝
libnfsidmap-0.25-9.el7.x86_64
[root@centosclient ~]# rpm -qa |grep rpc
xmlrpc-c-1.32.5-1905.svn2451.el7.x86_64
xmlrpc-c-client-1.32.5-1905.svn2451.el7.x86_64
libtirpc-0.2.4-0.10.el7.x86_64
rpcbind-0.2.0-42.el7.x86_64 //必要安裝
如果沒有安裝:yum install rpcbind nfs-utils.x86_64
systemctl enable rpcbind.service
systemctl enable nfs-server.service
systemctl start rpcbind.service
systemctl start nfs-server.service
chkconfig --list nfs
chkconfig --list rpcbind
exportfs -rv //重新讀取NFS配置文件

三、服務確認及配置

服務器端/etc/exports就是nfs服務的主配置文件,這個文件不一定會存在,要使用vim手動建立;
/usr/sbin/exportfs:NFS服務的管理命令
/usr/sbin/showmount:客戶端的查看命令
/var/lib/nfs/etab:記錄NFS分享出來的目錄的完整權限設定值
/var/lib/nfs/xtab:記錄曾經登錄過的客戶端信息
systemctl status rpcbind.service //查看RPC的服務狀態
netstat -antlp |grep rpc //查看rpcbind服務的端口
rpcinfo -p localhost //查看本地主機是否有端口註冊
systemctl status nfs.service //查看nfs服務的狀態

/etc/exports文件內容格式:
<輸出目錄> [客戶端1 選項(訪問權限,用戶映射,其他)] [客戶端2 選項(訪問權限,用戶映射,其他)]

說明:
輸出目錄:指NFS系統中需要共享給客戶機使用的目錄;
客戶端是指網絡中可以訪問這個NFS輸出目錄的計算機,可以這麼寫:
指定ip地址的主機:192.168.0.200
指定子網中的所有主機:192.168.0.0/24 192.168.0.0/255.255.255.0
指定域名的主機:david.bsmart.cn
指定域中的所有主機:*.bsmart.cn
所有主機:*
選項用來設置輸出目錄的訪問權限、用戶映射:
設置輸出目錄只讀:ro
設置輸出目錄讀寫:rw
all_squash:將遠程訪問的所有普通用戶及所屬組都映射爲匿名用戶或用戶組(nfsnobody);
no_all_squash:與all_squash取反(默認設置);
root_squash:將root用戶及所屬組都映射爲匿名用戶或用戶組(默認設置),相當於在服務器使用nobody用戶訪問目錄;
no_root_squash:與rootsquash取反,即root用戶及及所屬組都不映射(no_root_squash),即相當於在服務器上用root身份訪問該目錄;如果啓用該選項,當客戶端用root身份登錄時,掛載nfs的共享目錄時,客戶端的root將對共享目錄具備root權限。
anonuid=xxx:將遠程訪問的所有用戶都映射爲匿名用戶,並指定該用戶爲本地用戶(UID=xxx);
anongid=xxx:將遠程訪問的所有用戶組都映射爲匿名用戶組賬戶,並指定該匿名用戶組賬戶爲本 地用戶組賬戶(GID=xxx);
secure:限制客戶端只能從小於1024的tcp/ip端口連接nfs服務器(默認設置);
insecure:允許客戶端從大於1024的tcp/ip端口連接服務器;
sync:將數據同步寫入內存緩衝區與磁盤中,效率低,但可以保證數據的一致性;
async:將數據先保存在內存緩衝區中,必要時才寫入磁盤;
wdelay:檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可以提高效率(默認設置);
no_wdelay:若有寫操作則立即執行,應與sync配合使用;
subtree:若輸出目錄是一個子目錄,則nfs服務器將檢查其父目錄的權限(默認設置);
no_subtree:即使輸出目錄是一個子目錄,nfs服務器也不檢查其父目錄的權限,這樣可以提高效率;

3.1【權限配置】:

1)如果同一目要針對不同用戶/不同區域開放不同權限:比如nfs共享目錄/home/public
setfacl -m g:blue:rwx /home/public
[root@ ~]# vim /etc/exports
/tmp *(rw,no_root_squash) //因 no_root_squash參數,client上root訪問訪問/tmp,文件所有者爲/root
/home/public 192.168.100.0/24(rw) (ro) //網段不能寫成192.168.100. 這樣的格式
上面通過配置文件裏權限配置內容+acl配置,共同實現/home/public 只有192.168.100.0/24且加入blue組的用戶才能讀寫,其他主機或用戶只能讀;當用戶從客戶端掛載NFS共享目錄/home/public後,192.168.100.0/24內的主機可以對改目錄可以讀寫,其他的只能只讀;

2)如果限制NFS的目錄爲指定主機是的某一個用戶纔可以訪問:
setfacl -m u:admin:rwx /home/public
[root@ ~]# vim /etc/exports
/tmp *(rw,no_root_squash) //當客戶端uid=600用戶訪問該目錄,創建文件是文件uid會變成600,即使NFS服務器上沒有uid=600的用戶
/home/public 192.168.100.2(rw) //只有100.2上的admin用戶纔能有完整的訪問權限

3)開通匿名訪問,假如客戶端過來的用戶在nfs共享目錄存儲文件時,希望文件的 UID 與 GID 都變成 45 這個身份的使用者,且改用戶的屬主爲nfsanon,相當於只有uid=45的用戶才能訪問/home/public 。
[root@ ~]# groupadd -g 45 nfsanon
[root@ ~]# useradd -u 45 -g nfsanon nfsanon
[root@ ~]# setfacl -m u:nfsanon:rwx /home/public
[root@ ~]# vim /etc/exports
/tmp *(rw,no_root_squash)
/home/public 192.168.100.0/24(rw,all_squash,anonuid=45,anongid=45)
#如果要開放匿名,那麼重點是 all_squash,且要配合 anonuid 使用!這樣當客戶端訪問 NFS 主機,且在 /home/public 寫入文件時,該文件的所有者或所有組,就會變成 /etc/passwd 裡面對應的 UID 爲 45 的那個用戶!

四、客戶端命名:

#showmount -e 192.168.0.10 //將得到一個在 192.168.0.10 上可用的 NFS 共享的列表,命令執行會檢索給定主機的導出文件夾列表,這些信息將被用於訪問這些文件夾。
顯示指定NFS服務器連接NFS客戶端的信息

showmount 192.168.1.1 #此ip爲nfs服務器的

顯示輸出目錄列表

showmount -e

顯示被掛載的共享目錄

showmount -d

顯示客戶端信息和共享目錄

showmount -a

顯示指定NFS服務器的客戶端信息和共享目錄
#showmount -a 192.168.1.1
客戶端維護工具:NFS Shell;它可以連接到NFS共享並可以幫助我們手動識別一些常見的安全問題
安裝:
apt-get install libreadline-dev libncurses5-dev
make
gcc -g -o nfsshell mount_clnt.o mount_xdr.o nfs_prot_clnt.o nfs_prot_xdr.o nfsshell.o -L/usr/local/lib -lreadline -lhistory -lncurses
./nfsshell
nfs> host IP // 連接NFS服務
nfs> export // 導出NFS列表
mount -t nfs 192.168.1.172:/ /temp -o nolock //將共享文件夾或導出的NFS列表掛載到客戶端一個空目錄來訪問
掛載後,如果對於共享上的文件我們沒有讀取權限,可改寫文件所有者的UID來欺騙NFS服務器,ls-al列出訪問文件的UID,可在客戶端本地創建一個新用戶,並將該用戶的UID和名稱修改爲與文件所有者相同。當然UID可以在passwd文件中更改,vi /etc/passwd將第2、3個冒號後id改爲同文件的UID和GID;執行su到新用戶後,由於該文件的UID與新用戶的UID相同,因此係統會誤認爲這是文件權限的所有者,這樣我們就可以以一個合法的用戶身份來讀取文件的內容了。

造成這種問題,原因在於導出文件夾並未設置root_squash選項。root_squash登入NFS主機,使用該共享目錄時相當於該目錄的擁有者。但是如果是以root身份使用這個共享目錄的時候,那麼這個使用者(root)的權限將被壓縮成爲匿名使用者,即通常他的UID與GID都會變成nobody那個身份,以防止越權訪問。如果passwd文件還具有寫入權限,那麼我們可以通過將一些非特權用戶的UID更改爲0,使其具有根級別的訪問權限,因此要跟passwd加權限限制chattr +i禁止修改。

禁用root_squash選項:
vi /etc/exports編輯:
/home 192.168.1.47(root_squash) // Enables Root Squash
/home 192.168.1.47(no_root_squash) // Disables Root Squash

注:NFS共享目錄可能含:authorized_keys和rhosts2個文件,而.rhosts文件用來配置哪些遠程主機或用戶可以訪問系統上的本地帳戶。如果.rhosts文件的內容爲++符號,則說明它允許來自網絡上的任何主機和用戶的連接。這樣的話,
cd /root/.ssh/
ssh-keygen -t rsa -b 4096
cp /root/.ssh/id_rsa.pub /temp/root/.ssh/
cat id_rsa.pub >> /temp/root/.ssh/authorized_keys
ssh -i /root/.ssh/id_rsa [email protected] //
以下命令將允許系統的root用戶直接連接目標系統,系統將不會提示密碼輸入,因爲來自系統的所有用戶都將被信任。
rsh -l root IP
rlogin -l root IP
應定期檢查文件將有助於確定哪些主機和用戶是可信的,因此可以在無需密碼的情況下進行身份驗證。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章