NFS协议的故障处理和安全分析


在之前的文章中,我们介绍了NFS协议的有关内容。想必大家对于它的基础概念,以及配置等有关内容已经有了了解了。这里我们主要讲解一下有关于NFS协议的故障解决以及相关安全的问题。

NFS协议故障解决

1、NFSD没有启动起来

首先要确认 NFS 输出列表存在,否则 nfsd 不会启动.可用 exportfs 命令来检查,如果 exportfs 命令没有结果返回或返回不正确,则需要检查 /etc/exports 文件.

2、 mountd 进程没有启动

mountd 进程是一个远程过程调用 (RPC) ,其作用是对客户端要求安装(mount)文件系统的申请作出响应.mountd进程通过查找 /etc/xtab文件来获知哪些文件系统可以被远程客户端使用.另外,通过mountd进程,用户可以知道目前有哪些文件系统已被远程文件系统装配,并得知远程客户端的列表.查看mountd是否正常启动起来可以使用命令rpcinfo进行查看,在正常情况下在输出的列表中应该象这样的行:

100005 1 udp 1039 mountd

100005 1 tcp 1113 mountd

100005 2 udp 1039 mountd

100005 2 tcp 1113 mountd

100005 3 udp 1039 mountd

100005 3 tcp 1113 mountd

如果没有起来的话可以检查是否安装了PORTMAP组件.

rpm -qa|grep portmap

3、fs type nfs no supported by kernel

kernel不支持nfs文件系统,重新编译一下 KERNEL就可以解决.

4、 can't contact portmapper: RPC: Remote system error - Connection refused

出现这个错误信息是由于SEVER端的PORTMAP没有启动.

5、 mount clntudp_create: RPC: Program not registered

NFS协议没有启动起来,可以用 showmout -e host命令来检查NFS SERVER是否正常启动起来.

6、mount: localhost:/home /test failed, reason given by server: Permission denied

这个提示是当 client要mount nfs server时可能出现的提示,意思是说本机没有权限去mount nfs server上的目录.解决方法当然是去修改NFS SERVER咯.

7、被防火墙阻挡

这个原因很多人都忽视了,在有严格要求的网络环境中,我们一般会关闭linux上的所有端口,当需要使用哪个端口的时候才会去打开.而NFS默认是使用111端口,所以我们先要检测是否打开了这个端口,另外也要检查 TCP_Wrappers的设定.

NFS安全

NFS的不安全性主要体现于以下4个方面:

1、新手对NFS的访问控制机制难于做到得心应手,控制目标的精确性难以实现

2、NFS没有真正的用户验证机制,而只有对RPC/Mount请求的过程验证机制

3、较早的NFS可以使未授权用户获得有效的文件句柄

4、在RPC远程调用中,一个SUID的程序就具有超级用户权限.

加强NFS协议安全的方法:

1、合理的设定/etc/exports**享出去的目录,最好能使用 anonuid,anongid以使MOUNT到NFS SERVER的CLIENT仅仅有最小的权限,最好不要使用root_squash.

2、使用IPTABLE防火墙限制能够连接到NFS SERVER的机器范围

iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT

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

3、为了防止可能的Dos攻击,需要合理设定NFSD 的COPY数目.

4、修改/etc/hosts.allow和/etc /hosts.deny达到限制CLIENT的目的

/etc/hosts.allow

portmap: 192.168.0.0/255.255.255.0 : allow

portmap: 140.116.44.125 : allow

/etc/hosts.deny

portmap: ALL : deny

5、改变默认的NFS协议的端口

NFS默认使用的是111端口,但同时你也可以使用port参数来改变这个端口,这样就可以在一定程度上增强安全性.

6、使用Kerberos V5作为登陆验证系统

修改/etc/hosts.allow和/etc/hosts.deny达到限制CLIENT的目的

/etc/hosts.allow

portmap: 192.168.0.0/255.255.255.0 : allow

portmap: 140.116.44.125 : allow

这个得多注意!!

/tmp *(rw,no_root_squash)

no_root_squash:登入到NFS主机的用户如果是ROOT用户,他就拥有ROOT的权限,此参数很不安全,建议不要使用.

有时需要执行umont卸载nfs盘阵时,会遇见device is busy的情况,字面意思理解为设备忙,有其他进程正在使用此设备.

此时需要用到命令fuser

其格式为: $ fuser -m -v  (nfs挂载点) 回车执行后得到的结果依次是:用户 进程号 权限 命令

此命令可以查看到访问此设备的所有进程,停止进程后umount.

如果添加参数 -k则可以一次性将所有当前访问nfs协议共享盘阵的进程停止 也可以加-i 打开交互显示,以便用户确认

或者用fuser命令:

#fuser -v -m 挂载点

即可查处 用户 PID等,KILL掉该进程后再umount.

或者

#umount -l 挂载点

选项 –l 并不是马上umount,而是在该目录空闲后再umount.还可以先用命令 ps aux 来查看占用设备的程序PID,然后用命令kill来杀死占用设备的进程,这样就umount的非常放心了.

相关内容