SEPostgreSQL SELinux 概述
本章介绍 SELinux 的概述,包括其安全设计、模型和设施,以帮助管理。
- 章节列表
SELinux 设计和模型
对“什么是 SELinux?”这个问题的最简短答案是,它是 Linux 内核中参考监视器的实现。参考监视器是一个小的软件模块,用于根据其安全策略控制对所有数据对象和设备的访问,安全策略必须满足以下条件:1) 防篡改,2) 始终调用,以及 3) 足够小以供验证。
首先,请考虑最抽象设计层上的参考监视器模型。在我们的信息系统中,所有数据对象都由操作系统之类的软件管理,因此我们必须向对象管理器发送访问对象的请求。对象管理器充当我们的代理。它访问所需的数据对象并返回给用户。在这个模型中,我们有三个实体:1) 要访问的数据对象,2) 数据访问的主题,以及 3) 访问数据对象的 method。
在操作系统的情况下,我们需要调用正确的系统调用,例如 read(2),来访问我们的目标数据对象。这也意味着我们可以通过监视系统调用的调用来检查对操作系统管理的数据对象的所有访问。SELinux 始终(即使来自 root 的请求)检查系统调用并做出决定。如果应该拒绝,SELinux 将不再允许执行系统调用。
我们可以将此模式移植到数据库对象的访问中。在这种情况下,所有数据对象都是通过 SQL 而不是系统调用访问的。当我们尝试运行 SQL 查询时,SE-PostgreSQL 会始终获取它们以检查客户端的权限,并根据 SELinux 的安全策略做出决定。它完全独立于任何现有的数据库 acl 机制。
XACE/SELinux 是另一个从用户空间应用程序利用内核内参考监视器的例子。在这种情况下,资源是 X 窗口对象,而 X 协议是访问方法。
参见 客户端的权限。它指出 SE-PostgreSQL 将对等进程的安全上下文应用为客户端的权限,独立于数据库身份验证。相同的安全策略始终针对两个安全上下文之间的相同组合返回相同的结果,因此这也意味着我们可以在访问控制中应用一致的规则。此外,由于单一统一的安全策略,所有访问控制决策都是集中管理的,并且即使客户端是数据库超级用户,由于其始终调用的特性,也无法绕过。
以下几个部分描述了做出决定的规则的详细信息。
安全上下文
本小节再次介绍安全上下文的详细信息。
参见 安全上下文的管理 以了解 SE-PostgreSQL 中的实现。
安全上下文是使用文本格式表示的属性,它包含 SELinux 在访问控制中做出决定所需的所有信息。它包含四个由冒号字符分隔的字段,分别是“SELinux 用户”、“角色”、“类型”和“范围”。
SELinux 基于几个不同的安全模型做出其访问控制决策,它们分别采用不同的字段来做出决策。它需要所有安全模型才能允许所需的访问以获得正面的结果。
第一个字段是“SELinux 用户”,它对应于操作系统的用户标识符。user_u是当安全策略中未定义适当的 SELinux 用户时的替代。第二个字段是“角色”,它用于 RBAC。此字段仅在进程中可用,因此object_r统一设置为所有资源。第三个字段是“类型”或“域”。当安全上下文分配给进程时,我们称之为“域”。类型或域用作类型强制的标识符,类型强制是 SELinux 中最重要的安全模型。第四个字段是“范围”,它用于 MLS(多级安全)或 MCS(多类别安全)机制。此字段可以通过mcstrans服务转换为人类可读的格式。例如,它可以将s0:c0.c1023显示为SystemHigh.
我们在下面介绍这些安全模型。
类型强制
TE(类型强制)是 SELinux 中最重要的安全模型。它采用安全上下文的第三个字段作为其标识符,我们描述了两种类型之间的关系。我们可以将分配给进程的类型称为域,但这里除了名称之外没有根本区别。
在下面的例子中,安全策略允许标记为postgresql_t的进程读取或写入标记为postgresql_db_t的文件,以及绑定标记为postgresql_port_t的特定端口号的套接字。SELinux 强制出现在访问控制中的所有实体都具有类型。类型是其在访问控制中位置的抽象,因此对于域、类型和操作的相同组合将返回相同的结果。在默认安全策略中,postgresql 服务器进程具有postgresql_t域,存储在/var/lib/pgsql/data/*中的数据库文件具有postgresql_db_t类型,存储在/var/www/html/*中的数据库文件具有中的 Web 内容文件具有httpd_sys_content_tpostgresql_port_t类型,而 PostgreSQL 的知名端口号具有
类型。postgresql_t此安全策略定义了两个关系。一个是postgresql_db_t和postgresql_t此安全策略定义了两个关系。一个是postgresql_port_t之间的关系,另一个是postgresql_t之间的关系。前一条规则允许postgresql_db_t域(包含 PostgreSQL 服务器进程)读取和写入标记为postgresql_t(包含数据库文件)的文件。另一条规则允许postgresql_port_t域绑定标记为postgresql_t(包含知名 PostgreSQL 端口 (5432))的 TCP 端口号。但是,在中的 Web 内容文件具有域和
类型之间没有显式规则,因此 SELinux 由于其白名单规则而阻止了它们之间的所有访问。
实际的类型强制规则是一组庞大的规则。但是,最近上游的安全策略模块化良好,丰富的预定义宏和模板将有助于理解类型强制规则。
域转换了解如何分配进程的安全上下文(而不是可执行程序文件)非常重要。在正常情况下,进程会继承其父进程的域。但是,/sbin/init
是所有进程的共同祖先。如果 SELinux 没有切换进程域的功能,所有进程都将在同一个域中工作。但这是不正确的。
SELinux 有一种切换进程域的机制,称为“域转换”。它在execve()系统调用(启动新的可执行程序文件)上替换进程的域。例如,以下策略可以将标记为initrc_tpostgresql_t的进程的域替换为,当它执行标记为.
TYPE_TRANSITION initrc_t postgresql_exec_t : process postgresql_t;
postgresql_exec_t系统调用(启动新的可执行程序文件)上替换进程的域。例如,以下策略可以将标记为的程序文件时。在默认安全策略中,,当它执行标记为是 init 脚本的域,而是/usr/bin/postgres可执行文件的类型。如果没有TYPE_TRANSITION系统调用(启动新的可执行程序文件)上替换进程的域。例如,以下策略可以将标记为,由 init 脚本启动的 PostgreSQL 服务器进程将继承可执行文件的类型。如果没有,但是,postgresql_t规则可以更改进程的域,然后它将在
域中工作,如我们所料。了解如何分配进程的安全上下文(而不是可执行程序文件)非常重要。在正常情况下,进程会继承其父进程的域。但是,在init_t域中工作,因此其余子进程通过域转换链分配了它们各自的域。
我们可以将此方案应用于除进程之外的资源。以下示例使用file作为对象类,这意味着在标记为var_log_t的目录下创建的新文件的安全上下文是postgresql_log_t
TYPE_TRANSITION postgresql_t var_log_t : file postgresql_log_t;
这个想法也应用于 SE-PostgreSQL,以指定新创建的数据库对象的 security context。
基于角色的访问控制
SELinux 将其 RBAC(基于角色的访问控制)功能实现为域转换的边界。角色是一组域,它由安全上下文的第二个字段标识。请注意,它不是一组类型。这个想法仅应用于进程。
当进程尝试切换其工作域时,旧域和新域都必须包含当前角色。请注意,域转换会替换进程 security context 中的第三个字段,但它不会影响角色,因为它是独立配置的不同概念。
当用户分配了一个foo_r的角色,该角色支配dom_A_t, dom_B_t此安全策略定义了两个关系。一个是dom_C_t,并且他的初始域是dom_A_t,RBAC 策略允许他的进程将其域切换到dom_B_t此安全策略定义了两个关系。一个是dom_C_t,但它不允许切换到dom_X_t,即使类型强制具有将域转换为该域的规则。
如果baz_r的角色除了它们之外还支配dom_X_t,并且他在登录时分配了baz_r角色,则上面的域转换将被允许。
我们可以使用此功能来实现有限权限的用户。例如,我们将能够看到一个root用户,他具有数据库管理员的角色,可以管理数据库配置、启动/停止服务器进程等等,但他不会触碰与邮件服务器、Web 服务器等相关的配置。
但是,我们必须等待默认安全策略的更多改进才能看到这一愿景。因此,我们不会在 SE-PostgreSQL 的默认策略中积极使用 RBAC 功能,
MLS 和 MCS
MLS(多级安全)是基于 Bell-La-Padulla 模型的传统强制访问控制的设计。它使用安全上下文中的第四个字段,称为范围。MCS(多类别安全)是 MLS 模型的简化设计。
进程的范围字段包含两个由连字符字符 (-) 分隔的部分,但其他资源只有一个唯一的范围字段。左侧部分称为下限范围,右侧部分称为上限范围。此外,每个范围都有两个由冒号字符分隔的元素。左侧是一个敏感度级别,例如s0,右侧是类别,例如c0.c15. SELinux 根据层次关系在访问控制中应用敏感性,并根据包含关系在访问控制中应用类别。
任何范围字段都有一个敏感性级别和零个或多个类别。我们对类别有一些符号规则。当没有关联类别时,它可以省略。它允许枚举以逗号分隔的多个类别,并且它尤其允许描述以句点分隔的连续类别。
以下示例显示了进程的安全上下文,其范围字段为s0-s0:c0,c3.c7,c9. 它有两个部分,因为安全上下文的拥有者是进程。左侧是s0, 所以这里没有类别,右侧是s0:c0,c3.c7,c9, 所以它有c0, c3, c4, c5, c6, c7此安全策略定义了两个关系。一个是c9.
[kaigai@saba ~]$ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0,c3.c7,c9
MLS 规则
MLS 中的访问控制规则被描述为进程的低范围或高范围与资源的范围之间的关系。检查哪个范围取决于正在运行的进程的域。一些特殊域被配置为在 MLS 规则检查中应用高范围,但大多数域在那里应用低范围。
当一个具有s2:c1.c2-s3:c0.c3范围的进程在非特殊域上运行尝试读取文件时,SELinux 会阻止它读取标记为s3:c0:c1的文件,因为s3高于s2, 并且标记为s1:c2.c3的文件,因为c3的文件不受c1.c2支配。但是,SELinux 不会阻止读取标记为s2:c1.c2此安全策略定义了两个关系。一个是s1:c1.c2的文件,因为这些文件与进程的低范围相等或受其支配。
当进程尝试写入文件时,SELinux 不会允许它,除非是标记为s2:c1.c2的文件,该文件与进程的低范围相同。
总之,以下规则是 MLS 策略的要求
- 当进程尝试读取资源时,其敏感性必须等于或低于进程的敏感性。
- 当进程尝试读取资源时,其类别必须等于或受进程的类别支配。
- 当进程尝试写入资源时,其范围必须等于进程的低范围。
MCS 规则
MCS 模型是 MLS 的简化实现。它使所有进程和资源共享一个唯一的敏感性级别,因此所有敏感性都具有相等关系,因此,它仅根据包含关系来决定可访问性。
低范围和高范围与 MLS 规则相比具有不同的含义。在 MCS 规则中,低范围表示创建新资源时的默认范围,高范围表示进程的特权。
当一个具有s0-s0:c1.c2尝试读取或写入文件时,SELinux 会阻止标记为s0:c0.c1的文件,因为c0的文件不受c1.c2的文件的操作,但 SELinux 允许标记为s0:c2和未分类的文件。
在默认安全策略中,MCS 规则处于激活状态,MLS 是一个选项。
SELinux 定制
强制模式和宽松模式
SELinux 具有两种工作模式:强制模式和宽松模式。在这两种工作模式下,SELinux 都检查其安全策略以决定是否应允许给定的操作。但是,SELinux 在宽松模式下不会阻止任何东西,但它还会生成审计日志记录以报告违反的访问。它可以用来列出正在运行的应用程序需要哪些权限。
我们可以将系统默认行为放在/etc/selinux/config中,并且setenforce命令使我们能够动态地切换工作模式。
[kaigai@saba ~]$ cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing
SE-PostgreSQL 在默认情况下遵循内核 SELinux 的工作模式。但是,我们可以通过sepostgresql.
的 guc 变量来设置自己的工作模式
布尔值布尔值功能允许安全策略的几个部分有条件地执行。布尔值是由 SELinux 管理的一系列变量,其状态为on或off
. 一块或多块规则取决于布尔值,它允许管理员设置一个新值,因此可以自定义安全策略设置而无需修改安全策略。例如,SELinux 在默认情况下不允许 Samba 文件服务器访问用户的家目录。但是,允许它们的条件策略取决于samba_enable_home_dirs的布尔值,该布尔值在默认情况下为false
if (samba_enable_home_dirs) { allow smbd_t user_home_t : file { create read write append unlink .... }; allow ambd_t user_home_t : dir { create search add_name remove_name unlink ... }; : : }
,如下所示
因此,Samba 文件服务器需要打开布尔值才能公开用户的家目录。
SE-PostgreSQL 的安全策略还提供了一些布尔值,允许最终用户自定义其安全策略。有关更多详细信息,请参阅 预定义的对象类型和布尔值。
安全策略模块
域中工作,如我们所料。要加载到内核的安全策略由一个基本策略模块和几十个安全策略模块组成。我们可以安装、升级或卸载必要的或不必要的安全策略模块。/usr/sbin/semodule是一个管理安全策略模块的接口。该-l选项用于显示已安装的安全策略模块的列表,该-i
[root@saba ~]# /usr/sbin/semodule -l amavis 1.7.0 amtu 1.1.0 apcupsd 1.3.0 : sepostgresql-devel 3.14 : xguest 1.0.0 zabbix 1.1.0
选项用于安装新的安全策略模块,等等。SE-PostgreSQL 提供了一个名为sepostgresql-devel.pp
的附加安全策略模块。它使开发人员能够控制审计消息并正确运行回归测试。
system-config-selinux