You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
18 KiB
18 KiB
插件安全审计
**本文档引用的文件** - [AuditLog.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/AuditLog.cs) - [AuditLogAction.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/AuditLogAction.cs) - [EntityChange.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/EntityChange.cs) - [SecurityLog.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/SecurityLog.cs) - [AuditLogManager.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AuditLogManager.cs) - [EntityChangeStore.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/EntityChangeStore.cs) - [SecurityLogManager.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/SecurityLogManager.cs) - [IPLocationAuditingStore.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.IP.Location/LINGYUN/Abp/AuditLogging/IP/Location/IPLocationAuditingStore.cs) - [IPLocationSecurityLogStore.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.IP.Location/LINGYUN/Abp/AuditLogging/IP/Location/IPLocationSecurityLogStore.cs) - [AuditLogAppService.cs](file://aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.Application/LINGYUN/Abp/Auditing/AuditLogs/AuditLogAppService.cs) - [SecurityLogAppService.cs](file://aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.Application/LINGYUN/Abp/Auditing/SecurityLogs/SecurityLogAppService.cs) - [AuditLogController.cs](file://aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.HttpApi/LINGYUN/Abp/Auditing/AuditLogs/AuditLogController.cs) - [SecurityLogController.cs](file://aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.HttpApi/LINGYUN/Abp/Auditing/SecurityLogs/SecurityLogController.cs)目录
简介
插件安全审计功能提供了一套完整的系统来记录和监控关键操作,包括API调用、数据访问和权限变更等。该系统通过详细的审计日志记录用户行为,支持多种存储后端,并提供灵活的查询接口和安全策略配置。
Section sources
- README.md
核心组件
插件安全审计系统由多个核心组件构成,这些组件协同工作以实现全面的安全监控和审计功能。
classDiagram
class AuditLog {
+Guid Id
+string? ApplicationName
+Guid? UserId
+string? UserName
+DateTime ExecutionTime
+int ExecutionDuration
+string? ClientIpAddress
+string? HttpMethod
+string? Url
+EntityChange[] EntityChanges
+AuditLogAction[] Actions
}
class AuditLogAction {
+Guid Id
+Guid AuditLogId
+string ServiceName
+string MethodName
+string Parameters
+DateTime ExecutionTime
+int ExecutionDuration
}
class EntityChange {
+Guid Id
+Guid AuditLogId
+DateTime ChangeTime
+EntityChangeType ChangeType
+string? EntityId
+string? EntityTypeFullName
+EntityPropertyChange[] PropertyChanges
}
class SecurityLog {
+Guid Id
+Guid? TenantId
+string? ApplicationName
+string? Identity
+string? Action
+Guid? UserId
+string? UserName
+DateTime CreationTime
+string? ClientIpAddress
+string? BrowserInfo
}
class IAuditLogManager {
+Task~long~ GetCountAsync()
+Task~AuditLog[]~ GetListAsync()
+Task~AuditLog~ GetAsync()
+Task DeleteAsync()
+Task DeleteManyAsync()
+Task~string~ SaveAsync()
}
class ISecurityLogManager {
+Task~SecurityLog~ GetAsync()
+Task DeleteAsync()
+Task DeleteManyAsync()
+Task SaveAsync()
+Task~SecurityLog[]~ GetListAsync()
+Task~long~ GetCountAsync()
}
class IAuditLogRepository {
+Task~Volo.Abp.AuditLogging.AuditLog~ InsertAsync()
+Task DeleteAsync()
+Task DeleteManyAsync()
+Task~long~ GetCountAsync()
+Task~Volo.Abp.AuditLogging.AuditLog[]~ GetListAsync()
+Task~Volo.Abp.AuditLogging.AuditLog~ GetAsync()
+Task~Volo.Abp.AuditLogging.EntityChange~ GetEntityChange()
+Task~long~ GetEntityChangeCountAsync()
+Task~Volo.Abp.AuditLogging.EntityChange[]~ GetEntityChangeListAsync()
}
class IIdentitySecurityLogRepository {
+Task~IdentitySecurityLog~ InsertAsync()
+Task DeleteAsync()
+Task DeleteManyAsync()
+Task~long~ GetCountAsync()
+Task~IdentitySecurityLog[]~ GetListAsync()
+Task~IdentitySecurityLog~ GetAsync()
}
AuditLog "1" *-- "0..*" AuditLogAction : 包含
AuditLog "1" *-- "0..*" EntityChange : 包含
AuditLogManager --> IAuditLogManager : 实现
SecurityLogManager --> ISecurityLogManager : 实现
AuditLogManager --> IAuditLogRepository : 使用
SecurityLogManager --> IIdentitySecurityLogRepository : 使用
IPLocationAuditingStore --> IAuditLogManager : 委托
IPLocationSecurityLogStore --> ISecurityLogManager : 委托
Diagram sources
- AuditLog.cs
- AuditLogAction.cs
- EntityChange.cs
- SecurityLog.cs
- AuditLogManager.cs
- EntityChangeStore.cs
- SecurityLogManager.cs
Section sources
- AuditLog.cs
- AuditLogAction.cs
- EntityChange.cs
- SecurityLog.cs
审计日志结构
审计日志(AuditLog)
审计日志是系统中最基本的审计单元,记录了每次请求的完整信息:
- 基础信息: 请求ID、应用名称、用户ID、租户ID、执行时间、执行时长
- 客户端信息: 客户端IP地址、客户端名称、客户端ID、浏览器信息
- 请求信息: HTTP方法、URL、相关ID、HTTP状态码
- 异常信息: 异常详情、注释
- 关联数据: 实体变更列表、操作动作列表、额外属性
操作动作(AuditLogAction)
记录具体的服务调用信息:
- 服务名称(ServiceName)
- 方法名称(MethodName)
- 参数(Parameters)
- 执行时间和时长
- 额外属性
实体变更(EntityChange)
记录数据库实体的变更情况:
- 变更类型(ChangeType): 创建、更新、删除
- 实体类型和ID
- 属性变更列表
- 变更时间和租户信息
安全日志(SecurityLog)
专门记录安全相关事件:
- 身份标识(Identity)
- 操作类型(Action)
- 用户和租户信息
- 创建时间
- 客户端信息
erDiagram
AUDIT_LOG {
guid Id PK
string ApplicationName
guid UserId FK
string UserName
guid TenantId FK
datetime ExecutionTime
int ExecutionDuration
string ClientIpAddress
string HttpMethod
string Url
string Exceptions
int HttpStatusCode
}
AUDIT_LOG_ACTION {
guid Id PK
guid AuditLogId FK
string ServiceName
string MethodName
string Parameters
datetime ExecutionTime
int ExecutionDuration
}
ENTITY_CHANGE {
guid Id PK
guid AuditLogId FK
datetime ChangeTime
enum ChangeType
string EntityId
string EntityTypeFullName
}
SECURITY_LOG {
guid Id PK
guid TenantId FK
string ApplicationName
string Identity
string Action
guid UserId FK
string UserName
datetime CreationTime
string ClientIpAddress
string BrowserInfo
}
AUDIT_LOG ||--o{ AUDIT_LOG_ACTION : "包含"
AUDIT_LOG ||--o{ ENTITY_CHANGE : "包含"
Diagram sources
- AuditLog.cs
- AuditLogAction.cs
- EntityChange.cs
- SecurityLog.cs
存储策略
多后端支持
系统支持多种存储后端,包括:
- Entity Framework Core (默认)
- Elasticsearch
- 其他自定义存储
存储流程
flowchart TD
Start([开始]) --> CheckEnabled["检查审计是否启用"]
CheckEnabled --> |否| End([结束])
CheckEnabled --> |是| CreateAuditInfo["创建AuditLogInfo对象"]
CreateAuditInfo --> ProcessContributors["处理审计贡献者"]
ProcessContributors --> IPLocationCheck["检查IP位置"]
IPLocationCheck --> |启用| ResolveLocation["解析IP地理位置"]
ResolveLocation --> AddLocation["添加位置信息到ExtraProperties"]
AddLocation --> SaveToStorage["保存到存储"]
IPLocationCheck --> |禁用| SaveToStorage
SaveToStorage --> EFCore["EntityFrameworkCore存储"]
SaveToStorage --> Elasticsearch["Elasticsearch存储"]
SaveToStorage --> Custom["自定义存储"]
EFCore --> Complete["完成"]
Elasticsearch --> Complete
Custom --> Complete
Complete --> End
Diagram sources
- IPLocationAuditingStore.cs
- IPLocationSecurityLogStore.cs
- AuditLogManager.cs
- SecurityLogManager.cs
IP位置集成
系统集成了IP地理位置解析功能,可以在审计日志中自动记录客户端的地理位置信息:
// 配置示例
Configure<AbpAuditLoggingIPLocationOptions>(options =>
{
options.IsEnabled = true; // 启用IP位置记录
});
当IP位置功能启用时,系统会自动解析客户端IP地址并将其位置信息添加到审计日志的额外属性中。
Section sources
- IPLocationAuditingStore.cs
- IPLocationSecurityLogStore.cs
查询接口
审计日志查询
提供丰富的查询接口用于检索审计日志:
sequenceDiagram
participant Client as "客户端"
participant Controller as "AuditLogController"
participant AppService as "AuditLogAppService"
participant Manager as "AuditLogManager"
participant Repository as "IAuditLogRepository"
Client->>Controller : GET /api/auditing/audit-log
Controller->>AppService : GetListAsync(input)
AppService->>Manager : GetCountAsync(...)
Manager->>Repository : GetCountAsync(...)
Repository-->>Manager : 返回计数
Manager-->>AppService : 返回计数
AppService->>Manager : GetListAsync(...)
Manager->>Repository : GetListAsync(...)
Repository-->>Manager : 返回审计日志列表
Manager-->>AppService : 返回审计日志列表
AppService-->>Controller : 返回分页结果
Controller-->>Client : 返回审计日志数据
Diagram sources
- AuditLogController.cs
- AuditLogAppService.cs
- AuditLogManager.cs
支持的查询条件
审计日志查询支持以下过滤条件:
- 时间范围(开始时间、结束时间)
- HTTP方法(GET, POST, PUT, DELETE等)
- URL路径
- 用户ID和用户名
- 应用程序名称
- 相关ID(CorrelationId)
- 客户端ID和IP地址
- 执行时长范围
- 是否有异常
- HTTP状态码
安全日志查询
安全日志提供类似的查询接口:
sequenceDiagram
participant Client as "客户端"
participant Controller as "SecurityLogController"
participant AppService as "SecurityLogAppService"
participant Manager as "SecurityLogManager"
participant Repository as "IIdentitySecurityLogRepository"
Client->>Controller : GET /api/auditing/security-log
Controller->>AppService : GetListAsync(input)
AppService->>Manager : GetCountAsync(...)
Manager->>Repository : GetCountAsync(...)
Repository-->>Manager : 返回计数
Manager-->>AppService : 返回计数
AppService->>Manager : GetListAsync(...)
Manager->>Repository : GetListAsync(...)
Repository-->>Manager : 返回安全日志列表
Manager-->>AppService : 返回安全日志列表
AppService-->>Controller : 返回分页结果
Controller-->>Client : 返回安全日志数据
Diagram sources
- SecurityLogController.cs
- SecurityLogAppService.cs
- SecurityLogManager.cs
审计策略配置
基本配置
在appsettings.json中配置审计策略:
{
"Auditing": {
"IsEnabled": true,
"HideErrors": false,
"IsEnabledForAnonymousUsers": true,
"IsEnabledForGetRequests": false,
"ApplicationName": "MyApplication"
},
"AbpAuditLoggingIPLocation": {
"IsEnabled": true
}
}
功能特性配置
通过功能特性系统控制审计功能:
// 在模块中配置功能特性
protected override void SetFeatures(IFeatureDefinitionContext context)
{
var auditing = context.GetOrNull("Auditing") ?? context.Create("Auditing", defaultValue: "true");
auditing.CreateChild(
name: AuditingFeatureNames.Logging.AuditLog,
defaultValue: "true",
displayName: L("Features:DisplayName:AuditLog"),
description: L("Features:Description:AuditLog")
);
auditing.CreateChild(
name: AuditingFeatureNames.Logging.SecurityLog,
defaultValue: "true",
displayName: L("Features:DisplayName:SecurityLog"),
description: L("Features:Description:SecurityLog")
);
}
权限控制
审计功能通过权限系统进行访问控制:
// 审计日志权限
public static class AuditingPermissionNames
{
public const string AuditLog = "Auditing.AuditLog";
public const string AuditLog_Default = AuditLog + ".Default";
public const string AuditLog_Delete = AuditLog + ".Delete";
public const string SecurityLog = "Auditing.SecurityLog";
public const string SecurityLog_Default = SecurityLog + ".Default";
public const string SecurityLog_Delete = SecurityLog + ".Delete";
}
忽略特定类型
可以配置忽略某些类型的审计记录:
Configure<AbpAuditingOptions>(options =>
{
options.IgnoredTypes.AddIfNotContains(typeof(CancellationToken));
options.IgnoredTypes.AddIfNotContains(typeof(YourCustomType));
});
Section sources
- README.md
- AuditingFeatureDefinitionProvider.cs
合规性检查清单
数据完整性
- 所有关键操作都被记录
- 审计日志包含足够的上下文信息
- 记录不可篡改(通过适当的存储机制)
- 支持数据追溯和回放
安全性
- 审计日志访问受权限控制
- 敏感信息适当脱敏
- 支持IP地理位置记录
- 异常情况被记录
可用性
- 提供高效的查询接口
- 支持分页和过滤
- 多种存储后端支持
- 高可用性和容错能力
合规性
- 符合GDPR要求
- 支持数据保留策略
- 提供数据导出功能
- 完整的访问控制日志
性能
- 异步写入避免影响主业务流程
- 批量处理优化性能
- 缓存机制减少数据库压力
- 可配置的采样率
Section sources
- AuditLog.cs
- SecurityLog.cs
- AuditLogManager.cs
- SecurityLogManager.cs