前言
今天有PGer小伙伴在群里,咨询基于PostgreSQL的等保配置方法。整理一下配置方法分享出来。大家一起讨论学习。
配置方法如下:(分为10个配置类别)
一、身份鉴别:
a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换;
linux下su – postgres 进入postgres用户,psql –h 127.0.0.1 –d postgres –U postgres 命令进入数据库;
windows下psql.exe –h 127.0.0.1 –d postgres –U postgres进入数据库1)
cat opt/vsb9/pgsql/data/pg_hba.conf 配置文件中不能使用了trunt可信任验证,如果使用的是MD5验证或者是password验证是具有身份鉴别功能的;但是password是密码明文传输,不能保证鉴别信息在传输过程中的保密和完整性:
select usename,passwd from pg_shadow;查询存在哪些账户;查看你是否有同名账户
select usename,passwd from pg_shadow;查询存在哪些账户;查看你是有空口令
进入数据库后查看是否加载了passwordcheck模块
Postgres#:select name,setting from pg_settings where name=’shared_preload_libraries’;
查看密码过期时间:
select * from pg_user;
整改方法:
Postgresql.conf配置文件中添加 shared_preload_libraries=’passwordcheck’
使用命令alter role postgres valid until '2020-04-10 16:58:00';
b)应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施;
1)2)在postgresql数据库中默认不具备登录失败处理功能,可以在postgresql.conf中加载auth_delay模块,这个模块在密码输错后会延迟指定的时间,可以防止暴力破解,以此降低风险,建议不要打符合。
shared_preload_libraries = 'auth_delay,passwordcheck'//加载密码复杂度和登录延迟模块
auth_delay.milliseconds = 5000//指定延迟时间单位为毫秒。
3)select * from pg_setting where name like ‘%timeout%’;
整改方法:
在postgresql.conf配置文件中把wal_receiver_timeout的注释取消掉,默认是60000毫秒。
c)当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听;
postgresql数据库默认的密码存放是进行MD5加密的,可以保证鉴别信息在传输过程中的保密性,可以使用select usename,passwd from pg_shadow;语句进行查询:
d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。
->查看登录方式,是否有双因子识别,系统的密码设置不算一种鉴别方式;必须使用双因子鉴定,一般使用堡垒只能降低风险,不能算符合,使用证书登录,动态口令,ukey,指纹验证等才算符合,必须使用除密码外的其他验证方式。通过限定管理地址和改变默认端口和改变默认用户名。可以降低风险。
二、访问控制:
a)应对登录的用户分配账户和权限;
->对照权限表进行权限检查,应该重名并限制postgres账户的权限,或者删除postgres账户,重新建立账户,应用程序分配对应的数据库权限,不应该具备其他数据库的权限。
b)应重命名或删除默认账户,修改默认账户的默认口令;
应该重命名postgres账户并且降低权限,修改postgres账户的默认口令。
c)应及时删除或停用多余的、过期的账户,避免共享账户的存在;
->应该对照权限表查看是否存在多余的和过期的账户。
d)应授予管理用户所需的最小权限,实现管理用户的权限分离;
->应该对照权限表,查看每个用户的权限,每个应用应该分配一个数据库管理账户,这个账户的权限应该只具备该数据库的权限。应该配置用户管理员,配置管理员和安全审计员角色。
select * from information_schema.table_privileges where grantee='user_name';查看用户权限
e)应由授权主体配置访问控制策略,访问控制策略规定主体对客体的访问规则;
postgresql数据库由管理员对数据库用户进行管理和权限分配,用户应该指定权限对照表,按照权限对照表进行用户的创建和权限划分。(就算没有划分三权分立也是符合的)
f)访问控制的粒度应达到主体为用户级或进程级,客体为文件、数据库表级;
postgresql数据库的访问控制的粒度可以达到主体为用户级或者进程级,客体为文件、数据库表级,此项默认符合。
g)应对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问。
->采用三方软件,比如启明星辰的铁卷或者DLP系列产品,实现强制访问控制,此项为中风险项,如果没有实现强制访问控制,可以打不符合。(打不符合)
三、安全审计:
a)应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计;
查看postgresql.conf文件中;日志是否开启和日志的存储路径
如上配置是符合要求的,其中logging_collerctor=on是开启日志审计,log_directory是&PGDATA相对的日志路径(但是存在默认路径),log_filename是日志的文件格式,应该使用如上格式,数据库默认是使用%a格式,使用%a的意思是按一周每天的顺序进行命名,只能保存7天的日志,会被后面的日志覆盖,log_rotation_age是指日志备份的周期(1d是一天),上述是每天进行一次备份,log_rotation_size=0M 日志文件的大小,大于规定值另存为一个文件。
查找日志文件:
Windows版本:select * from pg_settings where;(where后面加条件)
Linux版本:find -name postgresql… 后面是上面查看的log_filename
详细的参数解释请参考:
https://www.cnblogs.com/easonbook/p/11983534.html
b)审计记录应包括事件的日期和时间、用户、事件类型、事件是否成功及其他与审计相关的信息;
1)
以上是日志的输出格式,是不符合的,格式应该修改为log_line_prefix = '%m %p %u %d %r %e',这个格式的意思是:能够记录时间,用户名称,数据库名称,客户端IP和端口,sql语句。
2)
以上是不符合的,log_statement应该设置为‘all‘,记录所有的sql语句。
c)应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等;
是否配置了采用了技术措施对日志审计记录进行了保护,或者配置日志服务器对日志进行备份。
d)应对审计进程进行保护,防止未经授权的中断。
postgresql数据库中非审计管理员不能中断审计进行进程,此项默认符合。
四、入侵防范:
a)应遵循最小安装的原则,仅安装需要的组件和应用程序;
->进入数据库后使用\dx命令查看
Postgresql默认只安装plpgsql一个插件。
b)应关闭不需要的系统服务、默认共享和高危端口;
->postgresql数据只开启了默认5432端口,不存在高危端口,所以这项是默认符合的,或者不适用。
c)应通过设定终端接入方式或网络地址范围对通过网络进行管理的管理终端进行限制;
查看pg_hba.conf配置文件:
在ADDRESS一列中,可以限制访问地址,不能出现0.0.0.0/0,应该指定到ip进行访问。(系统读取时是取范围最大的)
整改建议:
修改配置文件为:
另外除了可以使用数据库本身进行限制外
d)应提供数据有效性检验功能,保证通过人机接口输入或通过通信接口输入的内容符合系统设定要求;
-postgresql数据库默认符合。
e)应能发现可能存在的已知漏洞,并在经过充分测试评估后,及时修补漏洞;
1)应该通过渗透测试和漏洞扫描发现是否存在高风险漏洞;
2)经过充分测试和评估后,及时去修补数据库漏洞。
f)应能够检测到对重要节点进行入侵的行为,并在发生严重入侵事件时提供报警。
->在数据库架设的网路层面应该架设IDS、IPS等网络入侵报警安全设备,并且防护设备设置并开启了在发现入侵时发出告警的设置。
五、可信验证:
a)可基于可信根对计算设备的系统引导程序、系统程序、重要配置参数和应用程序等进行可信验证,并在应用程序的关键执行环节进行动态可信验证,在检测到其可信性受到破坏后进行报警,并将验证结果形成审计记录送至安全管理中心。
六、数据完整性:
a)应采用校验技术或密码技术保证重要数据在传输过程中的完整性,包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等;
1)select name,setting from pg_settings where name like ‘%ssl%’;
上面显示说明没有启用SSL功能,此项不符合。
整改建议:
使用openssl生成 1、server.key – 私钥 2、server.crt – 服务器证书 3、root.crt – 受信任的根书。具体请参考:
生成后,配置postgres.conf和pg_hba.conf
修改postgres.conf,修改ssl = on 配置ssl_ca_file = 'root.crt'
配置pg_hba.conf,新增ssl连接认证规则
重启数据库,规则生效
b)应采用校验技术或密码技术保证重要数据在存储过程中的完整性,包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等。
postgresql数据库的数据文件和数据库的密码在存放过程中是否进行了加密,数据库的文件字服务器的存放过程中是加密的,数据库的密码在数据库存放过程中也是进行加密的,可以打符合;但是严格意义来讲,数据库的审计记录和配置文件都要进行加密,但是比较难实现,所以要视情况而定。
七、数据保密性:
a)应采用密码技术保证重要数据在传输过程中的保密性,包括但不限于鉴别数据、重要业务数据和重要个人信息等;
1)测评和整改方法同数据传输过程中的完整性。
b)应采用密码技术保证重要数据在存储过程中的保密性,包括但不限于鉴别数据、重要业务数据和重要个人信息等。
postgresql数据库的数据文件和数据库的密码在存放过程中是否进行了加密,数据库的文件字服务器的存放过程中是加密的,数据库的密码在数据库存放过程中也是进行加密的,可以打符合;但是严格意义来讲,数据库的审计记录和配置文件都要进行加密,但是比较难实现,所以要视情况而定。
八、数据备份和恢复:
a)应提供重要数据的本地数据备份与恢复功能;
1)询问数据库管理员是否对数据库数据和配置文件制定相应的备份策略。
2)查看备份计划是否和备份策略一样;
3)产看备份命名方式和存储介质等是否和备案策略一致;
4)询问并查看是否有恢复性测试记录。
管理员应该对数据库文件进行备份,其中包括了数据库数据文件和数据库日志文件,如果只是备份数据库数据文件,是不能正常恢复数据的,可以使用备份服务器进行备份,也可以导出sql文件进行备份。
Postgresql数据库有三种备份方式,可以参考:
b)应提供异地实时备份功能,利用通信网络将重要数据实时备份至备份场地;
应该通过配置备份服务器对重要数据进行异地实时备份,异地实时备份的设备跟数据库服务器距离间隔至少30公里。
c)应提供重要数据处理系统的热冗余,保证系统的高可用性。
应该为数据库提供热冗余,满足系统的高可用性。
九、剩余信息保护:
a)应保证鉴别信息所在的存储空间被释放或重新分配前得到完全清除;
->postgresql数据库此项是符合的,因为用户进行鉴别信息验证时,用户的鉴别信息时不能够查看到的,之后也不能查看到历史记录;在.psql_history隐藏文件中会记录修改密码的历史命令记录,可能会导致鉴别信息泄露,但是这个不在考虑范围之类,可以忽略。
b)应保证存有敏感数据的存储空间被释放或重新分配前得到完全清除。
Linux的postgresql数据库此项是不符合的,因为在postgresql账户的home目录下会默认生成一个隐藏文件,这个隐藏文件会记录数据库在操作过程中的命令,查看文件如下:
Window下postgresql也是不符合的,上下键可以查看到历史命令记录。
十、个人信息保护:
a)应仅采集和保存业务必需的用户个人信息;
1)询问并检查采集的个人信息是否是业务应用必需的;
2)询问并查看是否制定了有关个人信息保护的制度和流程。
b)应禁止未授权访问和非法使用用户个人信息。
1)应该采用技术措施限定对个人信息的访问和使用;
2)询问并查看是否制定了有关个人信息保护的制度和流程。