
/>
实战:精准捕捉系统安全异常
完整代码
<!DOCTYPEhtml>
charset="utf-8">
<meta
content="width=device-width,
<title>未来之窗
Linux服务日志分析工具(audit.log日志)</title>
</head>
class="container">
<div
Linux服务日志分析工具(audit.log日志)</h1>
<p>audit.log
class="input-area">
<label
for="auditInput"><span>fairyalli_strico_paper</span>请粘贴audit.log日志内容:</label>
<textarea
placeholder="示例:
type=ANOM_ABEND
msg=audit(1690533038.482:259):
auid=4294967295
comm="in:imjournal"
exe="/usr/sbin/rsyslogd"
sig=7
res=1AUID="unset"
msg=audit(1690533038.509:260):
pid=1
msg='unit=systemd-coredump@0-40594-0
exe="/usr/lib/systemd/systemd"
hostname=?
res=success'UID="root"
..."
style="height:200px;"></textarea>
<div
class="btn-group">
<button
class="btn"><span>fairyalli_strico_search</span>分析日志数据</button>
<button
btn-clear"><span>fairyalli_strico_垃圾桶</span>清空内容</button>
</div>
class="section-title"><span>fairyalli_strico_stat</span>日志统计汇总</h2>
<div
class="stats-summary">
<div
class="stat-card">
<div
class="stat-label">总日志条数</div>
<div
id="totalLogs">0</div>
</div>
class="stat-label">异常事件数</div>
<div
id="exceptionCount">0</div>
</div>
class="stat-card">
<div
class="stat-label">服务相关事件数</div>
<div
id="serviceCount">0</div>
</div>
class="stat-card">
<div
class="stat-label">用户相关事件数</div>
<div
id="userCount">0</div>
</div>
class="stat-card">
<div
class="stat-label">加密相关事件数</div>
<div
id="cryptoCount">0</div>
</div>
class="stat-label">执行失败事件数</div>
<div
id="failedCount">0</div>
</div>
class="sub-title"><span>fairyalli_strico_ok</span>事件类型分布统计</h3>
<div
class="table-wrap">
<table>
id="typeTableBody">
<tr>
class="empty">请粘贴audit.log日志并点击分析按钮</td>
</tr>
class="sub-title"><span>fairyalli_strico_stat</span>用户相关统计</h3>
<div
class="table-wrap">
<table>
id="userTableBody">
<tr>
class="empty">请粘贴audit.log日志并点击分析按钮</td>
</tr>
class="sub-title"><span>fairyalli_strico_stat</span>
异常事件详情</h3>
class="table-wrap">
<table>
id="exceptionTableBody">
<tr>
class="empty">暂无异常事件或请先分析日志</td>
</tr>
line.match(/type=(\w+)/);
const
line.match(/UID="([^"]+)"/);
const
line.match(/AUID="([^"]+)"/);
(uidMatch)
(line.includes('res=failed')
line.includes('res=1'))
执行失败
'操作执行失败(res=failed)';
else
(type.includes('ANOM_'))
其他异常类型
line.includes('res=failed');
return
text.trim().split('\n');
const
stats.exceptionCount++;
失败统计
stats.typeStats[log.type].count++;
(log.isException)
stats.typeStats[log.type].isException
=
stats.typeStats[log.type].exceptionCount++;
分类统计
(log.type.startsWith('SERVICE_'))
else
(log.type.startsWith('USER_'))
else
(log.type.startsWith('CRYPTO_'))
用户统计
stats.userStats[userKey].count++;
stats.userStats[userKey].types.add(log.type);
(log.isException)
stats.userStats[userKey].exceptionCount++;
});
document.getElementById('totalLogs').textContent
=
document.getElementById('exceptionCount').textContent
=
document.getElementById('serviceCount').textContent
=
document.getElementById('userCount').textContent
=
document.getElementById('cryptoCount').textContent
=
document.getElementById('failedCount').textContent
=
document.getElementById('typeTableBody');
const
class="empty">暂无事件类型数据</td></tr>';
return;
Object.entries(typeStats).map(([type,
data])
(item.type.startsWith('ANOM_'))
typeClass
(item.type.startsWith('SERVICE_'))
typeClass
(item.type.startsWith('USER_'))
typeClass
(item.type.startsWith('CRYPTO_'))
typeClass
class="exception">异常
(${item.exceptionCount}次)</span>`
`<span
class="normal">正常</span>`;
html
class="${typeClass}">${item.type}</td>
<td
class="count-cell">${item.count}</td>
<td>${exceptionText}</td>
<td>${item.percentage}</td>
</tr>`;
document.getElementById('userTableBody');
const
class="empty">暂无用户数据</td></tr>';
return;
Object.entries(userStats).map(([user,
data])
Array.from(data.types).join(',
'),
class="exception">异常
次</span>`
class="normal">无异常</span>`;
html
class="${userClass}">${item.user}</td>
<td
class="count-cell">${item.count}</td>
<td>${item.types}</td>
<td>${exceptionText}</td>
</tr>`;
renderExceptionTable(exceptions)
const
document.getElementById('exceptionTableBody');
(exceptions.length
class="empty">未检测到异常事件</td></tr>';
return;
exception.type.startsWith('ANOM_')
'type-anom'
(exception.type.startsWith('SERVICE_')
(exception.type.startsWith('USER_')
'type-user'
class="${typeClass}">${exception.type}</td>
<td
class="${userClass}">${exception.user}</td>
<td
class="exception">${exception.exceptionMsg}</td>
<td
class="path-cell">${exception.rawLine}</td>
</tr>`;
document.getElementById('auditInput').value;
const
renderExceptionTable(stats.exceptions);
清空按钮点击事件
document.getElementById('auditInput').value
=
document.getElementById('typeTableBody').innerHTML
=
class="empty">请粘贴audit.log日志并点击分析按钮</td></tr>';
document.getElementById('userTableBody').innerHTML
=
class="empty">请粘贴audit.log日志并点击分析按钮</td></tr>';
document.getElementById('exceptionTableBody').innerHTML
=
class="empty">暂无异常事件或请先分析日志</td></tr>';
初始化
document.getElementById('analyzeBtn').addEventListener('click',
analyze);
document.getElementById('clearBtn').addEventListener('click',
clearInput);
document.getElementById('auditInput').addEventListener('keypress',
function(e)
window.addEventListener('load',
</script>
系统安全防护体系中,audit.log是记录系统所有关键操作的
“安全黑匣子”——
从用户权限变更、服务启停,到程序异常终止、操作执行失败,每一个可能影响系统安全的行为都会被
auditd
的分析方法,不仅是满足合规审计的基本要求,更是快速定位系统异常、追溯安全事件的核心能力。
一、为什么audit.log
style="background-color:transparent">1.
audit.log
会深度捕获系统级关键事件:
- 程序异常事件:ANOM_ABEND(程序异常终止)等标识,直接暴露进程崩溃、恶意程序运行等问题;
- 服务状态变更:SERVICE_START/SERVICE_STOP
rsyslogd、systemd)的启停行为;
- 用户操作轨迹:UID/AUID
root
普通用户的敏感操作;
- 执行结果记录:res=failed/res=success
标识,判断操作是否成功执行,发现未授权访问尝试。
缺乏
audit.log
分析能力,就等于放弃了对系统底层操作的监控,无法发现隐藏的安全威胁。
2.
“核心证据链”
当系统出现异常(如程序莫名崩溃、权限被篡改)时,audit.log
是最直接的溯源依据:
- 可快速定位异常事件的发生时间、触发用户、具体操作;
- 区分
“恶意异常”(如程序被强制终止);
- 统计失败操作次数,识别暴力破解、未授权访问等攻击行为。
style="background-color:transparent">3.
“必备依据”
金融、政务等行业的合规要求中,明确要求留存系统操作审计日志。
通过
audit.log
分析:
- 可统计特定用户的操作频次、事件类型,满足审计核查要求;
- 识别违规操作(如
root
用户异常执行命令、普通用户越权访问);
- 生成异常事件报告,作为安全审计的核心凭证。
style="background-color:transparent">二、audit.log
style="background-color:transparent">1.
“异常标记”,通过关键标识可快速筛选问题:
表格
事件类型 核心特征 问题定位方向 ANOM_ABEND 程序异常终止、sig=7等
进程崩溃、恶意程序、系统库异常 res=failed 操作执行失败 未授权访问、权限配置错误 SERVICE_STOP 关键服务异常停止 服务被恶意终止、系统故障 USER_* 用户权限变更、登录操作 账号被盗、越权操作
style="background-color:transparent">2.
audit.log
效率极低,通过工具化解析可实现:
- 核心指标汇总:一键统计总日志数、异常事件数、失败操作数,快速掌握系统安全状态;
- 事件类型分布:按出现次数排序展示事件类型,聚焦高频异常(如
ANOM_ABEND
反复出现);
- 用户行为分析:统计各用户的操作次数、异常事件数,定位高危用户(如
root
用户频繁触发失败操作);
- 异常详情展示:提取异常事件的核心信息,无需翻阅原始日志即可定位问题。
style="background-color:transparent">3.
实战分析步骤(以程序异常终止为例)
style="background-color:transparent">问题现象
系统监控告警:rsyslogd
style="background-color:transparent">排查步骤
- 提取
audit.log
事件(程序异常终止);
- 查看事件关联用户:UID=root,确认是
root
用户所属进程;
- 统计该事件出现次数:5
分钟内触发
次,判定为非偶发异常;
- 结合异常信息(sig=7),定位到
rsyslogd
配置错误导致的进程崩溃;
- 修复配置后,ANOM_ABEND
事件消失,服务恢复正常。
style="background-color:transparent">三、audit.log
style="background-color:transparent">1.
“事后补救”
audit.log:
- 可发现
“失败操作次数骤增”
等攻击前兆,提前封堵漏洞;
- 识别
“程序异常终止频率升高”
等系统问题,避免服务彻底不可用;
- 监控
“敏感用户(如
root)的异常操作”,防范内部违规。
style="background-color:transparent">2.
降低安全事件排查成本
传统排查需翻阅海量原始日志,而
audit.log
分析工具可:
- 自动过滤无效信息,聚焦异常事件;
- 按维度分类展示数据,直观呈现问题核心;
- 生成结构化报告,无需专业审计知识也能快速定位。
style="background-color:transparent">3.
分析与防火墙、入侵检测系统(IDS)形成互补:
- 防火墙拦截外部攻击,audit.log
“拦截
style="background-color:transparent">总结
- audit.log
Linux
“最后一道防线”
,记录所有底层操作,是异常定位、安全溯源的核心依据; - 快速定位的关键是
“异常标识
等标识筛选异常,结合用户、事件类型维度交叉分析;
- 工具化解析大幅提升效率,将非结构化的
audit.log
转化为可视化统计数据,降低分析门槛。
掌握
audit.log
系统的安全防护能力,保障业务系统的稳定运行。
阿雪技术观
在科技发展浪潮中,我们不妨积极投身技术共享。
不满足于做受益者,更要主动担当贡献者。
无论是分享代码、撰写技术博客,还是参与开源项目维护改进,每一个微小举动都可能蕴含推动技术进步的巨大能量。
东方仙盟是汇聚力量的天地,我们携手在此探索硅基生命,为科技进步添砖加瓦。
Hey
folks,


