更新时间:2024-09-02 GMT+08:00

安全函数

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    | gaussdbgaussdb | 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

函数返回字段如下:

表1 pg_query_audit()函数返回字段

名称

类型

描述

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

语句执行错误时的错误码。

表2 operation_type操作类型项

操作类型

描述

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

表示对清理当前会话所有的全局临时表信息场景进行审计。

表3 audit_type审计类型项

审计类型

描述

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

函数返回字段如下:

表4 pg_query_audit()函数返回字段

名称

类型

描述

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. 查询审计语句中所有对象的列及其在语句中使用的类型:
    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
    
  2. 查询结果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;