Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


黑白名单

📄字数 5.8K
👁️阅读量 加载中...

一、概述

1.1 基本概念

数据库黑白名单是一种核心的访问控制机制,通过定义信任策略(白名单)和限制策略(黑名单),精确控制哪些用户、从哪些IP地址范围能够访问特定数据库资源。白名单明确授权合法访问路径,仅允许受信主体访问敏感数据库;黑名单则主动拦截高风险访问,阻止恶意IP、未授权用户或可疑连接。这种双重防护机制为数据库系统构建起精细化的访问安全防线。
数据库黑白名单通过配置信任IP地址信任用户指定数据库来实现访问控制:

  • 白名单:允许访问的可信配置项
  • 黑名单:禁止访问的不可信配置项

1.2 配置方式

配置方式生效范围生效时间管理复杂度
修改配置文件当前节点需重启服务
执行数据库命令单节点/所有节点立即生效

二、配置文件方式配置黑白名单

2.1 配置文件位置

通过修改数据库安装包根路径下SETUP文件夹的trust.ini文件配置黑白名单。

重要

配置文件方式需在数据库服务启动前配置配置后重启生效,建议集群环境下保持所有节点配置一致

2.2 trust.ini配置格式

2.3 参数说明

参数说明
TRUST表示该条配置信息为可信策略,允许配置用户访问数据库,即白名单策略
UNTRUST表示该条配置信息为不可信策略,不允许配置用户访问数据库,即黑名单策略
db_name指定策略所影响的目标数据库名
EVERYDB指定策略影响所有数据库
user_name指定策略所影响的目标用户名
EVERYONE指定策略影响所有所有用户
ip_str1指定策略所影响的IP地址
TO ip_str2可选参数,表示从ip_str1到ip_str2的IP段均受策略影响
ANYWHERE所有IP

2.4 配置示例

白名单配置

ini
# 允许192.168.1.100的SYSDBA用户访问SYSTEM库
trust system sysdba from 192.168.1.100

# 允许192.168.1.100-109网段的SYSDBA用户访问SYSTEM库
trust system sysdba from 192.168.1.100 to 192.168.1.109

提示

在trust.ini中默认配置trust everydb everyone from anywhere,该项覆盖了所有白名单选项,单独设置白名单无意义,若需白名单生效,需删除该配置项,可在启动服务前修改配置生效或通过命令删除该项。

黑名单配置

ini
# 禁止192.168.2.50的guest用户访问test库
untrust test guest from 192.168.2.50

# 禁止192.168.3.200-220网段所有用户访问report库
untrust report everyone from 192.168.3.200 to 192.168.3.220

三、数据库命令方式配置黑白名单

除了通过修改配置文件进行黑白名单策略配置外,还可通过命令进行策略配置。

重要

所有的可信策略配置只能在系统库进行设置,普通用户库的管理员无权设置可信策略。

删除可信策略时必须谨慎,若删除了所有可信策略,以下三种解决方案可避免用户无法登录数据库:

  • 1、在当前连接未断开之前新增白名单;
  • 2、若当前连接已断开,在数据库服务所在机器使用ip127.0.0.1登录,可登录成功,然后新增白名单;
  • 3、关闭数据库服务,修改SETUP文件夹的trust.ini文件配置白名单,重启生效(不推荐)。

3.1 命令语法

3.2 参数说明

参数说明
TRUST表示该条配置信息为可信策略,允许配置用户访问数据库,即白名单策略
UNTRUST表示该条配置信息为不可信策略,不允许配置用户访问数据库,即黑名单
db_name指定策略所影响的目标数据库名
EVERYDB指定策略影响所有数据库
user_name指定策略所影响的目标用户名
EVERYONE指定策略影响所有所有用户
ip_str1指定策略所影响的IP地址
TO ip_str2可选参数,表示从ip_str1ip_str2的IP段均受策略影响
ANYWHERE所有IP
ON ALL NODE多节点,可信策略对所有节点生效,单节点可不配置
ON NODE iconst其中iconst为节点号,表示黑白名单在iconst节点号生效,若未使用ON ALL NODEON NODE iconst则表示黑白名单在当前节点生效

3.3 黑名单管理

添加黑名单

sql
-- 增加一个黑名单,不允许高风险IP所有用户访问所有数据库
SQL> ALTER CONNECT POLICY ADD DISABLE 'everyone' LOGIN 'everydb' FROM '192.168.2.239' ON ALL NODE;
SQL> SELECT * FROM sys_black_white_list WHERE IP_RANGE='192.168.2.239';
+--------+-----------+---------+-----------+---------------+
| NODEID | LIST_TYPE | DB_NAME | USER_NAME |   IP_RANGE    |
+--------+-----------+---------+-----------+---------------+
| 1      | blacklist | everydb | everyone  | 192.168.2.239 |
+--------+-----------+---------+-----------+---------------+

-- 增加一个黑名单,不允许用户user_black从任何IP访问1号节点库customer_db
SQL> CREATE DATABASE customer_db;
SQL> CREATE USER user_black IDENTIFIED BY '123@';
SQL> ALTER CONNECT POLICY ADD DISABLE 'user_black' LOGIN 'customer_db' FROM 'anywhere' ON NODE 1;

SQL> SELECT * FROM sys_all_black_white_list WHERE list_type='blacklist' AND db_name='customer_db' AND nodeid=1;
+--------+-----------+-------------+-----------+----------+
| NODEID | LIST_TYPE |   DB_NAME   | USER_NAME | IP_RANGE |
+--------+-----------+-------------+-----------+----------+
| 1      | blacklist | customer_db | user_black| anywhere |
+--------+-----------+-------------+-----------+----------+

-- 增加一个黑名单,不允许任何用户从192.168.3.107到192.168.3.120这个IP地址段登录用户库test
SQL> ALTER CONNECT POLICY ADD DISABLE 'everyone' LOGIN 'customer_db' FROM '192.168.3.107' TO '192.168.3.120' ON ALL NODE;

SQL> SELECT * FROM sys_all_black_white_list WHERE list_type='blacklist' AND db_name='customer_db';
+--------+-----------+-------------+------------+-----------------------------+
| NODEID | LIST_TYPE |   DB_NAME   | USER_NAME  |          IP_RANGE           |
+--------+-----------+-------------+------------+-----------------------------+
| 1      | blacklist | customer_db | user_black | anywhere                    |
| 1      | blacklist | customer_db | everyone   | 192.168.3.107-192.168.3.120 |
| 2      | blacklist | customer_db | everyone   | 192.168.3.107-192.168.3.120 |
| 3      | blacklist | customer_db | everyone   | 192.168.3.107-192.168.3.120 |
+--------+-----------+-------------+------------+-----------------------------+

删除黑名单

sql
-- 删除用户user_black从任何IP访问1号节点库customer_db的黑名单策略
SQL> ALTER CONNECT POLICY DROP DISABLE 'user_black' LOGIN 'customer_db' FROM 'anywhere' ON NODE 1;

-- 删除customer_dbt库所有黑名单策略
SQL> ALTER CONNECT POLICY DROP ALL DISABLE LOGIN 'customer_db' ON ALL NODE;

-- 删除当前节点所有黑名单策略
SQL> ALTER CONNECT POLICY DROP ALL DISABLE;

-- 删除所有节点所有黑名单策略
SQL> ALTER CONNECT POLICY DROP ALL DISABLE ON ALL NODE;

3.4 白名单管理

添加白名单

sql
-- 增加一个白名单,允许用户user_white从192.168.10.50至192.168.10.60这个IP地址段访问数据库monitor_db
SQL> CREATE DATABASE monitor_db;
SQL> CREATE USER user_white IDENTIFIED BY '123@';
SQL> ALTER CONNECT POLICY ADD ENABLE 'user_white' LOGIN 'monitor_db' FROM '192.168.10.50' TO '192.168.10.60' ON ALL NODE;

SQL> SELECT * FROM sys_all_black_white_list WHERE db_name = 'monitor_db';
+--------+-----------+------------+------------+-----------------------------+
| NODEID | LIST_TYPE |  DB_NAME   | USER_NAME  |          IP_RANGE           |
+--------+-----------+------------+------------+-----------------------------+
| 1      | whitelist | monitor_db | user_white | 192.168.10.50-192.168.10.60 |
| 2      | whitelist | monitor_db | user_white | 192.168.10.50-192.168.10.60 |
| 3      | whitelist | monitor_db | user_white | 192.168.10.50-192.168.10.60 |
+--------+-----------+------------+------------+-----------------------------+

-- 增加一个白名单,允许用户user_white从192.168.3.105访问任意数据库
SQL> ALTER CONNECT POLICY ADD ENABLE 'user_white' LOGIN 'everydb' FROM '192.168.3.105' ON ALL NODE;
SQL> SELECT * FROM sys_all_black_white_list WHERE ip_range = '192.168.3.105';
+--------+-----------+---------+------------+---------------+
| NODEID | LIST_TYPE | DB_NAME | USER_NAME  |   IP_RANGE    |
+--------+-----------+---------+------------+---------------+
| 1      | whitelist | everydb | user_white | 192.168.3.105 |
| 2      | whitelist | everydb | user_white | 192.168.3.105 |
| 3      | whitelist | everydb | user_white | 192.168.3.105 |
+--------+-----------+---------+------------+---------------+

-- 增加一个白名单,允许任意用户从任意IP访问2号节点的monitor_db库
SQL> ALTER CONNECT POLICY ADD ENABLE 'everyone' LOGIN 'monitor_db' FROM 'anywhere' ON NODE 2;
SQL> SELECT * FROM sys_all_black_white_list WHERE nodeid=2 AND ip_range='anywhere' and user_name='everyone' and db_name='monitor_db';
+--------+-----------+------------+-----------+----------+
| NODEID | LIST_TYPE |  DB_NAME   | USER_NAME | IP_RANGE |
+--------+-----------+------------+-----------+----------+
| 2      | whitelist | monitor_db | everyone  | anywhere |
+--------+-----------+------------+-----------+----------+

-- 增加一个白名单,允许任意用户user_white从任意IP访问3号节点的任意库
SQL> ALTER CONNECT POLICY ADD ENABLE 'user_white' LOGIN 'everydb' FROM 'anywhere' ON NODE 3;
SQL> SELECT * FROM sys_all_black_white_list WHERE nodeid=3 AND ip_range='anywhere' and user_name='user_white';
+--------+-----------+---------+------------+----------+
| NODEID | LIST_TYPE | DB_NAME | USER_NAME  | IP_RANGE |
+--------+-----------+---------+------------+----------+
| 3      | whitelist | everydb | user_white | anywhere |
+--------+-----------+---------+------------+----------+

删除白名单

sql
-- 删除用户user_white从192.168.3.105访问monitor_db库的白名单策略
SQL> ALTER CONNECT POLICY DROP ENABLE 'user_white' LOGIN 'monitor_db' FROM '192.168.3.105' ON ALL NODE;

-- 删除用户user_white从任何IP访问任何3号节点任何库的白名单策略
SQL> ALTER CONNECT POLICY DROP ENABLE 'user_white' LOGIN 'everydb' FROM 'anywhere' ON NODE 3;

-- 删除所有用户从任何IP访问库monitor_db的白名单策略
SQL> ALTER CONNECT POLICY DROP ENABLE 'everyone' LOGIN 'monitor_db' FROM 'anywhere' ON ALL NODE;

-- 删除所有节点所有白名单策略【慎用!】
SQL> ALTER CONNECT POLICY DROP ALL ENABLE ON ALL NODE;

-- 删除所有的黑白名单策略【慎用!】
SQL> ALTER CONNECT POLICY DROP ALL ON ALL NODE;

注意

执行增加/删除黑白名单策略的命令后,将自动在SETUP/trust.ini下同步相应的内容
如:执行命令“ALTER CONNECT POLICY ADD DISABLE 'everyone' LOGIN 'everydb' FROM '192.168.2.239' ON NODE 1;”后,1号节点的trust.ini中将自动添加“untrust everydb everyone from 192.168.2.239”,执行删除命令后,trust.ini中相应内容也会删除。

四、相关系统表

字段名类型说明
NODEIDINTEGER节点ID
LIST_TYPEVARCHAR名单类型(whitelist/blacklist)
DB_NAMEVARCHAR数据库名称
USER_NAMEVARCHAR用户名称
IP_RANGEVARCHARIP地址范围

查询示例

sql
SQL> SELECT * FROM SYS_BLACK_WHITE_LIST WHERE LIST_TYPE = 'whitelist';
+--------+-----------+---------+-----------+----------+
| NODEID | LIST_TYPE | DB_NAME | USER_NAME | IP_RANGE |
+--------+-----------+---------+-----------+----------+
| 1      | whitelist | everydb | everyone  | anywhere |
+--------+-----------+---------+-----------+----------+