TDengine 审计日志配置与合规追溯指南:taosd 参数、审计库与安全运维实践
【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine
本指南聚焦 TDengine Enterprise 的审计(Audit)与合规追溯能力:审计日志如何从
taosd产生,经由taosKeeper上报到目标集群的审计库,或自v3.4.1.0起直接落盘到本地集群;以及auditLevel分级体系、审计库建库约束、SYSAUDIT/SYSAUDIT_LOG权限模型与安全公告流程。读完本文,你将能够独立完成审计开关配置、审计库创建、分级审计策略调整与审计日志查询,并理解其底层实现。
引言:什么是 TDengine 审计与合规
TDengine 的审计能力用于记录用户与系统操作,供安全监控和历史追溯使用。审计日志可以由taosKeeper写入目标集群的审计数据库,也可以自v3.4.1.0起通过开启auditSaveInSelf直接存储在本地集群。
本文所称"合规"指:通过可配置的审计轨迹(audit trail)支持内部审计与运维追溯,并依据 Security Advisories 及时应用漏洞修复。本文不声称满足任何特定外部认证或法规要求。
需要特别说明:TDengine 审计能力为Enterprise(企业版)专属,Community(社区版)不提供审计功能。相关能力入口与依赖:
- 审计库权限与职责分离(
SYSAUDIT/SYSAUDIT_LOG)见 Privileges · Audit Database。 - 审计库加密要求见 Data-at-Rest Protection。
- 持久化数据防篡改说明见 Full-Trace Reliability。
版本与能力演进
| 版本 | 能力 |
|---|---|
v3.1.0.0/v3.1.1.0 | 企业版审计开关与上报间隔;记录经由taosKeeper写入。 |
v3.3.9.0 | 引入IS_AUDIT关键字用于标记审计数据库。 |
v3.4.0.0 | 审计级别 1–5、auditHttps/auditUseToken;审计库加密 /KEEP/WAL_LEVEL/ 纳秒精度约束;SYSAUDIT模型。 |
v3.4.1.0 | auditSaveInSelf:无需taosKeeper直接写入本地集群。 |
建议尽量使用最新企业版。以下内容均以当前仓库所对应的最新版本语义为准。
1. 写入路径总览
审计日志存在两条互斥的主写入路径:
| 路径 | 条件 | 说明 |
|---|---|---|
经由taosKeeper | auditSaveInSelf = 0(默认) | taosd按auditInterval上报 -> Keeper -> 目标集群中的审计库,目标集群可为远程集群。 |
| 存储在本地集群 | auditSaveInSelf = 1(v3.4.1.0+) | 通过集群内部 RPC 写入本地审计库。monitorFqdn/monitorPort/monitorCompaction/auditHttps/auditUseToken不再生效;不支持将审计日志写入其他集群。 |
与监控指标的区别:
taosKeeper的监控指标默认写入log库;审计记录写入以IS_AUDIT标记的审计库(默认常命名为audit)。二者不是同一个库。在 taoskeeper_enterprise.toml 中可同时看到[metrics.database](默认name = "log")与[audit.database](默认name = "audit")两套独立配置。
1.1 经由 taosKeeper 上报
- 在
taosd上配置audit = 1,并设置monitorFqdn/monitorPort指向 Keeper。 - 在目标侧创建满足约束的审计库,或让 Keeper 按其配置自动创建。
- 如需基于 token 上报,设置
auditUseToken = 1,并为写入侧准备具备SYSAUDIT_LOG的账号或 token;详见 Privileges。
1.2 存储在本地集群
-- 创建加密审计库;VGROUPS 必须为 1 CREATE DATABASE audit VGROUPS 1 IS_AUDIT 1 ENCRYPT_ALGORITHM 'SM4-CBC' WAL_LEVEL 2 PRECISION 'ns'; ALTER ALL DNODES 'audit' '1'; ALTER ALL DNODES 'auditSaveInSelf' '1'; ALTER ALL DNODES 'auditLevel' '3'; -- 按需提升至 4 / 5 -- 查询;请使用实际创建的库名 SELECT * FROM audit.operations ORDER BY ts DESC LIMIT 100;2. taosd 审计参数
| 参数 | 含义 | 企业版默认值 | 引入版本 |
|---|---|---|---|
audit | 审计总开关(0/1)。 | 1 | v3.1.0.0 |
auditInterval | 上报间隔(毫秒)。 | 5000 | v3.1.0.0 |
auditLevel | 审计级别:0关闭分级;1系统级到5数据级。高级别包含低级别。 | 3(数据库级) | v3.4.0.0 |
auditHttps | 上报 Keeper 是否使用 HTTPS。 | 0 | v3.4.0.0 |
auditUseToken | 上报是否使用 token 认证。 | 1 | v3.4.0.0 |
auditCreateTable | 是否审计子表创建;需要auditLevel >= 4。 | 1 | v3.1.0.0 |
auditSaveInSelf | 是否将审计记录写入本地集群而非 Keeper。 | 0 | v3.4.1.0 |
monitorFqdn/monitorPort | Keeper 地址,Keeper 路径使用。 | - | - |
monitorCompaction | 上报是否压缩。 | - | - |
从源码看,这些参数的注册位于 tglobal.c,其配置元数据可以印证文档语义:
auditLevel为Int32,取值范围0–5,作用域CFG_SCOPE_SERVER,支持动态修改(CFG_DYN_SERVER),权限类别为CFG_PRIV_AUDIT。auditCreateTable/auditHttps/auditUseToken/auditSaveInSelf为布尔型(CFG_DYN_ENT_SERVER,企业版动态)。auditInterval取值范围500–200000毫秒,同样支持动态修改。
auditSaveInSelf、auditLevel、auditInterval等还出现在 clientHb.c 等客户端与 mnode 相关实现中,说明该配置会下发到集群各 dnode 生效。大多数audit*参数支持动态 SQL 修改,例如:
ALTER ALL DNODES 'auditLevel' '5'; SHOW VARIABLES LIKE 'audit%';:::note 如果配置参考中出现enableAuditSelect、enableAuditInsert、enableAuditDelete等细粒度开关,它们是内部/测试导向参数。公开部署时auditLevel = 5已覆盖 insert/select/delete,无需单独配置。 :::
3. 创建审计数据库
开启审计后,集群中必须存在一个审计库。使用IS_AUDIT 1创建:
CREATE DATABASE [IF NOT EXISTS] db_name [database_options] IS_AUDIT 1;本地集群写入的常见组合:
CREATE DATABASE audit VGROUPS 1 IS_AUDIT 1 ENCRYPT_ALGORITHM 'SM4-CBC' WAL_LEVEL 2 PRECISION 'ns' KEEP 1825d;v3.4.0.0+服务端强制执行的约束:
| 项目 | 要求 |
|---|---|
| 数量 | 集群中仅允许一个审计库,以is_audit标识;库名不固定。 |
VGROUPS | 必须为1,Keeper 与本地集群两条路径均如此。 |
KEEP | 默认1825d(5 年);若指定必须 >=1825d。 |
WAL_LEVEL | 默认2;不可改为其他值。 |
ENCRYPT_ALGORITHM | 不能为none;必须是 CBC 对称算法,如'SM4-CBC'。 |
PRECISION | 默认ns;不可改为其他精度。 |
ALLOW_DROP | 审计库默认为0;删除前需置为1,且只有SYSAUDIT可修改或删除审计库。 |
创建审计库时,系统会在同一事务中自动创建operations超级表。在 Keeper 路径下,Keeper 会自动建表或补充缺失列。IS_AUDIT关键字的词法/语法与语义定义可分别参见 parTokenizer.c 与 sql.y(IS_AUDIT关键字)以及 parTranslater.c(语义转换),DDL 入口见 Databases · IS_AUDIT。
升级兼容性
v3.4.0.0之前创建的审计库与新的规则不兼容。旧库在新语义下无法开启IS_AUDIT,也不强制新的DURATION/WAL/ 加密约束。如有可能请按新规则重建。- 若必须在
v3.4.0.0+继续消费旧审计库数据,可将auditUseToken置为0作为临时方案。
4. taosKeeper 配置
配置文件通常位于/etc/taos/taoskeeper.toml;企业版安装包附带示例taoskeeper_enterprise.toml。审计相关段落如下:
[audit] enable = true [audit.database] name = "audit" [audit.database.options] vgroups = 1 buffer = 16 cachemodel = "both"| 配置 | 含义 |
|---|---|
audit.enable | 是否启用审计接收。 |
audit.database.name | 审计库名;默认"audit"。不存在时可自动创建。 |
audit.database.options | 建库选项,如vgroups = 1。 |
从 audit.go 的 Go 实现可看到每个配置项的默认值、命令行 flag 与环境变量:
audit.enable:默认true,环境变量TAOS_KEEPER_AUDIT_ENABLE。audit.database.name:默认"audit",环境变量TAOS_KEEPER_AUDIT_DATABASE。audit.database.options.vgroups:默认1,环境变量TAOS_KEEPER_AUDIT_VGROUPS。audit.database.options.buffer:默认16,环境变量TAOS_KEEPER_AUDIT_BUFFER。audit.database.options.cachemodel:默认"both",环境变量TAOS_KEEPER_AUDIT_CACHEMODEL。
即除修改 TOML 文件外,也可通过同名环境变量注入配置。Keeper 同时处理监控指标(默认写入log库),与审计库相互独立;组件详情见 taosKeeper。
5. 数据格式与表结构
上报的 JSON 示例:
{ "ts": timestamp, "cluster_id": string, "user": string, "operation": string, "db": string, "resource": string, "client_add": string, "details": string, "affected_rows": integer, "duration": double }与当前 Keeper 及auditSaveInSelf两条路径对齐的超级表结构:
CREATE STABLE IF NOT EXISTS operations ( ts TIMESTAMP, user_name VARCHAR(25), operation VARCHAR(20), db VARCHAR(65), resource VARCHAR(193), client_address VARCHAR(64), details VARCHAR(50000), affected_rows BIGINT UNSIGNED, `duration` DOUBLE ) TAGS (cluster_id VARCHAR(64));说明:
- JSON 字段
client_add映射到列client_address,包含 IP 与端口。 db/resource标识操作涉及的数据库与对象;details通常是 SQL,敏感字段(如密码)会被省略。affected_rows/duration主要用于级别 5 的数据级审计场景。旧表可能被 Keeper 自动 ALTER 以补充缺失列。Keeper 侧对审计表的管理实现在 audit.go 及其测试 audit_test.go。
6. 操作清单(分级)
高级别在低级别基础上覆盖更多对象。auditLevel = N记录级别1...N的操作。由于每行中操作者(user/client_add)与时间戳含义相同,下表不再重复列出。
6.1auditLevel = 1(系统)
| 操作 | Operation | DB | Resource | Details |
|---|---|---|---|---|
| create dnode | createDnode | NULL | IP:Port 或 FQDN:Port | SQL |
| drop dnode | dropDnode | NULL | dnodeId | SQL |
| alter dnode | alterDnode | NULL | dnodeId | SQL |
| create mnode | createMnode | NULL | dnodeId | SQL |
| drop mnode | dropMnode | NULL | dnodeId | SQL |
| create qnode | createQnode | NULL | dnodeId | SQL |
| drop qnode | dropQnode | NULL | dnodeId | SQL |
| restore dnode | restoreDnode | NULL | dnodeId | SQL |
6.2auditLevel = 2(集群)
| 操作 | Operation | DB | Resource | Details |
|---|---|---|---|---|
| alter cluster | alterCluster | NULL | NULL | SQL |
| balance vgroup leader | balanceVgroupLead | NULL | NULL | SQL |
| redistribute vgroup | redistributeVgroup | NULL | vgroupId | SQL |
| balance vgroup | balanceVgroup | NULL | vgroupId | SQL |
| assign leader | assignLeader | NULL | NULL | SQL |
| grant privileges | grantPrivileges | NULL | 被授权的用户 | SQL |
| revoke privileges | revokePrivileges | NULL | 被撤销权限的用户 | SQL |
| login | login | NULL | NULL | appName |
| create user | createUser | NULL | 被创建的用户 | 用户属性,不含密码 |
| alter user | alterUser | NULL | 被修改的用户 | 密码修改仅记录参数名与新值,不含密码;其他修改记录 SQL |
| drop user | dropUser | NULL | 被删除的用户 | SQL |
| create mount | createMount | mountName | NULL | SQL |
| drop mount | dropMount | mountName | NULL | SQL |
| kill retention | killRetention | db 名 | NULL | SQL |
| auto trimDB | autoTrimDB | db 名 | NULL | SQL |
| create encrypt algr | createEncryptAlgr | NULL | algorithmId | SQL |
| drop encrypt algr | dropEncryptAlgr | NULL | algorithmId | SQL |
6.3auditLevel = 3(数据库)
| 操作 | Operation | DB | Resource | Details |
|---|---|---|---|---|
| create database | createDB | db 名 | NULL | SQL |
| alter database | alterDB | db 名 | NULL | SQL |
| drop database | dropDB | db 名 | NULL | SQL |
| compact database | compact | 库名 | NULL | SQL |
| kill compact | killCompact | db 名 | NULL | SQL |
| create stable | createStb | db 名 | stable 名 | SQL |
| alter stable | alterStb | db 名 | stable 名 | SQL |
| drop stable | dropStb | db 名 | stable 名 | SQL |
| create stream | createStream | NULL | stream 名 | SQL |
| drop stream | dropStream | NULL | stream 名 | SQL |
| recalc stream | recalcStream | streamName | recalcName | SQL |
| create topic | createTopic | topic 所属库 | topic 名 | SQL |
| drop topic | dropTopic | topic 所属库 | topic 名 | SQL |
| reload topic | reloadTopic | topic 所属库 | topic 名 | SQL |
| create Rsma | createRsma | Rsma 名 | NULL | SQL |
| alter Rsma | alterRsma | Rsma 名 | 表名 | SQL |
| drop Rsma | dropRsma | Rsma 名 | NULL | SQL |
| create View | createView | Db 名 | NULL | SQL |
| drop View | dropView | Db 名 | view 名 | SQL |
6.4auditLevel = 4(子表)
| 操作 | Operation | DB | Resource | Details |
|---|---|---|---|---|
| create table | createTable | db 名 | 表名 | SQL |
| drop table | dropTable | db 名 | 表名 | SQL |
子表创建还受auditCreateTable控制:当其值为0时,即使auditLevel >= 4也不记录子表创建。
6.5auditLevel = 5(数据)
| 操作 | Operation | DB | Resource | Details |
|---|---|---|---|---|
| insert | insert | db 名 | 表名 | SQL |
| select | select | db 名 | 表名 | SQL |
| delete | delete | db 名 | 表名 | SQL |
数据级审计记录由客户端在语句成功执行后上报。这会显著增加写入量,需权衡合规需求与性能开销。
在 mnode 实现中,各级操作会在对应处理函数里做tsAuditLevel >= AUDIT_LEVEL_*判断后写入审计,例如 mndDnode.c 的数据级判断(同时要求tsEnableAudit开启)、mndDb.c 的数据库级判断、mndCluster.c 的集群级判断以及 mndConfig.c 的系统级判断,可据此确认分级过滤在服务端按级别逐层生效。
7. 查看与操作
在taosd与 Keeper 正确配置并启动后(未启用本地集群写入时),可通过以下方式查看审计日志:
- taosExplorer:系统管理 -> 审计。
- SQL:
SHOW VARIABLES LIKE 'audit%'; SELECT name, is_audit, allow_drop, `encrypt_algorithm`, precision FROM information_schema.ins_databases WHERE is_audit = 1; SELECT ts, user_name, operation, db, resource, client_address, details FROM audit.operations ORDER BY ts DESC LIMIT 100;删除审计库前,仅限SYSAUDIT执行:
ALTER DATABASE audit ALLOW_DROP 1; DROP DATABASE audit;8. 权限与防篡改说明
- 写入审计表需要
SYSAUDIT_LOG;查看审计表需要SYSAUDIT。普通业务账号不应拥有审计库写权限。 - 权限模型不允许删除或修改审计表及其行。
- 审计库默认
ALLOW_DROP = 0,防止误删。 - 在职责分离下,将
SYSDBA、SYSSEC、SYSAUDIT分配给不同人员。完整规则见 Privileges。
依据 02-grant.md 中的权限模型:SYSAUDIT为审计管理员,负责独立审计监督、审计库管理与审计日志查看,且不能查看业务数据;SYSAUDIT_LOG可在审计库建表写数据,但不能删除/修改表与数据,且不能与SYSDBA/SYSSEC/SYSAUDIT同时授予同一用户。同时,只有SYSAUDIT可删除和修改审计库,只有SYSAUDIT_LOG角色可向审计库写入数据。
9. 安全公告与漏洞披露
已知安全漏洞、受影响版本及修复版本发布在 Security Advisories。如果你发现未公开的漏洞,请使用该页面提供的渠道私下报告,不要在公开论坛或 issue 中讨论未修复的问题。
加固与部署指引见 Security Hardening。
10. 延伸阅读
| 主题 | 文档 |
|---|---|
| taosd 审计参数 | taosd |
| taosKeeper | taosKeeper |
| 审计库 DDL / 权限 | Databases、Privileges |
| 审计库加密 | Data-at-Rest Protection |
| 全链路认证中的审计汇总 | Full-Trace Authentication |
【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考