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

admin 2024年2月15日18:16:28评论246 views1字数 7031阅读23分26秒阅读模式

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

登录数据库:

如果直接使用psql命令发现未找到命令

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

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

执行 su - postgres

psql -U postgres  //连接pgsql server

psql -h 127.0.0.1 -d postgres -U postgres  //连接pgsql server,之后输入密码

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

本地也可直接使用 psql,直接登录

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

c 查看当前连接的数据库和用户名

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

查看数据库版本:

外部命令行界面,pg_ctl --version

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

内部,select version();

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

查看数据库配置文件:

select name,setting from pg_settings where category='File Locations';

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

一、身份鉴别

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

  1. 身份标识

通过用户名进行身份标识,无法创建同名用户
等保2.0测评 — PostgreSQL 数据库(上)

2. 身份鉴别

查看$PGDATA目录下pg_hba.conf 文件,观察是否所有地址都需要通过口令验证
等保2.0测评 — PostgreSQL 数据库(上)

也可以使用 select * from pg_hba_file_rules;

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

3. 密码复杂度

show shared_preload_libraries;
等保2.0测评 — PostgreSQL 数据库(上)

4. 密码有效期(没啥用)

select * from pg_shadow 查看valuntil 字段
等保2.0测评 — PostgreSQL 数据库(上)
这个应该是失效日期,过了这个点,即使正确的口令也无法登录,需要管理员修改valuntil的值

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

● 延展知识

① 密码复杂度模块配置

passwordcheck.so 模块可以实现密码复杂度要求,此模块可以检查密码,如果密码太弱,他会拒绝连接。创建用户或修改用户密码时,强制限制密码的复杂度,限制密码不能重复使用
1. 启用模块

启用 `passwordcheck.so` 来增强 PgSQL 密码检查功能,需要按照以下步骤进行设置:

⑴ 打开 `postgresql.conf` 配置文件。根据你的操作系统和数据库安装方式的不同,该文件的位置可能会有所不同。

⑵ 在配置文件中找到 `shared_preload_libraries` 参数,并确保其被设置为 `passwordcheck` 模块,如下所示:

   shared_preload_libraries = 'passwordcheck'

   如果未找到该参数,请添加上述配置。

等保2.0测评 — PostgreSQL 数据库(上)
⑶ 重新启动数据库以使配置生效。
2. 测试
启用了该模块后,要求口令:至少8个字符,必须包含数字和字母,密码中不能含有用户名字段(全部字段)
设置完毕后发现简单密码无法设置
等保2.0测评 — PostgreSQL 数据库(上)等保2.0测评 — PostgreSQL 数据库(上)等保2.0测评 — PostgreSQL 数据库(上)

② pg_hba.conf 文件配置详解:

pg_hba.conf 文件存放在数据库集群的数据目录里。
HBA 的意思是 host-based authentication:基于主机的认证。 在initdb初始化数据目录的时候,它会安装一个缺省的文件。
文件pg_hba.conf 的常用格式是一套记录,每行一条。空白行行被忽略,井号( # )开头的注释也被忽略。并且记录不能跨行存在。
每条记录声明一种联接类型,一个客户端 IP 地址范围(如果和联接类型相关的话),一个数据库名,一个用户名字,以及对匹配这些参数的联接使用的认证方法。
第一条匹配联接类型,客户端地址和联接企图请求的数据库名和用户名的记录将用于执行认证。
等保2.0测评 — PostgreSQL 数据库(上)
1)TYPE 定义了多种连接PostgreSQL的方式,分别是:“local”使用本地unix套接字,“host”使用TCP/IP连接(包括SSL和非SSL),“host”结合“IPv4地址”使用IPv4方式,结合“IPv6地址”则使用IPv6方式,“hostssl”只能使用SSL TCP/IP连接,“hostnossl”不能使用SSL TCP/IP连接。
2)DATABASE 指定哪个数据库,多个数据库,库名间以逗号分隔。
all”只有在没有其他的符合条目时才代表“所有”,如果有其他的符合条目则代表“除了该条之外的”,因为“all”的优先级最低,如下例:
等保2.0测评 — PostgreSQL 数据库(上)
注意:若local mydb all rehect 这条添加在‘all’条下面则不生效,从上至下匹配
这两条都是指定local访问方式,因为前一条指定了特定的数据库mydb,所以后一条all代表的是除了mydb之外的数据库,同理用户的all也是这个道理。
尝试,无法登录。
等保2.0测评 — PostgreSQL 数据库(上)
3)USER 指定哪个数据库用户(PostgreSQL正规的叫法是角色,role),多个用户以逗号分隔。
4)ADDRESS 项local方式不必填写,该项可以是IPv4地址或IPv6地址,可以定义某台主机或某个网段。
5)METHOD 指定如何处理客户端的认证。常用的有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:是拒绝认证。

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

1. 登录失败处理功能

默认无该功能,现场核查询问。

2. 超时自动退出功能

好像没有,没找到,现场核查询问。
等保2.0测评 — PostgreSQL 数据库(上)

● 扩展

1.  启用密码验证失败延迟

主要用于防止暴力破解,验证失败后,延迟一个时间窗口才能继续验证。启用该模块
等保2.0测评 — PostgreSQL 数据库(上)
重启后生效
等保2.0测评 — PostgreSQL 数据库(上)
该参数控制登录失败后,返回的错误的时长
show auth_delay.milliseconds;
等保2.0测评 — PostgreSQL 数据库(上)
等保2.0测评 — PostgreSQL 数据库(上)
所有配置均需要reload后生效
等保2.0测评 — PostgreSQL 数据库(上)
测试
输入密码后,如果密码不正确,会等10s,然后返回密码失败提示
等保2.0测评 — PostgreSQL 数据库(上)
等保2.0测评 — PostgreSQL 数据库(上)
但是如果输入正确的口令,立马返回连接成功
等保2.0测评 — PostgreSQL 数据库(上)
这个配置能延迟暴力破解的时间,但是应该不满足等保的要求。

auth_delay.so 模块会导致服务器在报告身份验证失败之前短暂停留,这个主要用于防止暴力破解. 验证失败后, 延迟一个时间窗口才能继续验证。请注意, 它不会阻止拒绝服务攻击, 甚至可能会加剧这些攻击, 因为在报告身份验证失败之前等待的进程仍将使用连接插槽。

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

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

确认ssl字段是否为on

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

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

确认TYPE字段是否采用 hostssl

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

注意:若METHOD列具有password字样,则代表明文传输

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

● 扩展

1.  默认情况下远程

先查看pg_hba.conf 文件中 METHOD
等保2.0测评 — PostgreSQL 数据库(上)
SCRAM-SHA-256
如RFC 7677中所述, 方法scram-sha-256执行SCRAM-SHA-256认证。这是一种挑战-响应架构, 可防止密码在不可信连接上嗅探,并支持以密码散列的形式将密码存储在服务器上, 这种形式被认为是安全的。
这是目前提供的方法中最安全的方法,但旧版客户端库不支持它。
MD5
方法md5使用自定义安全性较低的质询-响应机制。 它可以防止密码嗅探,并避免以纯文本形式将密码存储在服务器上, 但如果攻击者设法从服务器窃取密码哈希,则不提供保护。而且, MD5哈希算法现在不再被认为对于确定的攻击是安全的。
为了简化从md5方法到新的SCRAM方法的转换, 如果在pg_hba.conf中将md5 指定为方法,但服务器上用户的密码是SCRAM加密的(由password_encryption参数控制), 那么自动选择基于SCRAM的认证。
我们可以查看password_encryption参数
等保2.0测评 — PostgreSQL 数据库(上)
password_encryption (enum)
当在CREATE USER或ALTER ROLE 中指定了一个密码时,这个参数决定加密密码所使用的算法。默认值是md5, 它将密码存储为MD5哈希(也接受on作为md5的别名)。 将该参数设置为scram-sha-256将使用SCRAM-SHA-256加密密码。
请注意,较老的客户端可能缺少对SCRAM认证机制的支持, 因此不适用于使用SCRAM-SHA-256加密的密码。

2.  使用SSL连接

2.1 使用命令生成相应的证书
openssl genrsa -des3 -out server.key 2048 创建server.key文件,过程中要求输入密码,
等保2.0测评 — PostgreSQL 数据库(上)
可以使用如下命令删除设置的密码:openssl rsa -in server.key -out server.key
等保2.0测评 — PostgreSQL 数据库(上)
2.2 创建基于server.key的服务器证书
openssl req -new -key server.key -days 3650 -out server.crt -x509
等保2.0测评 — PostgreSQL 数据库(上)
所有设置都直接回车跳过了
然后修改该文件的权限:chmod og-rwx server.key
如果文件的权限比这个更自由,服务器将拒绝该文件。
第一次未修改文件权限,数据库就启动不了,日志如下
等保2.0测评 — PostgreSQL 数据库(上)
数据库用户所有文件权限必须小于600
$PGDATA目录下就存在2个文件
等保2.0测评 — PostgreSQL 数据库(上)
2.3 修改配置文件使其支持SSL连接
修改postgresql.conf 文件,把SSL设置成on,设置ssl_ca_file='server.crt'
等保2.0测评 — PostgreSQL 数据库(上)
再设置pg_hba.conf文件,新增ssl连接认证规则:
等保2.0测评 — PostgreSQL 数据库(上)

然后重启服务连接即可

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

现场核查,一般不会去做。

二、访问控制

a)应对登录的用户分配账户和权限

1. 查看当前有哪些角色

pg使用role来表示所有的角色,用户,用户组
通过工具查看
等保2.0测评 — PostgreSQL 数据库(上)

2. 然后查看对应角色对应的权限

等保2.0测评 — PostgreSQL 数据库(上)
PS:通过psql程序登录可使用du命令列出现有角色
等保2.0测评 — PostgreSQL 数据库(上)

● 扩展

1. 系统权限

1.1 role属性
可以认为是这个用户所具有的系统权限.
● LOGIN --具有登录权限
● SUPERUSER --超级用户,具有所有系统权限,除了登录验证
● CREATEDB --创建数据库权限
● CREATEROLE --创建role权限
● PASSWORD --设置密码
1.2 修改属性
创建test角色
create role test login;
等保2.0测评 — PostgreSQL 数据库(上)

alter role test createdb createrole password '****@123';

等保2.0测评 — PostgreSQL 数据库(上)
alter role test nocreatedb nocreaterole superuser;
等保2.0测评 — PostgreSQL 数据库(上)

2. role成员权限

role membership(role成员)为了管理上的方便,我们可以创建一个role group,然后可以将各用户或者有特殊权限的role组织在一起,各个role就是这个role group的membership.
role group 是不带login的role,因为pg使用role来表示所有的角色、用户、用户组,所以不要混淆,创建语句都是create role.
测试:
2.1 继承role group
1)直接继承
我们创建一个用户,两个角色,分别有直属一个表的查询权限
create role jack login inherit;
create role r1;
create role r2;
等保2.0测评 — PostgreSQL 数据库(上)
然后创建对应的表
等保2.0测评 — PostgreSQL 数据库(上)
授予查询权限
等保2.0测评 — PostgreSQL 数据库(上)
进行grant授权,使jack成为r1,r2的membership
等保2.0测评 — PostgreSQL 数据库(上)
测试角色切换
jack 继承了r1,r2的权限
等保2.0测评 — PostgreSQL 数据库(上)
等保2.0测评 — PostgreSQL 数据库(上)
2)间接继承
移除membership
可以使用revoke group_role from role1,…命令
等保2.0测评 — PostgreSQL 数据库(上)
此时,r1属于r2,然后jack又属于r1
等保2.0测评 — PostgreSQL 数据库(上)
关闭r1的继承
alter role r1 noinherit;
等保2.0测评 — PostgreSQL 数据库(上)
然后再尝试访问tab,发现tab2无法访问
等保2.0测评 — PostgreSQL 数据库(上)
取消继承权限后,r1也无权限访问
等保2.0测评 — PostgreSQL 数据库(上)
等保2.0测评 — PostgreSQL 数据库(上)等保2.0测评 — PostgreSQL 数据库(上)
移除后将无权限
等保2.0测评 — PostgreSQL 数据库(上)
注意:授权不能形成回路
等保2.0测评 — PostgreSQL 数据库(上)
3)系统权限任何时候都不会主动继承
系统权限不会继承,只有主动set才生效
等保2.0测评 — PostgreSQL 数据库(上)
使用set命令后,该会话会具有group_role的临时系统权限,且会被认为是group_role角色,创建的表之类的均为set role的权限
等保2.0测评 — PostgreSQL 数据库(上)
重新开启会话后,无权限
等保2.0测评 — PostgreSQL 数据库(上)
三种方式还原到最初的jack角色:
等保2.0测评 — PostgreSQL 数据库(上)
综上所述:角色属性login、superuser、createdb和createrole可以被认为是一种特殊权限,但是它们从来不会像数据库对象上的普通权限那样被继承。要使用这些属性,你必须实际set role到一个有这些属性之一的特定角色。
4)角色删除
删除role,role下有权限或者是对象属于此role,则删除不了
等保2.0测评 — PostgreSQL 数据库(上)
移除掉相关权限关联后进行删除,然后涉及到r1的成员或者是group_role自动释放
等保2.0测评 — PostgreSQL 数据库(上)
5)role总结
● pg中的role包含了用户,角色,角色组,成员等所有含义,如使用create role来创建
● 一个role可以成为多个role的成员,根据role的inherit属性来决定是否集成其他role的各种权限
● 继承关系不能形成回路

● 删除role需要先清理此role关联的各种权限

b)应重命名或删除默认账户,修改默认账户的默认口令

默认账户为postgres,查看其是否禁止登录或重命名
等保2.0测评 — PostgreSQL 数据库(上)
通过若使用psql登录,通过du命令查看,无法登录将有cannot login字样
等保2.0测评 — PostgreSQL 数据库(上)

● 扩展

1.  默认角色
PostgreSQL提供一组默认角色, 他们可以访问特定的、通常需要的特权功能和信息。 管理员可以将这些角色 GRANT 给用户和/或其环境中的其他角色, 为这些用户提供对指定功能和信息的访问权限。
请注意,每个默认角色的特定权限可能会因为将来添加额外的功能而发生变化。 管理员应监控发行说明以进行更改,如下图:
角色
允许的权限
pg_read_all_settings
阅读所有配置变量,即使那些通常只对超级用户可见的配置变量。
pg_read_all_stats
阅读所有pg_stat_*视图并使用各种统计相关的扩展,甚至那些通常只对超级用户可见的扩展。
pg_stat_scan_tables
执行可能对表进行可能需要很长时间ACCESS SHARE锁定的监视功能。
pg_signal_backend
给其他后端发送信号(比如: 取消查询、终止)。
pg_monitor
读取/执行各种监视视图和函数。 此角色是pg_read_all_settings、 pg_read_all_stats和 pg_stat_scan_tables的成员。
pg_mointor、pg_read_all_settings、pg_read_all_stats和pg_scan_tables 角色旨在允许管理员轻松配置角色以见识数据库服务器。他们授予一组通用权限,允许角色读取通常仅限于超级用户的各种有用的配置设置,统计和其他系统信息。
应小心授予这些角色,以确保只在需要执行所需监视的情况下才会使用这些角色。
管理员可以使用grant命令给这些用户授予访问权限:

grant pg_signal_backend to admin_user;

c)应及时删除或停用多余的、过期的账户,避免共享账户的存在

查看当前是否存在多余用户:select * from gp_shadow;

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

d)应授予管理用户所需的最小权限,实现管理用户的权限分离

查看是否遵循三权分立原则,询问管理员各账户用途、权限以及对应人员。

e)应由授权主体配置访问控制策略,访问控制策略规定主体对客体的访问规则

SELECT
    grantee AS user,
    privilege_type AS privilege
FROM
    information_schema.role_table_grants
WHERE

    grantee = 'your_username';

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

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

也可通过图形化界面直接查看对应账户具有哪些权限

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

f)访问控制的粒度应达到主体为用户级或进程级,客体为文件、数据库表级

默认符合。数据库访问控制粒度主体为用户,客体为数据库表。

g)应对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问

无该功能,默认不符合。

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

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月15日18:16:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   等保2.0测评 — PostgreSQL 数据库(上)https://cn-sec.com/archives/2189861.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息