审计
描述被记录并且应该被监控以检测安全性威胁的Greenplum数据库事件。
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 | number of milliseconds, 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_size | 0 - INT_MAX/1024 kilobytes | 1048576 | 大于0时,将这个千字节数写入日志后,将创建一个新的日志文件。设置为零可禁用基于大小的新日志文件的创建。 |
log_rotation_age | Any valid time expression (number and unit) | 1d | 决定个体日志文件的最大生存时间。在这个时间过去之后,一个新的日志文件将被创建。设置为零可禁用新日志文件基于时间创建。 |
log_statement_stats | Boolean | off | 对每个查询,写入查询解析器、规划器和执行器的整体性能统计信息到服务器日志中。这是一种粗糙的画像手段。 |
log_truncate_on_rotation | Boolean | off | 截断(重写)而不是追加到任何现存的同名日志文件。仅当一个新文件由于基于时间的轮转而被打开时,截断才会发生。例如,使用这个设置配合gpseg#-%H.log这样的log_filename会导致产生24个每小时的日志文件,然后循环地重写它们。关闭这一设置时,预先已经存在的文件在所有的情况下都会被追加内容。 |
Parent topic: 安全性配置指南