数据是公司重要的资产,因此您应该考虑数据库中的所有安全因素,以确保其尽可能安全。基于 RedHat 的操作系统上的一项重要安全功能是 SELinux。在这篇文章中,我们将看到这个特性是什么,以及如何为PostgreSQL和TimescaleDB数据库配置它。
什么是 SELinux?
Security-Enhanced Linux (SELinux) 是 Linux 系统的一种安全架构,允许管理员更好地控制谁可以访问系统。它使用安全策略定义系统上的应用程序、进程和文件的访问控制,这是一组告诉 SELinux 可以访问什么的规则。
当称为主体的应用程序或进程发出访问对象(如文件)的请求时,SELinux 会检查访问向量缓存 (AVC),其中为主体和对象缓存了权限。如果 SELinux 无法根据缓存的权限做出访问决策,它会将请求发送到安全服务器。安全服务器检查应用程序或进程和文件的安全上下文。从 SELinux 策略数据库应用安全上下文,并授予或拒绝权限。
有不同的方法来配置它。您可以查看/etc/selinux/config中的主要 SELinux 配置文件,以了解它当前的配置方式。
$ cat /etc/selinux/config<font></font> # This file controls the state of SELinux on the system.<font></font> # SELINUX= can take one of these three values:<font></font> # enforcing - SELinux security policy is enforced.<font></font> # permissive - SELinux prints warnings instead of enforcing.<font></font> # disabled - No SELinux policy is loaded.<font></font> SELINUX=enforcing<font></font> # SELINUXTYPE= can take one of these three values:<font></font> # targeted - Targeted processes are protected,<font></font> # minimum - Modification of targeted policy. Only selected processes are protected.<font></font> # mls - Multi Level Security protection.<font></font> SELINUXTYPE=targeted
该文件中有两个指令。SELINUX 指令指定 SELinux 模式,它可以具有三个可能的值:Enforcing、Permissive 或 Disabled。
强制(默认):它将在系统上启用和强制执行 SELinux 安全策略,拒绝用户和进程未经授权的访问尝试。
Permissive:使用它,SELinux 已启用,但不会强制执行安全策略。所有违反政策的行为都记录在审计日志中。这是在强制执行之前测试 SELinux 的好方法。
已禁用:SELinux 已关闭。
SELINUXTYPE 指令指定要使用的策略。默认值是targeted,使用此策略,SELinux 允许您自定义和微调访问控制权限。
即使强制模式是默认模式,禁用 SELinux 也已成为一种常见做法,因为它比应对它更容易。当然,这不是推荐的,您应该至少在 Permissive 模式下配置它并定期检查日志以查找异常行为。
如何配置 SELinux
如果您的环境中禁用了 SELinux,您可以通过编辑 /etc/selinux/config 配置文件并设置 SELINUX=permissive 或 SELINUX=enforcing 来启用它。
如果您从未使用过 SELinux,配置它的佳方法是首先使用 Permissive 模式,检查日志以查找消息日志文件中的拒绝消息,并在需要时修复它:
$ grep "SELinux" /var/log/messages
在检查完所有内容并且可以安全继续后,您可以使用以下命令将 SELinux 配置为使用以前的方法强制执行或不重新启动:
$ setenforce 1
如果需要回滚,请运行:
$ setenforce 0
此命令可用于动态在强制和许可模式之间切换,但如果您重新启动系统,这些更改不会持续存在。您需要在配置文件中配置该值以使其持久化。
您可以使用 getenforce 命令检查当前的 SELinux 状态:
$ getenforce<font></font> Enforcing
或者有关更多详细信息,您可以使用sestatus 代替:
$ sestatus<font></font> SELinux status: enabled<font></font> SELinuxfs mount: /sys/fs/selinux<font></font> SELinux root directory: /etc/selinux<font></font> Loaded policy name: targeted<font></font> Current mode: enforcing<font></font> Mode from config file: enforcing<font></font> Policy MLS status: enabled<font></font> Policy deny_unknown status: allowed<font></font> Memory protection checking: actual (secure)<font></font> Max kernel policy version: 33
如何为 PostgreSQL 和 TimescaleDB 配置 SELinux
如果您使用默认配置和默认数据目录安装PostgreSQL/TimescaleDB,并且SELinux也是默认配置的,那么您很可能不会有任何问题,但问题是您是否要使用,例如特定位置在哪里存储您的数据库,那么让我们看看如何配置 SELinux 使其工作。对于本示例,我们将在 CentOS 8 上安装 PostgreSQL 13,并将使用 /pgsql/data/ 作为数据目录。
首先,启用 postgresql 模块:
$ dnf module enable postgresql:13
安装相应的 PostgreSQL 13 包:
$ dnf -y install postgresql-server postgresql-contrib postgresql-libs
启用服务:
$ systemctl enable postgresql.service
初始化你的 PostgreSQL 数据库:
$ postgresql-setup --initdb
现在,如果您只启动服务而不更改任何内容,例如数据目录,它将正常启动,否则,您将看到如下错误:
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal postmaster[29116]: postmaster: could not access the server configuration file "/pgsql/data/postgresql.conf": Permission denied<font></font> <font></font> Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal systemd[1]: postgresql.service: Main process exited, code=exited, status=2/INVALIDARGUMENT<font></font> <font></font> Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal systemd[1]: postgresql.service: Failed with result 'exit-code'.
那么,让我们看看如何修复它。首先,更改 PostgreSQL 配置文件和服务中的数据目录。为此,编辑 PostgreSQL 服务文件并更改 PGDATA 位置:
$ vi /etc/systemd/system/multi-user.target.wants/postgresql.service<font></font> Environment=PGDATA=/pgsql/data
编辑 PostgreSQL bash 配置文件并更改PGDATA 位置:
$ vi /var/lib/pgsql/.bash_profile<font></font> PGDATA=/pgsql/data
阅读更改:
$ systemctl daemon-reload
初始化新的 PostgreSQL 数据库:
$ postgresql-setup --initdb<font></font> * Initializing database in '/pgsql/data'<font></font> * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
不必像之前在配置文件中那样指定新的数据目录位置。现在,在开始之前,您需要更改 SELinux 标签:
$ chcon -Rt postgresql_db_t /pgsql/data
此命令将更改 SELinux 安全上下文,标志为:
R , --recursive: 递归操作文件和目录
t , --type=TYPE: 在目标安全上下文中设置类型 TYPE
然后,启动 PostgreSQL 服务:
$ systemctl start postgresql.service
您的数据库现在正在运行:
$ ps aux |grep postgres |head -1<font></font> postgres 28566 0.0 3.0 497152 25312 ? Ss 21:16 0:00 /usr/bin/postmaster -D /pgsql/data
这只是如何为 PostgreSQL/TimescaleDB 配置 SELinux 的基本示例。有不同的方法可以使用不同的限制或工具来做到这一点。佳 SELinux 实现或配置取决于业务需求。
如何在 ClusterControl 和 SELinux 中使用 PostgreSQL 和 TimescaleDB
ClusterControl不管理任何 Linux 内核安全模块,如 SELinux。使用 ClusterControl部署PostgreSQL或TimescaleDB集群时,您可以指定是否希望ClusterControl在部署过程中为您禁用 SELinux 以降低出错风险:
如果您不想禁用它,您可以使用 Permissive 模式并监控服务器中的日志以确保您拥有正确的 SELinux 配置。之后,您可以按照上述说明将其更改为强制执行。
您可以在RedHat或CentOS官方站点上找到有关 SELinux 配置的更多信息。
来源 https://www.modb.pro/db/100141