在 CentOS(以及其它使用 SELinux 的 Linux 发行版)中,context(安全上下文,Security Context) 是 SELinux 的核心概念,用来做强制访问控制(MAC)。
简单来说:
context 决定了“谁(进程)能以什么方式访问什么(文件/端口/资源)”。
SELinux 中,每个对象都有安全上下文,格式通常是:
user:role:type:level
例如:
system_u:object_r:httpd_sys_content_t:s0
常见字段说明:
system_u、unconfined_u)object_r、system_r)即使你是 root,SELinux 也看 context。
示例:
httpd_thttpd_sys_content_t如果文件 context 不对:
/var/www/html/index.html -> user_tmp_t
Apache 会 拒绝访问,即使权限是 777。
✅ 解决:
restorecon -Rv /var/www/html
SELinux 给端口也定义了 context。
例如:
semanage port -l | grep http
如果你让 Apache 监听 8081,但端口没有 http_port_t:
systemctl start httpd # 失败
✅ 解决:
semanage port -a -t http_port_t -p tcp 8081
即使:
SELinux 仍能阻止:
这是 最小权限原则。
当出现“权限没问题但访问被拒”时:
tail /var/log/audit/audit.log
# 或
ausearch -m avc -ts recent
通常会看到类似:
denied { read } for pid=... comm="httpd"
target="index.html" scontext=httpd_t
tcontext=user_tmp_t
说明:context 不匹配。
| 对象 | 常见 context |
|---|---|
| Apache 网页 | httpd_sys_content_t |
| SSH 配置 | etc_t |
| MySQL 数据 | mysqld_db_t |
| 日志文件 | var_log_t |
| 可执行程序 | bin_t |
查看 context:
ls -Z
ps -Z
netstat -Z
修改 context:
chcon -t httpd_sys_content_t /data/www
恢复默认 context:
restorecon -Rv /path
永久生效:
semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
restorecon -Rv /data/www
CentOS 中的 context 是 SELinux 用来“判断能不能访问”的依据,比传统 Linux 权限更严格、更安全。
如果你愿意,我可以:
你更想了解哪一块?