SEPostgreSQL 简介

来自 PostgreSQL wiki
(从 SEPostgreSQL 重定向)
跳转到导航跳转到搜索

SepgsqlLogo.png

本文档为安全增强型 PostgreSQL (SE-PostgreSQL) 提供了全面文档。SE-PostgreSQL 是 PostgreSQL 的内置增强功能,它基于安全增强型 Linux (SELinux) 安全策略提供额外的访问控制。以下章节展示了 SE-PostgreSQL 的背景、概述、设计以及参考(对象类、权限等)。

  • 章节列表
  1. 简介
  2. 架构
  3. 规格
  4. SELinux 概述
  5. 管理
  6. 参考
  7. 开发

什么是 SE-PostgreSQL

数据库是管理信息资产的重要工具。数据库使信息以比文件系统更优雅的方式进行搜索、检索和存储。

大多数现有的 RDBMS 应用自己的访问控制,例如 GRANT 和 REVOKE,而不与操作系统协作。这会导致访问控制与文件系统等上的访问控制不一致。

一些现代操作系统具有增强的访问控制功能,例如 SELinux。大多数这些功能的设计基于参考监控模型(源自 1980 年代的研究),该模型允许所有系统访问由集中式安全策略管理。参考监控模型假设对象管理器(例如操作系统)可以捕获所有系统访问,然后决定是否允许或拒绝该访问。注意:在所有情况下,操作系统都不是对象管理器。关系数据库管理系统 (RDBMS) 是数据库对象的管理器,类似于操作系统是文件系统对象的管理器。以前,RDBMS 独立于集中式安全策略做出访问控制决策,因此需要仔细维护操作系统和 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 窗口系统和 RDBMS,可以用作进程间通信通道。用户空间管理的资源对内核是不可见的,留下了两种安全策略选项:传统的全有或全无策略,不允许共享用户空间对象(这是不现实的),或者增强用户空间对象管理器,使其访问控制决策基于 SELinux 的单一统一安全策略。

SepgsqlDocFigure01.png

上图展示了一致的数据流控制。它要求机密信息(更高敏感性级别域)不会通过进程间通信通道泄露到非机密域(更低敏感性级别域),无论这些通道是网络、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) 组成。此外,我们希望将其覆盖范围扩展到应用程序服务器层。

SepgsqlDocFigure11.png

外部链接
  • SELinux
    • SELinux 已成为 Linux 内核 2.6.x 系列中的一个上游功能,并受到主要发行版(RedHatEL、Fedora 等)支持超过五年。它可以对系统资源的访问应用细粒度的强制访问控制。
  • 参考策略
    • 它是 SELinux 中的默认安全策略。它由 SELinux 社区管理和开发。
    • 它在 refpolicy-20070928 或更高版本中获得了 SE-PostgreSQL 支持。
  • Apache/SELinux plus
    • 它是 Apache Web 服务器的额外模块,它允许使用基于 HTTP 身份验证的特定安全上下文启动 Web 应用程序实例。它允许操作系统/RDBMS 对每个 Web 用户应用有效的访问控制。
    • 它在 Fedora11 或更高版本中打包为 mod_selinux
  • PHP/SELinux
    • 它是一组针对 PHP 脚本语言的 SELinux API。它为 PHP 脚本提供与 SELinux 通信的接口。
    • 它在 Fedora9 或更高版本中打包为 php-pecl-selinux