linux学习教程导航页🚥🚥🚥

🥬linux基本命令及测试1

🍒linux基础命令及测试2

🥪firewalld防火墙服务

🍀NFS服务搭建

在过往的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
2
3
4
5
6
7
systemctl start rpcbind

systemctl start nfs-server

systemctl enable rpcbind

systemctl enable nfs-server

查看rpc服务的注册情况,可使用rpcinfo的指令进行查看。

1
rpcinfo -p localhost

0

至此,NFS的服务安装完毕。

1.2 NFS的配置文件

NFS服务的配置文件为/etc/exports

建立分享的文件下

1
2
3
mkdir /share1

mkdir /share2

编辑/etc/exports,输入如下内容:

配置文件每行分为两段:第一段为共享的目录,使用绝对路径,第二段为客户端地址及权限。

1
2
3
/share1 *(sync,ro) 192.168.190.129(sync,rw)   ##输出"/share1"目录,对所有主机可读,对IP地址为192.168.190.129的主机可读可写。

/share2 192.168.190.0/24(sync,ro) ##输出"/share2"目录,对192.168.0.0/24网络内的所有主机可读。

地址可以使用完整IP或网段,例如10.0.0.8或10.0.0.0/24,10.0.0.0/255.255.255.0

当然也可以地址可以使用主机名,DNS解析的和本地/etc/hosts解析的都行,支持通配符,

例如:*.fsec.io

权限有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
·  rw:read-write,可读写;

· ro:read-only,只读;

· sync:文件同时写入硬盘和内存;

· async:文件暂存于内存,而不是直接写入内存;

· no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。

· root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;

· all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;

· anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;

· anongid:匿名用户的GID值。

编辑完成后,需要运行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
2
3
4
5
6
7
8
9
10
11
12
13
[root@centos /]# firewall-cmd --zone=public --add-port=111/tcp --permanent 

[root@centos /]# firewall-cmd --zone=public --add-port=111/udp --permanent

[root@centos /]# firewall-cmd --zone=public --add-port=2049/tcp --permanent

[root@centos /]# firewall-cmd --zone=public --add-port=2049/udp --permanent

[root@centos /]# firewall-cmd --zone=public --add-port=20048/tcp --permanent

[root@centos /]# firewall-cmd --zone=public --add-port=20048/udp --permanent

[root@centos /]# firewall-cmd --reload

success

1.3.1 showmount命令

showmount -e 显示本地NFS服务器中的共享列表

1
2
3
4
5
6
7
[root@centos /]# showmount -e

Export list for centos.test:

/share2 192.168.190.0/24

/share1 (everyone)

showmount -e IP 显示指定NFS服务器中的共享列表

1
2
3
4
5
6
7
8
9
┌──(root㉿fsec)-[/]

└─# showmount -e 192.168.190.130

Export list for 192.168.190.130:

/share2 192.168.190.0/24

/share1 (everyone)

如果kali中没有showmount的指令,可通过如下指令进行查询与安装:

1
2
3
apt-cache search showmount

apt-get install nfs-common
1.3.2 mount命令

mount命令用于挂载磁盘,在nfs的服务中,需要使用mount -t nfs 或者mount.nfs的指令进行指定挂载的类型。

使用挂载前先在客户端创建挂载点。

1
2
3
4
5
6
7
┌──(root㉿fsec)-[/]

└─# mkdir /mnt/share1

┌──(root㉿fsec)-[/]

└─# mkdir /mnt/share2

随后使用mount指令将远程主机的目录挂载至本机的目录。(2个挂载方式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
┌──(root㉿fsec)-[/]

└─# mount -t nfs 192.168.190.130:/share1 /mnt/share1

┌──(root㉿fsec)-[/]

└─# mount.nfs 192.168.190.130:/share2 /mnt/share2

┌──(root㉿fsec)-[/]

└─# df -h

文件系统 大小 已用 可用 已用% 挂载点

udev 3.9G 0 3.9G 0% /dev

tmpfs 792M 2.1M 790M 1% /run

/dev/mapper/fsec--vg-root 38G 30G 6.1G 84% /

tmpfs 3.9G 33M 3.9G 1% /dev/shm

tmpfs 5.0M 0 5.0M 0% /run/lock

/dev/sda1 455M 149M 282M 35% /boot

tmpfs 792M 2.5M 789M 1% /run/user/0

/dev/sr0 3.6G 3.6G 0 100% /media/cdrom0

192.168.190.130:/share1 36G 3.4G 32G 10% /mnt/share1

192.168.190.130:/share2 36G 3.4G 32G 10% /mnt/share2

当我们进入到挂载好的目录中,分别进行创建文件的测试,会发现虽然同时失败,但报错的信息却分别为权限不够只读文件系统

但我们所配置的权限中,特定的IP已经给予rw的权限,却提示权限不够。换言之,share2的权限是对的,share1的写入权限为错误状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──(root㉿fsec)-[/]

└─# cd /mnt/share1

┌──(root㉿fsec)-[/mnt/share1]

└─# touch test

touch: 无法 touch 'test': 权限不够

┌──(root㉿fsec)-[/mnt/share1]

└─# cd /mnt/share2

┌──(root㉿fsec)-[/mnt/share2]

└─# touch test

touch: 无法 touch ‘test’: 只读文件系统

exports目录权限中,有这么一个参数no_root_squash

其作用是:登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有root 的权限!。默认情况使用的是相反参数root_squash:在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的UID 与 GID 都会变成 nobody 那个身份。

为此重新修正权限后即可完成写入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@centos /]# vi /etc/exports

/share1 *(sync,ro) 192.168.190.129(sync,rw,no_root_squash)

/share2 192.168.190.0/24(sync,ro)

[root@centos /]# exportfs -r

[root@centos /]# exportfs

/share1 192.168.190.129

/share2 192.168.190.0/24

/share1

再次尝试一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(root㉿fsec)-[/mnt/share2]

└─# cd /mnt/share1

┌──(root㉿fsec)-[/mnt/share1]

└─# touch test

┌──(root㉿fsec)-[/mnt/share1]

└─# cd /mnt/share2

┌──(root㉿fsec)-[/mnt/share2]

└─# touch test

touch: 无法 touch ‘test’: 只读文件系统

1.3.3 卸除已挂载的目录

mount |grep nfs 显示当前主机挂载的NFS共享目录

1
2
3
4
5
6
7
┌──(root㉿fsec)-[/mnt/share2]

└─# mount | grep nfs

192.168.190.130:/share1 on /mnt/share1 type nfs4 (rw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.190.129,local_lock=none,addr=192.168.190.130)

192.168.190.130:/share2 on /mnt/share2 type nfs4 (rw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.190.129,local_lock=none,addr=192.168.190.130)

umount 命令卸载NFS 文件系统(不要在挂载的目录中进行操作)

1
2
3
umount /mnt/share1

umount /mnt/share2

1.4 备份数据的方案

假设现今我们在IDC的网络中,搭建了一台NFS的服务器用于给业务主机提供数据备份的服务。那么此时我们的需求可以梳理出大致需要完成以下三点的需要:

1 如果客户端重启后,那么挂载的连接将会失效,为此需要拥有自动挂载的方案。

2 备份的所拷贝的文件或文件夹时,需要采用时间戳进行命名,以便用于区分。

3 系统中哪些文件需要备份?

1.4.1 客户端自动挂载NFS

通过如下的命令,我们重新调整NFS的配置。

1
2
3
4
5
6
7
8
9
10
11
mkdir /backup

vi /etc/exports

cat /etc/exports

/backup 192.168.190.0/24(sync,rw,no_root_squash)

exportfs -r

exportfs

在客户机中,可通过使用rc.local的方式实现开机自动挂载。

在/etc/rc.local文件中添加如下内容:

1
mount.nfs 192.168.190.130:/backup /mnt/backup/

随后创建挂载点,并给/etc/rc.local执行权限。

1
2
3
mkdir /mnt/backup

chmod +x /etc/rc.local

重启主机后,可进入/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
2
3
4
5
6
7
8
9
10
11
cp /etc/hosts.allow /etc/hosts.allowbak

cp /etc/hosts.deny /etc/hosts.denybak

修改添加 /etc/hosts.allow

mountd:192.168.190.129        #cent7.0及以上设置方式

rpcbind: 192.168.190.129:allow #cent6.0设置方式

Portmap:192.168.190.129:allow     #cent5.0设置方式

修改添加 /etc/hosts.deny

1
2
3
4
5
mountd:all                         #cent7.0及以上设置方式

rpcbind:ALL:deny #cent6.0设置方式

Portmap:ALL:deny #cent5.0设置方式

这样就限制了只有192.168.190.129才能看到相关的信息

第二,NFS在位于内网中的情况,那么当攻击者拿到其中一台主机的权限后,可通过访问备份的目录进入到数据集中的区域。

第三,如果将敏感的目录共享出去,攻击者有可能查看到/etc/shadow或者编辑密钥实现攻击。


好用的Linux命令在线查询手册