等保2.0测评 — PostgreSQL 数据库(下)

admin 2024年2月15日15:39:57评论16 views字数 10862阅读36分12秒阅读模式

知识宝库在此藏,一键关注获宝藏

续上文。。。

三、安全审计

a)  应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计

PostgreSQL有3种日志:

● pg_log(数据库运行日志)    

内容可读    默认关闭的,需要设置参数启动

● pg_xlog(WAL 日志,即重做日志)     

内容一般不具有可读性        强制开启

● pg_clog(事务提交日志,记录的是事务的元数据)   

内容一般不具有可读性    强制开启

1.  开启数据库运行日志(pg_log)收集

show logging_collector;       --是否开启日志收集,默认off
等保2.0测评 — PostgreSQL 数据库(下)

2.  其他一些日志配置

show log_destionation;  --日志记录类型,默认是stderr,只记录错误输出
等保2.0测评 — PostgreSQL 数据库(下)
show log_directory;    --日志路径,默认是$PGDATA/pg_log
等保2.0测评 — PostgreSQL 数据库(下)
show log_filename;  --日志名称,默认是postgresql-%Y-%m-%d_%H%M%S.log
等保2.0测评 — PostgreSQL 数据库(下)
show log_connections;  --用户session登录时是否写入日志,默认off
等保2.0测评 — PostgreSQL 数据库(下)
show log_disconnections; --用户session退出时是否写入日志,默认off
等保2.0测评 — PostgreSQL 数据库(下)
show log_statement; --记录用户登录数据库后的各种操作
等保2.0测评 — PostgreSQL 数据库(下)
log_statement 参数值:
none,不记录
ddl,记录create,drop,和alter
mod,记录ddl+insert,delete,update和truncate
all,mod+select

● 扩展

1. pg_log

作用:这个日志一般是记录服务器与DB的状态,比如各种Error信息,定位慢查询SQL,数据库的启动关闭信息,发生checkpoint过于频繁等的告警信息,诸如此类。该日志有.csv格式和.log。建议使用.csv格式,因为它一般会按大小和时间自动切割,毕竟查看一个巨大的日志文件比查看不同时间段的多个日志要难得多。pg_log是可以被清理删除,压缩打包或者转移,同时并不影响DB的正常运行。当我们有遇到DB无法启动或者更改参数没有生效时,第一个想到的就是查看这个日志。
1.1日志配置文件
$PGDATA/postgresql.conf 文件:
等保2.0测评 — PostgreSQL 数据库(下)
等保2.0测评 — PostgreSQL 数据库(下)
1.2 涉及的参数
涉及的参数有:
logging_collector      --是否开启日志收集开关,默认off,开启要重启DB
log_destination    --日志记录类型,默认是stderr,只记录错误输出
log_directory      --日志路径,默认是$PGDATA/pg_log, 这个目录最好不要和数据文件的目录放在一起, 目录需要给启动postgres的操作系统用户写权限.
log_filename       --日志名称,默认是postgresql-%Y-%m-%d_%H%M%S.log
log_file_mode   --日志文件类型,默认为0600
log_truncate_on_rotation  --默认为off,设置为on的话,如果新建了一个同名的日志文件,则会清空原来的文件,再写入日志,而不是在后面附加。
log_rotation_age   --保留单个文件的最大时长,默认是1d,也有1h,1min,1s,个人觉得不实用
log_rotation_size  --保留单个文件的最大尺寸,默认是10MB
log_error_verbosity  --默认为default,verbose表示冗长的
log_connections    --用户session登陆时是否写入日志,默认off
log_disconnections --用户session退出时是否写入日志,默认off
1)  Where to Log
log_destination = 'stderr'   # Valid values are combinations of
                                         # stderr, csvlog, syslog, and eventlog,
                                          # depending on platform.  csvlog
                                         # requires logging_collector to be on.
# This is used when logging to stderr:
logging_collector = on                   # Enable capturing of stderr and csvlog
                                         # into log files. Required to be on for
                                         # csvlogs.
                                          # (change requires restart)
# These are only used if logging_collector is on:
log_directory (string)
这个参数只能在postgresql.conf 文件中被设置。它决定存放数据库运行日志文件的目录。默认值是pg_log。可以是绝对路径,也可是相对路径(相对于数据库文件所在的路径)。
log_filename (string)
它决定数据库运行日志文件的名称。默认值是postgresql-%Y-%m-%d_%H%M%S.log。它的值可以包含%Y、%m、%d、%H、%M和%S这样的字符串,分别表示年、月、日、小时、分和秒。 如果参数的值中没有指定时间信息(没有出现%Y、%m、%d、%H、%M和%S中的任何一个),系统会自动在log_filename值的末尾加上文件创建的时间作为文件名,例如,如果log_filename的值是 server_log,那么在Sun Aug 29 19:02:33 2004 MST被创建的日志文件的名称将是server_log.1093827753,1093827753是Sun Aug 29 19:02:33 2004 MST在数据库内部的表示形式。这个参数只能在postgresql.conf文件中被设置。
log_rotation_age (integer)
它决定何时创建一个新的数据库日志文件。单位是分钟。默认值是0。如果现在的时间减去上次创建一个数据库运行日志的时间超过了log_rotation_age的值,数据库将自动创建一个新的运行日志文件。如果它的值是0,该参数将不起任何作用。这个参数只能在postgresql.conf文件中被设置。
log_rotation_size (integer)
这个参数只能在postgresql.conf文件中被设置。它决定何时创建一个新的数据库日志文件。单位是KB。默认值是10240。如果一个日志文件写入的数据量超过log_rotation_size的值,数据库将创建一个新的日志文件。如果它的值被设为0,该参数将不起任何作用。
log_truncate_on_rotation (boolean)
系统在创建一个新的数据库运行日志文件时,如果发现存在一个同名的文件,当log_truncate_on_rotation的值是on时,系统覆盖这个同名文件。当log_truncate_on_rotation的值是off时,系统将重用这个同名文件,在它的末尾添加新的日志信息。另外要注意的是,只有在因为参数log_rotation_age起作用系统才创建新的日志文件的情况下,才会覆盖同名的日志文件。因为数据库重新启动或者因为参数log_rotation_size起作用而创建新的日志文件,不会覆盖同名的日志文件,而是在同名的日志文件末尾添加新的日志信息。这个参数只能在postgresql.conf文件中被设置。默认值是off。
例如,将这个参数设为on,将log_rotation_age设为60,将同时将log_filename设为postgresql-%H.log,系统中一共将只有24个日志文件,它们会被不断地重用,任何时刻,系统中最多只有最近24小时的日志信息。
# These are relevant when logging to syslog:
#syslog_facility = 'LOCAL0'
#syslog_ident = 'postgres'
# This is only relevant when logging to eventlog (win32):
#event_source = 'PostgreSQL
2)  When to Log
client_min_messages (string)
控制发送给客户端的消息级别。合法的取值是DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、LOG、NOTICE、WARNING、ERROR、FATAL和PANIC,每个级别都包含排在它后面的所有级别中的信息。级别越低,发送给客户端的消息就越少。 默认值是NOTICE。这个参数可以在任何时候被设置。
log_min_messages (string)
控制写到数据库日志文件中的消息的级别。合法的取值是DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、 LOG、FATAL和PANIC,每个级别都包含排在它后面的所有级别中的信息。级别越低,数据库运行日志中记录的消息就越少。默认值是NOTICE。只有超级用户才能修改这个参数。只有超级用户才能设置这个参数。
log_error_verbosity (string)
控制每条日志信息的详细程度。合法的取值是TERSE、DEFAULT和VERBOSE(每个取值都比它前面的取值提供更详细的信息)。只有超级用户才能修改这个参数。默认值是DEFAULT。
log_min_error_statement (string)
控制日志中是否记录导致数据库出现错误的SQL语句。合法的取值是DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、 LOG、FATAL和PANIC,每个级别都包含排在它后面的所有级别。默认值是ERROR。只有超级用户才能修改这个参数。

消息严重级别

严重级别

DEBUG1..DEBUG5

报告详细的调试信息。

INFO

报告用户可能需要的信息。

NOTICE

报告对用户有用的信息。

WARNING

报告警告信息。

ERROR

报告错误信息。

LOG

报告对数据库管理员有用的信息, 例如,检查点操作统计信息。

FATAL

报告导致当前会话被终止的错误信息。

PANIC

报告导致整个数据库被关闭的错误信息。

3)  What to Log
debug_print_parse (boolean)
debug_print_rewritten (boolean)
debug_print_plan (boolean)
debug_pretty_print (boolean)
这些参数控制数据库是否输出运行时的调试信息。这些参数的默认值是off。这些参数可以被任何用户设置。
log_checkpoints (boolean)
控制是否及记录检查点操作信息。默认值是off。这个参数只能在postgresql.conf文件中被设置。必须重启数据库才能生效。
log_connections (boolean)
控制是否及记录客户端连接请求信息。默认值是off。这个参数只能在postgresql.conf文件中被设置。必须重启数据库才能生效。
log_disconnections (boolean)
控制是否记录客户端结束连接信息。默认值是off。这个参数只能在postgresql.conf文件中被设置。
log_duration (boolean)
控制是否记录每个完成的SQL语句的执行时间。只有超级用户才能修改这个参数。默认值是off。对于使用扩展协议与数据库通信的客户端,会记载Parse、Bind和Execute的执行时间。
log_hostname (boolean)
控制是否及记录客户端的主机名。默认值是off。如果设为on,可能会影响数据库的性能,因为解析主机名可能需要一定的时间。这个参数只能在postgresql.conf文件中被设置。这个参数只能在postgresql.conf文件中被设置。
log_line_prefix (string)
控制每条日志信息的前缀格式。默认值是空串。它的格式类似c语言中printf函数的format字符串。这个参数只能在postgresql.conf文件中被设置。
log_line_prefix = '< %m >'                      # special values:
转义序列

#   %a = application name

#   %u = user name  用户名

#   %d = database name  数据库名

#   %r = remote host and port  客户端机器名或IP地址,还有客户端端口

#   %h = remote host  客户端机器名或IP地址

#   %p = process ID  进程ID

#   %t = timestamp without milliseconds  带微秒的时间

#   %m = timestamp with milliseconds  不带微秒的时间

#   %i = command tag  命令标签: 会话当前执行的命令类型

#   %e = SQL state

#   %c = session ID 会话ID

#   %l = session line number 每个会话的日志编号,从1开始

#   %s = session start timestamp 进程启动时间

#   %v = virtual transaction ID  虚拟事务ID (backendID/localXID)

#   %x = transaction ID (0 if none) 事务ID (0表示没有分配事务ID)

#   %q = stop here in non-session 不产生任何输出。如果当前进程是backend进程,忽略这个转义序列,继续处理后面的转义序列。如果当前进程不是backend进程,忽略这个转义序列和它后面的所有转义序列。

#    processes

#   %%     '%' 字符%
log_lock_waits (boolean)
如果一个会话等待某个类型的锁的时间超过deadlock_timeout的值,该参数决定是否在数据库日志中记录这个信息。默认值是off。只有超级用户才能修改这个参数。
log_statement (string)
控制记录哪种SQL语句的执行信息。有效的取值是none、ddl、mod和all。默认值是none。ddl包括所有数据定义语句,如CREATE、ALTER和DROP语句。mod包括所有ddl语句和更新数据的语句,例如INSERT、UPDATE、DELETE、TRUNCATE、 COPY FROM、PREPARE和 EXECUTE。All包括所有的语句。只有超级用户才能修改这个参数。
log_temp_files (integer)
控制是否记录临时文件的删除信息。单位是KB。0表示记录所有临时文件的删除信息。正整数表示只记录大小比log_temp_files的值大的临时文件的删除信息。-1表示不记录任何临时文件删除信息。默认值是-1。这个参数可以在任何时候被设置。
log_timezone (string)

设置数据库日志文件在写日志文件时使用的时区。默认值是unknown,意思是使用操作系统的时区。这个参数只能在postgresql.conf文件中被设置

b)审计记录应包括事件的日期和时间、用户、事件类型、事件是否成功及其他与审计相关的信息

1. 查看数据库当前时间

select now();
等保2.0测评 — PostgreSQL 数据库(下)

2. 查看日志文件

1)  查看$PGDATA目录postgresql文件
log_line_prefix 参数
等保2.0测评 — PostgreSQL 数据库(下)

也可使用命令查看 show log_lin_prefix;

等保2.0测评 — PostgreSQL 数据库(下)
2)位置:在$PGDATA目录下的:
show log_directory;
等保2.0测评 — PostgreSQL 数据库(下)
查看一条,确定正常运作留存日志即可
等保2.0测评 — PostgreSQL 数据库(下)
c)应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等

1.  日志文件权限

查看log_file_mode参数,其余账户无权管理
等保2.0测评 — PostgreSQL 数据库(下)

2. 本机轮替规则

查看 log_truncate_on_rotation 参数,需为开启状态
等保2.0测评 — PostgreSQL 数据库(下)
再查看log_filename 参数,默认参数如下:
等保2.0测评 — PostgreSQL 数据库(下)
产生的日志文件,每天产生一个,不轮替

等保2.0测评 — PostgreSQL 数据库(下)

为了让日志文件自动覆盖,达到保留多少日志的目的,可以进行如下设置:

log_truncate_on_rotation = on
log_filename = 'postgresql-%I.log' 
#最多保存12小时的日志,每小时一个文件
log_filename = 'postgresql-%H.log' 
#最多保存24小时的日志,每小时一个文件
log_filename = 'postgresql-%w.log' 
#最多保存一周的日志,每天一个文件
log_filename = 'postgresql-%d.log' 
#最多保存一个月的日志,每天一个文件
log_filename = 'postgresql-%j.log' 
#最多保存一年的日志,每天一个文件

3. 备份

现场核查用户是否有备份措施,日志保存时间是否达到6个月以上。

d)应对审计进程进行保护,防止未经授权的中断

1. 审计开关

1)super权限账户

无法直接关闭
等保2.0测评 — PostgreSQL 数据库(下)
其他一些参数能修改
等保2.0测评 — PostgreSQL 数据库(下)

2)普通账户无权限

等保2.0测评 — PostgreSQL 数据库(下)
给他授权super权限账户后即可
等保2.0测评 — PostgreSQL 数据库(下)

2.  结论

logging_collector 仅具有重启服务权限的账户具有。
其余一些权限设置,查看用户权限,具有superuser权限用户可操作

等保2.0测评 — PostgreSQL 数据库(下)

四、入侵防范

a)应遵循最小安装的原则,仅安装需要的组件和应用程序

该条不适用

b)应关闭不需要的系统服务、默认共享和高危端口

该条不适用

c)应通过设定终端接入方式或网络地址范围对通过网络进行管理的管理终端进行限制

1. 确认监听地址

进入$PGDATA目录,查看postgresql.conf 文件
等保2.0测评 — PostgreSQL 数据库(下)

2. 确认远程管理地址

查看$PGDATA目录下的pg_hba 文件:
确认ADDRESS 字段是否进行了地址限制

等保2.0测评 — PostgreSQL 数据库(下)

d)应提供数据有效性检验功能,保证通过人机接口输入或通过通信接口输入的内容符合系统设定要求

该条不适用。

e)应能发现可能存在的已知漏洞,并在经过充分测试评估后,及时修补漏洞

结合漏洞扫描结果,确认是否存在该数据库相关漏洞,并确定是否测试评估后再修补漏洞

f)应能够检测到对重要节点进行入侵的行为,并在发生严重入侵事件时提供报警

该条不适用。

五、数据完整性

a)应采用校验技术或密码技术保证重要数据在传输过程中的完整性,包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等

考虑的数据:鉴别数据、重要业务数据、重要个人信息

采用SSL管理符合。

查看$PGDATA目录下的postgresql.conf 文件:

确认ssl字段是否为on
等保2.0测评 — PostgreSQL 数据库(下)

再查看$PGDATA目录下的pg_hba 文件:

确认TYPE字段是否采用 hostssl

等保2.0测评 — PostgreSQL 数据库(下)

b)应采用校验技术或密码技术保证重要数据在存储过程中的完整性,包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等

考虑的数据:鉴别数据、重要业务数据、重要个人信息

有无完整性比对措施,具有之前的哈希值,和之后的哈希做比较的机制。完整性概念可参考等保2.0测评深入理解—Linux操作系统(十)

六、数据保密性

a)应采用密码技术保证重要数据在传输过程中的保密性,包括但不限于鉴别数据、重要业务数据和重要个人信息等

1.未启用SSL连接时

1.1 鉴别信息

身份验证过程中,传输的不是存储字段的MD5值

等保2.0测评 — PostgreSQL 数据库(下)
尝试用‘123456’,应该采用的是挑战应答机制,具有一定的保密性。
等保2.0测评 — PostgreSQL 数据库(下)

1.2 重要业务数据

例如查询用户口令存储表:

select * from pg_shadow;

等保2.0测评 — PostgreSQL 数据库(下)
通过wireshark抓包,发现各字段以明文方式传输,一些重要数据将会被窃听
等保2.0测评 — PostgreSQL 数据库(下)

2. 启用SSL链接

2.1 鉴别数据

开启ssl,看不懂了
等保2.0测评 — PostgreSQL 数据库(下)

2.2 重要业务数据

等保2.0测评 — PostgreSQL 数据库(下)
抓包,使用SSL管理同理看不懂了

等保2.0测评 — PostgreSQL 数据库(下)

b)应采用密码技术保证重要数据在存储过程中的保密性,包括但不限于鉴别数据、重要业务数据和重要个人信息等

1.  鉴别信息

1.1 查看加密算法

可使用show password_encryption 命令可以查看存储密码使用的算法
等保2.0测评 — PostgreSQL 数据库(下)
也可直接查看用户口令字段,会显示在passwd 列:
select usename,passwd from pg_shadow;

等保2.0测评 — PostgreSQL 数据库(下)

1.2 该算法的保密性

经过测试passwd该字段存储的是口令+角色名的MD5码
我们创建两个用户,进行测试:
create role est password '12345678t';
create role st password '1234567te';
等保2.0测评 — PostgreSQL 数据库(下)
passwd字段相同,未加salt,通过解密可以得到明文
等保2.0测评 — PostgreSQL 数据库(下)
所以passwd字段最终存储的是:口令+用户名生成初始原文,经MD5算法后产生的hash值
只能说比仅使用MD5算法强一些,但加强的粒度有限,如果用户名或密码复杂,一般也无法破解。

2.  重要业务数据、个人信息

询问数据库管理员,查看存储重要数据、个人信息的表内,对应字段是否进行加密存储。

七、数据备份恢复

a)应提供重要数据的本地数据备份与恢复功能

询问客户如何进行备份,取证查看相应的备份措施。

● 扩展

1.  SQL转存(命令行备份)

1.1 pg_dump
SQL 转储方法的思想是创建一个由SQL命令组成的文件,当把这个文件回馈给服务器时,服务器将利用其中的SQL命令重建与转储时状态一样的数据库。PostgreSQL为此提供了工具pg_dump。这个工具的基本用法是:
pg_dump [connection-option...] [option...] [dbname]
dbname
指定要被转储的数据库名。如果没有指定,将使用环境变量PGDATABASE。如果环境变量也没有设置,则使用指定给该连接的用户名。
语法:pg_dump dbname > outfile
等保2.0测评 — PostgreSQL 数据库(下)
1.2 从转存中恢复
pg_dump 生成的文本文件可以由psql程序读取,常用命令:
psql dbname < infile

等保2.0测评 — PostgreSQL 数据库(下)

pg_dump和 psql 读写管道的能力使得直接从一个服务器转储一个数据库到另一个服务器成为可能,例如:
pg_dump -h host1 dbname | psql -h host2 dbname

2.  pg_dumpall

pg_dump每次只转储一个数据库,而且它不会转储关于角色或表空间(因为它们是集簇范围的)的信息。为了支持方便地转储一个数据库集簇的全部内容,提供了pg_dumpall程序。pg_dumpall备份一个给定集簇中的每一个数据库,并且也保留了集簇范围的数据,如角色和表空间定义。该命令的基本用法是:
pg_dumpall > outfile
等保2.0测评 — PostgreSQL 数据库(下)
直接使用pg_dump下来的文件会发现无法恢复角色等相关信息
等保2.0测评 — PostgreSQL 数据库(下)
通过pg_dumpall 转储的结果可以使用psql恢复:
psql -f infile postgres
等保2.0测评 — PostgreSQL 数据库(下)
也可使用 psql < file

等保2.0测评 — PostgreSQL 数据库(下)

b)应提供异地实时备份功能,利用通信网络将重要数据实时备份至备份场地

现场查看,询问。

c)应提供重要数据处理系统的热冗余,保证系统的高可用性

现场查看,询问。

八、剩余信息保护

a)应保证鉴别信息所在的存储空间被释放或重新分配前得到完全清除

这条结合漏洞扫描结果吧,暂时不确定是否默认符合。

b)应保证存有敏感数据的存储空间被释放或重新分配前得到完全清除

这条结合漏洞扫描结果吧,暂时不确定是否默认符合。

● 扩展

1.  设置密码时防止密码被记录到数据库日志中

密码的配置命令可能会被记录到history文件及csvlog日志文件中(如果开启了DDL或更高级别审计log_statement),这些文件明文记录了密码,可能造成密码泄露风险。
1.1 密码会被记录到两个地方
1).pgsql_history
将用于存储历史记录列表的文件名。如果未设置,则文件名取自PSQL_HISTORY环境变量。如果未设置,则默认值为~/.psql_history,或在Windows上为%APPDATA%postgresqlpsql_history
等保2.0测评 — PostgreSQL 数据库(下)
2) 日志文件
等保2.0测评 — PostgreSQL 数据库(下)
1.2 示例
如下命令,会记录到HISTFILE和日志文件中:
等保2.0测评 — PostgreSQL 数据库(下)
1).pgsql_history
等保2.0测评 — PostgreSQL 数据库(下)
2)日志文件
show logging_collector; --是否开启日志收集
等保2.0测评 — PostgreSQL 数据库(下)
查看log_statement;  (ddl会记录)
等保2.0测评 — PostgreSQL 数据库(下)
然后查看日志文件
等保2.0测评 — PostgreSQL 数据库(下)

2.  解决方式

① 使用createuser命令工具-W选项提示输入密码
等保2.0测评 — PostgreSQL 数据库(下)
等保2.0测评 — PostgreSQL 数据库(下)
通过这种方式口令就不会直接记录在相应日志中

② 使用pg_md5工具生成密码, 在psql中使用ALTER ROLE填入md5值

口令+用户名就是要计算的原文,例如:123456postgres。用户postgres,口令123456,用的就是下面的MD5值
等保2.0测评 — PostgreSQL 数据库(下)

十一、个人信息保护

a)  应仅采集和保存业务必需的用户个人信息;

1. 询问、查看保存了哪些个人信息
2. 检查保存的的个人信息是否为必需
3. 管理方面,询问是否制定了相关的个人信息访问制度、流程

b)  应禁止未授权访问和非法使用用户个人信息。

  1. 查看存储个人信息表的权限
select * from information_schema.table_privileges where table_name='tablename';

等保2.0测评 — PostgreSQL 数据库(下)如果是super用户,则都能查看

2. 技术与管理方面,询问是否制定了相关的个人信息访问制度、流程,并确认是否落实。

原文始发于微信公众号(等保不好做啊):等保2.0测评 — PostgreSQL 数据库(下)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月15日15:39:57
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   等保2.0测评 — PostgreSQL 数据库(下)https://cn-sec.com/archives/2189934.html

发表评论

匿名网友 填写信息