SEPostgreSQL 简介
本文档为安全增强型 PostgreSQL (SE-PostgreSQL) 提供了全面文档。SE-PostgreSQL 是 PostgreSQL 的内置增强功能,它基于安全增强型 Linux (SELinux) 安全策略提供额外的访问控制。以下章节展示了 SE-PostgreSQL 的背景、概述、设计和参考(对象类、权限等)。
- 章节列表
什么是 SE-PostgreSQL
数据库是管理信息资产的重要设施。数据库允许以比文件系统更优雅的方式搜索、检索和存储信息。
大多数现有的 RDBMS 应用了自己的访问控制,例如 GRANT 和 REVOKE,而没有与操作系统协作。这会导致与文件系统等上的访问控制不一致。
一些现代操作系统具有增强的访问控制功能,例如 SELinux。大多数这些功能的设计基于参考监控模型(来自 1980 年代的研究),该模型允许所有系统访问由集中式安全策略管理。参考监控模型假设对象管理器(例如操作系统)可以捕获所有系统访问,然后决定是否允许或拒绝该访问。注意:操作系统并非在所有情况下都是对象管理器。关系数据库管理系统 (RDBMS) 是数据库对象的管理器,类似于操作系统是文件系统对象的管理器。以前,RDBMS 独立于集中式安全策略做出访问控制决策,因此需要仔细维护其与 OS 之间的一致性。
SE-PostgreSQL 是 PostgreSQL 的内置增强功能,它为数据库对象提供了细粒度的强制访问控制 (MAC)。SE-PostgreSQL 根据 SELinux 安全策略做出访问控制决策,与操作系统管理用户对文件系统对象的访问方式相同。它提供以下重要功能
强制访问控制
PostgreSQL 使用数据库超级用户的概念,该用户可以绕过所有本机 PostgreSQL 访问控制。相反,SE-PostgreSQL 对任何客户端强制执行其访问控制,无一例外,即使客户端是数据库超级用户。客户端只有在本地 PostgreSQL 和 SE-PostgreSQL 都允许访问时才能访问数据库对象,类似于某些操作系统上任意访问控制 (DAC) 和强制访问控制 (MAC) 之间的关系。
细粒度访问控制
访问控制的粒度取决于 RDBMS。SE-PostgreSQL 允许在列和行级别配置访问控制(只有少数专有 RDBMS 支持列和行级访问控制选项)。
列和行是数据库对象的最小单元。对这些对象的访问控制允许数据库管理员对它们应用灵活的访问控制。
访问控制的一致性
SELinux 要求所有进程和对象都具有表示其权限和属性的安全上下文。SE-PostgreSQL 在每个数据库对象(即 system/general 表中的元组)上分配安全上下文,并根据权限和属性做出访问控制决策,就像 SELinux 在内核中应用它们一样。
libselinux提供了一个名为getpeercon()的有趣 API,它允许您获取连接到服务器进程的对等进程的安全上下文。SE-PostgreSQL 需要安全上下文才能做出决策。这是访问控制一致性的一个重要功能,因为客户端的权限和对象的属性以相同形式表示。
为什么我们需要访问控制的一致性
将 RDBMS(包括 PostgreSQL)视为进程间通信通道,与文件系统、网络、IPC 等相同。
安全机制的最重要目的是防止机密信息泄露。在具有单独访问控制(而非集中式访问控制)的子系统上,攻击者可以选择最薄弱的进程间通信通道。
SELinux 是一个操作系统功能,它在整个操作系统上应用单一的统一安全策略。系统调用被拦截和检查。这种方法允许以最小的成本执行策略;但是,请记住,X Window System 和 RDBMS 等几个用户空间对象管理器可以用作进程间通信通道。在用户空间管理的资源对内核是不可见的,这留下了两种安全策略选项:传统的全有或全无策略,不允许共享用户空间对象(这很不现实),或者增强用户空间对象管理器,使其访问控制决策基于 SELinux 的单一统一安全策略。
上图展示了一致的数据流控制。它要求机密信息(较高敏感级别域)不会通过进程间通信通道泄露到非机密域(较低敏感级别域),无论这些通道是网络、RDBMS 等等。
在本例中,当具有权限的用户登录时,他们的用户进程被标记为SystemHigh,允许他们访问标记为Secret的机密信息。相反,当没有权限的用户登录时,他们的用户进程被标记为SystemLow,阻止他们访问标记为SecretSecretSystemHigh的机密信息。此外,SystemLow进程被禁止向
进程发送消息。这些限制独立于使用的进程间通信通道类型(限制适用于整个操作系统)。
根据安全策略,SELinux 阻止没有权限的用户进程读取存储在 Linux 内核管理的对象中的机密信息,以及阻止具有权限的用户进程将机密信息写入非机密对象。
LAPP/SELinux
这是我们(中期)在这个项目中的愿景。
在 LAPP/SELinux 堆栈上,我们可以运行具有更严格权限的 Web 应用程序,以防止使用应用程序错误或漏洞进行违规访问。所有访问控制规则都集中在 SELinux 的安全策略中,所有应用程序行为始终由 SELinux 和 SE-PostgreSQL(用于数据库对象)检查。
- LAPP/SELinux 堆栈现在由 SELinux(OS)、SE-PostgreSQL(DB) 和 Apache/SELinux plus(web) 组成。此外,我们希望将其覆盖范围扩大到应用程序服务器层。
- 外部链接
- SELinux
- SELinux 已经成为 Linux 内核 2.6.x 系列的向上游功能,并得到主要发行版(RedHatEL、Fedora 等)支持五年多。它允许对系统资源的访问应用细粒度的强制访问控制。
- 参考策略
- 它是 SELinux 中的默认安全策略。它由 SELinux 社区管理和开发。
- 它在 refpolicy-20070928 或更高版本中获得了 SE-PostgreSQL 支持。
- Apache/SELinux plus
- 它是 Apache Web 服务器的一个额外模块,它允许基于 HTTP 身份验证以特定安全上下文启动 Web 应用程序实例。它允许 OS/RDBMS 为每个 Web 用户应用有效的访问控制。
- 它作为 mod_selinux 打包在 Fedora11 或更高版本中。
- PHP/SELinux
- 它是为 PHP 脚本语言提供的一组 SELinux API。它为 PHP 脚本提供了与 SELinux 通信的接口。