首页 » 应用安全 » 数据库 » PostgreSQL » 正文

PostgreSQL 常见加固

1,监听地址和端口

默认安装的PostgreSQL会开放5432端口,并且对外开放监听,存在安全隐患。


1.1,修改默认监听地址、端口

vi data/postgresql.conf
# 只允许本地访问
listen_addresses = '127.0.0.1'
# 修改监听端口为 20181
port = 20181

1.2,使用 iptables 限制访问IP

如果数据库需要从外部访问,则可以使用iptalbes对可访问的IP进行限制,另外也可以通过 pg_hba.conf 进行配置,参见客户端访问控制章节。

# 只允许固定的IP对数据库端口进行访问
iptables -A INPUT -s x.x.x.x -p tcp --dport 20181 -j ACCEPT 

2,用户管理

修改 postgresql.conf 文件,将新创建用户的密码设置为 MD5 加密存储(修改配置后需要重启数据库服务)。

vi data/postgresql.conf
password_encryption = "true"

查询当前用户中是否包含使用明文密码的用户:

SELECT rolname,rolpassword FROM pg_authid WHERE char_length(rolpassword) < 3 OR substring(rolpassword from 0 for 3) <> 'md5';

如果已进行上述配置修改,可以执行下面的命令修改为复杂的密码:

ALERT USER username WITH PASSWORD 'New_P@ssw0rd'; 

否则,执行下面的命令修改复杂密码:

ALTER USER username WITH ENCRYPTED PASSWORD 'New_P@ssw0rd';

3,低权限运行

新建一个普通用户或使用一个现有的普通用户,将数据目录($PGDATA)的读写、PostgreSQL日志目录(以配置时设定的位置为准)的写入权限分配给该用户,使用这个用户来运行PostgreSQL数据库。

对于 Windows 用户:

打开“开始菜单 -> 管理工具 -> 服务”,双击PostgreSQL数据库服务,在打开的界面上选择“登录”选项卡,选择“此账号”单选框,输入用户名和密码后单击“确定”。然后重启服务。

对于 Linux 用户:

修改服务配置文件,将变量 PGUSER 的值修改为运行服务的用户。

vi /etc/rc.d/init.d/postgresql

4,客户端访问控制

基于安全考虑,postgresql的 trust 认证方式只允许在本地使用。另外,还需要对访问ip、用户和数据库进行严格的限制。其它访问源的认证方式均建议修改为md5或其它方式

修改pg_hba.conf文件,根据实际需要设置类型、数据库、用户、客户端地址和认证方法:

vi data/pg_hba.conf

# 只允许本地用户使用 trust 认证
host    all         all         127.0.0.1/32        trust
# 远程连接只允许使用 md5 认证,并对访问IP、用户和数据库进行限制
host    db1       user1    192.168.10.5/32   md5
# 默认阻止除以上配置以外的连接
host    all         all         0.0.0.0/0             reject

5,登录尝试次数限制

PostgreSQL 自身没有登录次数限制方面的设置。

6,登录错误审计

# 日志记录的目标,推荐csvlog、syslog和eventlog
log_destination = "csvlog"
# 将日志记录到文件
logging_collector = on
# 指定日志存储的文件夹
log_directory = "pg_log"
# 指定日志文件名
log_filename = ""
# 记录日志的最低级别,推荐 fatal 以上
log_min_messages = "fatal"

7,管理账号与应用帐号分开

应该为应用创建专门的用户而不是使用管理员用户,并且要保证这个用户具有尽可能小的权限:非超级用户(NOSUPERUSER)、无法创建数据库(NOCREATEDB)、无法创建用户(NOCREATEUSER)、允许登录(LOGIN)、仅对应用数据库具有必要的权限。

数据库中存在一个内置的超级用户postgres,postgres可以在数据库中创建新的超级用户,也可以把一个超级用户变成普通用户。同时数据库中也有一个内置的名为PUBLIC的角色, 任何用户都可以给PUBLIC授权和回收权限。数据库中的所有用户和角色都自动拥有PUBLIC角色拥有的一切权限。

对于数据库对象,有创建(CREATE)、创建临时表(TEMP)、连接数据库(CONNECT)、所有权限(ALL)、分配给其它角色(WITH GRANT OPTION)等权限可以分配。对于数据表和视图对象,有插入(INSERT)、查询(SELECT)、更新(UPDATE)、删除(DELETE)等权限可以分配;对于数据表字段对象,有插入(INSERT)、查询(SELECT)、更新(UPDATE)等权限可以分配;对于函数有执行(EXECUTE)权限可以分配。等等。

# 修改用户 user 的权限
ALTER USER test NOSUPERUSER NOCREATEUSER NOCREATEDB;

8,对象访问控制

PostgreSQL实现了基于角色的存取控制机制,角色是权限的集合。可以将权限赋给用户,也可以将权限赋给角色。可以将角色赋给一个用户,该用户将拥有角色的所有权限。也可以将角色赋给其它的角色。

# 查看用户对各数据库对象的访问权限
psql>\l

# 查看用户对各数据表、视图、字段的访问权限
psql>\c 数据库名
psql>\dp

# 查看授权命令的使用说宁
psql>\h GRANT
# 授权:给testuser用户分配testdb数据库的CONNECT权限
psql>GRANT CONNECT ON DATABASE testdb TO testuser;

# 查看撤销(回收)命令的使用说明
psql>\h REVOKE
# 撤销权限:撤销testuser用户对testtable表的INSERT、SELECT、UPDATE权限
psql>REVOKE INSERT,SELECT,UPDATE ON testtable FROM testuser;

有关各加固参数的更详细介绍,请参阅官方手册:

http://www.postgresql.org/docs/manuals/

发表评论