GrowingIO 作为一家大数据公司,核心资产虽然在大数据平台上,但关系型数据库仍扮演着不可或缺的角色。它担负着存储产品逻辑,配置信息等重要数据信息。
GrowingIO 目前的数据库实例较多,例如按环境区分为开发环境,测试环境,生产环境等不同环境。按需求来说,又存在运维人员需要直接修改线上脏数据,开发人员本地访问开发环境的实例进行联调等情况。
而随着公司员工不断发展,人员的流动性会加剧,数据库权限控制会越来越复杂。
这时一个易用的数据库管理工具会减少相当大的工作量。
由于 GrowingIO 选用 PostgreSQL 作为关系型数据库,所以以下内容以 PostgreSQL 作为基础展开。
之前 GrowingIO 是使用基于 SSH + Iptables + PostgreSQL 日志的组合架构来实现的 PostgreSQL 的管理。
这种架构只是满足了权限控制和审计的基本需求,但是实际使用中有些问题是很难解决,例如:
由于以上种种原因,所以决定将该架构进行一次重构。
功能需求
由于目前市面上主要数据库使用 MySQL 居多,而 PostgreSQL 使用的较少,扩展工具方面的资料相对较少。
目前找到的可行的方案是 PostgreSQL 本身的 LDAP 功能 + pgAudit 组合来达到权限和审计功能。
该方案可实现的功能包括:
该方案存在的问题:
由于该方案每个 PostgreSQL 实例的管理还是割裂的状态,当实例过多时仍会带来管理的复杂,对于不支持公网的实例仍需在 PostgreSQL 实例前端搭建一个 Proxy 程序来做流量转发的工作。
基于以上困难,决定自己开发一个 PostgreSQL 的审计和权限控制系统。
整体架构较为简单,整个系统的核心为 Server 端和 Proxy 端。
Server 端需要实现与 PostgreSQL 客户端通过某些认证方式建立连接,并将用户发来的请求进行处理,并通过一些模块来扩展功能,例如:
Proxy 端则主要通过 PostgreSQL 的系统用户与 PostgreSQL 数据库建立连接,作为 Server 端和 PostgreSQL 数据库之间沟通的桥梁。
所以系统的核心为 Server 端和 Proxy 端的实现,当这两块实现后我们就可以在此上做扩展,增加不同的功能。
Server 和 Proxy 实现
这里似乎只要找到 PostgreSQL Server 和 Client 的包然后做一次封装后就差不多可以实现 Server 和 Proxy 了。
但是真正问题的是网上找了一圈没发现有实现 PostgreSQL 服务端的示例,也没找到官方的包。只在 PostgreSQL 官方文档中找到了前后端的通信协议。
最后只能自己实现 PostgreSQL 的前后端。
PostgreSQL 前后端交互的核心为通信协议和会话过程这两部分,下面主要进行这两块的讲解。
这里介绍一下我个人去了解 PostgreSQL 通信协议的方法。
PostgreSQL 前后端协议格式中,我们主要介绍如下两种,这两种弄懂后,其他格式其实大同小异。
协议字段说明:
StartupMessage 消息
为客户端发送的第一次的消息格式,用于标记客户端的一些信息。
数据类型为 String,使用 key/value 格式,使用 0 做分割符,主要字段有 user database,如下:
user\x00xiaoming\x00database\x00hello\x00application_name\x00navicat…
复制代码
消息类型(’R‘)
是服务端发送到客户端的一种消息格式,用于通知客户端的认证方式。
主体消息 中前四位使用 Int32,标记认证格式,部分含义如下。
password = 'md5' + string(md5(md5(USERNAME+PASSWORD) + string(SALT)))
通过上面的介绍,我们大致对协议格式有了一些了解,下面内容介绍一下 PostgreSQL 的会话过程,同样先放一张图,然后我们再来进行说明。
如图,我们可以将一个前后端会话过程概括为如下四个阶段:
1. 建立连接
主要为建立 TCP 网络连接请求过程,如果启用 SSL,则客户端需要发送一条包含 SSL Requests 信息的 TCP 请求。
SSL Requests 内容为
[]byte{0, 0, 0, 8, 4, 210, 22, 47}
复制代码
2. 认证阶段
该阶段主要为用户登录的认证阶段,主要过程如下。
3. 会话阶段
认证通过后前后端开始进入会话进行 SQL 的请求操作。
这时客户端会发送例如 'Q' 和 'P' 等格式消息的 SQL 请求,服务端进行应答。
4. 结束会话
客户端发送一条 'X' 的 Close 请求后,进入 SSL/TCP 挥手阶段。
[]byte{'X', '\x00', '\x00', '\x00', '\x04'}
复制代码
通过上一节介绍的 PostgreSQL 前后端通信协议格式 和 前后端的会话过程 我们对 Server 和 Proxy 端的开发已经不存在障碍了,下面我会简单的介绍一下数据库审计系统的会话流程,同样还是先放一张图。
整个数据库审计系统的处理流程大体如下:
通过上面的介绍,我们可以知道数据库审计系统的核心还是在于 PostgreSQL 的前后端协议和会话过程,其他功能相对比较简单,所以对于系统更多的细节介绍这里不在展开。
目前该系统已经稳定运行了一年多的时间,通过这段时间的使用可以确认该系统达到了当初的设计目标,完全满足了目前的使用场景,并且大大减轻了日常中关于数据库管理的相关工作,并且由于没有对 PostgreSQL 数据库做任何方面的改动,从而没有对线上的业务产生任何影响。
领取专属 10元无门槛券
私享最新 技术干货