安全函数
gs_password_deadline()
描述:显示当前账户距离密码过期的时间。密码过期后提示用户修改密码。与GUC参数password_effect_time相关。
返回值类型:interval
示例:
1 2 3 4 5 |
SELECT gs_password_deadline(); gs_password_deadline ------------------------- 83 days 17:44:32.196094 (1 row) |
gs_password_expiration()
描述:显示当前账户距离密码过期的时间。密码过期后用户无法登录数据库。与创建用户的DDL语句PASSWORD EXPIRATION period相关,函数返回值大于等于-1,如果创建用户时未指定PASSWORD EXPIRATION period,该函数的缺省值为-1,表示没有过期限制。
返回值类型:interval
示例:
1 2 3 4 5 |
SELECT gs_password_expiration(); gs_password_expiration ------------------------- 29 days 23:59:49.731482 (1 row) |
login_audit_messages(flag boolean)
描述:查看登录用户的登录信息。
返回值类型:元组
示例:
- 查看上一次登录认证通过的日期、时间和IP等信息:
1 2 3 4 5
SELECT * FROM login_audit_messages(true); username | database | logintime | type | result | client_conninfo | session_id ------------+----------+------------------------+---------------+--------+--------------------+----------------------------------------- dbadmin | gaussdb | 2017-06-02 15:28:34+08 | login_success | ok | gsql@[local] | 1663745305.140192538154752.coordinator1 (1 row)
- 查看上一次登录认证失败的日期、时间和IP等信息:
1 2 3 4
SELECT * FROM login_audit_messages(false) ORDER BY logintime desc limit 1; username | database | logintime | type | result | client_conninfo | session_id ------------+----------+------------------------+--------------+--------+-------------------------+------------ (0 rows)
- 查看自从最后一次认证通过以来失败的尝试次数、日期和时间:
1 2 3 4
SELECT * FROM login_audit_messages(false); username | database | logintime | type | result | client_conninfo | session_id ------------+----------+------------------------+--------------+--------+-------------------------+------------ (0 rows)
login_audit_messages_pid(flag boolean)
描述:查看登录用户的登录信息。与login_audit_messages的区别在于结果基于当前backendid向前查找。所以不会因为同一用户的后续登录,而影响本次登录的查询结果。也就是查询不到该用户后续登录的信息。
返回值类型:元组
示例:
- 查看上一次登录认证通过的日期、时间和IP等信息:
1 2 3 4 5
SELECT * FROM login_audit_messages_pid(true); username | database | logintime | type | result | client_conninfo | backendid | session_id ------------+----------+------------------------+---------------+--------+--------------------+----------------------------------------- dbadmin | postgres | 2017-06-02 15:28:34+08 | login_success | ok | gsql@[local] | 140311900702464 | 1663745305.140192538154752.coordinator1 (1 row)
- 查看上一次登录认证失败的日期、时间和IP等信息:
1 2 3 4
SELECT * FROM login_audit_messages_pid(false) ORDER BY logintime desc limit 1; username | database | logintime | type | result | client_conninfo | backendid | session_id ------------+----------+------------------------+--------------+--------+-------------------------+------------ (0 rows)
- 查看自从最后一次认证通过以来失败的尝试次数、日期和时间:
1 2 3 4
SELECT * FROM login_audit_messages_pid(false); username | database | logintime | type | result | client_conninfo | backendid | session_id ------------+----------+------------------------+--------------+--------+-------------------------+------------ (0 rows)
pg_query_audit()
描述:查看当前CN节点审计日志。
返回值类型:record
函数返回字段如下:
名称 |
类型 |
描述 |
---|---|---|
begintime |
timestamp with time zone |
操作的执行开始时间。 |
endtime |
timestamp with time zone |
操作的执行结束时间。 |
operation_type |
text |
操作类型,具体类型见表2。 |
audit_type |
text |
审计类型,具体类型见表3。 |
result |
text |
操作结果。 |
username |
text |
执行操作的用户名。 |
database |
text |
数据库名称。 |
client_conninfo |
text |
客户端连接信息,即gsql,jdbc或odbc。 |
object_name |
text |
操作对象名称。 |
object_details |
text |
记录语句中涉及的列及其使用类型。 |
command_text |
text |
操作的执行命令。 |
detail_info |
text |
执行操作详细信息。 |
transaction_xid |
text |
事务ID。 |
query_id |
text |
查询ID。 |
node_name |
text |
节点名称。 |
session_id |
text |
会话ID。 |
local_port |
text |
本地端口。 |
remote_port |
text |
远端端口。 |
result_rows |
text |
语句执行返回的记录数。 |
error_code |
text |
语句执行错误时的错误码。 |
操作类型 |
描述 |
---|---|
audit_switch |
表示对用户打开和关闭审计日志操作场景进行审计。 |
login_logout |
表示对用户登录和登出操作场景进行审计。 |
system |
表示对系统的启停、实例切换操作场景进行审计。 |
sql_parse |
表示对SQL语句解析场景进行审计。 |
user_lock |
表示对用户锁定和解锁操作的场景进行审计。 |
grant_revoke |
表示对用户权限授予和回收操作场景进行审计。 |
violation |
表示对用户访问存在越权的场景进行审计。 |
ddl |
表示对DDL操作场景进行审计,因为DDL操作会根据操作对象进行更细粒度控制,仍然沿用审计开关audit_system_object,即由audit_system_object控制对哪些对象的DDL操作进行审计(此处不配置ddl,只要配置了audit_system_object,审计也会生效)。 |
dml |
表示对DML操作场景进行审计。 |
select |
表示对SELECT操作场景进行审计。 |
internal_event |
表示对内部事件操作场景进行审计。 |
user_func |
表示对用户自定义函数、存储过程、匿名块操作场景进行审计。
说明:
如果自定义函数、存储过程中有fetch语句,则审计fetch语句时,其中common_text字段记录的为其对应的CURSOR内容。 |
special_func |
表示对特殊函数调用操作场景进行审计,特殊函数包括:pg_terminate_backend和pg_cancel_backend。 |
copy |
表示对COPY操作场景进行审计。 |
set |
表示对SET操作场景进行审计。 |
transaction |
表示对事务操作场景进行审计。 |
vacuum |
表示对VACUUM操作场景进行审计。 |
analyze |
表示对ANALYZE操作场景进行审计。 |
cursor |
表示对游标操作的场景进行审计。 |
anonymous_block |
表示对匿名块操作场景进行审计。 |
explain |
表示对EXPLAIN操作场景进行审计。 |
show |
表示对SHOW操作场景进行审计。 |
lock_table |
表示对锁表操作场景进行审计。 |
comment |
表示对COMMENT操作场景进行审计。 |
preparestmt |
表示对PREPARE、EXECUTE、DEALLOCATE操作场景进行审计。 |
cluster |
表示对CLUSTER操作场景进行审计。 |
constraints |
表示对CONSTRAINTS操作场景进行审计。 |
checkpoint |
表示对CHECKPOINT操作场景进行审计。 |
barrier |
表示对BARRIER操作场景进行审计。 |
cleanconn |
表示对CLEAN CONNECTION操作场景进行审计。 |
seclabel |
表示对安全标签操作进行审计。 |
notify |
表示对通知操作进行审计。 |
load |
表示对加载操作进行审计。 |
discard |
表示对清理当前会话所有的全局临时表信息场景进行审计。 |
审计类型 |
描述 |
---|---|
audit_open/audit_close |
表示审计类型为打开和关闭审计日志操作。 |
user_login/user_logout |
表示审计类型为用户登录/退出成功的操作和用户。 |
system_start/system_stop/system_recover/system_switch |
表示审计类型为系统的启停、实例切换操作。 |
sql_wait/sql_parse |
表示审计类型为SQL语句解析。 |
lock_user/unlock_user |
表示审计类型为用户锁定和解锁成功的操作。 |
grant_role/revoke__role |
表示审计类型为用户权限授予和回收的操作。 |
user_violation |
表示审计类型为用户访问存在越权的操作。 |
ddl_数据库对象 |
表示审计类型为DDL操作,因为DDL操作由会根据操作对象进行更细粒度控制,仍然沿用审计开关audit_system_object,即由audit_system_object控制对哪些对象的DDL操作进行审计(此处不配置ddl,只要配置了audit_system_object,审计也会生效)。 例如:ddl_sequence表示审计类型为序列相关操作。 |
dml_action_insert/dml_action_delete/dml_action_update/dml_action_merge/dml_action_select |
表示审计类型为INSERT、DELETE、UPDATE、MERGE等DML操作。 |
internal_event |
表示审计类型为内部事件。 |
user_func |
表示审计类型为用户自定义函数、存储过程、匿名块操作。
说明:
如果自定义函数、存储过程中有fetch语句,则审计fetch语句时,其中common_text字段记录的为其对应的CURSOR内容。 |
special_func |
表示审计类型为特殊函数调用操作,特殊函数包括:pg_terminate_backend和pg_cancel_backend。 |
copy_to/copy_from |
表示审计类型为COPY相关操作。 |
set_parameter |
表示审计类型为SET操作。 |
trans_begin/trans_commit/trans_prepare/trans_rollback_to/trans_release/trans_savepoint/trans_commit_prepare/trans_rollback_prepare/trans_rollback |
表示审计类型为事务相关操作。 |
vacuum/vacuum_full/vacuum_merge |
表示审计类型为VACUUM相关操作。 |
analyze/analyze_verify |
表示审计类型为ANALYZE相关操作。 |
cursor_declare/cursor_move/cursor_fetch/cursor_close |
表示审计类型为游标相关操作。 |
codeblock_execute |
表示审计类型为匿名块。 |
explain |
表示审计类型为EXPLAIN操作。 |
show |
表示审计类型为SHOW操作。 |
lock_table |
表示审计类型为锁表操作。 |
comment |
表示审计类型为COMMENT操作。 |
prepare/execute/deallocate |
表示审计类型为PREPARE、EXECUTE或DEALLOCATE操作。 |
cluster |
表示审计类型为CLUSTER操作。 |
constraints |
表示审计类型为CONSTRAINTS操作。 |
checkpoint |
表示审计类型为CHECKPOINT操作。 |
barrier |
表示审计类型为BARRIER操作。 |
cleanconn |
表示审计类型为CLEAN CONNECTION操作。 |
seclabel |
表示审计类型为安全标签操作。 |
notify |
表示审计类型为通知操作。 |
load |
表示审计类型为加载操作。 |
discard |
表示审计类型为DISCARD操作。 |
pgxc_query_audit()
描述:查看所有CN节点审计日志。
返回值类型:record
函数返回字段同pg_query_audit函数。
pg_query_audit_details()
描述:查看审计日志并将审计日志中的object_name和object_details字段由json格式解析出来。该函数仅8.2.1.100及以上集群版本支持。
返回值类型:record
函数返回字段如下:
名称 |
类型 |
描述 |
---|---|---|
begintime |
timestamp with time zone |
操作的执行开始时间。 |
endtime |
timestamp with time zone |
操作的执行结束时间。 |
operation_type |
text |
操作类型,具体类型见表2。 |
audit_type |
text |
审计类型,具体类型见表3。 |
result |
text |
操作结果。 |
username |
text |
执行操作的用户名。 |
database |
text |
数据库名称。 |
client_conninfo |
text |
客户端连接信息,即gsql,jdbc或odbc。 |
transaction_xid |
text |
事务ID。 |
query_id |
text |
查询ID。 |
node_name |
text |
节点名称。 |
session_id |
text |
会话ID。 |
local_port |
text |
本地端口。 |
remote_port |
text |
远端端口。 |
object_name |
text |
表名、函数名、视图名。 |
column_name |
text |
列名。 |
type_of_use |
text |
对象的使用类型: 1:仅涉及(在实际使用中,此标志位暂不存在) 2:执行过程中访问(语句中出现的列以及在解析过程中访问到的列) 4:条件中发现(条件类型语句中,不包括条件表达式及函数) 8:inner join中发现 16:outer join中发现 32:聚合节点中发现(包括distinct、group by、聚集函数) 64:full join中发现 该列数值为叠加显示的数值。 |
use_type |
text |
type_of_use解析出的具体类型: 1:Reference only 2:Access 4:Conditional 8:Inner join 16:Outer join 32:Sum 64:Full join |
command_text |
text |
操作的执行命令。 |
示例:
- 查询审计语句中所有对象的列及其在语句中使用的类型:
1 2
SET audit_object_details = on; SELECT object_name,object_details,result_rows,error_code,command_text FROM pg_query_audit('2023-05-12-03 8:00:00','2023-05-12 22:55:00') where command_text like '%student%';
查询结果如下:
1 2 3 4 5 6
object_name | object_details | result_rows | error_code | command_text ------------------------------------------------------------------+------------------------------------------------------------------------------------------+-------------+------------+------------------------------------------------------------------------------------------------------------------------------------------------------- student | | 0 | | CREATE TABLE student(stuNo int, stuName TEXT); studentscore | | 0 | | CREATE TABLE studentscore(stuNo int, stuscore int); ["public.student_view01","public.studentscore","public.student"] | | 0 | | CREATE OR REPLACE VIEW student_view01 AS SELECT * FROM student t1 where t1.stuNo in (select stuNo from studentscore t2 where t1.stuNo = t2.stuNo); ["public.student_view01","public.student","public.studentscore"] | {"public.student":[{"stuno":"6"},{"stuname":"2"}],"public.studentscore":[{"stuno":"6"}]} | 0 | | SELECT * FROM student_view01
- 查询结果object_details中显示部分语句执行过程中,涉及到的列及其使用类型,使用json格式进行记录。
使用pg_query_audit_details函数对object_name和object_details列进行解析:
1
SELECT database,object_name,column_name,type_of_use,use_type FROM pg_query_audit_details('2021-02-03 8:00:00','2024-02-03 22:55:00','current') where command_text like '%student%';
查询结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
database | object_name | column_name | type_of_use | use_type ----------+-----------------------+-------------+-------------+-------------------- gaussdb | student | | 2 | Access gaussdb | | | 2 | Access gaussdb | studentscore | | 2 | Access gaussdb | | | 2 | Access gaussdb | public.student_view01 | | 2 | Access gaussdb | public.studentscore | | 2 | Access gaussdb | public.student | | 2 | Access gaussdb | | | 2 | Access gaussdb | public.student | stuno | 6 | Access,Conditional gaussdb | public.student | stuname | 2 | Access gaussdb | public.studentscore | stuno | 6 | Access,Conditional gaussdb | public.student_view01 | | 2 | Access gaussdb | public.student | | 2 | Access gaussdb | public.studentscore | | 2 | Access gaussdb | | | 2 | Access (15 rows)
pg_delete_audit()
描述:删除指定时间段的审计日志。8.1.3及以上集群版本中该函数已废弃。
返回值类型:void
基于数据库安全考虑,不提供删除指定时间段的审计日志的函数接口,调用该函数将直接报“ERROR: For security purposes, it is not allowed to manually delete audit logs”。
create_audit_csv_foregion_table()
描述:创建读审计日志的分区外表。用户调用该函数生成审计日志外表pgxc_audit_logs,通过读取pgxc_audit_logs可以读取放在obs上的审计日志信息。该函数仅8.2.1.300及以上集群支持。
入参:
- obs_server:text类型,obs server名称
- file_path:text类型,obs文件路径
返回值类型:record
示例:
--创建obs server CREATE SERVER obs_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( address 'obs.example.com:xxx', encrypt 'true', access_key 'xxxxxxxxx', secret_access_key 'xxxxxxxxxxxxxx', type 'obs' ); --调用该函数生成审计日志外表 SELECT * FROM pg_catalog.create_audit_csv_foregion_table('obs_server','/obs-audit/test/'); create_audit_csv_foregion_table --------------------------------- t (1 row) --读取放在obs上的审计日志信息 SELECT * FROM pgxc_audit_logs where year=2023 and month=7 and date=24; year | month | date | begintime | endtime | operation_type | audit_type | result | username | database | client_conninfo | object_name | object_details |command_text| detail_info | transaction_xid | query_id | node_name | session_id | local_port | remote_port | result_rows | error_code ------+-------+------+----------------------------+----------------------------+----------------+-------------------+--------+----------+----------+-----------------+--------------------------------+----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+-----------------+--------------------+-----------+------------------------------------+------------+-------------+-------------+------------ 2023 | 7 | 24 | 2023-07-24 09:56:40.727+08 | 2023-07-24 09:56:42.215+08 | dml | dml_action_select | ok | dbadmin | gaussdb | gsql@[local] | public.pgxc_audit_logs | | select * f rom pgxc_audit_logs where year=2023 and date=24 and month=7;