1、借用操作系统的黑白名单
2、使用数据库 TRUSTED CONTEXT 机制
CREATE TRUSTED CONTEXT tcx1USER rootATTRIBUTES (ADDRESS '172.16.39.162')ATTRIBUTES (ADDRESS '172.16.39.163')ENABLEWITH USE FOR wangyx WITHOUT AUTHENTICATION;
如上创建 可信任上下文对象 tcx1
在 jdbc URL中添加TRUSTED_CONTEXT=TRUE属性
实际效果为 162 与163 机器的 root 用户可以连接数据库,其他ip 或者非root用户不能连接,从 root切换成 wangyx用户时不需要输入密码
SET SESSION AUTHORIZATION TO 'wangyx';
更多语法以及配置细节可参考gbase8s语法手册
3 利用数据库现有机制实现
create table sysmaster:gbasedbt.hostlist
(id int,ipaddr varchar(15));insert into hostlist values(0,'node23');
insert into hostlist values(1,'172.16.39.162');drop procedure if exists checkip;
create procedure checkip()
define a int;
define v_sessionid int;
define r_msg varchar(10);
define v_ipaddr varchar(100);
let v_sessionid=dbinfo('sessionid');
select hostname into v_ipaddr from sysmaster:sysscblst where sid=v_sessionid;
select count(1) into a from sysmaster:hostlist where ipaddr=v_ipaddr;
if a =0 THEN
execute function sysadmin:task('onmode','z',v_sessionid) into r_msg;
RAISE EXCEPTION -746,0,'connect refuse';
end if;
end procedure;dbaccess tstnw <<!
create procedure public.sysdbopen()
call sysmaster:checkip();
end procedure;
!
1)在部分环境中由于DNS反向解析策略很有可能将实际IP解析成bogon,需要额外关注下
2)若 sysdbopen 未知异常会导致数据库无法连接,最简单的处理方案为
dbaccess sysmaster -<<!
update <dbname>:sysprocedures set procname='aaa' where procname like '%sysdbopen%';
!
重启数据库
4 某些高版本中支持在参数中直接配置黑白名单