这是基于vue-vben-admin 模板适用于abp vNext的前端管理项目
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

插件安全审计

**本文档引用的文件** - [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)

目录

  1. 简介
  2. 核心组件
  3. 审计日志结构
  4. 存储策略
  5. 查询接口
  6. 审计策略配置
  7. 合规性检查清单

简介

插件安全审计功能提供了一套完整的系统来记录和监控关键操作,包括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