MST
星途 面试题库

面试题:Bash日志管理中的审计追踪功能设计

假设你正在开发一个需要严格审计追踪的Bash脚本应用,要求记录所有关键操作(如文件修改、权限变更等)的详细信息到日志。请描述如何设计日志结构以方便后续审计分析,以及如何在脚本中实现对这些关键操作的准确捕获与记录。
29.9万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

日志结构设计

  1. 时间戳:记录操作发生的精确时间,格式可采用 ISO 8601,例如 YYYY - MM - DDTHH:MM:SSZ,方便按时间顺序梳理操作流程。
  2. 操作类型:明确具体的操作,如 “文件修改”、“权限变更”、“用户登录” 等,便于快速筛选特定类型操作。
  3. 操作主体:对于文件操作,记录文件名;对于权限变更,记录变更的对象(如用户、组、文件等)。
  4. 详细描述:具体说明操作的细节,例如文件修改记录修改前后的关键内容片段,权限变更记录原权限和新权限。
  5. 执行用户:记录执行操作的用户,有助于确定操作责任人。

示例日志格式:

[2023 - 10 - 01T12:34:56Z] [文件修改] [/path/to/file.txt] [修改前内容片段:'old content',修改后内容片段:'new content'] [user1]

脚本中实现关键操作捕获与记录

  1. 文件修改记录
    • 利用 inotifywait 工具监测文件系统事件。首先安装 inotify-tools(在基于 Debian 或 Ubuntu 的系统上使用 sudo apt install inotify-tools,在基于 Red Hat 的系统上使用 sudo yum install inotify-tools)。
    • 示例脚本:
#!/bin/bash
LOG_FILE="/var/log/file_operations.log"
inotifywait -m /path/to/monitor -e modify | while read path action file; do
    echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] [文件修改] [${path}${file}] [$(diff -u <(cat ${path}${file}.bak) <(cat ${path}${file}))] [$(whoami)]" >> ${LOG_FILE}
    cp ${path}${file} ${path}${file}.bak
done

此脚本使用 inotifywait 持续监测 /path/to/monitor 目录下文件的修改事件,记录修改前后的内容差异,并备份修改后的文件。

  1. 权限变更记录
    • 利用 auditd 服务(在基于 Debian 或 Ubuntu 的系统上使用 sudo apt install auditd,在基于 Red Hat 的系统上使用 sudo yum install auditd),它能更全面地捕获系统调用级别的权限变更。
    • 配置 auditd 规则,例如在 /etc/audit/rules.d/权限变更.rules 中添加:
-a always,exit -F arch=b64 -S chmod -k permission_change
-a always,exit -F arch=b64 -S fchmod -k permission_change
-a always,exit -F arch=b64 -S fchmodat -k permission_change
- 重启 `auditd` 服务:`sudo systemctl restart auditd`。
- 编写脚本读取 `auditd` 日志并整理:
#!/bin/bash
LOG_FILE="/var/log/permission_operations.log"
ausearch -k permission_change | while read line; do
    timestamp=$(echo ${line} | grep -oP 'time->\K.*?(?= )')
    operation_type="权限变更"
    object=$(echo ${line} | grep -oP 'name=\K.*?(?= )')
    old_perm=$(echo ${line} | grep -oP 'a0=\K.*?(?= )')
    new_perm=$(echo ${line} | grep -oP 'a1=\K.*?(?= )')
    user=$(echo ${line} | grep -oP 'user=\K.*?(?= )')
    echo "[${timestamp}] [${operation_type}] [${object}] [原权限:${old_perm},新权限:${new_perm}] [${user}]" >> ${LOG_FILE}
done

此脚本从 auditd 日志中提取权限变更相关信息并记录到自定义日志文件。