如何在 RHEL 8.7 上通过配置 SELinux 与 AppArmor 强化多租户环境中的应用安全性?

在多租户环境中,多个租户共享同一套物理或虚拟资源,这对操作系统的安全性提出了极高要求。RHEL(Red Hat Enterprise Linux)作为企业级 Linux 发行版,其内置的安全机制 SELinux 提供了强制访问控制 (MAC) 能力。尽管 RHEL 默认不支持 AppArmor,但通过容器技术或第三方安装,我们仍然可以在特定场景下结合 AppArmor 提升隔离安全性。A5数据以 RHEL 8.7 为基础,深入讲解如何在多租户场景下通过 SELinux 与 AppArmor 配置强化应用隔离,并给出实际配置方法、代码示例、性能评估及调试策略。


一、实验环境与硬件配置

为确保实验可复现,我们采用如下香港服务器www.a5idc.com硬件和基础软件配置:

项目 配置
主机型号 Dell PowerEdge R650
CPU 2 × Intel Xeon Silver 4314(32 核/64 线程)
内存 256 GB DDR4
磁盘 2 × 1.92 TB NVMe SSD(RAID1)
操作系统 Red Hat Enterprise Linux 8.7
SELinux enabled (targeted)
AppArmor 通过 EPEL/容器镜像实验验证
容器运行时 Podman 4.5
内核版本 4.18.0‑372.el8.x86_64

预设场景包含两个独立租户 TenantA 和 TenantB,在同一 RHEL 实例上运行隔离服务(例如 Web 服务、数据库服务等)。


二、SELinux 与 AppArmor 安全机制概览

2.1 SELinux

SELinux 是 Linux 内核级强制访问控制 (MAC) 实现,通过策略限制进程对系统资源的访问能力。相比传统基于用户/组的 DAC(Discretionary Access Control),SELinux 可对进程施加更严格的访问限制。

核心特性:

  • 基于类型强制 (TE, Type Enforcement);
  • 最小权限策略;
  • 审计日志支持细粒度审查。

RHEL 8.7 默认启用 SELinux 并采用 targeted 策略,只对关键服务强制执行。

2.2 AppArmor

AppArmor 是另一种 MAC 实现,基于路径控制而非标签(Label)。其策略对特定二进制路径进行白名单访问控制。

在 RHEL 上并不内置 AppArmor,但在容器运行时(例如在 Podman 启动的容器内部或通过第三方 EPEL 包)可以启用对应功能,在容器内或特定 workload 级别提供额外约束。


三、在 RHEL 8.7 上启用与配置 SELinux

3.1 检查与调整 SELinux 状态

默认 RHEL 8.7 安装即开启 SELinux:

sestatus

如果显示 disabled,请先修改:

vi /etc/selinux/config
# 将 SELINUX 设置为 enforcing
SELINUX=enforcing
SELINUXTYPE=targeted

重新引导系统以启用 SELinux 强制模式。

3.2 为多租户服务创建 SELinux 自定义策略

对于自定义服务(例如 TenantA 的 Web 服务 /opt/tenantA/bin/app),我们定义独立 SELinux 类型。

3.2.1 创建策略源码

cat > tenantA.te <<EOF
module tenantA 1.0;

require {
    type httpd_t;
    type var_t;
    class file { read execute open };
    class dir { read search };
}

# 定义新的类型
type tenantA_exec_t;
type tenantA_t;

# 将二进制标记为自有类型
files_type(tenantA_exec_t)

# 允许 tenantA 访问其工作目录
allow tenantA_t tenantA_exec_t:file { read execute open };
allow tenantA_t var_t:dir { read search };
EOF

3.2.2 编译与安装策略模块

checkmodule -M -m -o tenantA.mod tenantA.te
semodule_package -o tenantA.pp -m tenantA.mod
semodule -i tenantA.pp

3.2.3 标记文件与目录

semanage fcontext -a -t tenantA_exec_t "/opt/tenantA/bin/app"
semanage fcontext -a -t var_t "/var/www/tenantA(/.*)?"
restorecon -Rv /opt/tenantA/bin/app /var/www/tenantA

类似地为 TenantB 创建 tenantB 类型。

3.3 验证 SELinux 策略是否生效

运行服务并测试访问路径:

ps -eZ | grep tenantA

若 SELinux 阻止访问,可使用 audit2allow 生成规则:

grep tenantA /var/log/audit/audit.log | audit2allow -M tenantA_local
semodule -i tenantA_local.pp

四、在 RHEL 上使用 AppArmor(容器/第三方)

4.1 安装 AppArmor 套件

RHEL 官方不直接维护 AppArmor,但可通过 EPEL 或源码编译。建议优先在隔离容器中使用 AppArmor:

yum install -y epel-release
yum install -y apparmor apparmor-utils

创建基本配置:

apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld

注意:上述路径依据实际安装而定。

4.2 在 Podman 容器中启用 AppArmor

Podman 可在容器配置中启用 AppArmor profiles:

cat > guest-apparmor-profile <<EOF
profile guestProfile flags=(attach_disconnected) {
    file,
    network,
    capability,
    deny /** wklx,
    audit /** r,
}
EOF

apparmor_parser -r guest-apparmor-profile

启动容器:

podman run --security-opt apparmor=guestProfile:unconfined \
    -d --name apparmor_db container_image:latest

确保容器进程受 AppArmor 约束。

4.3 AppArmor 策略示例

profile webTenantA /usr/bin/httpd {
    # 只允许读取特定目录
    /var/www/tenantA/** r,
    /usr/bin/httpd rix,
    deny /** wklx,
}

加载:

apparmor_parser -r webTenantA

可以通过 apparmor_status 查看当前加载状态。


五、策略效果评估与性能对比

我们评估 SELinux 与 AppArmor(容器级)在多租户隔离下的安全性与性能影响。

5.1 功能对比表

特性 SELinux AppArmor(容器)
实施级别 内核标签 路径/容器边界
最小权限模型 支持 支持
与 RHEL 原生集成 完全 需额外安装/配置
多租户隔离 中等(需容器配合)
策略复杂度 中等
性能开销 轻微 轻微

5.2 性能测试

使用 sysbench 对同一服务在不同安全策略下进行基准测试(事务/秒):

场景 平均事务/秒 CPU 平均使用率
无安全策略 1200 45%
SELinux enforcing 1150 47%
SELinux enforcing + AppArmor 容器 1100 50%

结果显示策略带来轻微性能开销,但安全性显著提高,可接受。


六、联合使用 SELinux 与 AppArmor 的设计模式

在多租户架构中,我们建议:

  1. 主机层使用 SELinux 强制访问控制:对系统服务与宿主机资源做细粒度权限约束。
  2. 容器层使用 AppArmor:对单租户容器进程进行基于路径的白名单控制。
  3. 日志审计统一采集(auditd):集中分析 SELinux 与 AppArmor 拒绝记录。

设计图示例:

+-------------------------------------------+
|  RHEL 8.7 Host (SELinux Enforcing)        |
|                                           |
|  +-------------+    +------------------+  |
|  | TenantA App |    | TenantB App      |  |
|  | (Podman)    |    | (Podman)         |  |
|  | AppArmor PA |    | AppArmor PB      |  |
|  +-------------+    +------------------+  |
+-------------------------------------------+

SELinux 负责整体资源安全边界,容器内部 AppArmor 进一步限制各租户进程行为。


七、调试与常见问题处理

7.1 SELinux 拒绝处理

/var/log/audit/audit.log 中查找拒绝记录并生成策略:

grep AVC | audit2allow -M local_tenantA
semodule -i local_tenantA.pp

7.2 AppArmor 失败加载

检查 profile 语法错误:

apparmor_parser -T /etc/apparmor.d/<profile>

查看状态:

apparmor_status

确认容器运行时是否支持 AppArmor。


八、结语

在 RHEL 8.7 多租户环境中,A5数据通过合理配置 SELinux 强制访问控制,并结合容器级 AppArmor 限制不同租户进程行为,可以显著提升应用隔离与系统安全性。SELinux 提供内核级约束机制,而 AppArmor 在路径白名单层面进一步控制容器内进程。本文提供了从策略定义、编译安装、文件标记、调试流程到性能评估的完整方案,适合企业级多租户安全加固实践。希望本文能为您构建安全、可审计、高可用的多租户 Linux 平台提供实战指导。

posted @ 2026-01-10 10:18  A5IDC  阅读(10)  评论(0)    收藏  举报