NFS 的基本原則是「 允许不同的客戶端及服务器端通过一组 RPCs 分享相同的文件系統」,它是独立与操作系统,允许不同硬件及操作系統共同进行文件的分享。
NFS 提供了以下的服务:
- 在目录(directory)中寻找文件
- 列出目录中的文件
- 管理目录
- 取得各文件的属性(file attribute)
- 文件的读/写
RPC(Remote Procedure Call)
NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER.所以 只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系: NFS是一个文件系统,而RPC是负责负责信息的传输。
NFS的不安全性主要体现于以下4个方面:
- 1、新手对NFS的访问控制机制难于做到得心应手,控制目标的精确性难以实现 防火墙对各端口的设定,hosts.allow对各服务、客户端IP的限制
- 2、NFS没有真正的用户验证机制,而只有对RPC/Mount请求的过程验证机制 可以使用安全的NFS服务器 使用公钥、密钥?
- 3、较早的NFS可以使未授权用户获得有效的文件句柄
- 4、在RPC远程调用中,一个SUID的程序就具有超级用户权限.
加强NFS安全的方法:
- 合理的设定/etc/exports中共享出去的目录,最好能使用anonuid,anongid以使MOUNT到NFS SERVER的CLIENT仅仅有最小的权限,最好不要使用no_root_squash。
- 合理设置共享出去目录的权限(文件所有者、文件所在组、其他人的权限760?)
- 使用IPTABLE防火墙限制能够连接到NFS SERVER的机器范围 iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
- 根据客户端数,在/etc/sysconfig/nfs中设置合理的nfs服务器端进程数RPCNFSDCOUNT,默认8
- 修改/etc/hosts.allow和/etc/hosts.deny达到限制CLIENT的目的 /etc/hosts.allow
- /etc/services中改变默认的portmapper端口111,和nfs端口2049
- 配置安全NFS Tunneling NFS4 over SSH, Security and NFS
iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT
portmap: 192.168.0.0/255.255.255.0 : allow
portmap: 140.116.44.125 : allow
/etc/hosts.deny
portmap: ALL : deny
NFS相关端口:
111 portmap端口
2049 nfsd端口
在/etc/sysconfig/nfs或者/etc/service中固定mountd、rquotad、rpc.statd相关端口, /etc/sysconfig/nfs中的优先级 大于 /etc/service, lockd,statd的端口好像只能在nfs配置文件中指定?试着没有修改成功!
方式一:在/etc/service固定相应守护进程的端口 mountd 892/tcp #rpc.mountd mountd 892/udp #rpc.mountd rquotad 875/tcp #rpc.rquotad rquotad 875/udp #rpc.rquotad 方式二:/etc/sysconfig/nfs #默认: #Port rpc.mountd should listen on. #MOUNTD_PORT=892 #Port rpc.statd should listen on. #STATD_PORT=662 #/usr/sbin/rpc.rquotad Port rquotad should listen on. #RQUOTAD_PORT=875 #TCP port rpc.lockd should listen on. #LOCKD_TCPPORT=32803 #UDP port rpc.lockd should listen on. #LOCKD_UDPPORT=32769 修改成: RQUOTAD_PORT=30001 LOCKD_TCPPORT=30002 LOCKD_UDPPORT=30003 MOUNTD_PORT=30004 STATD_PORT=30005
防火墙设置:
iptables -A INPUT -s 192.168.1.1 -p tcp --dport 111 -j ACCEPT iptables -A INPUT -s 192.168.1.1 -p udp --dport 111 -j ACCEPT iptables -A INPUT -s 192.168.1.1 -p tcp --dport 2049 -j ACCEPT iptables -A INPUT -s 192.168.1.1 -p udp --dport 2049 -j ACCEPT iptables -A INPUT -s 192.168.1.1 -p tcp --dport 30001:30005 -j ACCEPT iptables -A INPUT -s 192.168.1.1 -p udp --dport 30001:30005 -j ACCEPT
CentOS NFS配置
维基百科 - 网络文件系统