那天对着服务器终端反复敲命令,脑子里就绕着selinux是什么这个问题,页面一直报权限拒绝,文件权限明明都改成755,属主也调对了,可服务就是起不来,日志刷出来一堆看不懂的提示。之前接触的权限配置,改改读写执行基本都能搞定,哪想到还有一层东西拦在那,当时完全没往这个方向想,反复核对配置文件,删了重写,重启服务几十次,屏幕上的报错文字翻来覆去都是同一个样子。

最先怀疑是防火墙的问题。

关掉防火墙,再启动。报错依旧,一点变化都没有。坐在椅子上盯着黑底白字的窗口,心里有点发闷,网上翻零散的帖子,好多人随口提一句selinux,可没说清楚它到底在这个流程里做什么,我也只是模糊记下这个名字,不知道它和普通文件权限根本不是一回事。那时候下意识觉得,权限就是文件上标记好的那串数字,只要改到位,程序就能正常读取,哪里晓得还有另外一套管控规则,会单独拦进程的访问动作。

翻帖子的时候看到有人说临时关掉它就能跑通,抱着试一试的想法敲了命令,设置成permissive模式,再一次启动服务。这一次,日志不再抛出权限拒绝的记录,服务正常跑起来了。盯着成功的状态提示,反倒更懵了,原来之前所有的调整都没触碰到真正卡住的地方,之前花那么久调整文件属主、权限位,全都做在了另外一套规则上面。只是这么临时放行之后,我也不敢长时间维持这个状态,帖子里有人说不建议直接永久关闭,可我当时根本理不清这里面的取舍,只是单纯记下,这个东西会额外限制程序能访问哪些资源。

之后试着看审计日志,里面一条条记录着被拦截的动作,每一条都带着上下文的标签。慢慢才隐约感觉到,它不是简单判断文件能不能读,而是给进程、文件都打上一类标签,再按照标签之间的匹配关系做放行或者拦截,和我一直熟悉的rwx权限完全分开。同一个文件,权限放开了,要是对应的标签不允许当前进程访问,照样拿不到内容。那段时间反复打开日志看,很多标签名称看着很绕,记不住,也没法快速判断该怎么新增允许规则,只能看懂哪些动作被它拦下来了。

有次换一台同版本的机器部署同样的程序,同样的配置文件,同样的权限设置,这台机器上服务直接正常启动,没有任何报错。对比两台机器的状态,才发现一台是开启状态,一台本身就是宽松模式,一下子就对上了之前遇到的情况。两台机器文件配置一模一样,结果完全两样,差别就只在这个开关上面。也就在这一刻,才把之前零散碰到的问题串起来,原来它是系统自带的一层额外访问控制,不是我手动装的工具,系统默认就带着。

试过去尝试添加策略,照着别人贴出来的命令生成规则,可生成完之后刷新,还是会冒出新的拦截记录。标签之间的关系比想象中细碎,改一处,别的地方又有可能被卡住,试了两三次之后就停手了。没有继续深挖策略编写,只是明白了,想要让特定程序正常运行,可以选择调整策略,也可以切换模式,两种路子,只是我当时没能力把策略调妥当。

这些都只是我自己碰出来的感受,不同系统版本、不同业务程序,碰到的情况会不一样,别人的场景不一定和我这个一样。我也没有摸透它全部的逻辑,到现在也只能分得清它和普通文件权限不是同一个东西,知道它会基于标签去管控进程行为,别的更深的细节,还没有足够多的实操积累。

那天凌晨三点,关掉终端,起身去接水。脑子里还留着终端里audit日志不停滚动的样子,没有去整理一套固定的处理步骤,只是记住了,以后再碰到权限改完依旧拒绝访问的情况,会多留意这个方向。