logo
GBase 8s
其他
文章

南大通用GBase 8s 数据库之环境变量NODEFDAC详解

路路路
发表于2025-02-06 18:04:07170次浏览0个评论

在数据库的世界里,环境变量往往扮演着幕后英雄的角色。它们虽不显眼,却在背后默默影响着数据库的行为和性能。GBase 8s V8.8版本中,NODEFDAC环境变量便是这样一个存在。它看似简单,却能在非ANSI兼容的数据库中,对表的权限管理产生深远影响。今天,我们来探讨一下GBase 8s数据库中的一个关键环境变量——NODEFDAC,看看它是如何在数据安全领域发挥重要作用的。

在默认情况下,GBase 8s数据库在创建新表时,会自动授予PUBLIC角色默认的表访问权限,这包括了insert、delete、update、select和index等权限。这种设置在某些场景下虽然方便,但在涉及敏感数据或需要严格权限控制的环境中,却可能带来安全隐患。而NODEFDAC环境变量的出现,就是为了应对这种情况。

当我们将NODEFDAC环境变量设置为yes时,数据库服务器在创建新表时,将不再授予PUBLIC默认的表访问权限。这个小小的改变,却能为数据安全筑起一道坚固的防线。想象一下,在一个企业级数据库中,存储着大量客户的个人信息和交易记录。如果没有合理的权限控制,任何一个拥有数据库连接权限的用户,都可能轻易地访问甚至修改这些敏感数据,后果不堪设想。而通过设置NODEFDAC,我们可以在源头上限制这种无差别授权,确保只有经过明确授权的用户才能对表进行操作。

值得注意的是,NODEFDAC的设置非常讲究。它区分大小写,并且对前导和尾随空格敏感。这意味着,如果你不小心在设置时使用了大写字母,或者在yes前后添加了多余的空格,NODEFDAC将被视为未设置。这就好比是一把精细的锁,只有用正确的钥匙,才能打开它。因此,在实际操作中,运维人员必须格外小心,确保NODEFDAC的设置准确无误。

     export NODEFDAC=yes

  • yes 设置区分大小写,并且对前导和尾随空格敏感。
  • 在设置中包含大写字母或空格相当于未设置 NODEFDAC。
  • 当 NODEFDAC 未设置,或如果其设置为除 yes 之外的任何值,在非 ANSI 兼容的数据库中创建表,默认会向 PUBLIC 授予默认权限。
  • 在 ANSI 兼容的数据库中启用 NODEFDAC 没有任何效果。

具体示例:

--gbasedbt用户建库建表    
    
> create database testdac with log;    
Database created.    
    
> create table t1(id int);    
Table created.    
    
--缺省情况下PUBLIC对新建表的默认访问权限(insert,delete,update,select,index)    
--并且,具有库级connect权限的用户自动获取“public”权限    
> select * from systabauth where tabid=100;    
    
grantor  root    
grantee  public    
tabid    100    
tabauth  su-idx---    
    
1 row(s) retrieved.    
    
--创建普通用户tmp_u_001    
> create user tmp_u_001 with password 'GBase_123';    
User created.    
    
--赋予用户tmp_u_001对库testdac的connect权限    
> grant connect to 'tmp_u_001';    
Permission granted.    
    
--tmp_u_001用户连接库    
> connect to 'testdac@ol_tl3302_zm0519' user 'tmp_u_001';    
   ENTER PASSWORD:    
Disconnected.    
Connected.    
    
--此时普通用户tmp_u_001已经可以对表t1进行操作    
--(insert,delete,update,select,index)    
> select * from t1;    
    
         id    
    
No rows found.    
    
> insert into t1 values(1);    
1 row(s) inserted.    
    
> update t1 set id=2;    
1 row(s) updated.    
    
--设置环境变量NODEFDAC,不用重启数据库  
# export NODEFDAC=yes    
--gbasedbt用户建表t2  
> database testdac;  
  
Database selected.  
  
> create table t2(id int);    
Table created.    
    
--t2表没有缺省权限了  
> select * from systabauth where tabid>99;    
    
grantor  root    
grantee  public    
tabid    100       --这里的100是上面的t1表  
tabauth  su-idx---    
    
1 row(s) retrieved.    
    
--用户tmp_u_001对表t2也没有任何权限了    
> connect to 'testdac@ol_tl3302_zm0519' user 'tmp_u_001';    
   ENTER PASSWORD:    
Disconnected.    
Connected.    
    
> select * from t2;    
  272: No SELECT permission for t2.    
Error in line 1    
Near character position 16    
  
> insert into t2 values(1);  
  275: The Insert privilege is required for this operation.  
Error in line 1  
Near character position 16  
  
> delete from t2;  
  274: No DELETE permission for t2.  
Error in line 1  
Near character position 14  
  
> update t2 set id=1;  
  273: No UPDATE permission for t2.  
Error in line 1  
Near character position 11  

在数据库运维管理中,NODEFDAC环境变量或许只是一个小小的细节,但通过合理设置NODEFDAC,我们可以在非ANSI兼容的数据库环境中,有效地控制表的权限分配,防止不必要的数据访问和操作,从而为数据库的安全性筑牢防线。它或许不显眼,但却能在关键时刻发挥重要作用,成为我们守护数据安全的“隐形卫士”。作为数据库运维人员,我们应当深入了解每一个细节,熟练掌握每一个工具,用专业知识和技能,为数据安全保驾护航。

评论

登录后才可以发表评论