SEPostgreSQL 简介
本文档为增强安全 PostgreSQL (SE-PostgreSQL) 提供了全面文档。 SE-PostgreSQL 是 PostgreSQL 的内置增强功能,它基于增强安全 Linux (SELinux) 安全策略提供额外的访问控制。 以下章节介绍了 SE-PostgreSQL 的背景、概述、设计和参考(对象类、权限等)。
- 章节列表
什么是 SE-PostgreSQL
数据库是管理信息资产的重要设施。 数据库可以比文件系统更优雅地搜索、检索和存储信息。
大多数现有的 RDBMS 都应用了自己的访问控制,例如 GRANT 和 REVOKE,而没有与操作系统协作。 这会导致与文件系统上的访问控制不一致等。
一些现代操作系统具有增强的访问控制功能,例如 SELinux。 大多数这些功能的设计基于参考监视器模型(源自 1980 年代的研究),该模型允许通过集中安全策略管理所有系统访问。 参考监视器模型假设对象管理器(例如操作系统)可以捕获所有系统访问,然后决定是否允许或拒绝该访问。 注意:在所有情况下,操作系统都不是对象管理器。 关系数据库管理系统 (RDBMS) 是数据库对象的管理对象,类似于操作系统是文件系统对象的管理对象。 以前,RDBMS 独立于集中安全策略进行访问控制决策,因此需要仔细注意保持 OS 和 RDBMS 之间的一致性。
SE-PostgreSQL 是 PostgreSQL 的内置增强功能,为数据库对象提供了细粒度的强制访问控制 (MAC)。 SE-PostgreSQL 根据 SELinux 安全策略做出访问控制决策,就像操作系统管理对文件系统对象的访问一样。 它提供以下重要功能
强制访问控制
PostgreSQL 使用数据库超级用户的概念,它可以绕过所有本机 PostgreSQL 的访问控制。 相反,SE-PostgreSQL 对任何客户端强制执行其访问控制,无一例外,即使客户端是数据库超级用户也是如此。 客户端只有在本地 PostgreSQL 和 SE-PostgreSQL 都允许访问时才能访问数据库对象,类似于某些操作系统上自由裁量访问控制 (DAC) 和强制访问控制 (MAC) 之间的关系。
细粒度访问控制
访问控制的粒度取决于 RDBMS。 SE-PostgreSQL 允许在列和行级别配置访问控制(只有少数专有 RDBMS 支持列和行级别访问控制选项)。
列和行是数据库对象中最小的单元。 对这些对象的访问控制允许数据库管理员对它们应用灵活的访问控制。
访问控制的一致性
SELinux 要求所有进程和对象都具有一个安全上下文,该上下文表示其权限和属性。 SE-PostgreSQL 在每个数据库对象(即系统/通用表中的元组)上分配安全上下文,并根据权限和属性做出访问控制决策,就好像 SELinux 在内核中应用它们一样。
libselinux提供了一个名为getpeercon()的有趣 API,它使您能够获取连接到服务器进程的同级进程的安全上下文。 SE-PostgreSQL 需要安全上下文才能做出其决策。 这是一个在访问控制一致性方面的重要功能,因为客户端的权限和对象的属性以相同的形式表示。
为什么我们需要访问控制的一致性
将 RDBMS(包括 PostgreSQL)视为进程间通信通道,与文件系统、网络、IPC 等相同。
安全机制的最重要目的是保护机密信息不被泄露。 在具有单个访问控制的子系统上(不是集中式的),攻击者可以选择最弱的进程间通信通道。
SELinux 是一个操作系统功能,它在整个操作系统上应用单一的统一安全策略。 系统调用被拦截和检查。 这种方法允许以最小的成本执行策略;但是,请记住,几个用户空间对象管理器,例如 X Window 系统和 RDBMS,可以用作进程间通信通道。 用户空间管理的资源对内核是不可见的,留下两个安全策略选项:传统的全有或全无策略,不允许共享用户空间对象(这是不现实的),或者增强用户空间对象管理器,使其访问控制决策基于 SELinux 的单一统一安全策略。
上图展示了一致的数据流控制。 它要求机密信息(更高敏感级别域)不会通过进程间通信通道泄露到非机密域(更低敏感级别域),无论这些通道是网络、RDBMS 等等。
在此示例中,当具有许可的用户登录时,他们的用户进程将被标记为SystemHigh,允许他们访问标记为Secret的秘密信息。 相反,当没有许可的用户登录时,他们的用户进程将被标记为SystemLow,阻止他们访问标记为Secret的秘密信息。 此外,SystemHigh进程被禁止向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 服务器的额外模块,它能够使用特定安全上下文启动 Web 应用程序实例,该上下文基于 http 身份验证。 它允许 OS/RDBMS 对每个 Web 用户应用有效的访问控制。
- 它打包为 mod_selinux 在 Fedora11 或更高版本中。
- PHP/SELinux
- 它是 PHP 脚本语言的一组 SELinux API。 它为 PHP 脚本提供接口以与 SELinux 通信。
- 它打包为 php-pecl-selinux 在 Fedora9 或更高版本中。