共计 4236 个字符,预计需要花费 11 分钟才能阅读完成。
概述
SELinux,全称 Security-Enhanced Linux,是一个为零碎提供强制访问控制机制的平安模块,装置并启用 SELinux 模块的操作系统会为每个过程和系统资源打上一个非凡的平安标记,称为 SELinux 上下文,并依据 SELinux 上下文信息以容许或回绝拜访行为。
亚马逊云科技开发者社区为开发者们提供寰球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、流动与比赛等。帮忙中国开发者对接世界最前沿技术,观点,和我的项目,并将中国优良开发者或技术举荐给寰球云社区。如果你还没有关注 / 珍藏,看到这里请肯定不要匆匆划过,点这里让它成为你的技术宝库! |
依据国家网络安全等级爱护根本要求,第三级零碎在平安计算环境层面“应答重要主体和客体设置平安标记,并管制主体对有平安标记信息资源的拜访”,因而须要通过国家等保三级测评的零碎均须要在零碎内开启 SELinux。
注:亚马逊官网零碎镜像 Amazon Linux 2022 已默认开启了 Enforcing 策略的 SELinux。
随着 SELinux 的利用越来越宽泛,由 SELinux 配置不当导致的系统故障也随之增多,重大状况下可能导致系统启动失败,本文先从如何紧急复原 SELinux 故障的 EC2 主机动手,而后围绕 SELinux 常见三大问题本源之一的“标签故障”,介绍在 AWS 上进行故障排查的办法及思路。
EC2 紧急复原的两种办法
EC2 串行控制台拜访
如果故障主机满足串行控制台拜访前置条件,并且启用了串行控制台拜访,则能够间接应用 EC2 串行控制台拜访进行紧急复原以及故障排查,串行控制台不要求您的 EC2 实例具备任何联网性能。应用串行控制台,您能够向实例输出命令,就像键盘和显示器间接连贯到实例的串行端口一样。串行控制台会话在实例重启和进行期间继续。在重新启动期间,您能够从一开始就查看所有启动音讯。串行控制台默认未启用,须要明确受权当前方可应用,具体方法如下:
1、授予账户可执行串行控制台的权限,倡议的 IAM 策略如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:GetSerialConsoleAccessStatus",
"ec2:EnableSerialConsoleAccess",
"ec2:DisableSerialConsoleAccess"
],
"Resource": "*"
}
]
}
配置此策略后,账户将能够在连贯 EC2 实例时,看到“EC2 串行控制台拜访”的选项,初始默认为“禁止”,须要点击“治理”,设置为“容许”,结束,账号即可对 EC2 进行串行控制台拜访.
2、在串行控制台登陆 EC2 服务器前,咱们还须要为 EC2 建设容许在串行控制台应用明码登陆的用户及口令。应用默认的 SSH 形式近程登录 EC2 服务器,登录当前应用 passwd 设定明码,上面应用 root 为例:
[ec2-user ~]$ sudo passwd root
3、禁用 SELinux 以进行紧急复原,对于因 SELinux 导致的系统故障,咱们能够先禁用 SELinux 以进行紧急复原及故障排查。串行控台登录服务器当前,间接批改 /etc/selinux/config 并将 SELINUX=disabled,而后重启服务器,即可失效。
救济实例
对于不反对串行控制台拜访的服务器,或反对但后期未启用的,咱们还能够应用救济实例对 SELinux 故障主机进行紧急复原。具体操作如下:
- 在 Virtual Private Cloud (VPC)中启动新的 Amazon EC2 实例,且应用与受损实例雷同的 Amazon 零碎映像 (AMI)并与其位于同一可用区中。新实例将成为您的“救济”实例。或者,也能够应用您能够拜访的现有实例,但前提是该实例应用与受损实例雷同的 AMI,并且二者位于同一可用区中.
- 从受损实例中拆散 Amazon Elastic Block Store (Amazon EBS)根卷(/dev/xvda 或 /dev/sda1)。记下设施名称,以确保稍后从新连贯时它是雷同的
- 将 EBS 卷作为辅助设施(/dev/sdf)附加到救济实例。
- 应用 SSH 连贯到您的救济实例。
- 成为根用户,应用 lsblk 标识正确的设施名称,而后将其保留以在整个过程中应用:
$ sudo -i
# lsblk
# rescuedev=/dev/xvdf1
留神:设施(/dev/xvdf1)可能会以不同的设施名称附加到救济实例。应用 lsblk 命令查看可用磁盘设施及其挂载点,以确定正确的设施名称。
6、抉择要应用的适当长期挂载点,并确保它存在,请应用 /mnt,除非该挂载点已在应用
# rescuemnt=/mnt
# mkdir -p $rescuemnt
7、从附加的卷挂载根文件系统:# mount $rescuedev $rescuemnt
留神:如果卷挂载失败,请查看 dmesg | tail。如果日志显示 UUID 抵触,请应用选项 -o nouuid。
8、批改 SELinux 配置文件
# cd /mnt/rescuemnt
# vi ./etc/selinux/config
9、实现后,卸载辅助设施:
# exit
# umount $rescuemnt
10、将辅助卷(/dev/sdf)与救济 EC2 实例拆散,而后以 /dev/xvda 或 /dev/sda1(根卷)的模式将其附加到原始实例。确保这与步骤 2 中看到的雷同。/11、启动 EC2 实例,而后验证实例是否失常重启。
SELinux 日志剖析
零碎复原当前,咱们第一步是剖析 SELinux 拦挡日志,剖析 SELinux 到底是拦挡了哪些过程才导致的零碎异样。默认状况下,SELinux 拦挡日志均记录在 /var/log/audit/audit.log 及 /var/log/messages 文件中,对于 audit 和 message,咱们均能够通过关键词“AVC”(Access Vector Cache,拜访矢量缓存)筛选除 SELinux 拦挡的日志,以下是当 Apache HTTP 服务器(在 httpd_t 域中运行)尝试拜访 /var/www/html/file1 文件(标有 samba_share_t 类型)时产生的 AVC 回绝日志(以及关联的零碎调用)示例(具体日志格局含意,可参考 RedHat 官网链接):
type=AVC msg=audit(1226874073.147:96): avc: denied {getattr} for pid=2465 comm="httpd"
path="/var/www/html/file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
type=SYSCALL msg=audit(1226874073.147:96): arch=40000003 syscall=196 success=no exit=-13
a0=b98df198 a1=bfec85dc a2=54dff4 a3=2008171 items=0 ppid=2463 pid=2465 auid=502 uid=48
gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=6 comm="httpd"
exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
通过剖析 SELinux 拦挡日志,可辨认出故障产生时 SELinux 拦挡掉的过程及门路文件信息。
注:如果通过剖析日志无奈直观辨认出被拦挡的异样过程,因为 audit 及 message 都默认有归档性能,还能够将故障工夫点的拦挡日志与失常时间段拦挡日志进行比照剖析,辨认出故障产生时被额定拦挡的过程。
过程上下文标签重置
剖析上下文标签有两种形式:一种是间接对拦挡日志中主客体的上下文各个字段进行剖析,包含剖析 SELinux 用户、角色、类型、以及级别,这方面的剖析须要管理员对 SELinux 有十分粗浅的了解,要求较高。
作为一种简略但更实用的排查办法,对于仅仅启用默认 SELinux 策略的零碎,咱们能够应用 rhel-autorelabel 服务将零碎过程上下文标签进行复原重置,而后通过对比重置前后的文件标签属性,辨认出过程上下文标签的异样。
对于文件标签属性,咱们有两种办法进行比照,一种手动比照,咱们可应用系统命令“ls -z file”查看并记录重置前后 file 的上下文标签值。这种比照办法实用于小量文件的比照;另一种是在零碎装置 AIDE 文件完整性校验工具,将须要比照的文件退出 aide.conf 文件中,自动化进行比照。AIDE 应用办法参考如下:
cp /etc/aide.conf /etc/aide.conf_bak(可选,备份原始 conf 文件)vi /etc/aide.conf (可选,在默认的根底上减少须要比照的文件,起源能够是日志剖析辨认到的一个或多个异样过程)
aide --init
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
aide --check
启用 rhel-autorelabel 服务的操作命令如下:
systemctl enable rhel-autorelabel
touch /.autorelabel
reboot
#零碎重启后,将会对文件重打 SELinux 上下文标签
故障起因验证
在通过标签重置,并比照剖析辨认到标签故障具体起因后,咱们能够尝试系统命令 chcon 将异样过程的上下文标签批改为正确或谬误的值,验证异常现象是否隐没或复现,从而确定故障的根本原因。
总结
本文围绕“标签故障”这一 SELinux 常见故障本源,探讨了 SELinux 故障剖析的思路和办法,但在理论环境中,系统故障的起因有多种,甚至 SELinux 故障仍有许多可能性,因而还须要查阅系统日志文件及官网文档进行详细分析。
本篇作者
王俊峰
亚马逊云科技业余服务团队平安参谋,负责云平安合规、云平安解决方案等的征询设计及落地施行,致力于为客户上云提供平安最佳实际,并解决客户上云中碰到的平安需要。
文章起源:https://dev.amazoncloud.cn/column/article/63186bc260678178b03…