NFS服务搭建
linux学习教程导航页🚥🚥🚥
在过往的IT体系中,磁盘的性能一直在制约着整体的性能。而诸如于云计算、备份数据等需求往往需要海量的空间。
在实际的场景中,可以将存储分为如下三类:
1 单机版存储 2 类私有网盘存储 3 分布式存储
单机版存储可以采用的方案如NFS、SMB等服务。
私有网盘存储可以采用FreeNAS、owncloud等方案。
分布式存储方案可以采用ceph、TFS等。
在企业的环境中可以进行针对性的选择,而出于企业备份数据的角度,课程中所讲述的存储方案为单机版与私有网盘的方案。
1.1 NFS服务搭建
在NFS的服务中,主要依赖于nfs-utils与rpcbind的来进行服务。
在centos中,使用如下命令安装所需服务
1 | dnf -y install rpcbind nfs-utils |
在NFS的服务的启动中,启动rpcbind后再启动nfs服务。
1 | systemctl start rpcbind |
查看rpc服务的注册情况,可使用rpcinfo的指令进行查看。
1 | rpcinfo -p localhost |
至此,NFS的服务安装完毕。
1.2 NFS的配置文件
NFS服务的配置文件为/etc/exports
建立分享的文件下
1 | mkdir /share1 |
编辑/etc/exports,输入如下内容:
配置文件每行分为两段:第一段为共享的目录,使用绝对路径,第二段为客户端地址及权限。
1 | /share1 *(sync,ro) 192.168.190.129(sync,rw) ##输出"/share1"目录,对所有主机可读,对IP地址为192.168.190.129的主机可读可写。 |
地址可以使用完整IP或网段,例如10.0.0.8或10.0.0.0/24,10.0.0.0/255.255.255.0
当然也可以地址可以使用主机名,DNS解析的和本地/etc/hosts解析的都行,支持通配符,
例如:*.fsec.io
权限有:
1 | · rw:read-write,可读写; |
编辑完成后,需要运行exportfs重新发布所共享的目录。(exportfs -r 重新读取配置文件)
[root@centos /]# exportfs -r
[root@centos /]# exportfs
/share1 192.168.190.129
/share2 192.168.190.0/24
/share1
如果需要重启服务,建议先重启rpcbind再重启NFS服务。
1.3 客户端的访问
客户端访问需要防火墙开启相关的端口命令如下(相关端口号查看1.2)
1 | [root@centos /]# firewall-cmd --zone=public --add-port=111/tcp --permanent |
success
1.3.1 showmount命令
showmount -e 显示本地NFS服务器中的共享列表
1 | [root@centos /]# showmount -e |
showmount -e IP 显示指定NFS服务器中的共享列表
1 | ┌──(root㉿fsec)-[/] |
如果kali中没有showmount的指令,可通过如下指令进行查询与安装:
1 | apt-cache search showmount |
1.3.2 mount命令
mount命令用于挂载磁盘,在nfs的服务中,需要使用mount -t nfs 或者mount.nfs的指令进行指定挂载的类型。
使用挂载前先在客户端创建挂载点。
1 | ┌──(root㉿fsec)-[/] |
随后使用mount指令将远程主机的目录挂载至本机的目录。(2个挂载方式)
1 | ┌──(root㉿fsec)-[/] |
当我们进入到挂载好的目录中,分别进行创建文件的测试,会发现虽然同时失败,但报错的信息却分别为权限不够与只读文件系统。
但我们所配置的权限中,特定的IP已经给予rw的权限,却提示权限不够。换言之,share2的权限是对的,share1的写入权限为错误状态。
1 | ┌──(root㉿fsec)-[/] |
touch: 无法 touch ‘test’: 只读文件系统
exports目录权限中,有这么一个参数no_root_squash。
其作用是:登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有root 的权限!。默认情况使用的是相反参数root_squash:在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的UID 与 GID 都会变成 nobody 那个身份。
为此重新修正权限后即可完成写入。
1 | [root@centos /]# vi /etc/exports |
再次尝试一下
1 | ┌──(root㉿fsec)-[/mnt/share2] |
touch: 无法 touch ‘test’: 只读文件系统
1.3.3 卸除已挂载的目录
mount |grep nfs 显示当前主机挂载的NFS共享目录
1 | ┌──(root㉿fsec)-[/mnt/share2] |
umount 命令卸载NFS 文件系统(不要在挂载的目录中进行操作)
1 | umount /mnt/share1 |
1.4 备份数据的方案
假设现今我们在IDC的网络中,搭建了一台NFS的服务器用于给业务主机提供数据备份的服务。那么此时我们的需求可以梳理出大致需要完成以下三点的需要:
1 如果客户端重启后,那么挂载的连接将会失效,为此需要拥有自动挂载的方案。
2 备份的所拷贝的文件或文件夹时,需要采用时间戳进行命名,以便用于区分。
3 系统中哪些文件需要备份?
1.4.1 客户端自动挂载NFS
通过如下的命令,我们重新调整NFS的配置。
1 | mkdir /backup |
在客户机中,可通过使用rc.local的方式实现开机自动挂载。
在/etc/rc.local文件中添加如下内容:
1 | mount.nfs 192.168.190.130:/backup /mnt/backup/ |
随后创建挂载点,并给/etc/rc.local执行权限。
1 | mkdir /mnt/backup |
重启主机后,可进入/mnt/backup目录中查看是否存在测试的文件即可。
1.4.2 通过计划任务自动挂载
首先我们先编写备份的脚本,以备份passwd文件为例:
1 | \#!/bin/bashdate="$(date +%F)"cp /etc/passwd /mnt/backup/pass_$date |
随后可通过计划任务进行配置周期性的运行脚本即可。
1.5 错误的NFS配置及相关的防护措施
第一,如果NFS暴露在公网中,虽然只给予了只读权限,那么外网主机通过访问共享即可得到敏感的数据。(showmount -e命令漏洞,可获取相关的挂载信息)
解决方案:
通过服务器器端的hosts.allow和hosts.deny两个文件限制
备份原有的hosts.allow和hosts.deny
1 | cp /etc/hosts.allow /etc/hosts.allowbak |
修改添加 /etc/hosts.deny
1 | mountd:all #cent7.0及以上设置方式 |
这样就限制了只有192.168.190.129才能看到相关的信息
第二,NFS在位于内网中的情况,那么当攻击者拿到其中一台主机的权限后,可通过访问备份的目录进入到数据集中的区域。
第三,如果将敏感的目录共享出去,攻击者有可能查看到/etc/shadow或者编辑密钥实现攻击。
好用的Linux命令在线查询手册




