This is an automated email from the ASF dual-hosted git repository.
yongzao pushed a commit to branch audit-log-patch-again
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/audit-log-patch-again by this
push:
new f79989353a6 finish
f79989353a6 is described below
commit f79989353a62aff7f1696080ab535952ba1fba98
Author: Yongzao <[email protected]>
AuthorDate: Sat Oct 11 22:08:56 2025 +0800
finish
---
.../org/apache/iotdb/db/it/audit/AuditLogSet.java | 5 +-
.../iotdb/db/it/audit/IoTDBAuditLogBasicIT.java | 2003 ++++++++++----------
.../security/TreeAccessCheckVisitor.java | 9 +-
3 files changed, 1053 insertions(+), 964 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/audit/AuditLogSet.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/audit/AuditLogSet.java
index b21b46582d5..9fff64a9007 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/audit/AuditLogSet.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/audit/AuditLogSet.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.db.it.audit;
+import com.google.common.collect.HashMultiset;
import org.junit.Assert;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -36,12 +37,12 @@ public class AuditLogSet {
private static final Logger LOGGER =
LoggerFactory.getLogger(AuditLogSet.class);
private final int logCnt;
- private final Set<List<String>> auditLogSet;
+ private final HashMultiset<List<String>> auditLogSet;
@SafeVarargs
public AuditLogSet(List<String>... auditLogs) {
logCnt = auditLogs.length;
- auditLogSet = Stream.of(auditLogs).collect(Collectors.toSet());
+ auditLogSet =
Stream.of(auditLogs).collect(Collectors.toCollection(HashMultiset::create));
}
public void containAuditLog(ResultSet resultSet, Set<Integer>
indexForContain, int columnCnt)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/audit/IoTDBAuditLogBasicIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/audit/IoTDBAuditLogBasicIT.java
index d1493ee8ed5..e423b511da4 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/audit/IoTDBAuditLogBasicIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/audit/IoTDBAuditLogBasicIT.java
@@ -35,18 +35,16 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.StringJoiner;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -58,7 +56,8 @@ import java.util.stream.Stream;
@Category({LocalStandaloneIT.class})
public class IoTDBAuditLogBasicIT {
- private static final Logger LOGGER =
LoggerFactory.getLogger(IoTDBAuditLogBasicIT.class);
+ private static final long ENSURE_AUDIT_LOG_SLEEP_IN_MS = 250;
+
private static final List<String> AUDIT_TABLE_COLUMNS =
Arrays.asList(
AbstractAuditLogger.AUDIT_LOG_NODE_ID,
@@ -140,13 +139,13 @@ public class IoTDBAuditLogBasicIT {
// Ensure the session conns in test env are closed completely,
// in order to generate logout audit log
// TODO: Optimize this func after the close func of connection is optimized
- Thread.sleep(1000);
+ TimeUnit.MILLISECONDS.sleep(ENSURE_AUDIT_LOG_SLEEP_IN_MS);
((ClusterTestConnection) connection).writeConnection.close();
- Thread.sleep(1000);
+ TimeUnit.MILLISECONDS.sleep(ENSURE_AUDIT_LOG_SLEEP_IN_MS);
for (NodeConnection conn : ((ClusterTestConnection)
connection).readConnections) {
- Thread.sleep(1000);
+ TimeUnit.MILLISECONDS.sleep(ENSURE_AUDIT_LOG_SLEEP_IN_MS);
conn.close();
- Thread.sleep(1000);
+ TimeUnit.MILLISECONDS.sleep(ENSURE_AUDIT_LOG_SLEEP_IN_MS);
}
}
@@ -155,7 +154,7 @@ public class IoTDBAuditLogBasicIT {
"CREATE DATABASE test",
"USE test",
// "SHOW CURRENT_DATABASE",
- // "SHOW DATABASES",
+ "SHOW DATABASES",
"ALTER DATABASE test SET PROPERTIES TTL='INF'",
"CREATE TABLE table1(t1 STRING TAG, a1 STRING ATTRIBUTE, s1 STRING
FIELD)",
"SHOW TABLES",
@@ -489,7 +488,7 @@ public class IoTDBAuditLogBasicIT {
"true",
"__audit",
"SHOW DATABASES",
- "User root (ID=0) requests authority on object test with
result true")),
+ "User root (ID=0) requests authority on object __audit with
result true")),
// Alter database
new AuditLogSet(
Arrays.asList(
@@ -1305,7 +1304,7 @@ public class IoTDBAuditLogBasicIT {
private static final List<String> TREE_MODEL_AUDIT_SQLS_USER_ROOT =
Arrays.asList(
"CREATE DATABASE root.test",
- // "show databases",
+ "show databases",
// "COUNT databases",
"set ttl to root.test.** INF",
"create timeseries root.test.d1.s1 with datatype=BOOLEAN",
@@ -1329,9 +1328,8 @@ public class IoTDBAuditLogBasicIT {
"LIST PRIVILEGES OF USER user1",
"insert into root.test.d1(timestamp,s1,s2,s3) values(1,true,1,'1')",
"insert into root.test.d2(timestamp,s1,s2,s3) aligned
values(1,true,1,'1')",
- // TODO: Enable testing select for normal user
- // "select * from root.test.d1 order by time",
- // "select * from root.test.d2 order by time",
+ "select * from root.test.d1 order by time",
+ "select * from root.test.d2 order by time",
"delete from root.test.d1.s3",
"delete from root.test.d2.s3");
private static final List<String> TREE_MODEL_AUDIT_SQLS_USER_USER2 =
@@ -1342,11 +1340,8 @@ public class IoTDBAuditLogBasicIT {
"list role",
"insert into root.test.d1(timestamp,s1,s2,s3) values(1,true,1,'1')",
"insert into root.test.d2(timestamp,s1,s2,s3) aligned
values(1,true,1,'1')",
- "insert into root.test.d1(timestamp,s1,s2,s3) values(1,false,2,'2')",
- "insert into root.test.d2(timestamp,s1,s2,s3) aligned
values(1,false,2,'2')",
- // TODO: Enable testing select for normal user
- // "select * from root.test.d1 order by time",
- // "select * from root.test.d2 order by time",
+ "select * from root.test.d1 order by time",
+ "select * from root.test.d2 order by time",
"delete from root.test.d1.s3",
"delete from root.test.d2.s3");
private static final List<String> TREE_MODEL_AUDIT_SQLS_USER_ROOT_FINAL =
@@ -1359,943 +1354,1048 @@ public class IoTDBAuditLogBasicIT {
"DROP USER user2",
"DROP ROLE role1",
"DELETE DATABASE root.test");
- private static final List<List<String>> TREE_MODEL_AUDIT_FIELDS =
+ private static final List<AuditLogSet> TREE_MODEL_AUDIT_FIELDS =
Arrays.asList(
// Start audit service
- Arrays.asList(
- "root.__audit.log.node_1.u_none",
- "true",
- "GLOBAL",
- "[AUDIT]",
- "null",
- "CONTROL",
- "Successfully start the Audit service with configurations
(auditableOperationType [DDL, DML, QUERY, CONTROL], auditableOperationLevel
GLOBAL, auditableOperationResult SUCCESS,FAIL)",
- "null",
- "CHANGE_AUDIT_OPTION",
- "null",
- "null"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "is closing",
- "",
- "LOGOUT",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "root"),
- // Show audit database
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[MANAGE_DATABASE]",
- "[root.__audit]",
- "QUERY",
- "User root (ID=0) requests authority on object root.__audit with
result true",
- "SHOW DATABASES root.__audit",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "is closing",
- "",
- "LOGOUT",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "is closing",
- "",
- "LOGOUT",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "root"),
- // Desc audit table
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[READ_SCHEMA]",
- "__audit",
- "QUERY",
- "User root (ID=0) requests authority on object audit_log with
result true",
- "DESC __audit.audit_log",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "is closing",
- "",
- "LOGOUT",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "is closing",
- "",
- "LOGOUT",
- "127.0.0.1",
- "root"),
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_none",
+ "true",
+ "GLOBAL",
+ "[AUDIT]",
+ "null",
+ "CONTROL",
+ "Successfully start the Audit service with configurations
(auditableOperationType [DDL, DML, QUERY, CONTROL], auditableOperationLevel
GLOBAL, auditableOperationResult SUCCESS,FAIL)",
+ "null",
+ "CHANGE_AUDIT_OPTION",
+ "null",
+ "null")),
+ // Environment setup login/logout
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "is closing",
+ "",
+ "LOGOUT",
+ "127.0.0.1",
+ "root")),
+ // Show audit log database
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[MANAGE_DATABASE]",
+ "[root.__audit]",
+ "QUERY",
+ "User root (ID=0) requests authority on object root.__audit
with result true",
+ "SHOW DATABASES root.__audit",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "is closing",
+ "",
+ "LOGOUT",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "is closing",
+ "",
+ "LOGOUT",
+ "127.0.0.1",
+ "root")),
+ // Desc audit log table view
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[READ_SCHEMA]",
+ "__audit",
+ "QUERY",
+ "User root (ID=0) requests authority on object audit_log
with result true",
+ "DESC __audit.audit_log",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "is closing",
+ "",
+ "LOGOUT",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "is closing",
+ "",
+ "LOGOUT",
+ "127.0.0.1",
+ "root")),
// =============================Audit user
root=============================
// Root login, twice for both read and write connections
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "root"),
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "root")),
// Create database
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[MANAGE_DATABASE]",
- "root.test",
- "DDL",
- "User root (ID=0) requests authority on object root.test with
result true",
- "CREATE DATABASE root.test",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[MANAGE_DATABASE]",
+ "root.test",
+ "DDL",
+ "User root (ID=0) requests authority on object root.test
with result true",
+ "CREATE DATABASE root.test",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
+ // Show database
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[MANAGE_DATABASE]",
+ "[root.**]",
+ "QUERY",
+ "User root (ID=0) requests authority on object root.** with
result true",
+ "show databases",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
// Set TTL to database
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "[SYSTEM]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object [root.test.**]
with result true",
- "set ttl to root.test.** INF",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[SYSTEM]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object
[root.test.**] with result true",
+ "set ttl to root.test.** INF",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
// Create (aligned) timeseries TODO: fill database if necessary,
same as follows
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[WRITE_SCHEMA]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object [root.test.d1.s1]
with result true",
- "create timeseries root.test.d1.s1 with datatype=BOOLEAN",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[WRITE_SCHEMA]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object [root.test.d1.s2]
with result true",
- "create timeseries root.test.d1.s2 with datatype=INT64",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[WRITE_SCHEMA]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object [root.test.d1.s3]
with result true",
- "create timeseries root.test.d1.s3 with datatype=TEXT",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[WRITE_SCHEMA]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object [root.test.d2.s1,
root.test.d2.s2, root.test.d2.s3] with result true",
- "CREATE ALIGNED TIMESERIES root.test.d2(s1 BOOLEAN, s2 INT64, s3
TEXT)",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[WRITE_SCHEMA]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object
[root.test.d1.s1] with result true",
+ "create timeseries root.test.d1.s1 with datatype=BOOLEAN",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[WRITE_SCHEMA]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object
[root.test.d1.s2] with result true",
+ "create timeseries root.test.d1.s2 with datatype=INT64",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[WRITE_SCHEMA]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object
[root.test.d1.s3] with result true",
+ "create timeseries root.test.d1.s3 with datatype=TEXT",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[WRITE_SCHEMA]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object
[root.test.d2.s1, root.test.d2.s2, root.test.d2.s3] with result true",
+ "CREATE ALIGNED TIMESERIES root.test.d2(s1 BOOLEAN, s2
INT64, s3 TEXT)",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
// Show timeseries
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[READ_DATA, READ_SCHEMA]",
- "null",
- "QUERY",
- "User root (ID=0) requests authority on object [root.**] with
result true",
- "show timeseries",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[READ_DATA, READ_SCHEMA]",
+ "null",
+ "QUERY",
+ "User root (ID=0) requests authority on object [root.**]
with result true",
+ "show timeseries",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
// Count timeseries
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[READ_SCHEMA]",
- "null",
- "QUERY",
- "User root (ID=0) requests authority on object [root.test] with
result true",
- "COUNT TIMESERIES root.test",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[READ_SCHEMA]",
+ "null",
+ "QUERY",
+ "User root (ID=0) requests authority on object [root.test]
with result true",
+ "COUNT TIMESERIES root.test",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
// Alter timeseries
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[WRITE_SCHEMA]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object [root.test.d1.s1]
with result true",
- "ALTER timeseries root.test.d1.s1 ADD TAGS tag3=v3, tag4=v4",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[WRITE_SCHEMA]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object [root.test.d2.s1]
with result true",
- "ALTER timeseries root.test.d2.s1 ADD TAGS tag3=v3, tag4=v4",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Create user
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "[MANAGE_USER]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object user1 with result
true",
- "CREATE USER user1 ...",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "[MANAGE_USER]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object user2 with result
true",
- "CREATE USER user2 ...",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Create role
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "[MANAGE_ROLE]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object role1 with result
true",
- "CREATE ROLE role1",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Grant privileges to user
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "[SECURITY]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object user1 with result
true",
- "GRANT READ_DATA, WRITE_DATA ON root.test.** TO USER user1",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Grant privileges to role
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "[SECURITY]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object role1 with result
true",
- "GRANT READ ON root.test.** TO ROLE role1",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Grant role to user
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "[MANAGE_ROLE]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object user: user2,
role: role1 with result true",
- "GRANT ROLE role1 TO user2",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // List user, the target object is null since the root can list all
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "[MANAGE_USER]",
- "null",
- "QUERY",
- "User root (ID=0) requests authority on object null with result
true",
- "list user",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // List role, the target object is null since the root can list all
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "[MANAGE_ROLE]",
- "null",
- "QUERY",
- "User root (ID=0) requests authority on object null with result
true",
- "list role",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Root logout, twice for both read and write connections
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "is closing",
- "",
- "LOGOUT",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "is closing",
- "",
- "LOGOUT",
- "127.0.0.1",
- "root"),
- // =============================Audit user
user1=============================
- // User1 login, twice for both read and write connections
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User user1 (ID=10000),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "user1"),
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User user1 (ID=10000),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "user1"),
- // List privilege of user1
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "GLOBAL",
- "null",
- "null",
- "QUERY",
- "User user1 (ID=10000) requests authority on object user1 with
result true",
- "LIST PRIVILEGES OF USER user1",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- // Insert into (aligned) timeseries
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "OBJECT",
- "[WRITE_DATA]",
- "null",
- "DML",
- "User user1 (ID=10000) requests authority on object
[root.test.d1.s1, root.test.d1.s2, root.test.d1.s3] with result true",
- "insert into root.test.d1(timestamp,s1,s2,s3) values(...)",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "OBJECT",
- "[WRITE_DATA]",
- "null",
- "DML",
- "User user1 (ID=10000) requests authority on object
[root.test.d2.s1, root.test.d2.s2, root.test.d2.s3] with result true",
- "insert into root.test.d2(timestamp,s1,s2,s3) aligned
values(...)",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- // Select timeseries data
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "OBJECT",
- "[READ_DATA]",
- "null",
- "QUERY",
- "User user1 (ID=10000) requests authority on object
[root.test.d1.*] with result true",
- "select * from root.test.d1 order by time",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "OBJECT",
- "[READ_DATA]",
- "null",
- "QUERY",
- "User user1 (ID=10000) requests authority on object
[root.test.d2.*] with result true",
- "select * from root.test.d2 order by time",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- // Delete timeseries data
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "OBJECT",
- "[WRITE_DATA]",
- "null",
- "DML",
- "User root (ID=0) requests authority on object [root.test.d1.s3]
with result true",
- "delete from root.test.d1.s3",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "OBJECT",
- "[WRITE_DATA]",
- "null",
- "DML",
- "User root (ID=0) requests authority on object [root.test.d2.s3]
with result true",
- "delete from root.test.d2.s3",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- // user1 logout, twice for both read and write connections
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "is closing",
- "",
- "LOGOUT",
- "127.0.0.1",
- "user1"),
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "is closing",
- "",
- "LOGOUT",
- "127.0.0.1",
- "user1"),
- // =============================Audit user
user2=============================
- // User2 login, twice for both read and write connections
- Arrays.asList(
- "root.__audit.log.node_1.u_10001",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User user2 (ID=10001),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "user2"),
- Arrays.asList(
- "root.__audit.log.node_1.u_10001",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User user2 (ID=10001),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "user2"),
- // List privilege of user2
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "GLOBAL",
- "null",
- "null",
- "QUERY",
- "User user1 (ID=10000) requests authority on object user1 with
result true",
- "LIST PRIVILEGES OF USER user1",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- // List privilege of role1
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "GLOBAL",
- "null",
- "null",
- "QUERY",
- "User user1 (ID=10000) requests authority on object user1 with
result true",
- "LIST PRIVILEGES OF USER user1",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- // List user, can only see him/herself
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "GLOBAL",
- "null",
- "null",
- "QUERY",
- "User user1 (ID=10000) requests authority on object user1 with
result true",
- "LIST PRIVILEGES OF USER user1",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- // List role, can only see his/hers roles
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "GLOBAL",
- "null",
- "null",
- "QUERY",
- "User user1 (ID=10000) requests authority on object user1 with
result true",
- "LIST PRIVILEGES OF USER user1",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- // Insert into (aligned) timeseries
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "OBJECT",
- "[WRITE_DATA]",
- "null",
- "DML",
- "User user1 (ID=10000) requests authority on object
[root.test.d1.s1, root.test.d1.s2, root.test.d1.s3] with result true",
- "insert into root.test.d1(timestamp,s1,s2,s3) values(...)",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "OBJECT",
- "[WRITE_DATA]",
- "null",
- "DML",
- "User user1 (ID=10000) requests authority on object
[root.test.d2.s1, root.test.d2.s2, root.test.d2.s3] with result true",
- "insert into root.test.d2(timestamp,s1,s2,s3) aligned
values(...)",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- // Select timeseries data
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "OBJECT",
- "[READ_DATA]",
- "null",
- "QUERY",
- "User user1 (ID=10000) requests authority on object
[root.test.d1.*] with result true",
- "select * from root.test.d1 order by time",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "OBJECT",
- "[READ_DATA]",
- "null",
- "QUERY",
- "User user1 (ID=10000) requests authority on object
[root.test.d2.*] with result true",
- "select * from root.test.d2 order by time",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- // Delete timeseries data
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "OBJECT",
- "[WRITE_DATA]",
- "null",
- "DML",
- "User root (ID=0) requests authority on object [root.test.d1.s3]
with result true",
- "delete from root.test.d1.s3",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "OBJECT",
- "[WRITE_DATA]",
- "null",
- "DML",
- "User root (ID=0) requests authority on object [root.test.d2.s3]
with result true",
- "delete from root.test.d2.s3",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "user1"),
- // user1 logout, twice for both read and write connections
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "is closing",
- "",
- "LOGOUT",
- "127.0.0.1",
- "user1"),
- Arrays.asList(
- "root.__audit.log.node_1.u_10000",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "is closing",
- "",
- "LOGOUT",
- "127.0.0.1",
- "user1"),
- // =============================Audit user
user2=============================
- // User2 login, twice for both read and write connections
- Arrays.asList(
- "root.__audit.log.node_1.u_10001",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User user2 (ID=10001),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "user2"),
- Arrays.asList(
- "root.__audit.log.node_1.u_10001",
- "true",
- "GLOBAL",
- "null",
- "",
- "CONTROL",
- "IoTDB: Login status: Login successfully. User user2 (ID=10001),
opens Session",
- "",
- "LOGIN",
- "127.0.0.1",
- "user2"),
- // Drop role
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "[MANAGE_ROLE]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object role1 with result
true",
- "DROP ROLE role1",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Drop user
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "[MANAGE_USER]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object user1 with result
true",
- "DROP USER user1",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Insert into (aligned) timeseries
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[WRITE_DATA]",
- "null",
- "DML",
- "User root (ID=0) requests authority on object [root.test.d1.s2]
with result true",
- "INSERT INTO root.test.d1(timestamp,s2) VALUES(...)",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[WRITE_DATA]",
- "null",
- "DML",
- "User root (ID=0) requests authority on object [root.test.d2.s1,
root.test.d2.s2] with result true",
- "INSERT INTO root.test.d2(timestamp,s1,s2) ALIGNED VALUES(...)",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Select all timeseries
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[READ_DATA]",
- "null",
- "QUERY",
- "User root (ID=0) requests authority on object [root.test.**]
with result true",
- "SELECT ** FROM root.test",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Delete timeseries data
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[WRITE_DATA]",
- "null",
- "DML",
- "User root (ID=0) requests authority on object [root.test.d2]
with result true",
- "DELETE FROM root.test.d2",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Drop timeseries
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[WRITE_SCHEMA]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object [root.test.d1.s2]
with result true",
- "DROP TIMESERIES root.test.d1.s2",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Set TTL to devices
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "GLOBAL",
- "[SYSTEM]",
- "null",
- "DDL",
- "User root (ID=0) requests authority on object [root.test.**]
with result true",
- "set ttl to root.test.** 360000",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Delete database
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[MANAGE_DATABASE]",
- "[root.test]",
- "DDL",
- "User root (ID=0) requests authority on object [root.test] with
result true",
- "DELETE DATABASE root.test",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"),
- // Select audit log
- Arrays.asList(
- "root.__audit.log.node_1.u_0",
- "true",
- "OBJECT",
- "[READ_DATA]",
- "null",
- "QUERY",
- "User root (ID=0) requests authority on object
[root.__audit.log.**.*] with result true",
- "SELECT * FROM root.__audit.log.** ORDER BY TIME ALIGN BY
DEVICE",
- "OBJECT_AUTHENTICATION",
- "127.0.0.1",
- "root"));
- private static final Set<Integer> TREE_INDEX_FOR_CONTAIN =
- Stream.of(7).collect(Collectors.toSet());
-
- @Test
- public void basicAuditLogTestForTreeModel() throws SQLException,
InterruptedException {
- Connection connection =
EnvFactory.getEnv().getConnection(BaseEnv.TREE_SQL_DIALECT);
- Statement statement = connection.createStatement();
- for (String sql : TREE_MODEL_AUDIT_SQLS_USER_ROOT) {
- statement.execute(sql);
- }
- closeConnectionCompletely(connection);
- connection =
- EnvFactory.getEnv().getConnection("user1", "IoTDB@2025abc",
BaseEnv.TREE_SQL_DIALECT);
- statement = connection.createStatement();
- for (String sql : TREE_MODEL_AUDIT_SQLS_USER_USER1) {
- statement.execute(sql);
- }
- closeConnectionCompletely(connection);
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[WRITE_SCHEMA]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object
[root.test.d1.s1] with result true",
+ "ALTER timeseries root.test.d1.s1 ADD TAGS tag3=v3, tag4=v4",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[WRITE_SCHEMA]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object
[root.test.d2.s1] with result true",
+ "ALTER timeseries root.test.d2.s1 ADD TAGS tag3=v3, tag4=v4",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
+ // Create user/role
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[MANAGE_USER]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object user1 with
result true",
+ "CREATE USER user1 ...",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[MANAGE_USER]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object user2 with
result true",
+ "CREATE USER user2 ...",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[MANAGE_ROLE]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object role1 with
result true",
+ "CREATE ROLE role1",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
+ // Grant privileges: pri->user, pri->role, role->user
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[SECURITY]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object user1 with
result true",
+ "GRANT READ_DATA, WRITE_DATA ON root.test.** TO USER user1",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[SECURITY]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object role1 with
result true",
+ "GRANT READ ON root.test.** TO ROLE role1",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[MANAGE_ROLE]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object user: user2,
role: role1 with result true",
+ "GRANT ROLE role1 TO user2",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
+ // List user/role, the target object is null since the root can list
all,
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[MANAGE_USER]",
+ "null",
+ "QUERY",
+ "User root (ID=0) requests authority on object null with
result true",
+ "list user",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[MANAGE_ROLE]",
+ "null",
+ "QUERY",
+ "User root (ID=0) requests authority on object null with
result true",
+ "list role",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
+ // Root logout, twice for both read and write connections
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "is closing",
+ "",
+ "LOGOUT",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "is closing",
+ "",
+ "LOGOUT",
+ "127.0.0.1",
+ "root")),
+ // =============================Audit user
user1=============================
+ // User1 login, twice for both read and write connections
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User user1
(ID=10000), opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "user1"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User user1
(ID=10000), opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "user1")),
+ // List privilege of user1
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "true",
+ "GLOBAL",
+ "null",
+ "null",
+ "QUERY",
+ "User user1 (ID=10000) requests authority on object user1
with result true",
+ "LIST PRIVILEGES OF USER user1",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user1")),
+ // Insert into (aligned) timeseries
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "true",
+ "OBJECT",
+ "[WRITE_DATA]",
+ "null",
+ "DML",
+ "User user1 (ID=10000) requests authority on object
[root.test.d1.s1, root.test.d1.s2, root.test.d1.s3] with result true",
+ "insert into root.test.d1(timestamp,s1,s2,s3) values(...)",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user1"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "true",
+ "OBJECT",
+ "[WRITE_DATA]",
+ "null",
+ "DML",
+ "User user1 (ID=10000) requests authority on object
[root.test.d2.s1, root.test.d2.s2, root.test.d2.s3] with result true",
+ "insert into root.test.d2(timestamp,s1,s2,s3) aligned
values(...)",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user1")),
+ // Select timeseries data
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "false",
+ "GLOBAL",
+ "[AUDIT]",
+ "null",
+ "QUERY",
+ "User user1 (ID=10000) requests authority on object
root.__audit with result false",
+ "select * from root.test.d1 order by time",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user1"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "true",
+ "OBJECT",
+ "[READ_DATA]",
+ "null",
+ "QUERY",
+ "User user1 (ID=10000) requests authority on object
[root.test.d1.*] with result true",
+ "select * from root.test.d1 order by time",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user1"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "false",
+ "GLOBAL",
+ "[AUDIT]",
+ "null",
+ "QUERY",
+ "User user1 (ID=10000) requests authority on object
root.__audit with result false",
+ "select * from root.test.d2 order by time",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user1"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "true",
+ "OBJECT",
+ "[READ_DATA]",
+ "null",
+ "QUERY",
+ "User user1 (ID=10000) requests authority on object
[root.test.d2.*] with result true",
+ "select * from root.test.d2 order by time",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user1")),
+ // Delete timeseries data
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "true",
+ "OBJECT",
+ "[WRITE_DATA]",
+ "null",
+ "DML",
+ "User user1 (ID=10000) requests authority on object
[root.test.d1.s3] with result true",
+ "delete from root.test.d1.s3",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user1"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "true",
+ "OBJECT",
+ "[WRITE_DATA]",
+ "null",
+ "DML",
+ "User user1 (ID=10000) requests authority on object
[root.test.d2.s3] with result true",
+ "delete from root.test.d2.s3",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user1")),
+ // user1 logout, twice for both read and write connections
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "is closing",
+ "",
+ "LOGOUT",
+ "127.0.0.1",
+ "user1"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10000",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "is closing",
+ "",
+ "LOGOUT",
+ "127.0.0.1",
+ "user1")),
+ // =============================Audit user
user2=============================
+ // User2 login, twice for both read and write connections
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User user2
(ID=10001), opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "user2"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User user2
(ID=10001), opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "user2")),
+ // List privilege of user2/role1
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "true",
+ "GLOBAL",
+ "null",
+ "null",
+ "QUERY",
+ "User user2 (ID=10001) requests authority on object user2
with result true",
+ "LIST PRIVILEGES OF USER user2",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "true",
+ "GLOBAL",
+ "null",
+ "null",
+ "QUERY",
+ "User user2 (ID=10001) requests authority on object user2
with result true",
+ "LIST PRIVILEGES OF ROLE role1",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2")),
+ // List user/role, can only see him/herself
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "false",
+ "GLOBAL",
+ "[MANAGE_USER]",
+ "null",
+ "QUERY",
+ "User user2 (ID=10001) requests authority on object null
with result false",
+ "list user",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "true",
+ "GLOBAL",
+ "[null]",
+ "null",
+ "QUERY",
+ "User user2 (ID=10001) requests authority on object user2
with result true",
+ "list user",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2"),
+ // List role, can only see his/hers roles
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "false",
+ "GLOBAL",
+ "[MANAGE_ROLE]",
+ "null",
+ "QUERY",
+ "User user2 (ID=10001) requests authority on object null
with result false",
+ "list role",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "true",
+ "GLOBAL",
+ "[null]",
+ "null",
+ "QUERY",
+ "User user2 (ID=10001) requests authority on object user2
with result true",
+ "list role",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2")),
+ // Insert into (aligned) timeseries failed
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "false",
+ "OBJECT",
+ "[WRITE_DATA]",
+ "null",
+ "DML",
+ "User user2 (ID=10001) requests authority on object
[root.test.d1.s1, root.test.d1.s2, root.test.d1.s3] with result false",
+ "insert into root.test.d1(timestamp,s1,s2,s3) values(...)",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "false",
+ "OBJECT",
+ "[WRITE_DATA]",
+ "null",
+ "DML",
+ "User user2 (ID=10001) requests authority on object
[root.test.d2.s1, root.test.d2.s2, root.test.d2.s3] with result false",
+ "insert into root.test.d2(timestamp,s1,s2,s3) aligned
values(...)",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2")),
+ // Select timeseries data
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "false",
+ "GLOBAL",
+ "[AUDIT]",
+ "null",
+ "QUERY",
+ "User user2 (ID=10001) requests authority on object
root.__audit with result false",
+ "select * from root.test.d1 order by time",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "true",
+ "OBJECT",
+ "[READ_DATA]",
+ "null",
+ "QUERY",
+ "User user2 (ID=10001) requests authority on object
[root.test.d1.*] with result true",
+ "select * from root.test.d1 order by time",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "false",
+ "GLOBAL",
+ "[AUDIT]",
+ "null",
+ "QUERY",
+ "User user2 (ID=10001) requests authority on object
root.__audit with result false",
+ "select * from root.test.d2 order by time",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "true",
+ "OBJECT",
+ "[READ_DATA]",
+ "null",
+ "QUERY",
+ "User user2 (ID=10001) requests authority on object
[root.test.d2.*] with result true",
+ "select * from root.test.d2 order by time",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2")),
+ // Delete timeseries data failed
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "false",
+ "OBJECT",
+ "[WRITE_DATA]",
+ "null",
+ "DML",
+ "User user2 (ID=10001) requests authority on object
[root.test.d1.s3] with result false",
+ "delete from root.test.d1.s3",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "false",
+ "OBJECT",
+ "[WRITE_DATA]",
+ "null",
+ "DML",
+ "User user2 (ID=10001) requests authority on object
[root.test.d2.s3] with result false",
+ "delete from root.test.d2.s3",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "user2")),
+ // user2 logout, twice for both read and write connections
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "is closing",
+ "",
+ "LOGOUT",
+ "127.0.0.1",
+ "user2"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_10001",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "is closing",
+ "",
+ "LOGOUT",
+ "127.0.0.1",
+ "user2")),
+ // =============================Audit user root
final=============================
+ // root login, twice for both read and write connections
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "null",
+ "",
+ "CONTROL",
+ "IoTDB: Login status: Login successfully. User root (ID=0),
opens Session",
+ "",
+ "LOGIN",
+ "127.0.0.1",
+ "root")),
+ // Delete timeseries data
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[WRITE_SCHEMA]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object
[root.test.d1.s3] with result true",
+ "delete timeseries root.test.d1.s3",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
+ // Drop timeseries
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[WRITE_SCHEMA]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object
[root.test.d1.*] with result true",
+ "drop timeseries root.test.d1.*",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
+ // Revoke privileges
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[SECURITY]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object user1 with
result true",
+ "REVOKE READ_DATA, WRITE_DATA ON root.test.** FROM USER
user1",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[SECURITY]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object role1 with
result true",
+ "REVOKE READ ON root.test.** FROM ROLE role1",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
+ // Drop user/role
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[MANAGE_USER]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object user1 with
result true",
+ "DROP USER user1",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[MANAGE_USER]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object user2 with
result true",
+ "DROP USER user2",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root"),
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "GLOBAL",
+ "[MANAGE_ROLE]",
+ "null",
+ "DDL",
+ "User root (ID=0) requests authority on object role1 with
result true",
+ "DROP ROLE role1",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
+ // Delete database
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[MANAGE_DATABASE]",
+ "[root.test]",
+ "DDL",
+ "User root (ID=0) requests authority on object [root.test]
with result true",
+ "DELETE DATABASE root.test",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")),
+ // Select audit log
+ new AuditLogSet(
+ Arrays.asList(
+ "root.__audit.log.node_1.u_0",
+ "true",
+ "OBJECT",
+ "[READ_DATA]",
+ "null",
+ "QUERY",
+ "User root (ID=0) requests authority on object
[root.__audit.log.**.*] with result true",
+ "SELECT * FROM root.__audit.log.** ORDER BY TIME ALIGN BY
DEVICE",
+ "OBJECT_AUTHENTICATION",
+ "127.0.0.1",
+ "root")));
+ private static final Set<Integer> TREE_INDEX_FOR_CONTAIN =
+ Stream.of(7).collect(Collectors.toSet());
+
+ @Test
+ public void basicAuditLogTestForTreeModel() throws SQLException,
InterruptedException {
+ Connection connection =
EnvFactory.getEnv().getConnection(BaseEnv.TREE_SQL_DIALECT);
+ Statement statement = connection.createStatement();
+ for (String sql : TREE_MODEL_AUDIT_SQLS_USER_ROOT) {
+ statement.execute(sql);
+ TimeUnit.MILLISECONDS.sleep(ENSURE_AUDIT_LOG_SLEEP_IN_MS);
+ }
+ closeConnectionCompletely(connection);
+ connection =
+ EnvFactory.getEnv().getConnection("user1", "IoTDB@2025abc",
BaseEnv.TREE_SQL_DIALECT);
+ statement = connection.createStatement();
+ for (String sql : TREE_MODEL_AUDIT_SQLS_USER_USER1) {
+ statement.execute(sql);
+ TimeUnit.MILLISECONDS.sleep(ENSURE_AUDIT_LOG_SLEEP_IN_MS);
+ }
+ closeConnectionCompletely(connection);
connection =
EnvFactory.getEnv().getConnection("user2", "IoTDB@2025abc",
BaseEnv.TREE_SQL_DIALECT);
statement = connection.createStatement();
for (String sql : TREE_MODEL_AUDIT_SQLS_USER_USER2) {
try {
statement.execute(sql);
+ TimeUnit.MILLISECONDS.sleep(ENSURE_AUDIT_LOG_SLEEP_IN_MS);
} catch (SQLException e) {
// Ignore, only record audit log
}
@@ -2305,28 +2405,13 @@ public class IoTDBAuditLogBasicIT {
statement = connection.createStatement();
for (String sql : TREE_MODEL_AUDIT_SQLS_USER_ROOT_FINAL) {
statement.execute(sql);
+ TimeUnit.MILLISECONDS.sleep(ENSURE_AUDIT_LOG_SLEEP_IN_MS);
}
- int count = 0;
ResultSet resultSet =
statement.executeQuery("SELECT * FROM root.__audit.log.** ORDER BY
TIME ALIGN BY DEVICE");
- while (resultSet.next()) {
- LOGGER.info("Expected audit log: {}",
TREE_MODEL_AUDIT_FIELDS.get(count));
- List<String> actualFields = new ArrayList<>();
- for (int i = 1; i <= 11; i++) {
- actualFields.add(resultSet.getString(i + 1));
- }
- LOGGER.info("Actual audit log: {}", actualFields);
- List<String> expectedFields = TREE_MODEL_AUDIT_FIELDS.get(count);
- for (int i = 1; i <= 11; i++) {
- if (TREE_INDEX_FOR_CONTAIN.contains(i)) {
- Assert.assertTrue(resultSet.getString(i +
1).contains(expectedFields.get(i - 1)));
- continue;
- }
- Assert.assertEquals(expectedFields.get(i - 1), resultSet.getString(i +
1));
- }
-
- count++;
+ for (AuditLogSet expectedAuditLogSet : TREE_MODEL_AUDIT_FIELDS) {
+ expectedAuditLogSet.containAuditLog(resultSet, TREE_INDEX_FOR_CONTAIN,
11);
}
- Assert.assertEquals(TREE_MODEL_AUDIT_FIELDS.size(), count);
+ Assert.assertFalse(resultSet.next());
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java
index aa999677075..4ffa2c9a5f9 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java
@@ -593,7 +593,8 @@ public class TreeAccessCheckVisitor extends
StatementVisitor<TSStatus, TreeAcces
context::getUsername);
return AuthorityChecker.getTSStatus(false,
PrivilegeType.MANAGE_ROLE);
}
- recordObjectAuthenticationAuditLog(context.setResult(true),
context::getUsername);
+ recordObjectAuthenticationAuditLog(
+ context.setPrivilegeType(null).setResult(true),
context::getUsername);
statement.setUserName(context.getUsername());
return RpcUtils.SUCCESS_STATUS;
@@ -1151,8 +1152,10 @@ public class TreeAccessCheckVisitor extends
StatementVisitor<TSStatus, TreeAcces
checkedPaths,
permission);
if (!AuthorityChecker.INTERNAL_AUDIT_USER.equals(context.getUsername())) {
- // Skip internal auditor
- recordObjectAuthenticationAuditLog(context.setResult(true),
checkedPaths::toString);
+ // Internal auditor no needs audit log
+ recordObjectAuthenticationAuditLog(
+ context.setResult(result.getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()),
+ checkedPaths::toString);
}
return result;
}