在 CentOS(以及 RHEL 系列系统)中,SELinux 和 context(安全上下文) 是紧密相关的一组概念。简单说:context 是 SELinux 用来做访问控制的核心依据。
下面分层说明它们的关系。
SELinux(Security-Enhanced Linux)是一种**强制访问控制(MAC)**机制,不同于传统的 Linux 自主访问控制(DAC,即 rwx + 用户/组)。
SELinux 决定:
在 SELinux 中,几乎所有对象都有 安全上下文(security context),格式通常是:
user:role:type:level
例如:
system_u:object_r:httpd_sys_content_t:s0
最常见、最关键的是 type(类型)。
SELinux 策略规则大致是:
某类型的进程 可以 对某类型的对象 做 某种操作
例如:
httpd_t 进程httpd_sys_content_t 类型的文件user_home_t 类型的文件如果文件 context 不对,即使 ls -l 显示 755、属主正确,也会被 SELinux 拒绝。
ls -Z /var/www/html
ps -Z
semanage port -l
CentOS 中:
mv 可能保留旧 context(容易出问题)cp 通常会按目标目录重新打标常见操作:
# 临时修改
chcon -t httpd_sys_content_t /srv/web
# 永久修改(推荐)
semanage fcontext -a -t httpd_sys_content_t "/srv/web(/.*)?"
restorecon -Rv /srv/web
Apache 无法访问网页,权限是 755,但报错:
Permission denied
文件 context 是:
user_home_t
而 httpd 只能访问:
httpd_sys_content_t
semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
restorecon -Rv /web
在 CentOS 中,SELinux 通过“安全上下文(context)”来实施强制访问控制;context 不对,SELinux 就会拒绝访问,即使传统 Linux 权限正确。
如果你愿意,我也可以:
chcon / semanage / restorecon 的区别