访问安全
权限体系
计算节点有两类用户,一类是计算节点数据库用户,用于操作数据,执行SELECT,UPDATE,DELETE,INSERT等SQL语句。另一类是关系集群数据库可视化管理平台用户,用于管理配置信息。此章节将着重介绍计算节点用户相关内容。
基础权限
计算节点数据库用户必须被赋予逻辑库的权限,才能访问逻辑库。计算节点提供了如下操作权限:
权限类型 | 可执行的SQL语句 |
---|---|
CREATE | CREATE TABLE,CREATE INDEX |
DROP | DROP TABLE,DROP INDEX,TRUNCATE TABLE,RENAME TABLE |
ALTER | ALTER TABLE,RENAME TABLE |
SELECT | SELECT,INSERT...SELECT |
UPDATE | UPDATE |
DELETE | DELETE,REPLACE |
INSERT | INSERT,REPLACE,INSERT...SELECT |
SUPER | 管理端的语句, /!HotDB:dnid=?/ |
FILE | SELECT...INTO OUTFILE,LOAD DATA |
SUPER权限说明:
具有SUPER权限的user,可以登录计算节点的3325端口,可执行管理端的所有SQL语句;否则,不能登录管理端与执行管理端的SQL语句。
拥有SUPER权限的user,可在3323端口执行HINT语句。如:
/*!hotdb:dnid=1*/select * from table;
权限范围:
为计算节点数据库用户赋予权限时,除SUPER权限外,可指定user对逻辑库或表的操作权限。权限范围分为全局权限、逻辑库权限及表权限:
-
全局权限:拥有全局权限的user对所有逻辑库下的所有对象都拥有指定的权限。例如:勾选全局权限:SELECT,UPDATE,INSERT,CREATE,点击保存则当前用户可对所有逻辑库及表进行S/U/I/C操作。
-
逻辑库权限:拥有逻辑库权限的user对该逻辑库下的所有对象拥有指定权限。
-
表权限:表权限又分为表允许权限和表拒绝权限。拥有表允许权限的用户对该表拥有勾选的权限;拥有表拒绝权限的用户将拒绝勾选的权限,对于没有勾选的权限,需要在表允许权限下勾选后方能拥有。拥有表拒绝权限的用户对该表拥有除了勾选的权限以外的其他所有权限;例如:勾选表拒绝权限:SELECT,UPDATE,INSERT,CREATE,点击保存则当前用户不可对该表进行S/U/I/C操作,若该用户勾选了表允许权限:DELETE,DROP,则当前用户拥有DELETE和DROP权限。
SUPER权限不指定特定逻辑库。只有持有SUPER权限的user可以执行管理端的语句,管理端具体功能可参考管理端信息监控章节。
权限之间相互独立,拥有表的UPDATE权限,并不代表拥有该表的SELECT权限;拥有SUPER权限,并不代表拥有表的操作权限。另,TRIGGER相关的权限目前未单独维护,遵循权限规则为:CREATE TRIGGER 需要 CREATE 权限、DROP TRIGGER 需要 DROP权限、TRIGGER内部语句不验证权限、DEFINER 相关全去除、SHOW TRIGGERS时相关字段为当前用户。
行控制权限
计算节点支持通过手动修改配置库中行权限控制表hotdb_user_row_privilege的方式,为数据库用户增加行控制权限。
1.hotdb_user_row_privilege表结构如下:
-
username为用户名,host为主机名;这两列与计算节点配置库中hotdb_user表关联,用于确认需要配置行权限的数据库用户。用户名和主机名必须与hotdb_user表内数据完全对应;
-
table_scope用于确认需要配置行权限的库表。支持四种填写格式:
-
.:所有库下的所有表;
-
db_name.*:某库下的所有表,db_name为逻辑库名;
-
*.tbl_name:所有库下的某张表,tbl_name为表名;
-
db_name.tbl_name:某库下的某表;
-
-
where_condition用于控制用户可以访问的行数据条件,可以是单个条件也可以是多个条件,多个条件用and链接;
-
enable默认为1,表示开启行控制权限;可以手动修改为0,则停用该权限;
-
create_time和update_time分别为创建该权限的时间和更新时间。
2.手动配置行控制权限示例:
- 登陆计算节点配置库
mysql -uhotdb_config -pDRDS_config@2013 -P3306 -h<计算节点配置库IP地址>
use hotdb_config;
- 手动插入表数据,为数据库用户配置表的行控制权限。插入规则后,需动态加载生效
INSERT INTO hotdb_user_row_privilege (username, host, table_scope, where_condition) VALUES (‘用户名’, ‘主机名’, ‘逻辑库名.表名’, ‘行控制条件’);示例:
mysql> insert into hotdb_user_row_privilege (username, host, table_scope, where_condition) values ('user_row', 'host', 'test_database.customer', 'id>50');
-- 表示user_row@%用户对于test_database库中的customer表,只拥有id大于60的行的权限。
-
可以通过修改enable字段的值,停用或启用行控制权限。修改后需要动态加载生效
-
可以在3323服务端口执行show hotdb grants for ‘用户名’@‘主机名’查看数据库用户已配置的行控制权限。
3.注意事项:
-
行控制条件的内容必须符合MySQL语法规则,存在error in your SQL syntax的会被自动跳过不生效;
-
当配置的行控制条件存在语法问题时,动态加载后计算节点日志hotdb.log会输出warning日志。
通信认证
简介:SSL(Secure Socket Layer 安全套接层)是HTTPS下的一个协议加密层,有1、2、3三个版本,目前只使用SSL 3.0。IETF对SSL进行标准化后,在3.0版本的基础上发布了TLS1.0(Transport Layer Security 安全传输层协议)。TLS协议目前有1.0、1.1、1.2、1.3四个版本。支持SSL加密连接方式登录计算节点。
生成TLS秘钥
生成证书和密钥文件
可参考官方文档生成自签名的秘钥。例如:可以用自带的命令mysql_ssl_rsa_setup来生成证书和密钥文件。
mysql_ssl_rsa_setup --datadir=/usr/local/crt/
其中,客户端需要的秘钥有:ca.pem、client-cert.pem、client-key.pem;
服务端需要的秘钥有:ca.pem、server-cert.pem、server-key.pem;
注意
自带命令生成的证书无法进行CA认证,参考链接:https://dev.mysql.com/doc/refman/5.7/en/using-encrypted-connections.html
如果需要生成能够进行CA认证的自签名证书,需要使用openssl工具,可参考下列步骤进行:
1.生成CA根证书私钥:openssl genrsa 2048 > ca-key.pem
2.生成CA根证书:openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem,3.注意信息填写步骤中Common Name最好填入有效域名,并且不能与签发的证书中的Common Name一样,这里我们填写127.0.0.1
生成服务器证书请求文件:openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem,注意信息填写步骤中Common Name需要填入计算节点所监听的IP地址/域名,客户端将用此IP进行服务的连接,注意不能和CA证书中的信息一样
4.用openssl rsa命令处理秘钥以删除密码:openssl rsa -in server-key.pem -out server-key.pem
5.为服务端生成自签名证书:openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
6.生成客户端证书请求文件:openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem,注意信息填写步骤中Common Name不能和CA证书中的信息一样
7.用openssl rsa命令处理秘钥以删除密码:openssl rsa -in client-key.pem -out client-key.pem
8.为客户端生成自签名证书:openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
生成server.jks文件
对于计算节点来说,需要将秘钥转为Java标准的KeyStore文件。即下文中提到的.jks。生成步骤为:
1.先使用openssl工具将cert和key文件合成pfx文件:
本次样例中密码输入SDcrtest(程序自带的密钥文件其密码为hotdb.com,可直接使用,此处示例为需要另外重新生成秘钥时使用)
openssl pkcs12 -export -out server.pfx -inkey server-key.pem -in server-cert.pem -CAfile ca.pem
2.用Java提供的keytool工具将pfx转换为jks文件:
keytool -importkeystore -srckeystore server.pfx -destkeystore server.jks -srcstoretype PKCS12
配置TLS秘钥
生成好TLS秘钥后,将相应的秘钥文件分别传输到计算节点服务端和客户端所在的服务器上,并在计算节点中按要求配置如下三个参数之后才能使用:
<property name="enableSSL">false</property><!-- 是否开启SSL连接功能(Enable SSL connection or not) -->
参数说明:true代表开启SSL功能,false代表关闭SSL功能,默认值为false
<property name="keyStore">/server.jks</property><!-- 用于TLS连接的数据证书.jks文件的路径(Path to the data certificate .jks file for TLS connection) -->
参数说明: 计算节点在conf目录下默认提供了一套server.jks和client相关的pem文件,其密码为hotdb.com,可用于进行简单的连接测试。当选择使用自己生成 TLS证书或者使用付费的TLS证书进行连接,需根据实际的路径和名称来填写。例如:/usr/local/crt/server.jks。
<property name="keyStorePass">BB5A70F75DD5FEB214A5623DD171CEEB</property><!-- 用于TLS连接的数据证书.jks文件的密码(Password of the data certificate .jks file for TLS connection) -->参数说明:程序自带的密钥文件中密码是hotdb.com,通过select hex(aes_encrypt('hotdb.com',unhex(md5('Hotpu@2013#shanghai#2017'))))s加密得到默认keyStorePass:BB5A70F75DD5FEB214A5623DD171CEEB。若使用自己生成的密钥文件,需根据实际输入的密码来填写。例如:前文输入密码SDcrtest,通过select hex(aes_encrypt('SDcrtest',unhex(md5('Hotpu@2013#shanghai#2017'))))查询到keyStorePass值,然后填写C43BD9DDE9C908FEE7683AED7A301E33。
参数的修改无需重启计算节点服务, 动态加载时会重新读取server.jks文件。若SSL相关逻辑初始化失败,动态加载不会失败,但后续的SSL连接无法正常建立,非SSL连接不受影响。
TLS连接登录
客户端方式
使用MySQL协议的客户端,可以使用如下方式指定秘钥文件进行连接:
mysql -ujing01 -p123456 -h192.168.240.117 -P3323 --ssl-ca=/usr/local/crt/ca.pem --ssl-cert=/usr/local/crt/client-cert.pem --ssl-key=/usr/local/crt/client-key.pem --ssl-mode=verify_ca
JDBC方式
对于JDBC来说,也需要相应的秘钥文件。操作方式可参考官方手册,这里可通过两种方式:
1.可通过将CA导入Java信任库的方式:
keytool -importcert -alias MySQLCACert -file ca.pem -keystore truststore
则JDBC连接时使用truststore文件, 例如:
jdbc:mysql://192.168.240.117:3323/smoketest?clientCertificateKeyStoreUrl=file:/usr/local/crt/truststore&clientCertificateKeyStorePassword=hotdb.com&verifyServerCertificate=true
2.可通过使用证书的方式:
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -out client-keystore.p12
keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 -destkeystore keystore -deststoretype JKS
则JDBC连接时使用keystore文件, 例如:
jdbc:mysql://192.168.240.117:3323/smoketest?clientCertificateKeyStoreUrl=file:/usr/local/crt/keystore&clientCertificateKeyStorePassword=hotdb.com
Navicat等类似的客户端方式
对于Navicat等类似的客户端, 可以在客户端设置中配置相关的文件位置进行连接
注意
对于某些版本的Navicat可能在勾选验证CA证书名后无法连接,比如提示错误:“2026 SSL connection error:
ASN: bad other signature
confirmation”,这可能是该版本的动态链接库不兼容,需要将其目录下的libmysql.dll替换为MySQL
Workbench中的同名文件,或者更新到更高的版本,参考链接。