网盾科技IT教育,只培训技术精英
全国免费咨询电话: 15827351614
等保2.0涉及的PostgreSQL数据库(上)

登录数据库

一般用户在pgsql服务器上会创建相应的postgres用户,我们切换到postgres用户来操作数据库,pgsql

以postgres为默认用户。

执行su - postgres

切换后建议查看~/.bash_profile文件中是否将pgsql的bin目录加入环境变量中,方便使用pgsql相关命令

有相应环境变量后,即可直接执行:

psql -U postgres //连接pgsql server

psql -h 127.0.0.1 -d postgres -U postgres //连接pgsql server

在服务器本地postgres用户可直接使用psql命令(这个涉及到pg_hba.conf文件下的登录验证方式,后续会有说明)登录数据库

查看数据库版本:

外部命令行界面,可使用pg_ctl --version

 

登录到数据库内,使用select version();

 

接下来对应一些等保相关的条款,对应到pgsql中又是哪些设置呢?

身份鉴别

a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换

1.身份标识和鉴别

针对这个测评项,postgresql采用用户名+口令的方式进行身份标识和鉴别,除了这个我们还要搞清楚postgresql数据库的验证方式,这里就涉及到pg_hba.conf文件

pg_hba.conf文件(默认在$PGDATA目录下):

pg_hba.conf文件存放在数据库集群的数据目录里。

HBA 的意思是 host-based authentication:基于主机的认证。 在initdb初始化数据目录的时候,它会安装一个缺省的文件。

文件pg_hba.conf的常用格式是一套记录,每行一条。空白行行被忽略,井号( # )开头的注释也被忽略。并且记录不能跨行存在。

每条记录声明一种联接类型,一个客户端 IP 地址范围(如果和联接类型相关的话),一个数据库名,一个用户名字,以及对匹配这些参数的联接使用的认证方法。

第一条匹配联接类型,客户端地址和联接企图请求的数据库名和用户名的记录将用于执行认证。

具体文件内容如下:

① TYPE定义了多种连接PostgreSQL的方式,分别是:“local”使用本地unix套接字,“host”使用TCP/IP连接(包括SSL和非SSL),“host”结合“IPv4地址”使用IPv4方式,结合“IPv6地址”则使用IPv6方式,“hostssl”只能使用SSL TCP/IP连接,“hostnossl”不能使用SSL TCP/IP连接。

② DATABASE指定哪个数据库,多个数据库,库名间以逗号分隔。

“all”只有在没有其他的符合条目时才代表“所有”,如果有其他的符合条目则代表“除了该条之外的”,因为“all”的优先级最低,如下例:

注意:若local mydb all rehect 这条添加在‘all’条下面则不生效,从上至下匹配

这两条都是指定local访问方式,因为前一条指定了特定的数据库mydb,所以后一条all代表的是除了mydb之外的数据库,同理用户的all也是这个道理。

尝试,无法登录。

 

③ USER指定哪个数据库用户(PostgreSQL正规的叫法是角色,role),多个用户以逗号分隔。

④ ADDRESS 项local方式不必填写,该项可以是IPv4地址或IPv6地址,可以定义某台主机或某个网段。

⑤NETHOD 指定如何处理客户端的认证。常用的有ident、md5、password、trust、reject。

ident:是Linux下PostgresSQL默认的local认证方式,凡是能正确登录服务器的操作系统(注:不是数据库用户)就能使用本用户映射的数据库用户不需密码登录数据库。用户映射文件为pg_ident.conf,这个文件记录着与操作系统用户匹配的数据库用户,如果某操作系统用户在本文件中没有映射用户,则默认的映射数据库用户与操作系统用户同名。

比如,服务器上有名为user1的操作系统用户,同时数据库上也有同名的数据库用户,user1登录操作系统后可以直接输入psql,以user1数据库用户身份登录数据库且不需密码。很多初学者都会遇到psql -U username登录数据库却出现“username ident 认证失败”的错误,明明数据库用户已经createuser。原因就在于此,使用了ident认证方式,却没有同名的操作系统用户或没有相应的映射用户。

解决方案:1、在pg_ident.conf中添加映射用户;2、改变认证方式。

md5:是常用的密码认证方式,如果你不使用ident,最好使用md5。密码是以md5形式传送给数据库,较安全,且不需建立同名的操作系统用户。

password:是以明文密码传送给数据库,建议不要在生产环境中使用。

trust:是只要知道数据库名就不需要密码或ident就能登录,建议不要在生产环境中使用。

reject:是拒绝认证。

所以,针对第一个身份鉴别项,我们就需要查看pg_hba.conf文件,观察是否所有地址都需要通过口令验证,下图的本地local对应的NETHOD值为trust则存在问题,理论上本机上也需要关闭这种验证

2.身份标识具有唯一性

通过用户名(严格意义上说是为角色)进行身份标识,无法创建同名用户,默认符合

3.身份鉴别信息具有复杂度

针对于这个测评点,首先我们需要确认用户当前口令的组成情况,来判断当前口令是否达到等保要求,一般要求口令由大写字母、小写字母、数字、特殊字符中的三种组成,且长度8位以上。

然后我们可以通过show shared_preload_libraries; 命令查看是否启用了passwordcheck模块

密码复杂度模块配置:

passwordcheck.so模块可以实现密码复杂度要求,此模块可以检查密码,如果密码太弱,他会拒绝连接

创建用户或修改用户密码时,强制限制密码的复杂度,限制密码不能重复使用

1)启用模块

添加‘$libdir/passwordcheck’到参数shared_preload_libraries,重启生效

默认so文件都存放在$libdir目录下

使用select name,setting from pg_settings where name like '%dynamic%'; 查看

alter system set shared_preload_libraries=pg_stat_statements,passwordcheck;

 

重启服务后生效

2.测试

要求:最少8个字符,必须包含数字和字母,密码中不能含有用户名字段(全部字段)

设置完毕后发现简单密码无法设置

4.身份鉴别信息定期更换

暂时没有找到可以查看用户上一次口令的修改时间(有知道的可以告诉我一下)

密码使用期限网上叫我们查看的是:

select * from pg_shadow查看valuntil字段

valuntil值,应该是密码的失效日期(没啥用,和我们预期的需求不太一样),过了这个时间点,即使正确的口令也无法登录,需要管理员修改valuntil的值

通过Navicat管理工具这里可以直接设置

b)应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施

1.登录失败处理功能

postgresql好像不支持,目前无登录次数限制功能

2.操作超时自动退出功能

查看了一下,postgresql 中大概有这么几个 timeout 参数,原文链接

archive_timeout
控制服务器周期性地切换到一个新的 WAL 段文件,通俗的讲,就是定时归档。

authentication_timeout
完成服务器认证的最长时间,如果在这个时间内没有完成认证,服务器将关闭连接。

checkpoint_timeout
自动 WAL 检查点之间的最长时间,增大这个参数会使数据库崩溃后恢复的时间加长。

deadlock_timeout
进行死锁检测之前在一个锁上等待的总时间

idle_in_transaction_session_timeout
空闲事务超时。终止任何已经闲置超过这个参数所指定的时间(以毫秒计)的打开事务的会话。 这使得该会话所持有的任何锁被释放,并且其所持有的连接槽可以被重用, 它也允许只对这个事务可见的元组被清理。

lock_timeout
锁等待超时。语句在试图获取表、索引、行或其他数据库对象上的锁时等到超过指定的毫秒数,该语句将被中止。不推荐在postgresql.conf中设置。

statement_timeout
控制语句执行时长,单位是ms。超过设定值,该语句将被中止。
不推荐在postgresql.conf中设置,如非要设置,应该设置一个较大值。

wal_receiver_timeout
中止处于非活动状态超过指定毫秒数的复制链接。这对于正在接收的后备服务器检测主服务器崩溃或网络断开有用。设置为0会禁用超时机制。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。默认值是 60 秒。

wal_sender_timeout
中断那些停止活动超过指定毫秒数的复制连接。这对发送服务器检测一个后备机崩溃或网络中断有用。设置为0将禁用该超时机制。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。默认值是 60 秒。

好像上述没有对应等保要求的,多少时间不操作,自动退出当前数据库的功能,类似‘屏幕保护程序’一样的设置参数暂时没找到。

c) 当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听

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

确认ssl字段是否为on

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

在哪些地址段采用了hostssl连接方式

注意:NETHOD列采用password字段,则代表明文传输用户名和口令

使用SSL连接数据库

1)使用命令生成相应的证书

openssl genrsa -des3 -out server.key 2048 创建server.key文件,过程中要求输入密码

可以使用如下命令删除设置的密码:openssl rsa -in server.key -out server.key

2) 创建基于server.key的服务器证书

openssl req -new -key server.key -days 3650 -out server.crt -x509

所有设置都直接回车跳过了

然后修改该文件的权限:chmod og-rwx server.key

如果文件的权限比这个更自由,服务器将拒绝该文件。

第一次未修改文件权限,数据库就启动不了,日志如下

数据库用户所有文件权限必须小于600

在$PGDATA目录下就存在2个文件

 

3) 修改配置文件使其支持SSL连接

修改postgresql.con文件,把SSL设置成on,将ssl_ca_file='server.crt'

再设置pg_hba.conf文件,新增ssl连接认证规则:

 

然后重启服务连接即可

d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现

这条个人认为直接去现场观察客户登录该数据库的方式

一般都为用户名+口令,未采用双因子鉴别