SELinux 提供了一种安全的策略语言,管理员可以使用它来定义系统安全策略。这种策略语言是相当复杂的,但是可以通过使用预定义的策略模块进行简化。这些策略模块是一组预定义的规则集,可以保护常见的应用程序和服务,如 Apache Web 服务器、MySQL 数据库等。
总的来说,SELinux 可以帮助管理员保护系统免受恶意攻击和安全漏洞的影响,从而提高系统的安全性和稳定性。然而,由于 SELinux 是一种高级的安全机制,其配置和管理需要一定的技能和经验。一般情况下很少自己起编写 SELinux 的安全策略文件,只会临时或者配置 SELinux 默认的安全策略级别信息,SELinux 配置文件路径 /etc/selinux/config
中,目前很多发行版本已经默认启动该功能。
级别 | 说明 |
---|---|
enforcing | 默认启动,强制实行安全策略,如果不符合要求就会被禁止 |
permissive | 该级别会提示用户操作不符合安全策略,但是不会拒绝操作 |
disabled | 直接禁止功能,因此也不会占用系统资源 |
而策略文件存放在 /etc/selinux/targeted/policy
中,是针对系统的安全策略进行定义的文件。SELinux 有两大策:域(domain)的概念允许定义哪些进程可以访问某些文件和目录;上下文 (context) 默认会给每个系统资源文件设置一个标签,而 SELinux 安全功能就要根据策略文件来检测进程和上下文的关系,从而来控制哪些进程可以访问什么资源。
# 查看进程域
ps -Z
# 查看资源上下文
ls -Z
# 查看目录
ls -Zd /xxx/dir
# 查看 selinux 状态
sestatus
/var/www/html/
和其他 Web 服务器目录中上下文的文件和目录 httpd_sys_content_t ,但是策略中没有允许规则适用于通常位于 /mysql
和 /data/msyql/
中的文件,因此不允许访问,即使 Apache 被破坏,一个恶意的脚本可以访问它,也无法访问 /data/msyql/
目录 。
因为有默认安全规则配置文件的存在,创建新文件或者移动文件修改文件会导致进程域和上下文不相符的情况,SELinux 默认就会拒绝此类操作导致不符合预期的效果,例如把 nginx 默认的网站目录设置为其他目录导致无法正常运行。
此时就要使用下面命令修改进程上下文,使得 nginx 能正常访问到文件:
semanage fcontext -a -t httpd_sys_content_t /wwwroot
semanage fcontext -a -t httpd_sys_content_t /wwwroot/*
# 如果是网络描述符资源,例如端口上下文
semange fcontext -a -t http_port_t -p tcp 8080
# 生效刚刚到修改
restorecon -Rv /wwwroot
# 查找符合 http 端口
semanage port -l | grep http
命 令 | 作用说明 |
---|---|
setenforce | 临时修改 SELinux 状态 |
getenforce | 获取当前系统 SELinux 状态 |
getsebool [-a] | 查询 SElinux 策略内各项规则的布尔值 |
setsebool [-P] | 设置策略并且永久生效 |
修改之后 nginx 进程就能成功访问到 /wwwroot 目录中的文件了, SELinux 没有阻挡读取文件的请求,SELinux 修改的日志相信会存储在 /var/log/audit/audit.log
中,下面开始介绍如何使用 journalctl 查看系统日志信息。
juornalctl 日志调试
上面介绍了 SELinux 在 Linux 起到作用,并且运行过程中出现问题也会被记录到日志中,方便后期维护审查系统。这里要介绍一款日志审查工具 journalctl ,该工具可以快速帮助管理员检索到需要的日志信息,目前 Linux 中日志系统的日志消息级别有:报错 、警告 、提示 、其他 进行标注,分别对应着不同日志文件:
文件 | 作用 |
---|---|
/var/log/boot.log | 系统开机自检日志和引导日志 |
/var/log/lastlog | 用户登录成功的时间,终端名称和 IP 地址 |
/var/log/btmp | 登录失败的用户时间和终端和 IP 地址 |
/var/log/messages | 系统各个服务的运行和报错信息 |
/var/log/secure | 系统安全相关的信息 |
/var/log/wtmp | 系统启动和关机相关的信息 |
参数 | 作用 |
---|---|
-k | 内核日志 |
-b | 启动日志 |
-u | 指定服务 |
-n | 显示行数 |
-p | 指定类型 |
-f | 强制输出 |
-since | 启示时间 |
-until | 终止时间 |
下面是一些使用例子,注意点事 -p 参数有很多类型:
# 只显示错误、冲突和重要告警信息
journalctl -p err..alert
# 显示从某个日期 ( 或时间 ) 开始的消息
journalctl --since="2012-10-30 18:17:16"
# 显示从某个时间 ( 例如 20分钟前 ) 的消息
journalctl --since "20 min ago"
# 显示最新信息,并且显示多少行
journalctl -f -n 10
# 查看特定进程
journalctl /usr/lib/systemd/systemd
# 如果知道进程名称查看指定进程名称
journalctl -u sshd
# 通过进程 PID 进行
journalctl _PID=1
# 清理两周之前日志
journalctl --vacuum-time=2weeks
# 清理日志使总大小小于 100M
journalctl --vacuum-size=100M
# 查看 SELinux 日志信息
sudo journalctl -t setroubleshoot -n 50
# 等价于这条命令
sudo dmesg | grep -i selinux
类型 | 作用 |
---|---|
emerg | 系统出现严重故障,比如内核崩溃 |
alert | 应立即修复的故障,比如数据库损坏 |
crit | 危险比较高的故障,硬盘损坏导致程序运行失败 |
err | 危险性一般的故障,比如某个服务启动和运行失败 |
warning | 警告信息比如某个服务参数或者功能出错 |
notice | 不严重的一般故障,只是需要抽空处理的情况 |
info | 通用性消息用于提示一些有用的信息 |
debug | 调试程序所产生的信息 |
none | 没有优先级,不进行日志记录 |