介绍SELinux:检查状态、启用、基础命令
1. 什么是SELinux?它有什么用?
SELinux (Security-Enhanced Linux) 是一个安全模块,它通过添加强制访问控制的概念来增强传统的权限管理模型。它允许管理员为用户甚至进程设置更加严格的限制,从而尽量减少可能的攻击带来的潜在损害。
它有什么特别之处?
想象一下,你的系统是一幢房子。传统权限(rwx对用户、组和其他人)就像房门的钥匙。但如果有人撬开了门怎么办?SELinux成为第二道防线,通过行为规则加强保护:"嘿,即使你进来了,也不能去浴室!"
SELinux的主要任务:
- 防止进程和文件的未授权访问。
- 即使进程被攻击,也能将损害降到最低。
- 遵循"默认保护"原则(所有内容都禁止,除非明确允许)。
SELinux的工作模式
SELinux可以在三种模式下运行:
- Enforcing — 激活状态,执行安全策略并阻止违反规则的进程。
- Permissive — 仅记录违规则件到日志但不阻止操作。
- Disabled — 完全禁用。
在enforcing模式下,SELinux就像系统的严厉大哥。而permissive模式就像唠叨的弟弟,只会抱怨,但是啥都不干。
2. 检查SELinux状态
首先我们来看看SELinux是否启用以及它运行在哪种模式下。有几个很方便的命令可以做到这一点。
命令 getenforce
这个命令会简单告诉你当前使用的模式是哪个:Enforcing、Permissive,还是Disabled。
$ getenforce
Enforcing
如果输出Disabled,说明SELinux被禁用了——这意味着你需要稍微多做一些工作来启用它,但我们稍后会讨论这个。
命令 sestatus
你可以通过这个命令获取更详细的SELinux状态报告。它会显示当前状态、活动模式和所用的策略。
$ sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
在这里你可以看到:
- enabled/disabled — SELinux是否启用。
- current mode — 当前模式 (enforcing, permissive)。
- loaded policy name — 加载的策略。例如,"targeted" 表示SELinux仅对关键进程应用控制。
3. SELinux模式切换
要更改SELinux的当前工作模式,可以使用命令setenforce
。
切换到permissive模式
如果你想暂时“放松”SELinux,可以启用permissive模式。
$ sudo setenforce 0
现在SELinux将仅记录违规行为,但不会阻止它们。你可以通过命令getenforce
检查新的设置:
$ getenforce
Permissive
切换回enforcing模式
当你想重新开启严格控制时,执行:
$ sudo setenforce 1
当然,检查下结果:
$ getenforce
Enforcing
此更改会立即生效,但仅在系统的下一次重启之前有效。
4. 启用 SELinux
如果 SELinux 被禁用,需要修改配置文件。SELinux 是通过文件 /etc/selinux/config
管理的。
检查当前配置文件
先看看里面都设置了什么。可以使用任意文本编辑器,比如 nano
:
$ sudo nano /etc/selinux/config
你将看到类似下面的内容:
# This file controls the state of SELinux on the system.
SELINUX=disabled
SELINUXTYPE=targeted
切换 SELinux 到启用状态
为了启用 SELinux,把 SELINUX=disabled
修改为 SELINUX=enforcing
或 SELINUX=permissive
。
修改后的文件示例如下:
# This file controls the state of SELinux on the system.
SELINUX=enforcing
SELINUXTYPE=targeted
编辑后保存文件并重新启动系统:
$ sudo reboot
重启之后,可以使用 sestatus
检查状态,确保 SELinux 已启用。
5. SELinux上下文解析
什么是上下文?
上下文是SELinux用来管理访问的一种标签。每个文件、进程和用户都有自己的上下文。
你可以使用命令ls -Z
来查看文件的上下文。例如:
$ ls -Z /var/www/html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
这是什么意思呢?
- unconfinedu — SELinux用户。
- objectr — 对象类型。
- httpdsyscontent_t — 访问类型(在这个例子中与web服务器相关)。
- s0 — 安全级别。
更改上下文
如果SELinux阻止你的应用程序正常运行,可能需要更改文件的上下文。使用命令chcon
:
$ sudo chcon -t httpd_sys_content_t /var/www/html/index.html
这个命令临时更改文件的上下文类型。然而,在重启后更改可能会丢失,因此对于永久配置,最好修改SELinux策略(稍后会讲到)。
6. SELinux 工作示例
我们来看看一个例子。你是一个服务器管理员,想要部署一个 web 服务器,但 SELinux 阻止访问目录 /var/www/html
中的文件。
步骤:
检查 SELinux 的状态:
$ sestatus
确保 SELinux 已启用且运行在 enforcing 模式。
查看文件上下文:
$ ls -Z /var/www/html
如果上下文不正确,修改它:
$ sudo chcon -t httpd_sys_content_t /var/www/html/*
检查 web 服务器是否正常工作。
7. 常见错误和问题
SELinux 被关闭,但你没有注意到。 一定要用
sestatus
检查状态。很多管理员安装系统后忘记启用 SELinux。"为什么我的服务不能正常运行?" SELinux 阻止了访问。用
audit.log
来分析:$ sudo cat /var/log/audit/audit.log | grep denied
上下文的更改没有保存。 不要用
chcon
,而是用像semanage
这样的永久性更改命令。
学习 SELinux 就像准备马拉松:起初可能有点难,但久而久之你会明白这个工具如何显著提升系统安全性。用这些知识,让自己成为一个即使面对最牛的黑客也能毫发无损的管理员。
GO TO FULL VERSION