Chapter8 - 提供基于文件的存储
导出 NFS 文件系统
什么是 NFS ?
网络文件系统(NFS) 是UNIX 系统和网络附加存储设备常用的网络文件系统,允许多个客户端通过网络共享文件访问。通过它,可以从客户端系统访问共享目标或文件。
警告
NFS 协议通过网络以明文格式传输数据。此外,服务器要依靠客户端识别用户。不建议你在未使用Kerberos 身份验证和加密的情况下导出包含敏感信息的目录。
NFS 导出(exports)
NFS 服务器安装要求安装 nfs-utils 软件包,此软件包提供了使用 NFS 将目录导出到客户端而必需的所有程序。用于NFS 服务器导出的配置文件为 /etc/exports文件。
/etc/exports 文件列出了要通过网络而与客户端主机共享的目录,并且指示哪些主机或网络对导出具有访问权限。
注意
可以不必将导出所需的信息添加到 /etc/exports 文件,而将新创建的名为 *.exports 的文件添加到保存导出配置的 /etc/exports.d/目录。
警告
RHEL 7 中不支持使用 NFS 和 Samaba 导出同一目录,因为 NFS 和 Samba 使用不同的文件锁定机制,这可以导致文件损坏。
可以列出一个或多个客户端,以空格分隔,形式:
DNS 可解析的主机名,如 server0.example.com 中导出 /myshare 目录并且由 desktop0.example.com 挂载。
/myshare desktop0.example.com
DNS 可解析的主机名,包含通配符 * (表示多个字符)和 / 或 ?(表示单个字符) 。 以下示例允许 example.com 域中的所有子域访问NFS 导出。
/myshare *.example.com
DNS 可解析的主机名,包含在方括号中的字符类列表。在此示例中,主机 server0.example.com 、server1.example.com 直到 server20.example.com 均可访问 NFS 导出。
/myshare server[0-20].example.com
IPv4 地址。以下示例允许从 172.25.11.10 IP 地址访问 /myshare NFS 共享。
/myshare 172.25.11.10
IPv4网络。此示例显示 /etc/exports 条目,此条目允许从172.25.0.0/16 网络中心访问 NFS 导出的目录 /myshare
/myshare 172.25.0.0/16
不含方括号的 IPv6 地址,以下示例允许带有 IPv6 地址 2000:472:18:b51:c32:a21 的客户端访问 NFS 导出的目录 /myshare
/myshare 2000:472:18:b51:c32:a21
不含方括号的 IPv6 网络。此示例允许 IPv6网络 2000:472:18:b51::/64 访问 NFS导出
/myshare 2000:472:18:b51::/64
通过指定多个目标及其选项(用空格分隔),后跟要导出的目录,便可同时将某个目录导出到多个目标。
/myshare *example.com 172.25.0.0/16
(可选)圆括号中可能将一个或多个导出选项指定为逗号分隔列表,后面紧跟每个客户端定义。常用导出选项包括:
ro ,只读:未指定任何设置时的默认设置。允许使用某个条目来显示指定此设置。限制 NFS 客户端读取 NFS 共享中的文件。禁止任何写操作。以下示例显式为 server0.example.com 主机规定 ro 标志。
/myshare desktop0.example.com(ro)
rw,读写:允许对 NFS 客户端进行读写访问。在以下示例中,desktop0.example.com 能够只读方式访问NFS 导出,而 server[0-20].example.com对 NFS 共享具有读写访问权限
/myshare desktop0.example.com(ro) server[0-20].example.com(rw)
no_root_squash:默认情况下,NFS 服务器将 NFS 客户端上的 root 视作用户 nfsnobody.即如果 root 尝试通过挂载的导出访问文件,服务器将其视作用户 nfsnobody 访问。在 NFS 导出被无磁盘客户端用做 / 和 root 需要被当作 root 情况下,这种安全措施存在隐患。若要禁用此保护,服务器需要将 no_root_squash 添加到 /etc/exports 中为导出设置的选项列表。
以下示例允许客户端 diskless.example.com 读写,并且实际的 root 用户访问导出的 NFS 目录 /myshare
/myshare diskless.example.com(rw,no_root_squash)
警告
请注意,此特定配置并不安全,并且最好与 Kerberos 身份验证和完整性检查一起完成
配置 NFS 导出
1、在serverX 上使用 systemctl 命令启动 NFS 服务
[root@server0]# systemctl start nfs-server
2、在serverX上,使NFS 服务在系统启动时启动
[root@server0]# systemctl enable nfs-server
3、创建目录 /myshare 以通过 NFS 将其在serverX 系统上共享
[root@server0]# mkdir /myshare
4、将 serverX 上的 /myshare 目录作为支持读写的共享来导出 desktopX 客户端。为此,请向 serverX 上的 /myshare 文件中添加以下行
/myshare desktopX(rw)
5、在保存了更改的 /etc/exports 文件后,通过执行 exportfs -r 来应用更改
[root@server0]# exportfs -r
6、必须在服务器上打开用于 nfsd 的 NFS 端口 2049/tcp 。要将 firewalld 配置为支持即时访问 NFS导出,请运行
[root@server0]# firewall-cmd --permanent --add-port=2049/tcp(--add-service=nfs)
7、重新加载 firewalld 规则,以便应用新规则。
[root@server0]# firewall-cmd --load
8、在desktopX 系统上使用新创建的挂载点 /mnt/nfsexport 来挂载 NFS 导出的目录。
[root@desktop0]# mkdir /mnt/nfsexport
9、在 desktopX 系统上,现在可以使用 mount 命令将共享挂载在新创建的挂载点 /mnt/nfsexport 上。
[root@desktop0]# mount serverX:/myshare /mnt/nfsexport
保护 NFS 导出
支持Kerberos 的导出
默认情况下,NFS 不要身份验证,仅根据客户端的 IP 地址或主机名来强制实施访问权限限制。为补救这一点,NFS 服务器使用多种方法提供了一些选项来保护对文件的访问:none、sys、krb5、krb5i 和 krb5p。 NFS 服务器可以选择为每个导出的共享提供一种方法或多种方法。NFS客户端必须使用为已导出共享规定的方法之一连接到该共享,该方法以挂载选项 sec=method 的形式指定。
安全性方法
none:可对文件进行匿名访问,对服务器的写入将分配为使用 UID 和 GID nfsnobody 。这需要 SELinux 的布尔值 nfsd_anon_write 处于活动状态。
sys: 文件访问权限基于 UID 和 GID 值的标准 Linux 文件权限。如果未指定,则此方法是默认值。 NFS 服务器信任客户端发送的任何 UID 。
krb5: 客户端必须使用Kerberos 证明身份,然后适用标准Linux 文件权限。 UID/GID 根据访问用户的Kerberos 主体来确定。
krb5i:添加加密性强的保证,确保每个请求中的数据未被篡改。 UID/GID 根据访问用户的 Kerberos 主体来确定。
krb5p: 为客户端与服务器之间的所有请求添加加密,防止网络中的数据泄露。这次影响性能,但会提供最好的安全性,UID/GID 根据访问用户的 Kerberos来确定。
要使用任何使用 Kerberos 服务器的安全性选项,除了导出 NFS 共享的系统上的 nfs-server 服务之外 ,还需要运行 nfs-secure-server 。客户端要求运行 nfs-secure 服务帮助协商 Kerberos 身份验证。
重要
Kerberos 选项至少需要 /etc/krb5.keytab 和本节中未论述的其他身份验证配置(加入 Kerberos 域)。/etc/krb5.keytab 通常将由身份验证或安全性管理员提供。请求包含主机和 / 或 nfs 主体的 keytab。
配置支持 Kerveros 的NFS 服务器
在本示例中,NFS 服务器将 /securedexport 目录导出到 example.com 的所有子域。客户端在 /mnt/securedexport 挂载点上挂载NFS 导出。
1、在将要充当NFS 服务器的 ServerX 系统上安装 http://classroom.example.com/pub/keytabs/serverX.tab 中提供的 keytab
[root@server0 ~]# wget -O /etc/krb5.keytab http://classroom.example.com/pub/keytabs/server0.keytab
2、对于包含 Kerberos 安全性的 NFS ,需要运行 nfs-secure-server 。在 serverX 系统上启动 nfs-secure-server 服务器
[root@server0 ~]# systemctl start nfs-secure-server
3、在 serverX 上,使 nfs-secure-server 在系统启动时启动
[root@server0 ~]# systemctl enable nfs-secure-server
4、在serverX 上创建目录 /securedexport 。此目录将用作 NFS 导出。
[root@server0 ~]# mkdir /securedexport
5、向 /etc/exports 文件中添加目录 /securedexport 以通过 NFS 将其导出。启用 krb5p 安全性以保护对 NFS共享访问。允许从 example.com 域的所有子域对导出的目录进行读写访问。
[root@server0 ~]# echo '/securedexport *.example.com(sec=krb5p,rw)' >> /etc/exports
6、在保存了更改的 /etc/exports 文件后,通过执行 exportfs -r 来应用更改。
[root@server0 ~]# exportfs -r
7、必须在服务器上打开用于 nfsd 的 NFS 端口 2049/tcp 。要将 firewalld 配置为支持即时访问 NFS 导出。请运行:
[root@server0 ~]# firewall-cmd --permanent --add-service=nfs
8、重新加载 firewalld 规则,以便应用新规则。
[root@server0 ~]# firewall-cmd --reload
9、在将要充当 NFS 客户端的 desktopX 系统上安装所提供的 keytab 。在 desktopX 系统上挂载krb5p 保护的共享。
[root@server0 ~]# wget -O /etc/krb5.keytab http://classroom.example.com/pub/keytabs/desktop0.keytab
10、连接到 Kerberos 保护的共享时,NFS 使用客户端上的 nfs-secure 服务来帮助协商和管理与服务器之间的通信。此服务必须正在运行,才能使用受保护的 NFS 共享;对其使用 start 和 enable 命令以确保其始终在 dexktopx 系统中可用。
[root@desktop0 ~]# systemctl enable nfs-secure
[root@desktop0 ~]# systemctl start nfs-secure
注意
nfs-secure 服务是nfs-utils 软件包的一部分,默认情况下应该已安装该软件包。如果未安装,请运行
[root@desktop0 ~]# yum install nfs-utils -y
11、挂载点必须存在才能在 desktop0 系统上挂载来自serverX 的krb5p 保护导出。将在 desktop0 系统上创建 /mnt/securedexport 。
[root@desktop0 ~]# mkdir /mnt/securedxport
12、导出的目录现在可以挂载在 desktop0 系统上,同时启用krb5p 安全性
[root@desktop0 ~]# mount -o sec=krb5p server0:/securedexport /mnt/securedexport
13、要清空以进行下一个演示,需要在 desktop0 系统上卸载 /mnt/securedexport 挂载点。
[root@desktop0 ~]# umount /mnt/securedexport
SELinux 和标记 NFS
SELinux 通过锁定 RHEL 中提供的服务的功能,从而提供了额外的安全性。默认情况下,NFS 挂载具有SELinux 上下文 nfs_t ,与其在提供导出的服务器上的 SELinux 上下文无关。
可以使用挂载选项 context="selinux_context"在客户端上更改此行为。以下示例将挂载 NFS 导出并强制实施 SELinux 上下文:system_u:object_r:public_content_rw:public_content_rw:s0
[root@desktop0 ~]#mount -o context='system_u:object_r:public_content_rw:s0' server0:/myshare /mnt/nfsexport
通过切换到 NFS 版本 4.2 ,可以强制 NFS 服务器正确导出共享的 SELinux 上下文。此规范目前仅作为 Internet 草稿存在。这在 RHEL 附带的NFS 服务器中已经实施。但是需要显式开启。
要在 server0 系统上启用 NFS 版本4.2 以导出 SELinux 标签,请将 /etc/sysconfig/nfs 文件中的RPCNFSDARGS=""行更改为:
RPCNFSARGS="-V 4.2"
nfs-server 或 nfs-secure-server 分别需要重新启动。
systemctl restart nfs-secure
systemctl restart nfs-secure-server
在客户端,必须将 mount -o v4.2 指定为挂载选项。
mount -o sec=krb5p,v4.2 server0:/securedexport /mnt/securedexport
出于测试目的,将在导出的目录 /securedexport 中创建名为 selinux.txt 的新文件。创建后,SELinux 类型将更改为 pulic_content_t
touch /securedexport/selinux.txt
chcon -t public_content_t /securedexport/selinux.txt
所有 SELinux 标签现在均由 server0 正确处理。并且转发到客户端系统 desktop0
ls -Z /mnt/securedexport
注意
在 RHEL 7 中默认安装中,nfs_export_all_ro 和 nfs_export_all_rw SELinux 布尔值均已启用。这允许 NFS 守护进程读写几乎所有文件。要锁定 NFS 服务器功能,请禁用这些布尔值。对于 NFS 可以读取的内容,应具有 public_content_t 或 nfs_t 上下文。如果使用 public_content_t 上下文,则必须启用 nfsd_anon_write 布尔值以允许写入。可以在 nfsd_selinux(8) man page 中找到其他有关 NFS 的SELinux 信息。此 man page 在 selinux-policy-devel RPM 软件包中提供。
提供 SMB 文件共享
什么是 SMB ?
服务器消息块( SMB) 用于Microsoft Windows 服务器和客户端的标准文件共享协议。可以采用多种不同方法配置 SMB 文件服务器。其中一种最简单的方法是将文件服务器及其客户端配置为普通Windows 工作组成员,工作组可向本地子网宣布服务器和客户端。文件服务器分别独立管理自己的本地用户账户和密码。更复杂的配置可以是Windows 域的成员并且通过域控制器来协调用户身份验证。
通过使用名为 Samba 的软件包,红帽企业Linux 可以充当 SMB 文件共享的服务器。将SMB 文件共享挂载为客户端是由 cifs-utils 软件包中包含的内核驱动程序和实用程序来处理的。
通过 Samba 进行 SMB 文件共享
Samba 服务可以将Linux 文件系统作为SMB 网络文件共享来进行共享。以下是要将Samba 配置为工作组成员来提供 SMB 文件共享而必须执行的基本步骤:
1、安装samba软件包
2、准备要共享的目录的权限 。
3、配置 /etc/samba/smb.conf
4、使用 NTLMv2 密码设置相应的Linux用户
5、启用Samba 并打开本地防火墙
6、验证是否可以从客户端挂载共享。
安装Samba
要在 RHEL 系统上部署Samba 服务,必须安装samba 软件包。可以直接完成此操作,也可以作为file-server软件包组的一部分来完成:
[root@serverX]# yum -y install samba
准备要共享的目录
警告
如果某个目录本身便是 NFS 导出或者挂载的 NFS 文件系统,请勿使用Samba 来共享此目录。这可能导致文件损坏、文件锁过时或共享方面的其他文件访问问题。
如果要共享的目录还不存在,则必须创建。
mkdir /sharedpath
用户和常规权限
应对目录设置的权限取决于需要访问此目录的用户及客户端挂载此目录的方式。
客户端一般是通过作为特定用户来验证对 SMB 服务器的访问权限,从而挂载共享。共享中的所有文件需要能够由用于挂载的用户进行读取(并可能写入)
SELinux 上下文及布尔值
要在SELinux 处于强制模式时使用Samba 正确运行,目录需要具有正确的SELinux 上下文并且可能需要设置某些SELinux 布尔值。
如果仅通过Samba 来访问共享目录,则目录及其所有子目录和文件都应以 samba_share_t 来标记,这将为Samba 提供读写访问权限。最好是配置SELinux 策略,以便在文件系统被重新标记的情况下,restorecon 将对共享及其内容设置此类型。
例如,要配置 restorecon (以便 /sharedpath 中的文件具有 samba_share_t 类型),然后重新标记目录,请运行:
[root@server0 ~]# semanage fcontext -a -t samba_share_t '/sharedpath(/.*)?'
[root@server0 ~]# restorecon -vvFR /sharedpath/
restorecon reset /sharedpath context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0
注意
Samba 还可以提供使用 SELinux 类型 public_content_t (只读) 和 public_content_rw_t (读写)标记的文件。要允许对标记为 public_content_rw_t 的文件和目录进行读写访问,必须还要启用 SELinux 布尔值 smdb_anon_write.
配置 /etc/samba/smb.conf
Samba 的主配置文件是 /etc/samba/smb.conf 此文件分为多个节。每节以节名称(括在方括号中)开关,后面是设置为特定值的参数的列表。
/etc/samba/smb.conf 以[global] 开头,此节用于常规服务器配置。随后各节分别定义Samba 服务器提供的文件共享或打印机共享。存在两个特殊节:[home]和[priters],它们有特殊用途。任何以分号(;)或(#)字符开头的行都将被注释掉。
[global]节
[global]节定义Samba 服务器的基本配置。在此节中应配置三项内容:
1、workgroup 用于指定服务器的Windows 工作组。大部分Windows 系统都默认为WORKGROUP,但Windows XP Home 默认为 MSHOME 。这用于帮助系统浏览对 TCP/IP 名称服务器使用 NetBIOS的服务器。
要将工作组设置为 WORKGROUP ,请将 /etc/samba/smb.conf 中的现有工作组条目更改为:
workgroup = WORKGROUP
2、security 控制Samba 对客户端进行身份验证的方式。对于 security = user ,客户端使用本地Samba 服务器管理的有效用户和密码来登录。此设置是 /etc/samba/smb.conf 中的默认设置。
3、hosts allow 是允许Samba 服务的主机的列表(以逗号、空格或制表符分隔)。如果未指定,则所有主机均可访问Samba。如果 [global] 节中未指定此设置,则可以单独在每个共享中设置。如果在[global]节中指定,将适用于所有共享,无论每个共享是否具有不同的设置。
可以通过主机名或源 IP 地址来指定主机。通过逆向解析传入连接尝试的 IP 地址来检查主机名。hosts_access(5) man page 中描述了此指令的完整语法。
可以通过多种方法来指定允许的主机:
- ipv4 网络/前缀:172.25.0.0/24
- ipv4 网络/网络掩码:172.25.0.0/255.255.255.0
- 如果ipv4 子网前缀处理字节边界:172.25.0.
- ipv6 网络/前缀: [2001:db8:0:1::/64]
- 主机名: dexktop0.example.com
- 以example.com 结尾的所有主机:.exmaple.com
例如,要使用尾点表示法将访问权限限制为 172.25.0.0/16 网络中的主机,/etc/samba/smb.conf 配置文件中的 hosts allow 条目将为:
hosts allow = 172.25.
要额外允许从主机名以 ".example.com" 结尾的所有主机中进行访问, /etc/samba/smb.conf 配置文件条目应为:
hosts allow = 172.25.0 .example.com
共享文件节
要创建文件共享,请在 /etc/samba/smb.conf 的末尾,将共享名称放在方括号中以启动共享的新节。应在此节中设置一此关键的指令:
1、必须设置 path 以指示要共享的目录;例如,path = /sharedpath .
2、如果所有经过身份验证的用户都应对共享具有读写访问权限,则应设置 writable = yes 。默认设置为 writable = no.
如果设置了 writable = no ,则可以提供对共享具有读写访问权限的用户的 write list (以逗号分隔)。不在列表中的用户将具有只读访问权限。还可以指定本地组的成员: write list = @management 将允许属于Linux 组 “management” 的所有经过身份验证的用户具有写访问权限。
3、valid users (如果设置)指定允许访问共享的用户的列表。不允许列表以外用户访问共享。但如果列表为空白,则所有用户均可访问共享。
例如,要仅允许用户 fred 和 management 组成员对共享 myshare 具有只读访问权限,此节应为:
[myshare]
path = /sharedpath
writable = no
valid users = fred,@management
[home]节
[home]节定义一个默认启用的特殊文件共享。利用此共享,可以通过 SMB 来提供本地主目录。共享名称可以指定为homes (在这种情况下,Samba 服务器会将其转换为对用户进行身份验证的主目录路径)或 username .
重要
samba_enable_home_dirs SELinux 布尔值允许本地 Linux 主目录由 Samba 和其他系统共享。需要将其启用才能使[home]生效(setsebool -P samba_enable_home_dirs=on)
另一方面,use_samba_home_dirs 布尔值允许挂载远程 SMB 文件共享并将其用作本地 Linux 主目录。这两个选项很容易混淆。
验证 /etc/samba/smb.conf
要验证编辑后的 smb.conf 文件中是否没有错误,可以使用命令 testparm 。不带任何参数运行 testparm 以验证是否不存在任何明显的语法错误。

重要
指令 read only = no 与 writable = yes 相同,这可能会产生混淆。
准备 Samba 用户
security = user 设置需要一个包含 Samba 账户(具有有效的 NTLM 密码)的 Linux 。要创建仅限于 Samba 的系统用户,请保持锁定 Linux 密码,并将登录 shell 设置为 /sbin/nologin 。这将防止直接进行用户登录,或在系统上通过 ssh 登录 。
例如,要为用户 fred 创建锁定的 Linux 账户:
[root@promote ~]# useradd -s /sbin/nolgin fred
samba-client 包含 smbpasswd 命令。它可以创建Samba 账户并设置密码。
[root@promote ~]# yum -y install smb-client
如果smbpasswd 只传递一个用户名而不带任何选项,它将尝试更改账户密码。root 用户可以将其与 -a 选项一起使用,以添加 Samba 账户并设置 NTLM 密码。root 用户可以使用 -x 选项来删除用户的 Samba账户和密码。
例如,要为用户fred 创建Samba 账户并分配 NTLM 密码:
[root@promote ~]# smbpasswd -a fred
New SMB password:
Retype new SMB password:
Added user fred.
[root@promote ~]#
为root用户提供了一个比smbpasswd 更强大的工具:pdbedit 。例如 pdbedit -L 将列出系统上配置了 Samba 账户的所有用户。如需要更多信息请参见 pdbedit(8) man page .

启动Samba
使用systemctl 立即启动 Sabma 服务并使其在系统启动时启动:
[root@promote ~]# systemctl start smb nmb
[root@promote ~]# systemctl enable smb nmb
Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/nmb.service to /usr/lib/systemd/system/nmb.service.
[root@promote ~]#
这个单元启动的这两个服务(smbd 和 nmbd )必须通过本地防火墙来通信。Samba 的 smbd 守护进程通常使用 TCP/445 进行 SMB 连接。基于 TCP 的 NetBIOS 身后兼容性,它还侦听 TCP/139 .nmbd 守护进程使用 UDP/137 和 udp 138 提供基于 tcp/ip 网络的NetBIOS 浏览支持。
要将 firewalld 配置为允许客户端与本地 samba 服务通信,请运行:
firewall-cmd: error: unrecognized arguments: --add-server=samba
[root@promote ~]# firewall-cmd --permanent --add-service=samba
success
[root@promote ~]# firewall-cmd --reload
success
[root@promote ~]#
重要
Samba 定期检查以确定 /etc/samba/smb.conf 是否已更改。如果配置文件已更改,则 Samba 自动重新加载配置文件。这将不会影响已经和 Samba 服务建立的任何连接。除非连接关闭或者Samba 完全重新启动。
可以使用命令systemctl reload smb nmb 立即重新加载配置文件,也可以使用 systemctl restart smb nmb 来完全重新启动 Sabma.
挂载 SMB 文件系统。
常规SMB 挂载
cifs-utils 软件包可用于在本地系统上挂载 SMB 文件共享,无论是来自 Samba 服务器还是本地 Microsoft Windows 。默认情况下,SMB 挂载使用单一一组用户凭据(挂载凭据)来挂载共享及确定对共享文件的访问权限。使用挂载的 Linux 系统上的所有用户均使用相同凭据来确定文件访问权限。
mount 命令用于挂载共享。默认情况下,用于对用户进行身份验证的协议是封装在原始 NTLMSSP 消息中的 NTLMv2 密码散列(sec=ntlmssp) ,这正是最新版本的Microsoft Windows 所预期的。可以通过两种方法来提供挂载凭据。如果是在 shell 提示符中以交互方式挂载,则可以使用username=选项来指定要进行身份验证的 SMB 用户;将提示此用户输入密码。如果是自动挂载,则可以通过credentials=选项来提供凭据文件,此文件只能由root 用户读取,且包含用户和密码。
例如,要挂载来自 SMB 文件服务器 serverX 的共享 myshare ,以 SMB 用户 fred 身份进行身份验证,并且该用户的 NTLM 密码为 redhat :
[root@promote ~]# mkdir /myshare
[root@promote ~]# mkdir /mnt/myshare
[root@promote ~]# mount -o username=fred //localhost/myshare /mnt/myshare
Password for fred@//127.0.0.1/myshare:
执行多用户 SMB 挂载
使用Samba 的多用户挂载
当挂载Samba共享时,默认情况下挂载凭据确定对挂载点的访问权限。新的 multiuser 挂载选项将挂载凭据与用于确定每个用户的文件访问权限的凭据进行隔离。在 RHEL 7 中,这可以与 set=ntlmssp 身份验证一起使用(与 mount.cifs (8) man page 相反)
root 用户使用 multiuser 选项以及一个 SMB 用户名(对共享内容具有最低访问权限)挂载共享。常规用户随后可以使用 cifscreds 命令将其自己的SMB 用户名密码存储在当前会话的内核密钥环中。其对共享的访问权限是通过来自密钥环的自身凭据而非挂载凭据来验证。用户可以随时清除或更改针对该登录的会话凭据,并且在会话结束后将会清除。文件访问权限完全由 SMB 服务器根据当前使用的访问凭据强制实施。
例如,要创建新的挂载点 /mnt/multiuser 并挂载来自 SMB 文件服务器 serverX 的共享 myshare ,同时作为 SMB 用户 fred 使用multiuser 挂载选项进行身份验证(此用户具有 NTLM 密码 redhat)
[root@desktop0 ~]# mkdir /mnt/multiuser
[root@desktop0 ~]# mount -o multiuser,sec=ntlmssp,username=fred //server0/myshare /mnt/multiuser
Password for fred@//server0/myshare: *****
需要命令 cifscreds 以将身份验证凭据存储在本地用户的密钥环中。这些身份验证凭据转发到多用户挂载上的Samba 服务器。cifs-utils 软件包提供 cifscreds命令,因此这一软件包在 desktop0 系统上是必需的。
[root@desktop0 ~]#yum -y install cifs-utils
cifscreds 命令具有各种操作:
- add,可向用户的会话密钥环中添加 SMB 凭据,此选项后跟 SMB 文件服务器的主机名
- update,可更新用户的会话密钥环中的现在凭据。此选项后跟 SMB 文件服务器的主机名
- clear,可从用户的会话密钥环中删除特定条目。此选项后跟 Samba 文件服务器的主机名
- clearall,可从用户的会话密钥环中清除所有现在凭据。
注意
默认情况,cifscreds 假定要与 SMB 凭据一起使用的用户名匹配当前 Linux 用户名。通过在 add、update和 clear操作后面添加-u username 选项,可以将其他用户名用于 SMB 凭据。
例如,假定root 用户已使用 multiuser 选项在挂载点 /mnt/multiuser 上挂载了 //server0/myshare . 要访问该共享上的文件,用户 frank 必须使用 cifscreds 临时将其用户名和密码存储在内核管理的会话密钥环中。
[frank@desktop0 ~]$ cifscreds add server0
Password: redhat
[frank@desktop0 ~]$ echo "Frank was here" >/mnt/multiuser/frank2.txt
[frank@desktop0 ~]$ cat /mnt/multiuser/frank2.txt
Frank was here
[frank@desktop0 ~]$ exit
假定对 SMB 共享的文件的权限授予 frank 对目录的读写访问权限,但是jane 仅被授予读访问权限。
[jane@desktop0 ~]$ cifscreds add server0
Password:redhat
[jane@desktop0 ~]$ echo "Jane was not here" >/mnt/multiuser/jane2.txt
-bash;/mnt/multiuser/jane2.txt:Permission denied
[jane@desktop0 ~]$ cat /mnt/multiuser/frank2.tt
Frank was here
配置多用户
[root@desktop0 ~]# echo "username=brian" >>/root/smb-multiuser.txt
[root@desktop0 ~]# echo "passwrod=redhat">>/root/smb-multiuser.txt
[root@desktop0 ~]# cat /etc/fstab
# /etc/fstab
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
//server0/smbshare /mnt/multiuser cifs credentials=/root/smb-multiuser.txt,multiuser,sec=ntlmssp 0 0