高安全架构 学习笔记(第 11 部分)
5.4 审计日志
javascript
// 审计日志系统
class AuditLogger {
constructor() {
this.logs = []
this.sensitiveOperations = [
'user:login',
'user:logout',
'user:delete',
'permission:grant',
'permission:revoke',
'data:export',
'data:delete',
'config:change'
]
}
// 记录操作日志
log(operation, details) {
const entry = {
id: this.generateId(),
timestamp: new Date().toISOString(),
operation,
userId: details.userId,
username: details.username,
resource: details.resource,
action: details.action,
result: details.result,
ipAddress: details.ipAddress,
userAgent: details.userAgent,
requestData: this.sanitizeData(details.requestData),
responseData: this.sanitizeData(details.responseData)
}
// 保存日志
this.logs.push(entry)
this.persistLog(entry)
// 敏感操作告警
if (this.sensitiveOperations.includes(operation)) {
this.alertSensitiveOperation(entry)
}
return entry
}
// 查询日志
query(filters) {
return this.logs.filter(log => {
if (filters.userId && log.userId !== filters.userId) return false
if (filters.operation && log.operation !== filters.operation) return false
if (filters.startTime && new Date(log.timestamp) < new Date(filters.startTime)) return false
if (filters.endTime && new Date(log.timestamp) > new Date(filters.endTime)) return false
if (filters.result && log.result !== filters.result) return false
return true
})
}
// 数据脱敏
sanitizeData(data) {
if (!data) return data
const sanitized = { ...data }
const sensitiveFields = ['password', 'token', 'secret', 'apiKey']
for (const field of sensitiveFields) {
if (sanitized[field]) {
sanitized[field] = '******'
}
}
return sanitized
}
// 持久化日志
persistLog(entry) {
// 实际实现:写入数据库或日志文件
console.log('审计日志:', entry)
}
// 敏感操作告警
alertSensitiveOperation(entry) {
console.log('敏感操作告警:', {
operation: entry.operation,
user: entry.username,
timestamp: entry.timestamp
})
// 发送告警通知
this.sendAlert(entry)
}
// 发送告警
sendAlert(entry) {
// 实际实现:发送邮件、短信、钉钉等
}
// 生成日志ID
generateId() {
return `audit-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`
}
// 审计中间件
middleware() {
return (req, res, next) => {
const startTime = Date.now()
// 拦截响应
const originalSend = res.send
res.send = function(data) {
const duration = Date.now() - startTime
// 记录日志
auditLogger.log(`${req.method}:${req.path}`, {
userId: req.user?.userId || 'anonymous',
username: req.user?.username || 'anonymous',
resource: req.path,
action: req.method,
result: res.statusCode < 400 ? 'success' : 'failed',
ipAddress: req.ip,
userAgent: req.get('user-agent'),
requestData: req.body,
responseData: typeof data === 'string' ? data.substring(0, 200) : data
})
originalSend.call(this, data)
}
next()
}
}
}
// 使用示例
const auditLogger = new AuditLogger()
// 应用审计中间件
app.use(auditLogger.middleware())
// 手动记录敏感操作
app.post('/admin/delete-user', (req, res) => {
// 执行删除操作
deleteUser(req.body.userId)
// 记录审计日志
auditLogger.log('user:delete', {
userId: req.user.userId,
username: req.user.username,
resource: `/users/${req.body.userId}`,
action: 'DELETE',
result: 'success',
ipAddress: req.ip,
userAgent: req.get('user-agent'),
requestData: { targetUserId: req.body.userId }
})
res.json({ message: '用户删除成功' })
})六、软件安全
6.1 软件安全三层面
code
软件安全三层面:
┌─────────────────────────────────┐
│ 1. 操作系统安全 │
│ - 病毒防护 │
│ - 木马检测 │
│ - 补丁管理 │
│ - 恶意脚本防护 │
├─────────────────────────────────┤
│ 2. 数据库安全 │
│ - SQL 注入防护 │
│ - 推理攻击防护 │
│ - 访问控制 │
│ - 数据加密 │
├─────────────────────────────────┤
│ 3. Web 应用安全 │
│ - XSS 防护 │
│ - CSRF 防护 │
│ - 重放攻击防护 │
│ - 敏感信息泄露防护 │
└─────────────────────────────────┘