传统的 Linux 安全机制靠着默认的用户权限、所属组、其他组、 ACL 等功能来实现权限控制,而目前还有另外一套安全机制 SELinux 机制来管理系统安全性,相比默认的权限控制 SELinux 的机制更为强制,默认的用户权限是靠着用户或者超级管理员设置和管理,而 SELinux 强制访问控制机制是由操作系统内核强制实施的,从而使系统更加安全。如果开启了 SELinux 每当操作的时候,SELinux 都会检测是否进程系统调用和网络套节字合法,如果不符合 SELinux 默认的权限就会被拒绝和终止。

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

在 SELinux 上下文包括以下字段: user(用户)、role(角色)、type(类型)和 security level(安全级别),例如有一个策略规则允许 Apache作为 httpd_t 运行的 Web 服务器进程,访问通常位于 /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

SELinux 默认提供多个命令可以协助帮助设置权限和查看 SELinux 目前运行状态和参数信息:

命 令作用说明
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系统启动和关机相关的信息

日志所以类型分为 3 大类:系统日志 、用户日志 、程序日志;系统日志一般都是有系统自动生成的,而用户日志主要就是记录一些用户登录和登出行为信息,程序日志是程序自己生产的,部分系统也会记录一份。常用的参数列表:

参数作用
-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

-p 参数对应的是日志输出的类型,目前日志类型列表:

类型作用
emerg系统出现严重故障,比如内核崩溃
alert应立即修复的故障,比如数据库损坏
crit危险比较高的故障,硬盘损坏导致程序运行失败
err危险性一般的故障,比如某个服务启动和运行失败
warning警告信息比如某个服务参数或者功能出错
notice不严重的一般故障,只是需要抽空处理的情况
info通用性消息用于提示一些有用的信息
debug调试程序所产生的信息
none没有优先级,不进行日志记录

其他资料

便宜 VPS vultr
最后修改:2023 年 07 月 05 日
如果觉得我的文章对你有用,请随意赞赏 🌹 谢谢 !