绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
[译文] 如何为 PostgreSQL 和 TimescaleDB 配置 SELinux
2022-05-12 15:36:56

数据是公司重要的资产,因此您应该考虑数据库中的所有安全因素,以确保其尽可能安全。基于 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 以降低出错风险:

image.png

如果您不想禁用它,您可以使用 Permissive 模式并监控服务器中的日志以确保您拥有正确的 SELinux 配置。之后,您可以按照上述说明将其更改为强制执行。

您可以在RedHatCentOS官方站点上找到有关 SELinux 配置的更多信息。

来源  https://www.modb.pro/db/100141

分享好友

分享这个小栈给你的朋友们,一起进步吧。

TimescaleDB
创建时间:2022-03-21 14:43:25
TimescaleDB
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • itt0918
    专家
戳我,来吐槽~