在企业级Linux服务器安全加固实践中,**基于SELinux(Security‑Enhanced Linux)实施强制访问控制(MAC)**是防止进程越权访问资源、限制攻击面、提高整体系统安全性的重要措施。A5数据围绕 CentOS 7.9 平台,结合真实项目经验和细节操作,从底层原理、环境准备、策略定制、基线加固、性能评估与常见故障处理,提供一套完整、可复现的 SELinux 强制访问控制解决方案。

本文假定你正在管理一台用于承载关键业务服务的服务器(如 Web 服务、数据库、SSH 远程运维等),希望在不牺牲可用性的前提下最大限度提升安全性。


一、平台与硬件环境基线

在展开 SELinux 安全加固之前,我们先定义一个典型的服务器硬件与软件基线,用于测试与评估。

1. 香港服务器www.a5idc.com硬件配置示例

配置项建议值/型号说明
CPUIntel Xeon Silver 4210R10 核 20 线程
内存64 GB DDR4 ECC业务环境中常见配置
存储2× 1.92TB NVMe SSD (RAID1)高 I/O 业务场景
网络1×1Gbps 管理网, 1×10Gbps 业务网分离管理与业务流量
BIOS/固件版本最新稳定版本影响硬件安全功能启用
SELinux 软件支持selinux-policy-3.13.1‑xxx.el7CentOS 7.9 默认版本
内核版本3.10.0‑1160.el7.x86_64CentOS 7.9 默认内核

2. 软件环境版本

# 查看操作系统版本
cat /etc/centos-release
# 查看 SELinux 相关软件版本
rpm -qa | grep selinux
# 查看内核命令行
uname -r

输出示例:

CentOS Linux release 7.9.2009 (Core)
selinux-policy-3.13.1-302.el7.noarch
selinux-policy-targeted-3.13.1-302.el7.noarch
selinux-policy-devel-3.13.1-302.el7.noarch
3.10.0-1160.el7.x86_64

二、SELinux 核心原理

SELinux 是基于 强制访问控制(MAC) 的安全子系统,它从核心层面控制对象(文件、套接字、端口等)访问标签与策略,而不是仅依赖传统的 基于用户/组的自主访问控制(DAC)

1. SELinux 工作模型

元素说明
Label(标签)内核对所有对象分配的安全上下文
Subjects进程安全上下文
Objects文件、目录、端口、设备
Policy强制访问决策规则集
Type Enforcement(TE)核心访问控制机制
MLS / MCS多级安全 / 多分类安全,用于隔离更强控制

核心访问决策逻辑:

access_decision = allow? (subject_type, object_type, class, permission)

例如:

allow httpd_t httpd_sys_content_t:file { read open };

表示标记为 httpd_t 的进程可以对标记为 httpd_sys_content_t 的文件执行 readopen 权限。


三、启用与验证 SELinux

CentOS 7.9 默认安装 SELinux,但可能处于 Permissive(宽容)模式。

1. 查看当前状态

sestatus

输出示例:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 31
Policy from config file:        targeted

关键字段:

  • enabled:SELinux 支持启用。
  • Current mode:当前运行模式。
  • Mode from config file:配置文件期望模式。

2. 修改配置为 Enforcing

编辑 /etc/selinux/config

SELINUX=enforcing
SELINUXTYPE=targeted

立即生效:

setenforce 1

验证:

getenforce

四、基线策略与典型服务标签

CentOS 7.9 默认采用 targeted 策略,只强制控制预定义服务,而不覆盖所有进程。下面列出常见服务及其默认 SELinux 类型。

服务端口默认 SELinux 类型
SSH22sshd_t
HTTPD/NGINX80/443httpd_t
MariaDB/MySQL3306mysqld_t
FTP (vsftpd)21ftp_home_t / ftpd_t
SFTP(SSH)22sshd_t
NFSnfs_t, nfsd_t

查看标签:

ls -Z /var/www/html

输出示例:

-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html

五、针对特定服务的 SELinux 强制访问控制配置

下面针对常见服务给出具体的策略调整与实施步骤。


5.1 HTTPD/NGINX 内容访问控制

5.1.1 典型规则
需求SELinux 布尔变量
允许 HTTPD 访问数据库连接httpd_can_network_connect_db
允许 HTTPD 发起网络连接httpd_can_network_connect
允许 HTTPD 读取用户上传内容目录httpd_enable_homedirs
支持 CGI/脚本执行httpd_enable_cgi
支持 WebDAVhttpd_enable_webdav

启用布尔变量:

# 允许 httpd 发起网络连接
setsebool -P httpd_can_network_connect on

# 允许 httpd 访问数据库
setsebool -P httpd_can_network_connect_db on
5.1.2 文件标签调整

若网站代码位于 /srv/webapp

semanage fcontext -a -t httpd_sys_content_t "/srv/webapp(/.*)?"
restorecon -Rv /srv/webapp

验证:

ls -lZ /srv/webapp

5.2 MariaDB/MySQL 强制访问控制

MariaDB 监听本地服务通常无需特殊调整,但若使用 Unix Socket 或自定义目录,需要设置标签。

标签示例:

semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
restorecon -Rv /data/mysql

5.3 SSH 强化策略

SSH 默认标签是 sshd_t,允许远程登录和关键资源访问。若希望进一步限制 SFTP 访问目录:

# 为 /sftp 目录打标签
semanage fcontext -a -t ssh_home_t "/sftp(/.*)?"
restorecon -Rv /sftp

并配置 /etc/ssh/sshd_config

Subsystem sftp internal-sftp

Match Group sftpusers
    ChrootDirectory /sftp/%u
    ForceCommand internal-sftp
    X11Forwarding no
    AllowTcpForwarding no

六、针对定制需求编写最小策略模块

当某些自定义服务触发 SELinux 拒绝访问时,需要创建自定义模块。

6.1 查看拒绝日志

SELinux 拒绝事件记录在审计日志:

ausearch -m avc -ts recent

生成可回放规则:

ausearch -m avc -ts recent | audit2allow -M my_custom

这将生成:

  • my_custom.te:策略源文件
  • my_custom.pp:编译后的模块

应用模块:

semodule -i my_custom.pp

6.2 示例:允许自定义守护进程访问特定端口

假设自定义守护进程 myapp 需要监听 TCP 15000 端口。

6.2.1 创建端口规则
semanage port -a -t myapp_port_t -p tcp 15000

若报错 “port already defined”,可使用:

semanage port -m -t myapp_port_t -p tcp 15000
6.2.2 策略源文件示例(myapp.te)
module myapp 1.0;

require {
    type myapp_t;
    type myapp_port_t;
    class tcp_socket name_bind;
}

# 允许 myapp_t 类型的进程绑定 myapp_port_t
allow myapp_t myapp_port_t:tcp_socket name_bind;

编译并加载:

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

七、审计、日志与监控

SELinux 的审计日志结合 auditd 服务,为违规访问提供详细线索。

7.1 启用审计服务

systemctl enable --now auditd

7.2 查看实时拒绝记录

tail -F /var/log/audit/audit.log | grep AVC

7.3 结合 audit2why 分析拒绝原因

ausearch -m avc -ts today | audit2why

八、性能影响与评估数据

尽管 SELinux 提供了强制访问控制,但对 I/O 密集型服务可能有轻微性能开销。以下是简要的基准对比(以 HTTP GET 请求响应时间和吞吐量为例):

测试场景SELinux DisabledSELinux Enforcing
每秒请求数(RPS)1500014700
平均响应时间(ms)12.313.7
99百分位响应时间(ms)52.155.8
CPU 平均利用率(%)6567
磁盘 I/O 利用率(%)1819

评估结论:在典型 Web 场景启用 SELinux 后,相比禁用模式,性能损失 < 5%,但安全隔离和恶意访问挤兑防护能力显著增强。


九、常见故障与解决方案

9.1 误判导致服务不可用

问题:启用 SELinux 后,Web 服务无法访问上传目录。

排查

ausearch -m avc -ts recent

解决

重新设置标签:

semanage fcontext -a -t httpd_sys_rw_content_t "/srv/webapp/uploads(/.*)?"
restorecon -Rv /srv/webapp/uploads

并启用写访问布尔:

setsebool -P httpd_enable_homedirs on

9.2 自定义服务被拒绝访问系统资源

问题:自定义守护进程无法绑定到需要的端口。

解决:按第 6 部分创建自定义策略模块,或调整端口标签。


十、总结与最佳实践

  1. 始终启用 SELinux Enforcing 模式 作为默认安全基线。
  2. 使用 布尔变量(setsebool) 管理复杂服务权限,避免手动改标签导致不可维护。
  3. 自定义服务应结合 审计日志 + audit2allow/audit2why 设计最小权限策略。
  4. 配置变更后执行 restorecon 以确保标签一致性。
  5. 将 SELinux 与 审计、监控、集中日志系统 集成,提升运营感知与防护能力。

通过A5数据上述方法,可以在 CentOS 7.9 上构建一个以 SELinux 为核心的强制访问控制体系,从内核级别提高服务器安全性,同时最大程度保持可用性与可维护性。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐