审计

审计

Greenplum数据库有能力审计很多事件,包括系统的启动和关闭、Segment数据库失效、导致错误的SQL语句以及所有的连接尝试和断开连接。Greenplum数据库还记录SQL语句和关于SQL语句的信息,并且可以以多种方式配置来记录不同细节的审计信息。log_error_verbosity配置参数控制写入到服务器日志中的每一条消息的细节多少。类似地,log_min_error_statement参数允许管理员配置为SQL语句记录的细节层次,而log_statement参数确定要被审计的SQL语句的种类。当可审计事件由Greenplum数据库外部的主体发起时,Greenplum数据库会为所有可审计事件记录用户名。

Greenplum数据库通过只允许具有适当角色的管理员在日志文件上执行操作来防止对审计记录的未授权修改和删除。日志以一种使用逗号分隔值(CSV)的专有格式存储。每个Segment和Master都存储有自己的日志文件,不过这些都可以由管理员从远程访问。Greenplum数据库还通过log_truncate_on_rotation参数授权对旧日志文件的覆盖。这是一个本地参数并且必须在每个Segment和Master的配置文件中设置。

Greenplum提供了一个名为gp_toolkit的管理方案,用户可以用它来查询日志文件、系统目录和操作环境得到系统状态信息。包括用法在内的更多信息,请参考Greenplum数据库参考指南中的gp_tookit管理方案附录。

查看数据库服务器的日志文件

Greenplum数据库中的每一个数据库实例(Master和Segment)都是一个运行着的PostgreSQL数据库服务器,它们都有自己的服务器日志文件。每天的日志文件被创建在Master和每个Segment的数据目录下的pg_log目录中。

服务器日志文件被写为逗号分隔值(CSV)格式。不是所有的日志项在所有的日志域中都有值。例如,只有与查询工作者进程相关的日志项才会有slice_id值。一个特定查询的相关日志项可以通过其会话标识符(gp_session_id)和命令标识符(gp_command_count)确定。

#

域名

数据类型

描述

1

event_time

timestamp with time zone

日志项被写到日志中的时间

2

user_name

varchar(100)

数据库用户名

3

database_name

varchar(100)

数据库名

4

process_id

varchar(10)

系统进程ID(带前缀“p”)

5

thread_id

varchar(50)

线程计数(带前缀“th”)

6

remote_host

varchar(100)

在Master上,是客户端机器的主机名/地址。在Segment上,是Master的主机名/地址。

7

remote_port

varchar(10)

Segment或Master的端口号

8

session_start_time

timestamp with time zone

会话连接打开的时间

9

transaction_id

int

Master上的顶层事务ID。这个ID是任何子事务的父亲。

10

gp_session_id

text

会话标识符号(带前缀“con”)

11

gp_command_count

text

会话内部的命令编号(带前缀“cmd”)

12

gp_segment

text

Segment内容标识符(对主Segment带前缀“seg”,镜像Segment带前缀“mir”)。Master的内容id总是-1。

13

slice_id

text

切片id(查询计划被执行的部分)

14

distr_tranx_id

text

分布式事务ID

15

local_tranx_id

text

本地事务ID

16

sub_tranx_id

text

子事务ID

17

event_severity

varchar(10)

值包括:LOG、ERROR、FATAL、PANIC、DEBUG1、DEBUG2

18

sql_state_code

varchar(10)

与日志消息相关的SQL状态代码

19

event_message

text

日志或者错误消息文本

20

event_detail

text

与错误或者警告消息相关的详细消息文本

21

event_hint

text

与错误或者警告消息相关的提示消息文本

22

internal_query

text

内部产生的查询文本

23

internal_query_pos

int

指向内部产生的查询文本中的光标

24

event_context

text

产生消息的上下文

25

debug_query_string

text

带有完整细节的用户提供的查询字符串,用于调试。这个字符串可能会由于内部使用而修改。

26

error_cursor_pos

int

指向查询字符串中的光标

27

func_name

text

产生这个消息的函数

28

file_name

text

产生消息的内部代码文件

29

file_line

int

产生消息的内部代码文件的行号

30

stack_trace

text

与这个消息相关的栈跟踪文本

Greenplum提供一个名为gplogfilter的工具,它能被用来在一个Greenplum数据库日志文件中搜索匹配指定条件的项。这个工具默认会搜索位于默认日志位置的Greenplum的Master日志文件。例如,要显示Master日志文件的最后三行:
$ gplogfilter -n 3
用户还可以通过gpssh工具运行gplogfilter来立刻搜索所有的Segment日志文件。例如,要显示每个Segment日志文件的最后三行:
$ gpssh -f seg_host_file
  => source /usr/local/greenplum-db/greenplum_path.sh
  => gplogfilter -n 3 /gpdata/gp*/pg_log/gpdb*.csv

下面是Greenplum与安全相关的审计(或者日志)服务器配置参数,它们可以在postgresql.conf配置文件中设置:

域名

值范围

默认

描述

log_connections

Boolean

off

这会对服务器日志输出一行详细描述每个成功的连接。某些客户端程序(如psql)在决定是否要求口令时会尝试连接两次,因此重复的“connection received”消息并非总是表示问题。

log_disconnections

Boolean

off

在一个客户端会话终止时,这会在服务器日志中输出一行,其中会包括该会话的持续时间。

log_statement

NONE

DDL

MOD

ALL

ALL

控制那些SQL语句会被记录。DDL记录所有数据定义命令,如CREATE、ALTER和DROP命令。MOD记录所有DDL语句外加INSERT、UPDATE、DELETE、TRUNCATE以及COPY FROM。如果PREPARE和EXPLAIN ANALYZE语句中如果包含有适当类型的命令,它们也会被日志记录。

log_hostname

Boolean

off

连接日志消息默认只显示连接主机的IP地址。把这个选项打开会导致主机名也被记录。注意这依赖于用户的主机名解析设置,而且这有可能会带来不可忽视的性能损失。

log_duration

Boolean

off

致使每一个满足log_statement的完成语句的持续时间被记录。

log_error_verbosity

TERSE

DEFAULT

VERBOSE

DEFAULT

为被记录的每条消息控制写入到服务器日志的细节多少。

log_min_duration_statement

毫秒数, 0, -1

-1

如果语句的持续时间大于等于指定的毫秒数,则在一个日志行中记录该语句和它的持续时间。将这个参数设置为0将打印出所有的语句及其持续时间。-1禁用这一特性。例如,如果用户将它设置为250,那么所有运行时间大于等于250ms的SQL语句将被记录。在跟踪应用中的未优化查询时,启用这一选项非常有用。

log_min_messages

DEBUG5

DEBUG4

DEBUG3

DEBUG2

DEBUG1

INFO

NOTICE

WARNING

ERROR

LOG

FATAL

PANIC

NOTICE

控制哪些消息级别会被写入到服务器日志。每个级别包括其后的所有级别。级别越靠后,发送到日志的消息就越少。

log_rotation_age

任意有效的时间表达式(数字和单位)

1d

决定个体日志文件的最大生存时间。在这个时间过去之后,一个新的日志文件将被创建。设置为零可禁用新日志文件基于时间创建。

log_statement_stats

Boolean

off

对每个查询,写入查询解析器、规划器和执行器的整体性能统计信息到服务器日志中。这是一种粗糙的画像手段。

log_truncate_on_rotation

Boolean

off

截断(重写)而不是追加到任何现存的同名日志文件。仅当一个新文件由于基于时间的轮转而被打开时,截断才会发生。例如,使用这个设置配合gpseg#-%H.log这样的log_filename会导致产生24个每小时的日志文件,然后循环地重写它们。关闭这一设置时,预先已经存在的文件在所有的情况下都会被追加内容。