知识宝库在此藏,一键关注获宝藏
登录数据库:
如果直接使用psql命令发现未找到命令
![等保2.0测评 — PostgreSQL 数据库(上) 等保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 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
本地也可直接使用 psql,直接登录
![等保2.0测评 — PostgreSQL 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
c 查看当前连接的数据库和用户名
![等保2.0测评 — PostgreSQL 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
查看数据库版本:
外部命令行界面,pg_ctl --version
![等保2.0测评 — PostgreSQL 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
内部,select version();
![等保2.0测评 — PostgreSQL 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
查看数据库配置文件:
select name,setting from pg_settings where category='File Locations';
一、身份鉴别
a) 应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
-
身份标识
2. 身份鉴别
查看$PGDATA目录下pg_hba.conf 文件,观察是否所有地址都需要通过口令验证
也可以使用 select * from pg_hba_file_rules;
![等保2.0测评 — PostgreSQL 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
3. 密码复杂度
show shared_preload_libraries;
4. 密码有效期(没啥用)
select * from pg_shadow 查看valuntil 字段
这个应该是失效日期,过了这个点,即使正确的口令也无法登录,需要管理员修改valuntil的值
![等保2.0测评 — PostgreSQL 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
● 延展知识
① 密码复杂度模块配置
passwordcheck.so 模块可以实现密码复杂度要求,此模块可以检查密码,如果密码太弱,他会拒绝连接。创建用户或修改用户密码时,强制限制密码的复杂度,限制密码不能重复使用
1. 启用模块
启用 `passwordcheck.so` 来增强 PgSQL 密码检查功能,需要按照以下步骤进行设置:
⑴ 打开 `postgresql.conf` 配置文件。根据你的操作系统和数据库安装方式的不同,该文件的位置可能会有所不同。
⑵ 在配置文件中找到 `shared_preload_libraries` 参数,并确保其被设置为 `passwordcheck` 模块,如下所示:
shared_preload_libraries = 'passwordcheck'
如果未找到该参数,请添加上述配置。
2. 测试
启用了该模块后,要求口令:至少8个字符,必须包含数字和字母,密码中不能含有用户名字段(全部字段)
② pg_hba.conf 文件配置详解:
pg_hba.conf 文件存放在数据库集群的数据目录里。
HBA 的意思是 host-based authentication:基于主机的认证。 在initdb初始化数据目录的时候,它会安装一个缺省的文件。
文件pg_hba.conf 的常用格式是一套记录,每行一条。空白行行被忽略,井号( # )开头的注释也被忽略。并且记录不能跨行存在。
每条记录声明一种联接类型,一个客户端 IP 地址范围(如果和联接类型相关的话),一个数据库名,一个用户名字,以及对匹配这些参数的联接使用的认证方法。
第一条匹配联接类型,客户端地址和联接企图请求的数据库名和用户名的记录将用于执行认证。
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”的优先级最低,如下例:
注意:若local mydb all rehect 这条添加在‘all’条下面则不生效,从上至下匹配
这两条都是指定local访问方式,因为前一条指定了特定的数据库mydb,所以后一条all代表的是除了mydb之外的数据库,同理用户的all也是这个道理。
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. 超时自动退出功能
● 扩展
1. 启用密码验证失败延迟
主要用于防止暴力破解,验证失败后,延迟一个时间窗口才能继续验证。启用该模块
show auth_delay.milliseconds;
输入密码后,如果密码不正确,会等10s,然后返回密码失败提示
这个配置能延迟暴力破解的时间,但是应该不满足等保的要求。
auth_delay.so 模块会导致服务器在报告身份验证失败之前短暂停留,这个主要用于防止暴力破解. 验证失败后, 延迟一个时间窗口才能继续验证。请注意, 它不会阻止拒绝服务攻击, 甚至可能会加剧这些攻击, 因为在报告身份验证失败之前等待的进程仍将使用连接插槽。
c) 当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听
1. 查看$PGDATA目录下的postgresql.conf文件:
确认ssl字段是否为on
![等保2.0测评 — PostgreSQL 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
2. 查看$PGDATA目录下的pg_hba文件:
确认TYPE字段是否采用 hostssl
![等保2.0测评 — PostgreSQL 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
注意:若METHOD列具有password字样,则代表明文传输
![等保2.0测评 — PostgreSQL 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
● 扩展
1. 默认情况下远程
先查看pg_hba.conf 文件中 METHOD
如RFC 7677中所述, 方法scram-sha-256执行SCRAM-SHA-256认证。这是一种挑战-响应架构, 可防止密码在不可信连接上嗅探,并支持以密码散列的形式将密码存储在服务器上, 这种形式被认为是安全的。
这是目前提供的方法中最安全的方法,但旧版客户端库不支持它。
方法md5使用自定义安全性较低的质询-响应机制。 它可以防止密码嗅探,并避免以纯文本形式将密码存储在服务器上, 但如果攻击者设法从服务器窃取密码哈希,则不提供保护。而且, MD5哈希算法现在不再被认为对于确定的攻击是安全的。
为了简化从md5方法到新的SCRAM方法的转换, 如果在pg_hba.conf中将md5 指定为方法,但服务器上用户的密码是SCRAM加密的(由password_encryption参数控制), 那么自动选择基于SCRAM的认证。
我们可以查看password_encryption参数
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文件,过程中要求输入密码,
可以使用如下命令删除设置的密码:openssl rsa -in server.key -out server.key
2.2 创建基于server.key的服务器证书
openssl req -new -key server.key -days 3650 -out server.crt -x509
然后修改该文件的权限:chmod og-rwx server.key
2.3 修改配置文件使其支持SSL连接
修改postgresql.conf 文件,把SSL设置成on,设置ssl_ca_file='server.crt'
再设置pg_hba.conf文件,新增ssl连接认证规则:
然后重启服务连接即可
d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现
现场核查,一般不会去做。
二、访问控制
a)应对登录的用户分配账户和权限
1. 查看当前有哪些角色
2. 然后查看对应角色对应的权限
PS:通过psql程序登录可使用du命令列出现有角色
● 扩展
1. 系统权限
1.1 role属性
● SUPERUSER --超级用户,具有所有系统权限,除了登录验证
1.2 修改属性
alter role test createdb createrole password '****@123';
alter role test nocreatedb nocreaterole superuser;
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;
进行grant授权,使jack成为r1,r2的membership
2)间接继承
可以使用revoke group_role from role1,…命令
3)系统权限任何时候都不会主动继承
使用set命令后,该会话会具有group_role的临时系统权限,且会被认为是group_role角色,创建的表之类的均为set role的权限
综上所述:角色属性login、superuser、createdb和createrole可以被认为是一种特殊权限,但是它们从来不会像数据库对象上的普通权限那样被继承。要使用这些属性,你必须实际set role到一个有这些属性之一的特定角色。
4)角色删除
删除role,role下有权限或者是对象属于此role,则删除不了
移除掉相关权限关联后进行删除,然后涉及到r1的成员或者是group_role自动释放
5)role总结
● pg中的role包含了用户,角色,角色组,成员等所有含义,如使用create role来创建
● 一个role可以成为多个role的成员,根据role的inherit属性来决定是否集成其他role的各种权限
● 删除role需要先清理此role关联的各种权限
b)应重命名或删除默认账户,修改默认账户的默认口令
默认账户为postgres,查看其是否禁止登录或重命名
通过若使用psql登录,通过du命令查看,无法登录将有cannot login字样
● 扩展
1. 默认角色
PostgreSQL提供一组默认角色, 他们可以访问特定的、通常需要的特权功能和信息。 管理员可以将这些角色 GRANT 给用户和/或其环境中的其他角色, 为这些用户提供对指定功能和信息的访问权限。
请注意,每个默认角色的特定权限可能会因为将来添加额外的功能而发生变化。 管理员应监控发行说明以进行更改,如下图:
|
|
|
阅读所有配置变量,即使那些通常只对超级用户可见的配置变量。
|
|
阅读所有pg_stat_*视图并使用各种统计相关的扩展,甚至那些通常只对超级用户可见的扩展。
|
|
执行可能对表进行可能需要很长时间ACCESS SHARE锁定的监视功能。
|
|
|
|
读取/执行各种监视视图和函数。 此角色是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 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
d)应授予管理用户所需的最小权限,实现管理用户的权限分离
查看是否遵循三权分立原则,询问管理员各账户用途、权限以及对应人员。
e)应由授权主体配置访问控制策略,访问控制策略规定主体对客体的访问规则
privilege_type AS privilege
information_schema.role_table_grants
grantee = 'your_username';
![等保2.0测评 — PostgreSQL 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
也可通过图形化界面直接查看对应账户具有哪些权限
![等保2.0测评 — PostgreSQL 数据库(上) 等保2.0测评 — PostgreSQL 数据库(上)]()
f)访问控制的粒度应达到主体为用户级或进程级,客体为文件、数据库表级
默认符合。数据库访问控制粒度主体为用户,客体为数据库表。
g)应对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问
无该功能,默认不符合。
原文始发于微信公众号(等保不好做啊):等保2.0测评 — PostgreSQL 数据库(上)
评论