4.9. 挂载文件系统
默认情况下,挂载支持扩展属性的文件系统时,每个文件的安全性上下文可以从 文件的 security.selinux 扩展属性获取。不支持扩展属性的文件系统中的文件将从策略配置中分配单一的默认安全上下文,具体取决于文件系统类型。
使用 mount -o context 命令覆盖现有的扩展属性,或者为不支持扩展属性的文件系统指定不同的默认上下文。如果您不信任文件系统来提供正确的属性,比如在多个系统中使用的可移动介质,这很有用。mount -o context 命令也可用于支持不支持扩展属性的文件系统标签,如文件分配表(FAT)或 NFS 卷。使用
context 选项指定的上下文
不会写入磁盘:原始上下文将被保留,如果文件系统最初具有扩展属性,则在不带 上下文
挂载时会看到。
有关文件系统标记的更多信息,请参阅 James Morris 的"SELinux 中的文件系统标签"文章: http://www.linuxjournal.com/article/7426
4.9.1. 上下文挂载
要使用指定上下文挂载文件系统,请覆盖现有上下文(如果存在),或者为不支持扩展属性的文件系统指定不同的默认上下文,作为 root 用户,使用 mount -o context=SELinux_user:role:type:level 命令。上下文更改不会写入磁盘。默认情况下,客户端上的 NFS 挂载使用 NFS 卷策略定义的默认上下文标记。在常见策略中,此默认上下文使用
nfs_t
类型。如果不使用其他挂载选项,这可能会阻止使用其他服务(如 Apache HTTP 服务器)共享 NFS 卷。以下示例挂载了 NFS 卷,以便可以使用 Apache HTTP 服务器进行共享:
~]#
mount server:/export /local/mount/point -o \ context="system_u:object_r:httpd_sys_content_t:s0"
此文件系统上新创建的文件和目录似乎具有通过
-o 上下文指定的 SELinux 上下文
。但是,由于这些更改不会写入磁盘,因此使用此选项指定的上下文不会在挂载之间保留。因此,这个选项必须与每个挂载中指定的相同上下文一起使用,以保持所需的上下文。有关使上下文挂载持久的更多信息,请参阅 第 4.9.5 节 “使上下文挂载持久”。
类型强制是 SELinux targeted 策略中使用的主要权限控制。对于大多数部分,SELinux 用户和角色可以忽略,因此在覆盖 SELinux 上下文时,使用 SELinux
system_u
用户和 object_r
角色,并集中在类型上。
如果您没有使用 MLS 策略或多类别安全性,请使用 s0
级别。
注意
使用
上下文
选项挂载文件系统时,禁止用户和进程进行上下文更改。例如,在使用 context
选项挂载的文件系统上运行 chcon 命令会导致 Operation not supported
错误。
4.9.2. 更改默认上下文
如 第 4.8 节 “file_t 和 default_t 类型” 所述,在支持扩展属性的文件系统中,当访问磁盘中缺少 SELinux 上下文的文件时,会将其视为 SELinux 策略定义的默认上下文。在常见策略中,此默认上下文使用
file_t
类型。如果需要使用其他默认上下文,请使用 defcontext
选项挂载文件系统。
以下示例将新创建的文件系统挂载到
/dev/sda2
上的新创建的 test/
目录中。它假定 /etc/selinux/targeted/contexts/files/
中没有定义 test/
目录的上下文的规则:
~]#
mount /dev/sda2 /test/ -o defcontext="system_u:object_r:samba_share_t:s0"
在本例中:
- 挂载后,文件系统的根目录(
test/
)将被视为标记为defcontext
指定的上下文(该标签不存储在磁盘上)。这会影响在test/
下创建的文件的标签:新文件继承samba_share_t
类型,这些标签存储在磁盘上。 - 使用
defcontext
选项挂载文件系统时,在test/
下创建的文件会保留其标签。
4.9.3. 挂载 NFS 卷
默认情况下,客户端上的 NFS 挂载使用 NFS 卷策略定义的默认上下文标记。在常见策略中,此默认上下文使用
nfs_t
类型。根据策略配置,Apache HTTP 服务器和 MariaDB 等服务可能无法读取使用 nfs_t
类型标记的文件。这可能会导致标记为此类型的文件系统被挂载,然后被其他服务读取或导出。
如果要挂载 NFS 卷并使用另一个服务读取或导出该文件系统,请在挂载时使用
context
选项覆盖 nfs_t
类型。使用以下上下文选项挂载 NFS 卷,以便可以使用 Apache HTTP 服务器共享它们:
~]#
mount server:/export /local/mount/point -o context="system_u:object_r:httpd_sys_content_t:s0"
由于这些更改不会写入磁盘,因此使用此选项指定的上下文不会在挂载之间保留。因此,这个选项必须与每个挂载中指定的相同上下文一起使用,以保持所需的上下文。有关使上下文挂载持久的更多信息,请参阅 第 4.9.5 节 “使上下文挂载持久”。
作为使用
上下文
选项挂载文件系统的替代方法,可以启用 布尔值以允许服务访问使用 nfs_t
类型标记的文件系统。有关配置布尔值以允许服务访问 nfs_t
类型的步骤,请参阅 第 II 部分 “管理受限服务”。
4.9.4. 多个 NFS 挂载
当从同一 NFS 导出挂载多个挂载时,尝试使用不同的上下文覆盖每个挂载的 SELinux 上下文时,会导致后续挂载命令失败。在以下示例中,NFS 服务器只有一个导出,
导出/
,它有两个子目录 web/
和数据库/
。以下命令尝试从一个 NFS 导出中尝试两个挂载,并尝试覆盖每个导出的上下文:
~]#
mount server:/export/web /local/web -o context="system_u:object_r:httpd_sys_content_t:s0"
~]#
mount server:/export/database /local/database -o context="system_u:object_r:mysqld_db_t:s0"
第二个 mount 命令失败,以下内容记录到
/var/log/messages
:
kernel: SELinux: mount invalid. Same superblock, different security settings for (dev 0:15, type nfs)
要从单个 NFS 导出挂载多个挂载,每个挂载都有不同的上下文,请使用
-o nosharecache,context
选项。以下示例从单个 NFS 导出挂载多个挂载,每个挂载都有不同的上下文(允许单个服务访问每个导出):
~]#
mount server:/export/web /local/web -o nosharecache,context="system_u:object_r:httpd_sys_content_t:s0"
~]#
mount server:/export/database /local/database -o \ nosharecache,context="system_u:object_r:mysqld_db_t:s0"
在本例中,
server:/export/web
挂载到本地的 /local/web/
目录,所有文件都标有 httpd_sys_content_t
类型,允许 Apache HTTP 服务器访问。server:/export/database
挂载到 /local/database/
,其中所有使用 mysqld_db_t
类型进行标记的文件,允许 MariaDB 访问。这些类型更改不会写入磁盘。
重要
nosharecache
选项允许您多次使用不同上下文挂载同一导出子目录,例如,多次挂载 /export/web/
。不要多次使用不同的上下文从导出中挂载同一子目录,因为这会产生重叠挂载,其中文件可在两个不同的上下文下访问。
4.9.5. 使上下文挂载持久
要使上下文在重新挂载和重启后持久挂载,请在
/etc/fstab
文件或自动挂载程序映射中添加文件系统的条目,并使用所需的上下文作为挂载选项。以下示例为 NFS 上下文挂载在 /etc/fstab
中添加一个条目:
server:/export /local/mount/ nfs context="system_u:object_r:httpd_sys_content_t:s0" 0 0
[5]
贾姆斯州米尔里斯."SELinux 中的文件系统标记"。2004 年 10 月 1 日发布.2008 年 10 月 14 日访问: http://www.linuxjournal.com/article/7426