查看原文
其他

AIX 关键系统文件被清空问题定位过程全记录 | 运维进阶

twt社区 twt企业IT社区 2024-02-18

【作者】陈炽卉,15年Power服务器领域工作经验,高级技术支持中心性能调优专家,红皮书《Power Systems Performance Guide: Implementing and Optimizing》主要作者之一。长期在金融、电信行业从事技术支持工作;对应用开发、系统优化、故障定位、基准测试等方面均有丰富经验。


问题描述

某日接到客户反馈,某系统备机重启后 telnet 无法登录,提示信息如下:

telnet (testlpar1)

telnetd: /bin/login: Cannot run a file that does not have a valid format.

.

而 ssh 登录显示正常。

问题定位过程

从错误提示, /bin/login 文件格式有问题,参照正常系统做一番简单检查,就可以看到:

/usr/sbin/tsm 文件被清空了,导致了 telnet 登录失败。

从另一台主机上拷贝 /usr/sbin/tsm 之后, telnet 恢复正常。

然而,系统重启后,同样的故障再次出现:

telnetd: /bin/login: Cannot run a file that does not have a valid format.

这样看来,系统中仍存在隐患故障点,导致了 /usr/sbin/tsm 每次重启过程中都会被清空。

从实际情况看, /usr/sbin/tsm 文件仍然存在,访问权限也未变化。这说明在重启过程中的破坏性动作很可能是一次类似 ”> /usr/sbin/tsm” 的清空文件操作。

下一步需要定位 /usr/sbin/tsm 文件为何被清空。

AIX 从 4.3 版本开始就提供了 Audit 审计功能,能够对关键系统操作进行记录。详细的介绍文档可以参考:

http://www.redbooks.ibm.com/abstracts/sg246020.html

考虑到 tsm 文件被置空之前,首先需要写打开 tsm 文件,这样我们只需要监控对 tsm 文件的写打开操作即可追踪到故障点。而且考虑到 tsm 文件的权限,只有 root 用户才有权限将其置空。因此,只需要监控 root 用户下对 tsm 文件的写打开操作。

使用 system audit 功能快速锁定问题点

首先编辑 audit 配置文件:

在监控类 files 中定义了文件的各种操作:

考虑到系统中文件操作很多,直接监控 files 类日志信息量太大不方便定位问题,因此考虑只将 FILE_Open 监控事件加入到默认的 general 类中。

修改如下,在 general 类中增加 FILE_Open 事件监控:

audit 日志默认以二进制方式记录,可以通过 auditpr 命令转换为文本方式。本处为方便问题定位,直接将记录方式改为 stream 方式,以文本格式记录系统监控事件。修改如下:

将 streammode 设置为 on ,而 binmode 设置为 off:

经过修改的 audit 配置文件:

启动并持续调整 audit 设置

启动 audit 命令后,就可以在 /audit/stream.out 文件上看到审计日志了:

从以下 /audit/stream.out 输出看,记录过于简单,看不出打开的文件名:

要看到 verbose**方式的输出,必须进一步调整 streamcmds**命令参数。

编辑 /etc/security/audit/streamcmds 命令文件,在 auditpr**命令后增加 -v**参数 :

然后重启 audit 服务:

此时如果再写操作 tsm 文件,就能得到如下信息(为了对比,在此处做了一个 cp /usr/sbin/tsm /tmp/tsm 操作):

注意这里的 flags 是 open 文件操作所带的参数, flags 是 int 型变量,其定义可以在 /usr/include/fcntl.h 文件里找到:

这里只简单说明与本次问题定位相关的部分,考虑到只有写打开才能修改文件,只读打开可以忽略,因此只需要监控 flags 二进制表示最后两位中,有一位为 1 的情况。如果 flags 二进制值最后两位有一位为 1 ,则说明 open 参数至少设置了 O_WRONLY 或 O_RDWR 。

所以, flags: 67109633 二进制最后一位为 1 ,说明是 O_WRONLY 方式写打开。相应地, flags: 67108864 二进制最后一位是 0 ,说明是 O_RDONLY 只读方式打开。

至此,我们配置好了 /usr/sbin/tsm 文件的写打开监控方法。接下来我们需要把监控操作添加到启动脚本中去,确保开机就能监控到文件操作。

将 audit 监控设置为随系统启动

在 /etc/inittab 中增加如下条目:

参考( /etc/inittab )文件,红色部分为新增:

重现故障

重启系统以重现故障点。

从 /audit/stream.out 日志可以看到:

结合 errpt 以及系统进程启动情况,可以看到 /usr/sbin/tsm 文件是在开机后被置空,而不是关机的过程中置空:

例如 :

再次重启重现故障

查看开机后生成的 probevue 日志,可以看到, pid 为 3670140 的 K shell 进程对 /usr/sbin/tsm 进行了写打开,其 group id 为 2556794 。

针对其进程 id 、父进程 id 、进程组 id 进行查看:

只有进程组 id 下有对应的条目:

观察 probevue 日志记录:

可以确认 tsm 文件被置空是启动 cimsys 服务触发,而且,从 probevue 监控日志输出看,停止 cimsys 、启动 cimsys 过程中各出现了一次对 /usr/sbin/tsm 置空的操作。

从追踪的记录可以看到 /opt/freeware/cimom/pegasus/bin/cimssys.sh start cimsys 脚本被执行了。由上面的跟踪情况可以推断,问题大概率是在脚本中执行 ”> /usr/sbin/tsm” 操作造成(因为 audit 和 probevue 跟踪得到的进程名为 ksh ,而不是具体的应用比如 cimsys 之类),因此 /opt/freeware/cimom/pegasus/bin/cimssys.sh 脚本有很大的嫌疑。

跟踪脚本执行

接下来需要对 /opt/freeware/cimom/pegasus/bin/cimssys.sh start cimsys 执行过程进行检查以及跟踪。

检查 cimssys.sh 脚本

对比本机与其他机器上的 /opt/freeware/cimom/pegasus/bin/cimssys.sh 文件,发现文件内容并未被修改。跟踪 /opt/freeware/cimom/pegasus/bin/cimssys.sh 的执行过程,发现其中主要的调用都是针对 /opt/freeware/cimom/pegasus/bin/CIMdiagd.sh 脚本,调用参数分别是 start 和 restart ,且输出都被重定向到 /dev/null 了。

手动执行 /opt/freeware/cimom/pegasus/bin/CIMdiagd.sh 脚本:

发现 /usr/bin/kill 报了很奇怪的错误(如上红色部分)。

对 /usr/bin/kill 命令所在的 d_stop 函数进行 set –x 跟踪:

真相大白,推测在运维过程中,发生了误操作,导致将 /usr/bin目录下的 ls –l结果输出到了 /usr/bin/kill文件中。结果所有的符号连接文件因为含有 ”->”,而导致了对其源文件的清空操作。最终造成了本次开机后无法 telnet故障,以及一系列关键系统文件被清空。

说明:

此处为了简化命令输出,对出错的 /usr/bin/kill 进行了删减,只保留了可以说明问题的一行记录。

问题总结

由于 kill 命令的特殊性,通常的 shell 终端中, kill 命令为 shell 内嵌,只要不使用绝对路径执行 kill (即 /usr/bin/kill ),就不会使用到操作系统 /usr/bin/kill 命令,也不会触发 /usr/bin/kill 被误覆盖导致的问题。

从实际启动过程看,只有 cimserver 启动时中显式调用了 /usr/bin/kill ,因此触发了关键文件误覆盖故障。但整个问题其实与 cimserver 无关,只是碰巧由 cimserver 触发。而因为触发点恰好在系统启动过程中(初始化 /etc/inittab 注册项时),问题定位的复杂度略高。

定位过程中使用的 audit 方法,以及 probevue 跟踪脚本,都可以在类似问题定位中复用。稍作修改,比如修改 probevue 脚本为监控 unlink 系统调用,也可以用来跟踪文件误删除等问题( audit 方案可以直接用于监控文件误删除问题)。

环境恢复

从正常系统拷贝 /usr/bin/kill 命令,以及被清空的 /usr/sbin/tsm 文件(以及所有被重定向置空的文件)。

停止 audit:

杀掉 probe 脚本。从 /etc/inittab 中删除 probe 和 audit 对应的项目,然后重启机器。

特别说明

为维护客户隐私,所有相关数据均采用测试环境重现后抓取,请勿对号入座,谢谢!

原题:AIX关键系统文件被清空问题定位过程全记录
原创文章,转载请注明出处
如有问题,可以点击阅读原文,到原文下提问交流
觉得本文有用,请转发或点击“在看”,让更多同行看到


 资料/文章推荐:


欢迎关注社区 "AIX"技术主题 ,将会不断更新优质资料、文章。地址:

https://www.talkwithtrend.com/Topic/117


下载 twt 社区客户端 APP


长按识别二维码即可下载

或到应用商店搜索“twt”


长按二维码关注公众号

*本公众号所发布内容仅代表作者观点,不代表社区立场

继续滑动看下一个

AIX 关键系统文件被清空问题定位过程全记录 | 运维进阶

向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存