AuditLog配置详解

本文详细介绍了Audit4j日志审计框架的配置、使用方法及注意事项,包括如何在YAML配置文件中设置auditLog,如何通过注解记录审计事件,以及如何查询AuditLog。同时,还探讨了框架的局限性和潜在的改进方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

auditLog采用Audit4j进行了简单的封装。

配置

在applicaton-.yml中添加auditLog的配置,配置参数如下:

# auditLog配置
audit4j:
  db-handler:
    # auditLog记录时否分表. 对于业务不是很复杂的应用,一般设置成false即可
    separate: false
    # 是否用内置的数据库记录.一般都是用自己的业务数据库,所以设置为false
    embedded: false
    # 默认的表名
    default_table_name: audit
    # 以下是auditLog数据库连接的一些配置;auditLog和业务的数据库不共用连接
    db_connection_type: pooled
    db_pool_connectionTimeout: 30000
    db_pool_maximumPoolSize: 2
    db_pool_minimumIdle: 1
    db_driver: com.mysql.jdbc.Driver
    db_url: jdbc:mysql://test.yuxisoft.cn:3306/loreal?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true&allowMultiQueries=true
    db_user: root
    db_password: yuxisoft
  # auditLog写日志文件的位置,app需要替换成应用的名称
  log:
    file:
      location: var/log/app/audit

数据库创建

separate设置为false

在separate设置为false情况下,Audit4j是使用默认使用名称为audit的表来记录(可以通过default_table_name来设置)。如果audit表不存在,会自动创建,创建的字段包括identifier, timestamp, actor, origin, action, elements, 字符集是utf-8格式。

建议自己先创建好audit表,并根据业务情况设置字段长度和类型。比如actor或者elements中有特殊符号,例如emoji表情,字符集需要设置成utf8mb4,如下:

CREATE TABLE `audit` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `identifier` varchar(200) NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `actor` varchar(200) CHARACTER SET utf8mb4 NOT NULL COMMENT '保存账号,名称,权限ID,数据权限ID',
  `origin` varchar(200) DEFAULT NULL,
  `action` varchar(200) NOT NULL,
  `elements` longtext CHARACTER SET utf8mb4,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='auditLog';

separate设置为true

separate设置为true情况下,在记录日志的时可以指定表前缀,例如在@Audit指定repository=login,该auditEvent就会记录在login_audit表中。

如果需要分表单独存储,建议根据业务的需要预先创建好存放auditLog的表。

注意:如果separeate=true, 记录日志时没有指定repository, 则会记录到表名为default_audit表中。

@Audit(repository = "login")
@RequestMapping("/login")
public String login() {
    return "hello";
}

自定义AuditMetaData

可以修改AuditMetaData.java类来自定义。

MetaData主要是定义Origin和Actor。origin是指操作来源,skeleton中只记录了ip,可以根据需求修改其实现记录IP加域名等等。actor是操作者,skeleton中记录id,userName, realName,实际可以再加上角色,权限等数据。

业务中如何使用

注解方式

@Audit

@Audit注解可以用在方法上,可以用在类上。如果是用在类上,该类中的所有public方法调用都会记录auditLog。

例如:

@Audit
public void foo(Integer bar){
}
** @Audit属性 **** 描述 **** 默认值 **
action自定义action名称Method名称
repository指定auditLog存放的表的前缀。只有separate=true时生效default

@AuditField

@AuditField是指定auditEvent中参数的名称. 不使用@AuditField指定参数名称,记录时默认使用arg1作为参数名称。

例如:

@Audit(repository = "action")
public String foo1(@AuditField(field="stringOne") String string1, @AuditField(field="stringTwo") String string2) {
	}
** @AuditField属性 **** 描述 **
field指定参数的名称

@IgnoreAudit

  1. 在class上使用了@Audit注解,但某些方法不需要审计,可以在该方法上添加@IgnoreAudit方法。

    例如:

   @Audit
   public class UserService {
       @IgnoreAudit
       public void changePassword(String oldPassword, String newPassword) {
           // This method will not be audited.
       }
   }
  1. 指定method的某个参数不被审计。

    例如:

   public class UserService {
       @Audit
       public void login(String username, @IgnoreAudit String password) {
           // password parameter will not be audited.
       }
   }
  1. 忽略审计对象中的成员属性

    例如:

   public class UserService {
       @Audit
       public void saveUser(User user) {
           // password parameter in user object will not be audited.
       }
   }
    
   public class User {
    
       private String username;
       @IgnoreAudit
       private String password;
    
      //Getters and Setters
   }

@DeIdentify

@DeIdentify用于匿名化特定的字段,用*代替。

例如:

@Audit
public void saveCreditCardId(@DeIdentify(left=5) int cardId){}

如果cardId是: 123456789

日志记录会变成: *****6789

** @DeIdentify属性 **** 描述 **
left匿名化左侧字符。例如,@DeIdentify(left=3) -> ***456789
right匿名化右侧字符。例如:@DeIdentify(right=3) -> 123456***
fromLeft从左侧开始匿名化所有字符。例如:@DeIdentify(fromLeft=3) -> 123******
fromRight从右侧开始匿名化所有字符。例如:@DeIdentify(fromRight=3) -> ******789

调用Audit Manager

调用Audit4j提供的audit方法直接记录一条auditEvent;

public void myMethod(String myParam1, Object myParam2) {
     String actor = MyApplicationContext.getAuthanticatedUser();
     AuditManager manager = AuditManager.getInstance();
     manager.audit(new AuditEvent(actor, "myMethod",
                                  new Field("myParam1Name", myParam1),
                                  new Field("myParam2Name", myParam2)));
 }

或者用EventBuilder构造一个AuditEvent

public void myMethod(String myParam1, Object myParam2) {
    String actor = MyApplicationContext.getAuthanticatedUser();
    EventBuilder builder = new EventBuilder();
    builder.addActor(actor).addAction("myMethod")
      .addField("myParam1Name", myParam1)
      .addField("myParam2Name", myParam2);
    AuditManager manager = AuditManager.getInstance();
    manager.audit(builder.build());
 }

注意:AuditManager记录的日志,Audit4j目前都保存到default_table_name设置的表名的表中。(设置不了repository,感觉是个audit4j的bug)

查询AuditLog

AuditLogService.java接口提供了getAuditLogList方法,根据的关键字段进行搜索。

public class AuditQueryDTO extends BaseQueryDTO {
    // 请求者的IP
    private String origin;
    // actor信息
    private String actor;
    // method信息
    private String action;
    // 参数信息
    private String elements;
    // 开始时间
    private Timestamp startTime;
    // 结束时间
    private Timestamp endTime;
}

注意点:

  1. 在controller中使用了BindingResult,需要对该参数加上@IgnoreAudit,不然这条记录可能不会被记录

MORE

  1. Audit4j这个框架目前满足基本记录和查询auditLog的需求。Audit4j也存在一些bug(例如:分表时,@Audit不指定repository时,不会记录到default_table_name设置的默认表名中),和一些局限(例如:不能设置表字段名称,字段类型这些)。
  2. Audit4j开源框架近一年没有更新。有定制化的需求,可以把源码来过了修改。
  3. 目前查询接口返回的elements,仅仅将记录的参数做为 一个字符串返回,可读性的不是那么强;后续可以考虑转成json格式的字符串。
  4. 后续在业务中记录auditLog时,发现有不满足的可以提出来,不断完善。
<think>我们正在处理用户关于winlogbeat.yml配置文件的详细解释请求。根据用户需求,我们需要提供winlogbeat.yml配置文件的详细配置方法和参数含义。 首先,我们需要了解Winlogbeat是Elastic Stack的一部分,用于收集和转发Windows事件日志。其配置文件winlogbeat.yml采用YAML格式,包含多个配置部分,如日志事件采集、处理、输出等。 接下来,我们将按照配置文件的主要部分逐一解释: 1. **输入配置(Inputs)**:定义要收集的事件日志,包括应用程序、安全、系统等日志通道。 2. **处理器(Processors)**:对收集的事件进行加工,如添加字段、删除字段等。 3. **模块(Modules)**:提供预定义的日志解析和可视化(如安全、系统日志分析)。 4. **输出(Output)**:配置将事件发送到哪里,如Elasticsearch、Logstash、Kafka等。 5. **日志记录(Logging)**:设置Winlogbeat自身的日志级别和输出。 6. **运行选项(Run options)**:包括运行模式、采集周期等。 由于配置项较多,我们将重点介绍常用配置,并给出示例。 同时,根据引用[1]中提到的optional配置导入机制,我们可以类比说明Winlogbeat配置中也可以使用环境变量或条件配置,但Winlogbeat本身可能不支持optional导入,这里仅作为参考。 另外,引用[2]中关于版本命名的约束,在Winlogbeat配置中版本号并不直接出现,但配置格式的版本兼容性需要注意。 引用[3]提到的自动化流程,在配置Winlogbeat时,我们也可以考虑如何通过配置自动化日志收集流程。 下面,我们将详细展开配置说明。</think>### Winlogbeat 配置文件 `winlogbeat.yml` 详解 Winlogbeat 是 Elastic Stack 中用于收集 Windows 事件日志的轻量级代理。其配置文件 `winlogbeat.yml` 采用 YAML 格式,主要包含以下核心模块: --- #### **1. 输入配置 (Inputs)** 定义要收集的事件日志通道和筛选条件: ```yaml winlogbeat.inputs: - name: Security # 日志通道名称 channels: ["Security"] event_id: 4624,4625 # 仅收集登录成功/失败事件 processors: - drop_event.when.not.equals.message: "登录成功" # 过滤非关键事件 - name: System channels: ["System"] level: "error,critical" # 仅收集错误级以上日志 ``` - **关键参数**: - `channels`: 事件日志通道(如 `Security`, `System`, `Application`) - `event_id`: 指定事件 ID(支持范围 `1100-1199` 或逗号分隔列表) - `level`: 日志级别(`critical`, `error`, `warning`, `information`, `verbose`) - `include_xml`: 是否包含原始 XML 事件数据(默认为 `false`) --- #### **2. 处理器 (Processors)** 对事件进行实时过滤和增强: ```yaml processors: - drop_fields: # 删除敏感字段 fields: ["user.password", "event.original"] - add_fields: # 添加自定义标签 target: "labels" fields: env: "production" region: "east-us" ``` - **常用处理器**: - `drop_event`: 丢弃特定事件 - `decode_xml`: 解析 XML 格式事件 - `script`: 使用 JavaScript 脚本处理事件 --- #### **3. 模块配置 (Modules)** 启用预定义的日志解析规则(如安全审计): ```yaml winlogbeat.modules: - module: security audit: log_path: "C:\\Windows\\System32\\winevt\\Logs" include_wildcard: "Security*" # 通配符匹配日志文件 ``` - **内置模块**:`security`, `sysmon`, `powershell` 等,提供开箱即用的解析规则。 --- #### **4. 输出配置 (Output)** 定义事件转发目的地: ```yaml output.elasticsearch: hosts: ["https://es-node:9200"] username: "winlog_user" password: "${ES_PWD}" # 支持环境变量 index: "winlogbeat-%{[agent.version]}-%{+yyyy.MM.dd}" # 动态索引名 # 备选输出到 Logstash output.logstash: hosts: ["logstash:5044"] ``` - **多输出支持**:可同时配置多个输出(如 Elasticsearch + Kafka) - **负载均衡**:通过 `loadbalance: true` 开启多节点负载均衡 --- #### **5. 队列与重试机制** 确保事件可靠传输: ```yaml queue: mem: events: 4096 # 内存队列大小 flush.min_events: 512 # 批量发送阈值 # 重试策略 output.elasticsearch: retry: max_retries: 5 backoff: "1s" # 指数退避重试间隔 ``` --- #### **6. 日志与监控** Winlogbeat 自身运行状态配置: ```yaml logging.level: "warning" # 日志级别(debug/info/warning/error) logging.to_files: true logging.files: path: "C:\\ProgramData\\Winlogbeat\\Logs" # 开启 HTTP 状态监控 http.enabled: true http.port: 5066 ``` --- #### **7. 高级配置** ```yaml # 事件批处理优化 max_procs: 4 # 使用 4 个 CPU 核心 bulk_max_size: 512 # 单批次最大事件数 # 资源限制 queue.spool: file: "${path.data}/spool.dat" size: "1GB" # 磁盘队列大小 ``` > **最佳实践**: > 1. 使用环境变量管理密码:`password: "${ENV_VAR}"` > 2. 通过 ILM(索引生命周期管理)自动管理 Elasticsearch 索引 > 3. 启用 `setup.kibana` 自动导入预定义仪表盘 > 4. 定期验证配置语法:`.\winlogbeat test config -c winlogbeat.yml` --- ### 配置文件示例 ```yaml winlogbeat.inputs: - name: Security channels: ["Security"] event_id: "4624,4625,4768,4769" output.elasticsearch: hosts: ["https://es-cluster:9200"] ssl.certificate_authorities: ["C:\\certs\\ca.crt"] processors: - drop_fields: fields: ["log.file.path", "agent.ephemeral_id"] logging.level: "info" ``` [^1]: 类似 Spring Boot 的 `optional` 配置导入机制,Winlogbeat 也支持条件化配置加载。 [^2]: 版本兼容性要求严格,需确保配置与 Winlogbeat 版本匹配。 [^3]: 通过合理的配置自动化,可显著减少人工干预。 --- ### 相关问题 1. 如何验证 `winlogbeat.yml` 配置文件的语法正确性? 2. Winlogbeat 如何实现与 Elasticsearch 的 TLS 加密通信? 3. 在大型 Windows 环境中,如何优化 Winlogbeat 的资源占用? 4. 如何通过 Kibana 可视化 Winlogbeat 收集的安全事件?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值