运维安全之NFS安全

rootsecurity 2014-04-20 14:46:00

说起NFS是(Network File System)的缩写,相信这很多人都知道。其最大的优点就是可以在网络里使不同的主机,不同的操作系统来互相分享文件。由于NFS不像WEB那样经常使用,一般也就用到的时候去网上随便找篇文档安装一下,剩下的就是能用就行了。所以安全性往往是比较容易忽略的问题。

NFS的联动进程有nfsd,rpc.mountd,rpc.statd, locked,rpc.idmapd,rpc.gssd,rpc.svcgssd,其主进程nfsd使用的是TCP/UDP的2049端口,其中TCP协议是在V3版本才引入的。下面是NFS的发展历程:

NFS V1是SUN公司研发,包含在SUN操作系统里。
NFS V2是最原始的NFS协议,在RFC1904中有相关描述,这个版本是基于UDP的,单个文件最大支持4G
NFS V3在RFC1813中描述,相对于V2增加了TCP协议的相关支持,安全异步,服务端ACL,V3相对于V2来说性能上有一个很大的提升,但是安全性并没有多少改进。
NFS V4在RFC3530中描述,相对于V3版本,它把lock喝mount整合进协议中,开发了新的AC L控制机制,引入对UTF-8字符集的支持,NFS V4要求所有实现都必须支持kerberos的身份验证,替代了原有的基于UID/GID的身份验证

下面阐述一下V3的连接过程:

NFSv3协议的服务器端是无状态的,所以就算机器重启了,NFS服务起来以后,客户端依然可以拿着旧文件句柄继续读写文件。但是服务器端的lockd进程是有状态的,重启就有点麻烦,解决方案是服务器端的rpc.statd让客户端报告自己手里的锁,然后重新让lockd恢复锁状态。

客户端问服务器端的portmap:rpc.mount目前的用哪个端口?客户端向服务器端的rpc.mount请求挂载NFS; 服务器端的rpc.mount判断权限后给客户端一个文件句柄; 客户端使用这个句柄与服务器端的nfsd交流(使用TCP/UDP的2049端口),以读写文件。

NFS V3的验证机制及安全:

NFS V3及其附属协议采用标准的RPC AUTH_SYS(又称AUTH_UNIX)机制验证挂载后的客户端对具体文件的权限,服务器完全信任客户端声名的自己的权限(其实不能被称为是“验证”了

大概过程就是客户端会在读写之前告诉服务器自己的UID和GID,然后NFS就把这些ID视同自己系统上的ID来验证权限;

客户端可以很容易伪造出高权限的ID以达到攻击的目的,防御的临时解决之道是不让NFS暴露在公有网络上且不打开NFS的root权限(是比较弱的防御)

还有一个麻烦是,不同客户端上同一个username的UID想保持同步是件不容易的事。

不要把包含配置文件的目录export出去

export整个文件系统的根出去,而不是export文件系统中某个目录出去。因为即使只是export一个目录出去,攻击者也可能通过猜测的方式得到文件系统中其它目录的读写权限。比如说一个ext3挂载在/mnt/下了,用NFS export/mnt/data1/出去,攻击者就可能读写/mnt/data2/下的文件。这显然不是我们希望的,因此不如干脆共享整个文件系统(也就是/mnt/)出去。或者也可以使用NFS的substree_check来帮我们做检查来防止这种入侵,但是这个选项会较大幅度降低NFS的性能

如果一个文件系统挂载点是另一个文件系统的子目录,那么父系统开启crossmnt或者子系统开启nohide就可以把两个文件系统都共享出去,使用这个选项的时候要小心,别共享了自己不想共享的内容出去

虽然nfsd固定使用2049端口,但是lockd、mountd、statd都使用portmap随机分配的端口,这让防火墙很难配置,而且还可能占用还没起来的其它服务的端口。可以在/etc/sysconfig/nfs中把这些进程的端口都配置成固定的,这样配置防火墙(只放行自己信任的IP)就容易了

rpcinfo -p可以查看portmap分配出去的端口。

评论

X

xsser 2014-04-20 14:50:39

洞主怎么扫描啊

Y

yangff 2014-04-21 08:31:24

它把lock[喝]mount

Y

yangff 2014-04-21 08:34:32

比如说一个ext3挂载在/mnt/下了,用NFS export/mnt/data1/出去,攻击者就可能读写/mnt/data2/下的文件。这显然不是我们希望的,因此不如干脆共享整个文件系统(也就是/mnt/)出去。
这是什么逻辑……

S

Spy4man 2014-04-21 10:50:38

111,2049

我是壮丁 2014-04-21 12:14:11

我就不发表观点了。。。。。。。

路人甲 2014-04-21 20:24:14

我不会告诉你,可以showmount 然后 nfs 挂载到本地。啊哈哈。。。。

W

winsyk 2014-04-22 16:11:27

只有最后一句是重点。

小贱人 2014-04-24 00:15:57

mark

霍大然 2014-04-24 11:20:21

一般在/etc/exports文件内做访问控制吧

S

sipcer 2014-04-25 11:23:32

不明觉厉

T

Tea 2015-09-24 17:40:07

这种服务怎么解决内网IP地址泄漏,比如如下配置:
/nfstest 192.168.1.*(rw,no_root_squash,no_all_squash,sync,insecure)
外网showmount -e 222.222.222.222
就会泄漏机器的内网IP段了,如:
Export list for 222.222.222.222:
/nfstest 192.168.1.*
虽然不能mount,除了直接阻止外网IP访问这个服务端口(mount也就内网的可以mount了),比如iptables等,配置上还有什么办法隐藏这些信息什么的?
这东西貌似在泄漏内网IP上,并没有什么人注意,更多的人注意的是能否成功远程mount,然后读写文件。

R

rootsecurity

关注开源,关注网络安全! INSERT INTO `wooyun`.`wooyun_user` (`ID`, `NICKNAM

twitter weibo github wechat

随机分类

PHP安全 文章:45 篇
企业安全 文章:40 篇
Python安全 文章:13 篇
Java安全 文章:34 篇
memcache安全 文章:1 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Article_kelp

因为这里的静态目录访功能应该理解为绑定在static路径下的内置路由,你需要用s

N

Nas

师傅您好!_static_url_path那 flag在当前目录下 通过原型链污

Z

zhangy

你好,为什么我也是用windows2016和win10,但是流量是smb3,加密

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

目录