hso是什么意思(你要知道几个仓库的安全性)
admin
2023-09-15 18:48:37

该账号是华为云开发者社区的官方运营账号,提供全面深入的云计算前景分析、丰富的技术干货和程序样本,分享华为云前沿的资讯动态。

本文分享自华为云社区《【安全无小事】你应该知道的数仓安全——加密函数》,作者zhangkunhn。

前言

最近遇到一个客户场景,涉及到共享schema的权限。简单的场景可以描述如下:一些用户是数据的生产者,需要创建表,在schema中写入数据;其他用户是数据的消费者,他们读取模式中的数据进行分析。实现模式权限管理的一种方法是,数据生产者在创建每个新表后通知管理员,用户使用grantselectonalltablesinschema语法将权限授予使用者。这种方法有一些局限性。如果生产者在模式下创建了一些新表,为了授权消费者使用这些新表,还需要通知管理员用户应该再次使用grantselectonalltablesinschema进行授权。有没有简单的解决方法?答案是肯定的,可以使用Alterdefaultprivilege。Alterdefaultprivilege用于授予或收回将来创建的对象的权限。

语法介绍

ALTERDEFAULTPRIVILEGES[FOR { ROLE | USER } target _ ROLE[,]][INSCHEMAschema_name[,]]缩写_ grant _ or _ revoke其中,abstrained _ grant _ or _ revoke子句用于指定授权或撤销哪些对象。授权表的语法是:

grant { { select | insert | update | delete | truncate | references }[,] |所有[权限]}可登录{[group] role _ name | public} [,]

参数说明

目标角色的名称。如果省略FORROLE/USER,则默认值为当前角色/用户。

值范围:现有角色的名称。

Schema_name现有模式的名称。

Target_role必须拥有schema_name的创建权限。

值范围:现有模式的名称。

Role_name被授予或撤消权限角色的名称。

值范围:现有角色的名称。

有关详细信息,请参见ALTERDEFAULTPRIVILEGES的语法说明。

场景示例

testdb=# createusercreator 1 password ' gauss _ 234 'CREATEUSERtestdb=# createusercreator 2 password ' gauss _ 234 'CREATEROLEtestdb=# create user 1 password ' gauss _ 234 'CREATEUSER -创建一个共享模式,授予creator1和creator2创建权限,授予user1使用权限TestDB=# CreateSchemashared _ schema;CREATESCHEMAtestdb=grantcreate,usageonschemashared _ schematocreator 1;GRANTtestdb=grantcreate,usageonschemashared _ schematocreator 2;grant testdb=# grantusageonschemashared _ schematouser 1;GRANT -将creator1和creator2在shared_schema中创建表的select权限授予user 1 testdb=# alterdefaultprivilegesforuser Creator 1和Creator 2 in schema shared _ schemagrantselectontabletouser 1;ALTERDEFAULTPRIVILEGES -剪切到creator1,并生成一个表testdb=# \ ctestdbcreator 1您现在没有以用户“creator 1”的身份连接到数据库“testdb”。testdb=createtableshared _ schema . t1(c1int);CREATETABLE - cut to creator2,并创建表testdb=\ CT EST DBcreator2您已作为用户' Creator 2 '连接到数据库' testdb 'testdb=Create table shared _ schema . T2(C1int);CREATETABLE - cut to user1并查询OK TestDB=\ c TestDB User 1您没有以用户身份连接到数据库' TestDB'

34;user1".testdb=>select*fromshared_schema.t1unionselect*fromshared_schema.t2;c1----(0rows)

查看默认权限的授予现状

查询系统表pg_default_acl可以查看当前哪些schema被授予了默认权限。从defaclacl字段可以看到creator1和creator2分别授予了user1对shared_schema中对象的select权限(r表示read)。

testdb=#selectr.rolname,n.nspname,a.defaclobjtype,a.defaclaclfromtestdb-#pg_default_acla,pg_rolesr,pg_namespacentestdb-#wherea.defaclrole=r.oidanda.defaclnamespace=n.oid;rolname|nspname|defaclobjtype|defaclacl----------+---------------+---------------+--------------------creator1|shared_schema|r|{user1=r/creator1}creator2|shared_schema|r|{user1=r/creator2}(2rows)

一些细节

所有在共享schema中创建对象的用户都应该出现在alterdefaultprivilegesforuser之后的列表中。否则,如果有用户creator3没有在列表中,其在共享schema中创建的对象或者说那些Owner是creator3的对象将不能被user1查询。因为共享schema中creator3用户创建的表没有授予user1默认权限。

testdb=#createusercreator3password'Gauss_234';CREATEUSERtestdb=#grantcreate,usageonschemashared_schematocreator3;GRANTtestdb=#\ctestdbcreator3Youarenowconnectedtodatabase"testdb"asuser"creator3".testdb=>createtableshared_schema.t3(c1int);CREATETABLEtestdb=>\ctestdbuser1Youarenowconnectedtodatabase"testdb"asuser"user1".testdb=>select*fromshared_schema.t3;ERROR:permissiondeniedforrelationt3

管理员可以通过alterdefaultprivilegesforuser将creator3放入列表中为user1授予访问creator3用户创建表的默认权限,也可以由creator3用户自己通过alterdefaultprivileges授权给user1.前面语法参数说明中有如果省略FORROLE/USER,则缺省值为当前用户

testdb=>\ctestdbcreator3Youarenowconnectedtodatabase"testdb"asuser"creator3".testdb=>alterdefaultprivilegesinschemashared_schemagrantselectontablestouser1;ALTERDEFAULTPRIVILEGEStestdb=>\ctestdbuser1Youarenowconnectedtodatabase"testdb"asuser"user1".testdb=>select*fromshared_schema.t3;ERROR:permissiondeniedforrelationt3testdb=>\ctestdbcreator3testdb=>createtableshared_schema.t4(c1int);CREATETABLEtestdb=>\ctestdbuser1Youarenowconnectedtodatabase"testdb"asuser"user1".testdb=>select*fromshared_schema.t4;c1----(0rows)

上述代码第3行为当前用户在shared_schema下面创建的表的select权限授予user1。第7行user1查询shared_schema.t3报权限不足,是因为alterdefaultprivileges只处理将来的对象。shared_schema.t3在是之前创建的。我们新建表shared_schema.t4,user1用户查询正常。

如果要处理已有表的权限,使用grant语句。参见grant语法说明。

testdb=>\ctestdbcreator3Youarenowconnectedtodatabase"testdb"asuser"creator3".testdb=>grantselectonalltablesinschemashared_schematouser1;ERROR:permissiondeniedforrelationt1testdb=>grantselectontableshared_schema.t3touser1;GRANTtestdb=>\ctestdbuser1Youarenowconnectedtodatabase"testdb"asuser"user1".testdb=>select*fromshared_schema.t3;c1----(0rows)

代码第3行中shared_schema中包含有3个用户创建的表,而creator3只是表t3的创建者(Owner)。所以授予整个schema的权限会报错,只授予creator3是Owner的表t3之后,user1用户查询正常。

alterdefaultprivileges只处理将来的对象,grant只处理已有的对象。进一步的,这两种语法授予权限时涉及的对象仅包括Owner是当前用户的对象。如果要为共享schema下面所有Owner的对象授予权限,需要使用管理员用户使用alterdefaultprivilegesforuser语法和grant语法。

透明加密

透明加密的应用场景

透明加密能够保障用户数据安全。更换磁盘、磁盘流出或者运维非法直接读取磁盘文件会绕过认证、权限管理和审计,从而导致数据泄露的风险。客户对业务数据有很高机密性要求时建议使用透明加密。

透明加密的原理

透明加密功能是对存在硬盘上的用户数据加密存储,对用户及上层使用SQL的应用不感知。透明的含义是指对客户来说是无感知的,仅需要创建GaussDB(DWS)集群时配置透明加密。目前支持行存表和列存表文件的加密存储,支持集群级别的透明加密配置。

集群级别的透明加密意味着集群中的所有库,库中的所有表都是加密存储。集群级别的透明加密还意味着需要在创建集群时进行配置,集群创建之后不可修改,既不能将非加密集群修改为加密集群,也不能将加密集群修改为非加密集群。

加密算法

透明加密核心是算法和密钥。我们采用AES-128算法,加密模式使用CTR。CTR流加密可以保证明文和密文长度相等,不会导致加密后数据存储空间膨胀。

密钥管理

使用华为公有云KMS服务管理,保证了用户的密钥安全。
加密密钥层次结构有三层。按层次结构顺序排列,这些密钥为主密钥(CMK)、集群密钥(CEK)、数据库密钥(DEK)。

主密钥保存在KMS中,用于给CEK加密。CEK用于加密DEK,CEK明文保存在集群内存中,密文保存在服务管理面中。DEK用于加密数据库中的数据,DEK明文保存在集群内存中,密文保存在服务管理面中。

密钥轮转

出于安全考虑,用户可以执行密钥轮转操作。密钥轮转只轮转集群密钥,不论转数据库秘钥。

透明加密的后续演进

集群级透明加密的优点是所有数据包括用户表和系统表都加密,适用于所有加密需求。一枚硬币的两面性告诉我们,优点也可能是缺点。对所有数据库对象加密会对数据导入和查询带来性能上的开销。

为解决此问题,后续考虑支持细粒度透明加密。比如可以支持表级透明加密,用户在创建表时指定属性为加密表,该用户表的数据会加密存储。用户可以在包含敏感数据的表中开启加密属性,在查询和使用过程中不感知加解密过程。由于加密粒度较小,对性能的影响也较小。

透明加密是保障用户核心数据安全的有效手段。从使用场景和原理介绍了GaussDB(DWS)数仓的透明加密特性,指出了后续透明加密特性的研究方向。

SQL函数加密

技术背景

密码学中密码算法可以分为三类:哈希函数、对称密码算法和非对称密码算法。

哈希函数

哈希函数又称为摘要算法,对于数据data,Hash函数会生成固定长度的数据,即Hash(data)=result。这个过程是不可逆的,即Hash函数不存在反函数,无法由result得到data。在不应保存明文场景,比如口令(password)属于敏感信息,系统管理员用户也不应该知道用户的明文口令,就应该使用哈希算法,存储口令的单向哈希值。

实际使用中会加入盐值和迭代次数,避免相同口令生成相同的哈希值,以防止彩虹表攻击。

对称密码算法

对称密码算法使用相同的密钥来加密和解密数据。对称密码算法分为分组密码算法和流密码算法。

分组密码算法将明文分成固定长度的分组,用密钥对每个分组加密。由于分组长度固定,当明文长度不是分组长度的整数倍时,会对明文做填充处理。由于填充的存在,分组密码算法得到的密文长度会大于明文长度。

流密码算法将明文逐比特与密钥流运算。流密码算法不需要填充,得到的密文长度等于明文长度。

非对称密码算法

非对称密码算法,又称为公钥密码算法。算法使用两个密钥:公钥和私钥。公钥向所有人公开,私钥保密。非对称密码算法应用于密钥协商、数字签名、数字证书等领域。

技术实现

GaussDB(DWS)主要提供了哈希函数和对称密码算法。哈希函数支持sha256,sha384,sha512和国密sm3。对称密码算法支持aes128,aes192,aes256和国密sm4。

哈希函数

md5(string)

将string使用MD5加密,并以16进制数作为返回值。MD5的安全性较低,不建议使用。

gs_hash(hashstr,hashmethod)

以hashmethod算法对hashstr字符串进行信息摘要,返回信息摘要字符串。支持的hashmethod:sha256,sha384,sha512,sm3。

testdb=#SELECTgs_hash('GaussDB(DWS)','sha256');gs_hash------------------------------------------------------------------cc2d1b97c6adfba44bbce7386516f63f16fc6e6a10bd938861d3aba501ac8aab(1row)

对称密码算法

gs_encrypt(encryptstr,keystr,cryptotype,cryptomode,hashmethod)
采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法,以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。
支持的cryptotype:aes128,aes192,aes256,sm4。
支持的cryptomode:cbc。
支持的hashmethod:sha256,sha384,sha512,sm3。
testdb=#SELECTgs_encrypt('GaussDB(DWS)','1234','aes128','cbc','sha256');gs_encrypt--------------------------------------------------------------------------------------------------------------------------AAAAAAAAAADlzZYiNQK1uB+p1gza4Lu3Moj3HdP4E1uJmqfDYBaXDLMt7RZoE0YVx9h2dMRYBQ5fhFNqqM49sUkeS72o8kX5vWRQvfW3fuocGyp+b+lX9A==(1row)
gs_decrypt(decryptstr,keystr,cryptotype,cryptomode,hashmethod)
采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法,以keystr为密钥对decryptstr字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。
testdb=#SELECTgs_decrypt('AAAAAAAAAADlzZYiNQK1uB+p1gza4Lu3Moj3HdP4E1uJmqfDYBaXDLMt7RZoE0YVx9h2dMRYBQ5fhFNqqM49sUkeS72o8kX5vWRQvfW3fuocGyp+b+lX9A==','1234','aes128','cbc','sha256');gs_decrypt--------------GaussDB(DWS)(1row)

效果分析

有个student表,有id,name和score三个属性。name可以使用哈希函数加密保存,score可以使用对称密码算法保存。

testdb=#createtablestudent(idint,nametext,scoretext);CREATETABLEtestdb=#insertintostudentvalues(1,gs_hash('alice','sha256'),gs_encrypt('95','12345','aes128','cbc','sha256'));INSERT01testdb=#insertintostudentvalues(2,gs_hash('bob','sha256'),gs_encrypt('92','12345','aes128','cbc','sha256'));INSERT01testdb=#insertintostudentvalues(3,gs_hash('peter','sha256'),gs_encrypt('98','12345','aes128','cbc','sha256'));INSERT01

没有密钥的用户即使拥有了select权限也无法看到name和score这两列加密数据。

testdb=#select*fromstudent;id|name|score----+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------1|2bd806c97f0e00af1a1fc3328fa763a9269723c8db8fac4f93af71db186d6e90|AAAAAAAAAAB26RmKZdGciLdOM1Z0sjsHg6Qh1b8taF3cY5KDVm+faJK5AT9tjufkr3Wogj3tIpFfiIEb6+miGqPHWcmKnFsArAMoBG9pPDawGs1Qze7xGg==2|81b637d8fcd2c6da6359e6963113a1170de795e4b725b84d1e0b4cfd9ec58ce9|AAAAAAAAAAB26RmKZdGciLdOM1Z0sjsHZOHH7URkyme6r8Hfh1k0UsVbgbREjFMkgB52w+7GtUGqGgUik07ghajSD9PMIDLd/49wBCVROm2/HSOw6jzbxA==3|026ad9b14a7453b7488daa0c6acbc258b1506f52c441c7c465474c1a564394ff|AAAAAAAAAAB26RmKZdGciLdOM1Z0sjsHwv6p/OAfDUyVULAqpaHIrYJYMcqLmQSj3K/REyavfMoKB7hgUpEPXfHRutWur37bru68jjt5XcBHFBjZeMgowA==(3rows)

拥有密钥的用户可以通过解密查看到加密数据。

testdb=#selectid,gs_decrypt(score,'12345','aes128','cbc','sha256')fromstudent;id|gs_decrypt----+------------1|952|923|98(3rows)

总结

数据加密是防止未授权访问和防护数据泄露的有效技术。介绍了密码算法的基本原理和GaussDB(DWS)数仓的加密函数,包括哈希函数gs_hash,对称密码算法gs_encrypt/gs_decrypt。举例说明了加密函数的使用场景。

想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDBDWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技~


点击关注,第一时间了解华为云新鲜技术~

相关内容

热门资讯

金花创建房间/微信金花房卡怎么... 1.微信渠道:(荣耀联盟)大厅介绍:咨询房/卡添加微信:88355042 2.微信游戏中心:打开微...
金花房间卡/金花房卡如何购买/... 金花房间卡/金花房卡如何购买/新超圣金花房卡正版如何购买新超圣是一款非常受欢迎的游戏,咨询房/卡添加...
牛牛创建房间/金花房卡批发/神... 微信游戏中心:神牛大厅房卡在哪里买打开微信,添加客服【88355042】,进入游戏中心或相关小程序,...
链接牛牛/牛牛房卡游戏代理/鸿... 鸿运大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
科技实测!牛牛房卡怎么获得/乐... 微信游戏中心:乐酷大厅房卡在哪里买打开微信,添加客服【88355042】,进入游戏中心或相关小程序,...