
# DWS安全最佳实践
安全性是华为云与您的共同责任。华为云负责云服务自身的安全，提供安全的云；作为租户，您需要合理使用云服务提供的安全能力对数据进行保护，安全地使用云。详情请参见[责任共担](https://support.huaweicloud.com/resp-pcre/index.html?product=dws)。
本文提供了DWS使用过程中的安全最佳实践，旨在提升用户业务数据的整体安全能力，提供可操作的规范性指导。
本文从DWS使用的不同阶段给出建议，您可以评估DWS使用情况，并根据业务需要在本指导的基础上进行安全配置。
1. 创建DWS集群和连接数据库阶段：
   - [资源访问控制]
   
   - [开启控制台敏感操作保护]
   
   - [开启集群级透明加密]
   
   - [通过SSL传输加密连接数据库]
    
2. 数据库对象设计阶段：
   - [通过Database和Schema实现业务隔离]
   
   - [通过Grant语法进行表数据访问和修改的授权]
    
3. SQL业务开发阶段：
   - [开启行级访问控制技术实现行级数据部分可见]
   
   - [使用数据脱敏进行列数据脱敏]
   
   - [使用DWS内置函数进行数据加密]
   
   - [通过审计日志可以查看哪些用户修改了业务数据]
   
   - [遇到业务性能瓶颈时通过智能运维（自动Vacuum）干预]
    
4. 运维阶段：
   - [通过监控面板进行数据库健康度监控]
   
   - [周期性备份业务数据]
   
   - [开启跨可用区双集群容灾]
    
 #### 资源访问控制
如果您需要为企业中的员工设置对华为云上DWS资源的不同访问权限，以达到不同员工之间的权限隔离，您可以使用统一身份认证服务（Identity and Access Management，简称IAM）进行精细的权限管理。该服务提供用户身份认证、权限分配、访问控制等功能，可以帮助您安全地控制华为云资源的访问。通过IAM，您可以在华为云账号中给员工创建IAM用户，并授权控制他们对华为云资源的访问范围。
- **场景一**：您的员工中有负责软件开发的人员，您希望他们拥有DWS 的使用权限，但是不希望他们拥有删除集群等高危操作的权限，那么您可以使用IAM为开发人员创建用户，通过授予仅能使用DWS，但是不允许删除集群的权限，控制他们对DWS 资源的使用范围。
- **场景二**：您希望您的员工只有DWS的资源使用权限，不希望拥有其他云资源的权限，以防止资源滥用。例如只开通DWS的操作权限，不能使用其他云服务。
通过IAM权限控制，有效达到云资源访问控制，避免云资源误操作。了解更多请参见[创建用户并授权使用DWS](https://support.huaweicloud.com/mgtg-dws/dws_01_0147.html)。
![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001760338025.png "点击放大")
 #### 开启控制台敏感操作保护
DWS支持敏感操作保护功能，当用户在控制台执行敏感操作时，则需要输入证明身份的凭证，身份验证通过后方可进行相关操作。为了账号安全，建议开启操作保护功能，该功能对账号以及账号下的子用户都生效。
目前支持的操作：绑定EIP、集群扩容、删除集群、重启集群、启动集群、停止集群、增删CN节点、升级集群、修改参数、删除空闲节点、自动弹性开关。
详情请参见[开启DWS控制台敏感操作保护](https://support.huaweicloud.com/mgtg-dws/dws_01_0701.html)。
 #### 开启集群级透明加密
传统数据库集群中，用户数据明文保存在行存/列存文件中，集群的维护人员或者恶意攻击者可在OS层面绕过数据库的权限控制机制或者窃取磁盘直接访问用户数据。DWS通过对接华为云KMS，可实现数据的透明加密，保障用户数据安全。
DWS数据库级透明加密，每个DWS集群有一个CEK，每个数据库单独配置DEK加密保护，DEK使用CEK加密保护，保存在DWS集群侧。密钥通过KMS服务申请和加解密，加密算法通过配置项统一配置。目前支持AES、SM4算法。
详情请参见[使用KMS对DWS集群进行加密](https://support.huaweicloud.com/mgtg-dws/dws_01_0115.html)。
 #### 通过SSL传输加密连接数据库
DWS支持SSL标准协议，SSL协议是安全性更高的协议标准，它们加入了数字签名和数字证书来实现客户端和服务器的双向身份验证，保证了通信双方更加安全的数据传输。为支持SSL连接方式，DWS已经从CA认证中心申请到正式的服务器、客户端的证书和密钥（假设服务器的私钥为server.key，证书为server.crt，客户端的私钥为client.key，证书为client.crt，CA根证书名称为cacert.pem）。
SSL连接方式的安全性高于普通模式，集群默认开启SSL功能允许来自客户端的SSL连接或非SSL连接，从安全性考虑，建议用户在客户端使用SSL连接方式。并且DWS服务器端的证书、私钥以及根证书已经默认配置完成。
了解更多请参见[使用SSL进行安全的TCP/IP连接](https://support.huaweicloud.com/mgtg-dws/dws_01_0038.html)。
 #### 通过Database和Schema实现业务隔离
DWS中可以使用Database和Schema实现业务的隔离，区别在于：
- Database之间无法直接互访，通过连接隔离实现彻底的权限隔离。各个Database之间共享资源极少，可实现连接隔离、权限隔离等。
- Schema隔离的方式共用资源较多，可以通过GRANT与REVOKE语法便捷地控制不同用户对各Schema及其下属对象的权限，从而赋予业务更多的灵活性。
从便捷性和资源共享效率上考虑，推荐使用Schema进行业务隔离。建议系统管理员创建Schema和Database，再赋予相关用户对应的权限。
1. 每个数据库包括一个或多个Schema。每个Schema包含表、视图、函数等其他类型的对象。
2. 用户要访问底层的对象，必须先被赋予上层对象的权限。
3. 用户要创建或者删除Schema，需要首先被授予Database的CREATE权限。
4. 用户要访问包含在Schema中的table1，需要首先被授予Database的CONNECT权限，再被授予Schema的USAGE权限，最后授予table1的SELECT权限。
了解更多请参见[DWS如何实现业务隔离](https://support.huaweicloud.com/dws_faq/dws_03_0200.html)。
图1权限分层   
![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001712379120.png "点击放大")
 #### 通过Grant语法进行表数据访问和修改的授权
**授权：**
DWS通过GRANT语法对角色和用户进行授权操作，普通用户如果要访问某张表，如果没有系统管理员dbadmin或者表的owner进行GRANT授权，是无法访问的，此默认机制有效地控制用户对数据的访问，防止数据泄露。
使用GRANT命令进行用户授权包括以下三种场景：
- 将**系统权限** 授权给角色或用户
  系统权限又称为用户属性，包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN和LOGIN。
  系统权限一般通过CREATE/ALTER ROLE语法来指定。其中，SYSADMIN权限可以通过GRANT/REVOKE ALL PRIVILEGE授予或撤销。但系统权限无法通过ROLE和USER的权限被继承，也无法授予PUBLIC。
  
- 将**数据库对象** 授权给角色或用户
  将数据库对象（表和视图、指定字段、数据库、函数、模式等）的相关权限授予特定角色或用户；
  GRANT命令将数据库对象的特定权限授予一个或多个角色。这些权限会追加到已有的权限上。
  DWS会将某些类型的对象上的权限授予PUBLIC。默认情况下，对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予PUBLIC，而以下这些对象的权限会授予PUBLIC：数据库的CONNECT权限和CREATE TEMP TABLE权限、函数的EXECUTE特权、语言和数据类型（包括域）的USAGE特权。当然，对象拥有者可以撤销默认授予PUBLIC的权限并专门授予权限给其他用户。为了更安全，建议在同一个事务中创建对象并设置权限，这样其他用户就没有时间窗口使用该对象。另外，这些初始的默认权限可以使用ALTER DEFAULT PRIVILEGES命令修改。
  
- 将**角色或用户的权限** 授权给其他角色或用户
  将一个角色或用户的权限授予一个或多个其他角色或用户。在这种情况下，每个角色或用户都可视为拥有一个或多个数据库权限的集合。
  当声明了WITH ADMIN OPTION，被授权的用户可以将该权限再次授予其他角色或用户，以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时，所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。
  数据库系统管理员可以给任何角色或用户授予/撤销任何权限。拥有CREATEROLE权限的角色可以授予或者撤销任何非系统管理员角色的权限。
  
了解更多请参见[GRANT](https://support.huaweicloud.com/sqlreference-dws/dws_06_0250.html)。
**撤销授权**
某个用户被授权获得相应的数据库对象权限后，如果后期不再需要该对象权限或由于权限管控，需要撤销授权，可通过REVOKE语法实现。
了解更多请参见[REVOKE](https://support.huaweicloud.com/sqlreference-dws/dws_06_0253.html)。
 #### 开启行级访问控制技术实现行级数据部分可见
在业务开发过程中，存在多个用户共同访问和维护同一张表的场景，需要针对不同用户设置不同行数据的访问权限。例如只允许用户A查看跟自己相关的行数据，即相对于表的管理员能看到全部表数据而言，用户A执行SELECT \* FROM table_name的时候，只能看到部分行数据，不能看到所有，以行级实现数据访问控制，对此DWS行级访问控制特性实现了这一功能。将数据库访问控制精确到数据表行级别，使数据库达到行级访问控制的能力。不同用户执行相同的SQL查询操作，读取到的结果是不同的。
![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001760378185.png "点击放大")
用户可以在数据表创建行访问控制(Row Level Security)策略，该策略是指针对特定数据库用户、特定SQL操作生效的表达式。当数据库用户对数据表访问时，若SQL满足数据表特定的Row Level Security策略，在查询优化阶段将满足条件的表达式，按照属性(PERMISSIVE \| RESTRICTIVE)类型，通过AND或OR方式拼接，应用到执行计划上。
行级访问控制的目的是控制表中行级数据可见性，通过在数据表上预定义Filter，在查询优化阶段将满足条件的表达式应用到执行计划上，影响最终的执行结果。当前受影响的SQL语句包括SELECT、UPDATE、DELETE。
了解更多请参见[行级访问控制](https://support.huaweicloud.com/devg-dws/dws_04_0061.html)。
 #### 使用数据脱敏进行列数据脱敏
DWS提供列级别的数据脱敏(Dynamic Data Masking)功能。针对某些敏感信息（如身份证号、手机号、银行卡号等），通过应用脱敏函数进行原始数据的变形改写，实现敏感隐私数据的可靠保护，从而增强产品在数据安全和隐私保护方面的能力。
![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001760338029.png "点击放大")
了解更多请参见[数据脱敏](https://support.huaweicloud.com/devg-dws/dws_04_0062.html)。
 #### 使用DWS内置函数进行数据加密
数据加密作为有效防止未授权访问和防护数据泄露的技术，在各种信息系统中广泛使用。作为信息系统的核心，DWS数仓也提供数据加密功能，包括透明加密和使用SQL函数加密。
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。
    
   
- 对称密码算法
  - gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod) 采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法，以keystr为密钥对encryptstr字符串进行加密，返回加密后的字符串。
    
  
  - gs_decrypt(decryptstr,keystr,cryptotype,cryptomode,hashmethod) 采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法，以keystr为密钥对decryptstr字符串进行解密，返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。
    
  
  - gs_encrypt_aes128(encryptstr,keystr) 以keystr为密钥对encryptstr字符串进行加密，返回加密后的字符串。keystr的长度范围为1\~16字节。
    
  
  - gs_decrypt_aes128(decryptstr,keystr) 以keystr为密钥对decryptstr字符串进行解密，返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。keystr不得为空。
    
   
了解更多请参见[实现数据列的加解密](https://support.huaweicloud.com/bestpractice-dws/dws_05_0092.html)。
 #### 通过审计日志可以查看哪些用户修改了业务数据
数据库审计日志记录着用户对业务数据的日常访问和修改记录，数据库管理员通过查看审计日志可以查看当前业务数据访问和修改情况，以提前识别数据泄露或数据被恶意篡改带来的风险。对于恶意篡改数据的用户，及时关闭其权限，确保业务安全。详情请参见[查看数据库审计日志](https://support.huaweicloud.com/mgtg-dws/dws_01_0183.html)。
 #### 遇到业务性能瓶颈时通过智能运维（自动Vacuum）干预
智能运维是DWS常驻运维工具，可帮助用户智能执行运维任务。智能运维会根据集群负载情况，选择合理时间窗、并发度完成用户指定的任务，在运维任务执行过程中，智能运维将时刻关注用户业务的变化，及时调整运维任务执行策略，以减轻对用户业务的影响。智能运维支持周期型和单次型任务的创建，执行时间窗可按照不同用户业务负载定制化。
数据库管理员可通过控制台界面配置以下任务，实现自动清理功能，详情参见[智能运维](https://support.huaweicloud.com/mgtg-dws/dws_01_1161.html)。
- 用户频繁创建、删除表，导致系统表膨胀严重，可对系统表执行Vacuum。
- 用户频繁执行UPDATE、DELETE语句，导致用户表膨胀严重，可对用户表执行Vacuum/Vacuum Full。
 
 #### 通过监控面板进行数据库健康度监控
数据库智能运维（DMS）是一个为DWS数据库提供多维度监控服务的系统，为客户数据库的快速、稳定运行保驾护航。该功能对业务数据库所使用磁盘、网络、OS指标数据，集群运行关键性能指标数据进行收集、监控、分析。通过综合收集到的多种类型指标，对数据库主机、实例、业务SQL进行诊断，及时暴露数据库中关键故障及性能问题，指导客户优化解决。详情请参见[数据库监控](https://support.huaweicloud.com/mgtg-dws/dws_01_00131.html)。
 #### 周期性备份业务数据
DWS支持集群级别的数据备份，以防止数据丢失，当前支持业务数据备份到OBS，详情请参见[快照概述](https://support.huaweicloud.com/mgtg-dws/dws_01_0151.html)。
 #### 开启跨可用区双集群容灾
一套集群部署在一个可用区内，当该可用区出现故障时，这套集群都会受到影响，此时集群级的备份恢复功能已无法满足数据安全的要求。为此，可以通过创建两套跨可用区的集群实现容灾管理。
容灾，即在另一个可用区（Region内）部署一个同构的DWS灾备集群，如果生产集群所处的地理位置发生自然灾害，或者集群内部出现了故障从而导致生产集群无法正常对外提供读写服务，那么灾备集群可以切换为生产集群，从而保障业务连续性。
详情请参见[容灾管理](https://support.huaweicloud.com/mgtg-dws/dws_01_00081.html)。
