文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

设置数据库审计


审计概述

背景信息

数据库安全对数据库系统来说至关重要。MogDB将用户对数据库的所有操作写入审计日志。数据库安全管理员可以利用这些日志信息,重现导致数据库现状的一系列事件,找出非法操作的用户、时间和内容等。

关于审计功能,用户需要了解以下几点内容:

  • 审计总开关audit_enabled支持动态加载。在数据库运行期间修改该配置项的值会立即生效,无需重启数据库。默认值为on,表示开启审计功能。
  • 除了审计总开关,各个审计项也有对应的开关。只有开关开启,对应的审计功能才能生效。
  • 各审计项的开关支持动态加载。在数据库运行期间修改审计开关的值,不需要重启数据库便可生效。

目前,MogDB支持以下审计项如表1所示。

表 1 配置审计项

配置项 描述
用户登录、注销审计 参数: audit_login_logout
默认值为7,表示开启用户登录、退出的审计功能。设置为0表示关闭用户登录、退出的审计功能。不推荐设置除0和7之外的值。
数据库启动、停止、恢复和切换审计 参数: audit_database_process
默认值为1,表示开启数据库启动、停止、恢复和切换的审计功能。
用户锁定和解锁审计 参数: audit_user_locked
默认值为1,表示开启审计用户锁定和解锁功能。
用户访问越权审计 参数: audit_user_violation
默认值为0,表示关闭用户越权操作审计功能。
授权和回收权限审计 参数: audit_grant_revoke
默认值为1,表示开启审计用户权限授予和回收功能。
对用户操作进行全量审计 参数:full_audit_users
默认值为空字符串,表示采用默认配置,未配置全量审计用户。
不需要审计的客户端名称及IP地址 参数:no_audit_client
默认值为空字符串,表示采用默认配置,未将客户端及IP加入审计黑名单。
数据库对象的CREATE、ALTER、DROP操作审计 参数: audit_system_object
默认值为12295,表示只对DATABASE、SCHEMA、USER、DATA SOURCE这四类数据库对象的CREATE、ALTER、DROP操作进行审计。
具体表的INSERT、UPDATE和DELETE操作审计 参数: audit_dml_state
默认值为0,表示关闭具体表的DML操作(SELECT除外)审计功能。
SELECT操作审计 参数: audit_dml_state_select
默认值为0,表示关闭SELECT操作审计功能。
COPY审计 参数: audit_copy_exec
默认值为0,表示关闭copy操作审计功能。
存储过程和自定义函数的执行审计 参数: audit_function_exec
默认值为0,表示不记录存储过程和自定义函数的执行审计日志。
执行白名单内的系统函数审计 参数:audit_system_function_exec
默认值为0,表示不记录执行系统函数的审计日志。
SET审计 参数: audit_set_parameter
默认值为1,表示记录set操作审计日志
事务ID记录 参数:audit_xid_info
默认值为0,表示关闭审计日志记录事务ID功能

安全相关参数及说明请参见表2

表 2 安全相关参数及说明

参数名 说明
ssl 指定是否启用SSL连接。
require_ssl 指定服务器端是否强制要求SSL连接。
ssl_ciphers 指定SSL支持的加密算法列表。
ssl_cert_file 指定包含SSL服务器证书的文件的名称。
ssl_key_file 指定包含SSL私钥的文件名称。
ssl_ca_file 指定包含CA信息的文件的名称。
ssl_crl_file 指定包含CRL信息的文件的名称。
password_policy 指定是否进行密码复杂度检查。
password_reuse_time 指定是否对新密码进行可重用天数检查。
password_reuse_max 指定是否对新密码进行可重用次数检查。
password_lock_time 指定帐户被锁定后自动解锁的时间。
failed_login_attempts 如果输入密码错误的次数达到此参数值时,当前帐户被锁定。
password_encryption_type 指定采用何种加密方式对用户密码进行加密存储。
password_min_uppercase 密码中至少需要包含大写字母的个数。
password_min_lowercase 密码中至少需要包含小写字母的个数。
password_min_digital 密码中至少需要包含数字的个数。
password_min_special 密码中至少需要包含特殊字符的个数。
password_min_length 密码的最小长度。说明:在设置此参数时,请将其设置成不大于password_max_length,否则进行涉及密码的操作会一直出现密码长度错误的提示
password_max_length 密码的最大长度。说明:在设置此参数时,请将其设置成不小于password_min_length,否则进行涉及密码的操作会一直出现密码长度错误的提示。
password_effect_time 密码的有效期限。
password_notify_time 密码到期提醒的天数。
audit_enabled 控制审计进程的开启和关闭。
audit_directory 审计文件的存储目录。
audit_data_format 审计日志文件的格式,当前仅支持二进制格式(binary)。
audit_rotation_interval 指定创建一个新审计日志文件的时间间隔。当现在的时间减去上次创建一个审计日志的时间超过了此参数值时,服务器将生成一个新的审计日志文件。
audit_rotation_size 指定审计日志文件的最大容量。当审计日志消息的总量超过此参数值时,服务器将生成一个新的审计日志文件。
audit_resource_policy 控制审计日志的保存策略,以空间还是时间限制为优先策略,on表示以空间为优先策略。
audit_file_remain_time 表示需记录审计日志的最短时间要求,该参数在audit_resource_policy为off时生效。
audit_space_limit 审计文件占用磁盘空间的最大值。
audit_file_remain_threshold 审计目录下审计文件的最大数量。
audit_login_logout 指定是否审计数据库用户的登录(包括登录成功和登录失败)、注销。
audit_database_process 指定是否审计数据库启动、停止、切换和恢复的操作。
audit_user_locked 指定是否审计数据库用户的锁定和解锁。
audit_user_violation 指定是否审计数据库用户的越权访问操作。
audit_grant_revoke 指定是否审计数据库用户权限授予和回收的操作。
full_audit_users 指定全量审计用户列表,对列表中的用户执行的所有可被审计的操作记录审计日志。
no_audit_client 指定不需要审计的客户端名称及IP地址列表。
audit_system_object 指定是否审计数据库对象的CREATE、DROP、ALTER操作。
audit_dml_state 指定是否审计具体表的INSERT、UPDATE、DELETE操作。
audit_dml_state_select 指定是否审计SELECT操作。
audit_copy_exec 指定是否审计COPY操作。
audit_function_exec 指定在执行存储过程、匿名块或自定义函数(不包括系统自带函数)时是否记录审计信息。
audit_system_function_exec 指定是否开启对执行白名单内的系统函数记录审计日志。
audit_set_parameter 指定是否审计SET操作。
enableSeparationOfDuty 指定是否开启三权分立。
session_timeout 建立连接会话后,如果超过此参数的设置时间,则会自动断开连接。
auth_iteration_count 认证加密信息生成过程中使用的迭代次数。

操作步骤

  1. 以操作系统用户omm登录数据库主节点。

  2. 使用如下命令连接数据库。

    gsql -d mogdb -p 8000

    mogdb为需要连接的数据库名称,8000为数据库主节点的端口号。请根据实际情况替换。

  3. 检查审计总开关状态。

    a. 用show命令显示审计总开关audit_enabled的值。

    MogDB=# SHOW audit_enabled;

    如果显示为off,执行‘\q’命令退出数据库,继续执行后续步骤。如果显示为on,则无需执行后续步骤。

    b. 执行如下命令开启审计功能,参数设置立即生效。

    gs_guc set -N all -I all -c "audit_enabled=on"
  4. 配置具体的审计项。

    img 说明:

    • 只有开启审计功能,用户的操作才会被记录到审计文件中。
    • 各审计项的默认参数都符合安全标准,用户可以根据需要开启其他审计功能,但会对性能有一定影响。

    以开启对数据库所有对象的增删改操作的审计开关为例,其他配置项的修改方法与此相同,修改配置项的方法如下所示:

    gs_guc reload -N all -I all -c "audit_system_object=12295"

    其中audit_system_object代表审计项开关,12295为该审计开关的值。


查看审计结果

前提条件

  • 审计功能总开关已开启。
  • 需要审计的审计项开关已开启。
  • 数据库正常运行,并且对数据库执行了一系列增、删、改、查操作,保证在查询时段内有审计结果产生。
  • 数据库各个节点审计日志单独记录。

背景信息

  • 只有拥有AUDITADMIN属性的用户才可以查看审计记录。有关数据库用户及创建用户的办法请参见用户

  • 审计查询命令是数据库提供的sql函数pg_query_audit,其原型为:

    pg_query_audit(timestamptz startime,timestamptz endtime,audit_log)

    参数startime和endtime分别表示审计记录的开始时间和结束时间,audit_log表示所查看的审计日志信息所在的物理文件路径,当不指定audit_log时,默认查看连接当前实例的审计日志信息。

    img 说明: startime和endtime的差值代表要查询的时间段,其有效值为从startime日期中的00:00:00开始到endtime日期中的23:59:59之间的任何值。请正确指定这两个参数,否则将查不到需要的审计信息。

操作步骤

  1. 以操作系统用户omm登录数据库主节点。

  2. 使用如下命令连接数据库。

    gsql -d mogdb -p 8000

    mogdb为需要连接的数据库名称,8000为数据库主节点的端口号。

  3. 查询审计记录。

    MogDB=# select * from pg_query_audit('2021-03-04 08:00:00','2021-03-04 17:00:00');

    查询结果如下:

    time          |      type      | result | userid | username  | database  |     client_conninfo     |    object_name    |  detail_info |     node_name     |            thread_id            | local_port | remote_port
    ------------------------+----------------+--------+--------+-----------+-----------+-------------------------+-------------------+--------------+-------------------+---------------------------------+------------+-------------
    2021-03-04 08:00:08+08 | login_success  | ok     | 10     | omm  | mogdb | gsql@::1 | mogdb    | login db(postgres) success,SSL=Off | dn_6001_6002_6003 | 140477687527168@668131208211425 |   17778      | 46946

    该条记录表明,用户omm在time字段标识的时间点登录数据库mogdb。其中client_conninfo字段在log_hostname启动且IP连接时,字符@后显示反向DNS查找得到的主机名。

    说明:

    对于登录操作的记录,审计日志detail_info结尾会记录SSL信息,SSL=on表示客户端通过SSL连接,SSL=off表示客户端没有通过SSL连接。


维护审计日志

前提条件

用户必须拥有审计权限。

背景信息

  • 与审计日志相关的配置参数及其含义请参见表1

    表 1 审计日志相关配置参数

    配置项 含义 默认值
    audit_directory 审计文件的存储目录。 /var/log/mogdb/用户名/pg_audit
    audit_resource_policy 审计日志的保存策略。 on(表示使用空间配置策略)
    audit_space_limit 审计文件占用的磁盘空间总量。 1GB
    audit_file_remain_time 审计日志文件的最小保存时间。 90
    audit_file_remain_threshold 审计目录下审计文件的最大数量。 1048576

    img 说明:

    如果使用gs_om工具部署MogDB,则审计日志路径为 "/var/log/mogdb/用户名/pg_audit"。

  • 审计日志删除命令为数据库提供的sql函数pg_delete_audit,其原型为:

    pg_delete_audit(timestamp startime,timestamp endtime)

    其中参数startime和endtime分别表示审计记录的开始时间和结束时间。

  • 目前常用的记录审计内容的方式有两种: 记录到数据库的表中、记录到OS文件中。这两种方式的优缺点比较如表2所示。

    表 2 审计日志保存方式比较

    方式 优点 缺点
    记录到表中 不需要用户维护审计日志。 由于表是数据库的对象,如果一个数据库用户具有一定的权限,就能够访问到审计表。如果该用户非法操作审计表,审计记录的准确性难以得到保证。
    记录到OS文件中 比较安全,即使一个帐户可以访问数据库,但不一定有访问OS这个文件的权限。 需要用户维护审计日志。

    从数据库安全角度出发,MogDB采用记录到OS文件的方式来保存审计结果,保证了审计结果的可靠性。

操作步骤

  1. 以操作系统用户omm登录数据库主节点。

  2. 使用如下命令连接数据库。

    gsql -d mogdb -p 8000

    mogdb为需要连接的数据库名称,8000为数据库主节点的端口号。

  3. 选择日志维护方式进行维护。

    • 设置自动删除审计日志

      审计文件占用的磁盘空间或者审计文件的个数超过指定的最大值时,系统将删除最早的审计文件,并记录审计文件删除信息到审计日志中。

      img 说明: 审计文件占用的磁盘空间大小默认值为1024MB,用户可以根据磁盘空间大小重新设置参数。

      配置审计文件占用磁盘空间的大小(audit_space_limit)

      a. 查看已配置的参数。

      MogDB=# SHOW audit_space_limit;
      audit_space_limit
      -------------------
      1GB
      (1 row)

      如果显示结果不为1GB(1024MB),执行“\q”命令退出数据库。

      b. 建议执行如下命令设置成默认值1024MB。

      gs_guc reload -N all -I all -c "audit_space_limit=1024MB"

      配置审计文件个数的最大值(audit_file_remain_threshold)

      a. 查看已配置的参数。

      MogDB=# SHOW audit_file_remain_threshold;
      audit_file_remain_threshold
      -----------------------------
      1048576
      (1 row)

      如果显示结果不为1048576,执行“\q”命令退出数据库。

      b. 建议执行如下命令设置成默认值1048576。

      gs_guc reload -N all -I all -c "audit_file_remain_threshold=1048576"
    • 手动备份审计文件

      当审计文件占用的磁盘空间或者审计文件的个数超过配置文件指定的值时,系统将会自动删除较早的审计文件,因此建议用户周期性地对比较重要的审计日志进行保存。

      a. 使用show命令获得审计文件所在目录(audit_directory)。

      MogDB=# SHOW audit_directory;

      b. 将审计目录整个拷贝出来进行保存。

    • 手动删除审计日志

      当不再需要某时段的审计记录时,可以使用审计接口命令pg_delete_audit进行手动删除。

      以删除2012/9/20到2012/9/21之间的审计记录为例:

      SELECT pg_delete_audit('2012-09-20 00:00:00','2012-09-21 23:59:59');

设置统一审计策略

背景信息

传统审计会产生大量的审计日志,且不支持定制化的访问对象和访问来源配置,不方便数据库安全管理员对审计日志的分析。而统一审计策略支持绑定资源标签、配置数据来源输出审计日志,可以提升安全管理员对数据库监控的效率。

操作步骤

  1. 执行以下命令开启统一审计开关。

    gs_guc reload -Z coordinator -N all -I all -c "enable_security_policy=on"
  2. 操作系统root用户进行rsyslog配置。

    在操作系统后台服务配置文件/etc/rsyslog.conf中添加:

    local0.* /var/log/localmessages  

    重启rsyslog服务使配置生效。

    sudo systemctl restart rsyslog
  3. 安全策略管理员登录数据库,配置资源标签,对于安全策略管理员的相关操作参考管理员章节,审计策略参数参考SQL语法描述。

    -- 初始化资源
    DROP TABLE IF EXISTS table_security_auditing;
    CREATE TABLE table_security_auditing(id int,name char(10));
    create user user001 password '********';
    create user user002 password '********';
    grant all privileges to user001;
    
    -- 新建资源标签
    DROP RESOURCE LABEL IF EXISTS rl_security_auditing;
    CREATE RESOURCE LABEL rl_security_auditing ADD TABLE(table_security_auditing);
    
    -- 创建审计策略,审计用户user001在资源标签rl_security_auditing上的DDL、DML操作
    CREATE AUDIT POLICY audit_security_priall PRIVILEGES all on LABEL(rl_security_auditing) FILTER ON ROLES(user001);
    CREATE AUDIT POLICY audit_security_accall ACCESS all on LABEL(rl_security_auditing) FILTER ON ROLES(user001);
  4. 使用用户user001登录数据库,执行如下操作, 触发审计策略。

    -- DML
    insert into table_security_auditing values(1,'22');
    update table_security_auditing set name=234123 where id=1;
    delete from table_security_auditing where id=1;
    truncate table table_security_auditing;
    -- DDL
    GRANT INSERT ON TABLE table_security_auditing TO user002;
    revoke insert on table table_security_auditing from user002;
  5. 使用操作系统root用户查看审计日志/var/log/localmessage。

    Oct  9 15:38:11 localhost PGAUDIT: AUDIT EVENT: user name: [user001], app_name: [gsql], client_ip: [local], access type: [INSERT], policy id: [16423], table: [public.table_security_auditi           ng], result: [OK]
    Oct  9 15:38:11 localhost PGAUDIT: AUDIT EVENT: user name: [user001], app_name: [gsql], client_ip: [local], access type: [UPDATE], policy id: [16423], table: [public.table_security_auditi           ng], result: [OK]
    Oct  9 15:38:11 localhost PGAUDIT: AUDIT EVENT: user name: [user001], app_name: [gsql], client_ip: [local], access type: [DELETE], policy id: [16423], table: [public.table_security_auditi           ng], result: [OK]
    Oct  9 15:38:12 localhost PGAUDIT: AUDIT EVENT: user name: [user001], app_name: [gsql], client_ip: [local], access type: [TRUNCATE], policy id: [16423], table: [public.table_security_audi           ting], result: [OK]
    Oct  9 15:49:41 localhost PGAUDIT: AUDIT EVENT: user name: [user001], app_name: [gsql], client_ip: [local], privilege type: [GRANT ON TABLE postgres.public.table_security_auditing TO user002], poy id: [16408], result: [OK]
    Oct  9 15:49:53 localhost PGAUDIT: AUDIT EVENT: user name: [user001], app_name: [gsql], client_ip: [local], privilege type: [REVOKE ON TABLE postgres.public.table_security_auditing FROM user002],licy id: [16408], result: [OK]
  6. 如不需要继续对特定资源进行审计,可移除审计策略。

    drop audit policy audit_security_priall;  
    drop audit policy audit_security_accall; 

统一审计日志字段说明

Oct  9 15:38:12 localhost PGAUDIT: AUDIT EVENT: user name: [user001], app_name: [gsql], client_ip: [local], access type: [TRUNCATE], policy id: [16423], table: [public.table_security_auditing], result: [OK]

以如上TRUNCATE操作触发的审计日志为例,字段说明如下:

|时间戳|主机名|事件类型|用户名|触发客户端|客户端IP|操作类型|策略ID|列名称|执行结果|

img 注意: 在使用DATABASE LINK功能的场景下,客户端发起的DATABASE LINK请求,实际的发送方是服务端,发送端ip地址等相关的属性将是服务端的值。


设置文件权限安全策略

背景信息

数据库在安装过程中,会自动对其文件权限(包括运行过程中生成的文件,如日志文件等)进行设置。其权限规则如下:

  • 数据库程序目录的权限为0750。

  • 数据库数据文件目录的权限为0700。

    MogDB部署时通过创建xml配置文件中的tmpMppdbPath参数指定目录(若未指定,则默认创建/tmp/$USER_mppdb目录)来存放".s.PGSQL.*"文件,该目录和文件权限设置为0700。

  • 数据库的数据文件、审计日志和其他数据库程序生成的数据文件的权限为0600,运行日志的权限默认不高于0640。

  • 普通操作系统用户不允许修改和删除数据库文件和日志文件。

数据库程序目录及文件权限

数据库安装后,部分程序目录及文件权限如表1所示。

表 1 文件及目录权限

文件/目录 父目录 权限
bin - 0700
lib - 0700
share - 0700
data(数据库节点/数据库主节点) - 0700
base 实例数据目录 0700
global 实例数据目录 0700
pg_audit 实例数据目录(可配置) 0700
pg_log 实例数据目录(可配置) 0700
pg_xlog 实例数据目录 0700
postgresql.conf 实例数据目录 0600
pg_hba.conf 实例数据目录 0600
postmaster.opts 实例数据目录 0600
pg_ident.conf 实例数据目录 0600
gs_initdb bin 0700
gs_dump bin 0700
gs_ctl bin 0700
gs_guc bin 0700
gsql bin 0700
archive_status pg_xlog 0700
libpq.so.5.5 lib 0600

建议

数据库在安装过程中,会自动对其文件权限(包括运行过程中生成的文件,如日志文件等)进行设置,适合大多数情况下的权限要求。如果用户产品对相关权限有特殊要求,建议用户安装后定期检查相关权限设置,确保完全符合产品要求。

Copyright © 2011-2024 www.enmotech.com All rights reserved.