3. 数据库资产发现与清点

数据库资产发现与清点,是数据库漏洞治理的起点。如果连“有哪些数据库、跑在哪里、谁在用、里面有什么数据”都说不清,后续的漏洞扫描、权限收敛、补丁加固都会失去准确的作用对象。本节要解决的核心问题,是把分散、动态、可能被人为隐藏的数据库资产,转化为一份可查询、可追溯、可更新的资产台账。

一、资产发现要采集哪些字段

资产发现不是简单地“扫出一个 IP 列表”,而是要围绕数据库实例建立多维属性。一个可用的资产台账,至少应覆盖以下信息:

  • 实例标识:实例名、实例类型(单机、主从、集群、云托管)、所属业务系统、责任人。
  • 网络位置:IP 地址、监听端口、协议(MySQL 3306、PostgreSQL 5432、SQL Server 1433、Oracle 1521、Redis 6379、MongoDB 27017 等)。
  • 版本信息:数据库产品与精确版本号,例如 MySQL 5.7.38、PostgreSQL 13.7、Oracle 11.2.0.4,用于判断已知漏洞影响范围。
  • 服务与运行状态:是否在线、启动时间、连接数、是否开启远程访问、是否启用 TLS。
  • 账号信息:账号名、认证方式、权限范围、是否为空口令、是否为默认账号。
  • 敏感数据分布:库、表、字段中是否包含身份证号、手机号、银行卡号、地址等敏感数据,以及数据量级。

这些字段共同构成资产台账的“最小可用集”。缺少版本,就无法做漏洞匹配;缺少账号,就无法做权限审计;缺少敏感数据分布,就无法确定加固优先级。

二、自动发现的技术路径

自动发现通常采用“主动探测 + 被动流量识别 + 配置采集”三种方式结合。主动探测适合发现开放端口和可连接实例;被动流量识别适合发现未开放扫描但实际在通信的数据库;配置采集则从 CMDB、云平台 API、容器编排平台中拉取实例元数据。

以主动探测为例,一个典型的发现流程是:先对目标网段做端口扫描,识别常见数据库端口;再对开放端口发送协议握手包,根据返回的 banner 或错误码判断数据库类型与版本;最后尝试用只读账号连接,读取实例元数据。下面是一段示例性的探测命令,用于说明思路,实际执行需在授权范围内进行:

# 示例:使用 nmap 识别常见数据库端口与服务
nmap -sV -p 3306,5432,1433,1521,6379,27017 10.10.20.0/24

# 示例:MySQL 版本探测(只读账号)
mysql -h 10.10.20.15 -P 3306 -u audit_ro -p -e "SELECT VERSION();"

# 示例:PostgreSQL 版本探测
psql -h 10.10.20.16 -p 5432 -U audit_ro -c "SELECT version();"

被动流量识别则通过镜像流量或数据库审计设备,解析数据库协议中的登录请求、SQL 语句和返回结果,从中提取实例 IP、端口、账号、库表访问关系。这种方式对“影子数据库”尤其有效——那些未登记在 CMDB 中、但实际承载业务流量的实例,往往只能通过流量发现。

三、敏感数据分布识别

发现实例之后,下一步是识别敏感数据分布。常见做法是:先采集库表结构,再对字段名和字段注释做规则匹配,最后对疑似字段做采样验证。例如,字段名为 id_card、phone、bank_no 时,可初步判定为敏感字段;再抽取少量数据,用正则表达式验证是否符合身份证号、手机号格式。

敏感数据识别结果应记录到资产台账中,形成“实例—库—表—字段—敏感类型—数据量”的层级关系。这样在后续漏洞治理中,就能优先处理承载敏感数据的实例,而不是平均用力。

数据库资产发现与清点:从探测到台账 发现来源 主动端口扫描 被动流量识别 CMDB / 云 API 探测与识别 端口 / 协议 / 版本 账号 / 权限 / 空口令 库表结构 / 敏感字段 资产台账(核心字段) 实例名 / 类型 / 责任人 IP / 端口 / 协议 产品 / 精确版本 账号 / 认证方式 敏感数据分布 在线状态 / 连接数 敏感数据分布层级:实例 → 库 → 表 → 字段 → 敏感类型 实例 10.10.20.15:3306 库 user_center 表 t_user_profile 字段 id_card / phone 敏感类型 身份证 / 手机号 识别规则示例:字段名匹配(id_card、phone、bank_no)+ 正则采样验证(身份证 18 位、手机号 1[3-9]\d{9}) 台账更新策略:每日增量扫描 + 变更事件触发,确保新增实例、新增账号、新增敏感字段及时入库

四、建立资产台账的落地要点

资产台账不是一次性表格,而是一个持续更新的数据集合。落地时要注意三点:

  1. 唯一标识:每个实例用“IP + 端口 + 实例名”作为唯一键,避免同一实例因多次扫描产生重复记录。
  2. 变更追踪:记录每次发现的时间戳和变更内容,例如版本升级、端口变更、账号新增,便于回溯。
  3. 与漏洞库联动:台账中的版本字段应能直接匹配 CVE 或厂商安全公告,自动标记“存在已知高危漏洞”的实例。
资产发现应在授权范围内进行。主动扫描可能触发数据库连接限制或安全告警,建议使用只读账号、控制扫描频率,并提前与业务方确认窗口期。

五、一个可参考的资产台账字段示例

下表给出一个简化的资产台账字段示例,实际使用时可根据组织规模扩展。表中数据为教学示例,非真实环境实测结果。

实例标识 IP:端口 产品/版本 账号数 敏感字段 风险标记
mysql-user-01 10.10.20.15:3306 MySQL 5.7.38 12 id_card, phone 版本存在已知漏洞
pg-order-01 10.10.20.16:5432 PostgreSQL 13.7 8 bank_no 存在空口令账号
redis-cache-01 10.10.20.17:6379 Redis 6.2.6 1 无 未启用认证

有了这份台账,后续的漏洞扫描就可以按“版本 + 端口 + 账号”精准匹配,权限收敛可以按“账号数 + 敏感字段”确定优先级,补丁加固也可以按“风险标记”排序。资产发现与清点的价值,正在于把模糊的“我们有很多数据库”变成清晰的“每个实例的状态、风险和责任人”。