在 CentOS(以及所有使用 SELinux 的 Linux 发行版)中,安全上下文(Security Context) 是 SELinux(Security-Enhanced Linux) 用来做访问控制的核心概念。
简单来说:
安全上下文就是给“进程”和“文件/资源”贴的一张“身份标签”,SELinux 根据标签来决定“谁可以访问什么”。
你可以用下面命令查看:
ls -Z
ps -Z
典型的安全上下文格式是:
user:role:type:level
例如:
system_u:object_r:httpd_sys_content_t:s0
含义:
| 字段 | 说明 |
|---|---|
| user | SELinux 用户(不是 Linux 用户) |
| role | 角色(用于约束用户能进入哪些域) |
| type | 最重要,类型(Type Enforcement) |
| level | 安全级别(MLS/MCS,可选) |
SELinux 默认使用 TE(Type Enforcement) 模型:
规则是:
只有“进程的域”被允许访问“文件的类型”,访问才会成功
httpd_t 进程
↓
允许访问
↓
httpd_sys_content_t 文件
如果文件类型不对,比如是 default_t,即使 ls -l 显示权限是 777,也会被 SELinux 拒绝。
CentOS 默认启用 SELinux,目的是:
例如:
/etc/shadow| 对象 | 常见 context |
|---|---|
| Web 目录 | httpd_sys_content_t |
| SSH | sshd_t |
| 普通用户文件 | user_home_t |
| 日志文件 | var_log_t |
| 可执行程序 | bin_t |
ls -Z /var/www/html
ps -Z
chcon -t httpd_sys_content_t /web
restorecon -Rv /var/www
semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
restorecon -Rv /web
你可能会遇到:
Permission denied
但:
ls -l
显示权限正常。
原因很可能是:
SELinux 上下文不正确
解决通常:
restorecon -Rv 目录
CentOS 的安全上下文是 SELinux 的“访问标签”,它通过类型和规则严格控制进程能访问哪些资源,是 CentOS 安全机制的重要基础。
如果你愿意,我也可以结合 Web 服务 / 数据库 / Docker / 实际报错 给你讲更具体的例子。