RHCE网络文件系统(NFS)
服务端:
安装:
[root@server exports.d]# yum install nfs-utils
Loaded plugins: langpacks
Package 1:nfs-utils-1.3.0-0.el7.x86_64 already installed and latest version
启动服务:
[root@server exports.d]# systemctl status nfs-server
将NFS服务添加到防火墙放行规则内:
[root@server exports.d]# firewall-cmd --permanent --add-service=nfs
success
[root@server exports.d]# firewall-cmd --reload
success
[root@server exports.d]# firewall-cmd --list-all
public (default, active)
interfaces: eth0 eth1 eth2
sources:
services: dhcpv6-client dns mountd nfs rpc-bind samba smtp ssh
ports: 3260/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
配置文件:
[root@server exports.d]# cat /etc/exports
/nfs1 *(rw,sync)
/nfs2 *(rw,sync,sec=krb5p)
#/nfs1 *.example.com(ro,sync)
/nfs2 *.example.com(rw,sync,sec=krb5p)
/nfs3*.example.com(rw,sync)
也可以在/etc/exports.d目录下创建*.exports文件,在里面写入要导出系统上的目录即可
服务端配置:
[root@server exports.d]# pwd
/etc/exports.d
[root@server exports.d]# cat nfs3.exports
/nfs3*.example.com(rw,sync)
客户端配置:
[root@desktop misc]# showmount -e 172.25.0.11
Export list for 172.25.0.11:
/nfs1 *
/nfs3 *.example.com
/nfs2 (everyone)
修改配置文件后使配置文件生效:重新加载/etc/exports配置文件
[root@server exports.d]# exportfs -r
配置文件内容参数详解:
# sample /etc/exports file
/ master(rw) trusty(rw,no_root_squash)
/projects proj*.local.domain(rw)
/usr *.local.domain(ro) @trusted(rw)
/home/joe pc001(rw,all_squash,anonuid=150,anongid=100)
/pub *(ro,insecure,all_squash)
/srv/www -sync,rw server @trusted @external(ro)
/foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
/build buildhost[0-9].local.domain(rw)
语法:
系统导出的目录允许客户端来访问的条件(导出目录的属性)
/myshareserver0.example.com#只允许server0.example.com来挂载目录/myshare
/myshare*.example.com#允许example.com域中的所有子域来访问/myshare目录下的文件
/myshareserver[0-10].example.com #允许server0.example.com - server10.example.com来访问
/myshare172.25.0.10#只允许172.25.0.10来访问
/myshare172.25.0.10/24#只允许172.25.0.x网络下的所有主机来访问
/myshare2000:472:18:b51:c32:a21 #只允许这个IPV6地址的客户端来访问
/myshare2000:134:234:234:234::/64#只允许这个IPV6子网下的主同来访问
/myshare*.example.com 172.25.0.0/24 #允许多个匹配的客户端来访问
导出目录的属性:
Ro:只读
RW读写
no_root_squash:登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用!
root_squash(默认):在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个系统账号的身份。
客户端:root_squash(默认)
默认情况下如果客户端是root用户,将无法创建文件,因为以root用户创建文件时,使用的用户权限是nfsnobody:nfsnobody,而服务器的默认文件夹是禁止其它用户(nfsnobody)有写权限:
所以在客户端root用户无法创建文件
[root@desktop nfs3]# >rsc
-bash: rsc: Permission denied
将服务端的文件夹修改在其它用户也可以写时,客户端才可以创建文件,创建文件的所属用户和组为nfsnobody:nfsnobody
服务端:
[root@server nfs3]# ls -dl /nfs3
drwxr-xr-x. 2 root root 6 Dec 18 13:55 /nfs3
[root@server nfs3]# chmod o+w /nfs3
[root@server nfs3]# ls -dl /nfs3
drwxr-xrwx. 2 root root 6 Dec 18 13:55 /nfs3
客户端:
[root@desktop nfs3]# >rscpass
[root@desktop nfs3]# ls
rscpass
[root@desktop nfs3]# ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Dec 18 14:37 rscpass
也可以在服务端就创建以nfsnobody为用户的文件夹,这样用默认配置,客户端如果以root用户登录的话,就可以创建和删除文件了
[root@server /]# chown nfsnobody /nfsshare/
[root@server /]# ls -dl /nfsshare/
drwxr-xr-x. 2 nfsnobody root 6 Dec 18 14:47 /nfsshare/
[root@desktop nfsshare]# >rscgmy
[root@desktop nfsshare]# ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Dec 18 14:51 rscgmy
在客户端查看服务端导出的目录列表:
[root@desktop misc]# showmount -e 172.25.0.11
Export list for 172.25.0.11:
/nfs1 *
/nfs3 *.example.com
/nfs2 (everyone)
在客户端挂载服务端导出的目录:
[root@desktop ~]# mount -t nfs 172.25.0.11:/nfs3 /mnt/nfs3
[root@desktop ~]# mount
172.25.0.11:/nfs3 on /mnt/nfs3 type nfs4 (rw,relatime,vers=4.0,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.25.0.10,local_lock=none,addr=172.25.0.11)
[root@desktop ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 xfs 10G 3.1G 6.9G 31% /
devtmpfs devtmpfs 734M 0 734M 0% /dev
tmpfs tmpfs 750M 0 750M 0% /dev/shm
tmpfs tmpfs 750M 17M 733M 3% /run
tmpfs tmpfs 750M 0 750M 0% /sys/fs/cgroup
172.25.0.11:/nfs3 nfs4 10G 3.5G 6.6G 35% /mnt/nfs3
保护NFS导出:
默认情况下,nfs不需要身份验证,仅根据客户端的IP地址或主机名来强制实施访问权限限制
通过krb5p来保护对文件的访问:
NFS客户端必须使用为已导出共享规定的方法之一连接到该共享,该方法以挂载选项sec=method 的形式指定
安全性方法: sec=none|sys|krb5|krb5i|krb5p
None:可对文件进行匿名访问,对服务器的写入将分配UID 和GID为nfsnobody,这需要selinux的布尔值nfsd_anon_wirte处于活动状态:
[root@desktop ~]# getsebool -a | grep nfsd
nfsd_anon_write --> off
Sys:文件访问权限基于UID和GID值的标准linux文件权限,如果没有指定,是信认客户端的任何UID
Krb5:客户端必须使用kerberos证明身份,再使用标准的linux权限来访问
Krb5i:添加加密性的保证,确保每个请求的数据未被篡改
Krb5p:为客户端和服务器的所有请求加密,防止数据泄露
配置前题条件:
时间同步:
Server端,desktop端,以及classroom端时间一定要同步,server,desktop一起同步classroom的时间
Server端:
[root@mail ~]# cat /etc/chrony.conf | grep server
server classroom.example.com iburst
[root@mail ~]# chronyc sources -V
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* classroom.example.com 8 6 377 52 +14us[ +26us] +/- 303us
Desktop端:
[root@desktop ~]# cat /etc/chrony.conf | grep server
server classroom.example.com iburst
[root@desktop ~]# chronyc sources -V
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* classroom.example.com 8 6 377 22 +68us[ +461us] +/- 196us
服务端server和客户端desktop的主机名要与kerberos上面认证的主机名要相同
服务端安装:
1.安装nfs-utils
[root@mail ~]# yum install nfs-utils
Loaded plugins: langpacks
Package 1:nfs-utils-1.3.0-0.el7.x86_64 already installed and latest version
2启动以下两个服务:
[root@mail ~]# systemctl start nfs-secure-server.service
nfs-secure-server.service - Secure NFS Server
Loaded: loaded (/usr/lib/systemd/system/nfs-secure-server.service; enabled)
Active: active (running) since Mon 2017-12-18 13:59:39 CST; 6 days ago
[root@mail ~]# systemctl start nfs-server.service
nfs-server.service - NFS Server
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled)
Active: active (exited) since Mon 2017-12-18 13:59:39 CST; 6 days ago
3./etc/sysconfig/nfs中声明使用nfs4以上版本:RPCNFSDARGS="-V 4.2"
Cat /etc/sysconfig/nfs
# Optional arguments passed to rpc.nfsd. See rpc.nfsd(8)
RPCNFSDARGS="-V 4.2"
4.下载用于服务端认证的keytab,并将密钥存入/etc下,如下:
[root@mail ~]# wget http://classroom.example.com/pub/keytabs/server0.keytab -O /etc/krb5.keytab
[root@mail ~]# file /etc/krb5.keytab
/etc/krb5.keytab: data
验证krb5.keytab配置文件是否有效:
[root@server0 ~]# klist -k
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
2 host/server0.example.com@EXAMPLE.COM
2 host/server0.example.com@EXAMPLE.COM
2 host/server0.example.com@EXAMPLE.COM
2 host/server0.example.com@EXAMPLE.COM
2 host/server0.example.com@EXAMPLE.COM#服务端的主机名一定是server0.example.com
5.在/etc/exports中进行共享目录的设置,需要声明使用的认证方式,如下:
创建要共享的目录:
Mkdir -p /public
Mkdir -p /protected
编写配置文件
[root@server0 etc]# cat /etc/exports
/public 172.25.0.0/24(ro)
/protected172.25.0.0/24(rw,sec=krb5p,sync)
使配置文件生效:
[root@server0 etc]# exportfs -r
6. 防火墙进行放行
#firewall-cmd --add-service=nfs --permanent
#firewall-cmd --reload
7.重启服务,注意,此处需要重启 nfs-server.service和nfs-secure-server.service两个服务
[root@mail exports.d]# systemctl restart nfs-server.service
[root@mail exports.d]# systemctl restart nfs-secure-server.service
8. 查看本地导出的目录:
[root@server0 /]# showmount -e localhost
Export list for localhost:
/protected 172.25.0.0/24
/public 172.25.0.0/24
客户端安装:
1.安装nfs-utils
[root@desktop ~]# yum install nfs-utils
重启服务
[root@desktop0 ~]# systemctl restart nfs-secure
[root@desktop0 ~]# systemctl status nfs-secure
2.下载和服务器匹配的密钥认证,如下:
[root@desktop ~]# wget -O /etc/krb5.keytab http://classroom.example.com/pub/keytabs/desktop0.keytab
[root@desktop ~]# file /etc/krb5.keytab
/etc/krb5.keytab: data
验证krb5.keytab配置文件是否有效:
[root@desktop0 ~]# klist -k
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
2 host/desktop0.example.com@EXAMPLE.COM
2 host/desktop0.example.com@EXAMPLE.COM
2 host/desktop0.example.com@EXAMPLE.COM#客户端的主机名一定是desktop0.example.com
/etc/sysconfig/nfs中声明使用nfs4以上版本:RPCNFSDARGS="-V 4.2"
Cat /etc/sysconfig/nfs
# Optional arguments passed to rpc.nfsd. See rpc.nfsd(8)
RPCNFSDARGS="-V 4.2"
3. 通过krb5p加密的方式挂载服务端的NFS文件系统:
[root@desktop ~]# mount -t nfs -o sync,rw,sec=krb5p 172.25.0.11:/protected /mnt/protected
添加到/etc/fstab
server0:/public/mnt/publicnfsdefaults,v4.20 0
server0:/protected/mnt/protectednfsdefaults,sec=krb5p,v4.20 0
验证/etc/fstab文件,并自动挂载
[root@desktop0 ~]# mount -a
4.查看已挂载的目录:
[root@desktop0 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 xfs 10G 3.2G 6.9G 32% /
devtmpfs devtmpfs 734M 0 734M 0% /dev
tmpfs tmpfs 750M 140K 749M 1% /dev/shm
tmpfs tmpfs 750M 17M 733M 3% /run
tmpfs tmpfs 750M 0 750M 0% /sys/fs/cgroup
/dev/sda xfs 1014M 33M 982M 4% /iscsidisk
server0:/public nfs4 10G 3.7G 6.4G 37% /mnt/public
server0:/protected nfs4 10G 3.7G 6.4G 37% /mnt/protected
5.查看挂载的参数:
server0:/public on /mnt/public type nfs4 server0:/public on /mnt/public type nfs4 (rw,relatime,seclabel,vers=4.2,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.25.0.10,local_lock=none,addr=172.25.0.11)
server0:/protected on /mnt/protected type nfs4 (rw,relatime,seclabel,vers=4.2,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=krb5p,clientaddr=172.25.0.10,local_lock=none,addr=172.25.0.11)
注意:/mnt/public是以sec=sys的方式挂载,可以通过正常的系统用户权限来配置
/mnt/protected是以sec=krb5p的方式挂载,只有krb5p认证的用户才有写权限,其它用户只有读权限
SELinux 和标记NFS
NFS挂载具有nfs_t的selinux上下文,与其在提供导出的服务器上的selinux上下文无关
服务端:
修改服务器的NFS版本为4.2版本,以提供selinux导出到客户端的功能:
[root@server0 ~]# cat /etc/sysconfig/nfs | grep RPCNFSDARGS
RPCNFSDARGS="-V 4.2"
重启服务:
[root@server0 ~]# systemctl restart nfs-server.service
[root@server0 ~]# systemctl restart nfs-secure-server.service
客户端:
修改客户端导出的SELinux上下文
[root@desktop0 ~]#
mount -o context="system_u:object_r:public_content_rw_t:s0",sec=krb5p,v4.2 server0:/protected /mnt/protected
[root@desktop0 ~]# ll -Z /mnt/protected/testfile.txt
-rwxr-xr-x. ldapuser1 ldapuser1 system_u:object_r:public_content_rw_t:s0 /mnt/protected/testfile.txt
关于selinux的权限:
默认NFS可以对系统上所有文件进行读写
默认启动的值为:nfs_export_all_ro nfs_export_all_rw
对于NFS可以读取的内容,应该具有以下selinux上下文:public_content_t 或nfs_t
对于NFS可以读写的内容:应该具有以下SELINUX上下文:public_content_rw 或nfs_t
如果使用public_content_rw上下文,则必须启用nfsd_anon_write布尔值以允许写入
扩展配置:
NFS服务器与客户端的搭建与配置
nfs用于linux之间共享文件目录,客户端可以将nfs服务器上共享的目录挂载到客户端本地,当作一个磁盘分区。
nfs在centos7.0中默认版本为3,但是在centos7.0中已经添加了了nfs4,nfs4版本中新增加了更安全的身份验证支持以及kerberos加密,由于默认还是使用版本3,所以如果客户端希望使用kerberos加密,则需要在服务器端和客户端同时进行配置
服务器端:在/etc/sysconfig/nfs内声明一下nfs版本,RPCNFSDARGS="-V 4.2"
注意:nfs的主要配置文件是/etc/exports,辅助配置文件是/etc/sysconfig/nfs
客户端:在挂载时声明版本:nfs server:/nfs2 /mnt/nfs2 nfs defaults,v4.2,sec=krb5p 0 0
不加密的nfs服务器配置:
1.安装nfs-utils
2.在/etc/exports文件内进行共享文件路径、权限、允许访问网段等参数配置,格式如下:
共享目录路径 允许访问的网段(权限参数)
/nfs1 172.25.0.0/24(ro,sync) #表示/nfs1可以由172.25.0.0/24网段内主机访问,read only,sync
★关于权限参数的下关系说明(如:ro,rw,sync等)
ro:该主机对该共享目录有只读权限
rw:该主机对该共享目录有读写权限
root_squash:客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户
no_root_squash:客户机用root访问该共享文件夹时,不映射root用户
all_squash:客户机上的任何用户访问该共享目录时都映射成匿名用户
anonuid:将客户机上的用户映射成指定的本地用户ID的用户
anongid:将客户机上的用户映射成属于指定的本地用户组ID
sync:资料同步写入到内存与硬盘中
async:资料会先暂存于内存中,而非直接写入硬盘
insecure:允许从这台机器过来的非授权访问
3.给nfs所需要的服务在防火墙放行
firewall-cmd --permanent --add-server=nfs
firewall-cmd --permanent --add-server=mountd
firewall-cmd --permanent --add-server=rpc-bind
简单说一下rpc,rpc服务的主要功能就是指定每个nfs功能所对应的端口号,并通知给客户端,让客户端连接正确的端口号,因为nfs启动时端口号不固定,nfs服务启动时会随机选择一个可用的端口,然后向rpc服务报告,说明nfs服务现在所占用的端口,所以,rpc必须在nfs启动前启动,没有rpc,nfs服务无法正常使用。
不加密nfs客户端配置方式:
1.安装nfs-utils
2.防火墙放行相关服务
3.本地fstab中挂载共享目录,如下:
server0:/nfs1 /mnt/nfs1 nfs defaults 0 0
注意:
之前学习时,在挂载samba服务时的方式为://samba server/smb1,
而在挂载nfs时为:nfs server:/nfs1,不要搞错。
4.mount -a
5.df查看挂载是否成功。
使用kerberos加密的nfs服务器配置方式:
1.安装nfs-utils
2./etc/sysconfig/nfs中声明使用nfs4以上版本:RPCNFSDARGS="-V 4.2"
3.下载用于认证的keytab,并将密钥存入/etc下,如下:
wget http://classroom.example.com/pub/keytabs/server.keytab -O(字母大写O) /etc/krb5.keytab
4.在/etc/exports中进行共享目录的设置,需要声明使用的认证方式,如下:
/nfs2 172.25.0.0/24(rw,sync,sec=krb5p)
5.防火墙进行放行
6.重启服务,注意,此处需要重启 nfs-server.service和nfs-secure-server.service两个服务
使用kerberos加密的nfs客户端配置方式:
1.安装nfs-utils
2.下载和服务器匹配的密钥认证,如下:
wget http://classroom.example.com/pub/keytabs/client.keytab -O(字母大写O) /etc/krb5.keytab
3.进行挂载,需要声明使用的kerberos类型以及nfs版本
server0:/nfs2 /mnt/nfs2 nfs defaults,v4.2,sec=krb5p 0 0 #注意v4.2和sec=krb5p这两个选项
4.mount -a
5.df
稍微说一下krb5p这个东西,nfs加密的方式,一共有三种方式krb5,krb5i,krb5p: krb5 基于Kerberos票据的认证;krb5i 挂载时校验数据完整性;krb5p通过kerberos认证,并且对数据进行加密。正常的下载的kerberos密钥均包含这三种方式,自己选择即可。
kerberos的作用其实就是利用客户端和服务器两端对称的密钥,在客户端发送给服务器请求时,用客户端这面的证书密钥进行加密,然后传到服务器端,用对称的证书密钥解析后,得到服务器的验证,证明确实是客户端发过来的,并且在传递过程中没有被改动过,这就是kerberos的作用。