hhdb数据库介绍(9-4)

ops/2024/11/14 7:56:18/

访问安全

权限体系

计算节点有两类用户,一类是计算节点数据库用户,用于操作数据,执行SELECT,UPDATE,DELETE,INSERT等SQL语句。另一类是关系集群数据库可视化管理平台用户,用于管理配置信息。此章节将着重介绍计算节点用户相关内容。

基础权限

计算节点数据库用户必须被赋予逻辑库的权限,才能访问逻辑库。计算节点提供了如下操作权限:

权限类型可执行的SQL语句
CREATECREATE TABLE,CREATE INDEX
DROPDROP TABLE,DROP INDEX,TRUNCATE TABLE,RENAME TABLE
ALTERALTER TABLE,RENAME TABLE
SELECTSELECT,INSERT...SELECT
UPDATEUPDATE
DELETEDELETE,REPLACE
INSERTINSERT,REPLACE,INSERT...SELECT
SUPER管理端的语句, /!HotDB:dnid=?/
FILESELECT...INTO OUTFILE,LOAD DATA

SUPER权限说明:

具有SUPER权限的user,可以登录计算节点的3325端口,可执行管理端的所有SQL语句;否则,不能登录管理端与执行管理端的SQL语句。

拥有SUPER权限的user,可在3323端口执行HINT语句。如:

sql">/*!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;
  • 手动插入表数据,为数据库用户配置表的行控制权限。插入规则后,需动态加载生效
sql">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中的同名文件,或者更新到更高的版本,参考链接。


http://www.ppmy.cn/ops/132918.html

相关文章

15分钟学 Go 第 47 天 :并发进阶——深入了解Go语言的并发模型!

第47天的学习&#xff1a;并发进阶——深入了解Go语言的并发模型&#xff01; 目录 Go并发模型简介Goroutines深度讲解Channels的进阶使用Select语句详解并发模型设计模式实战案例分析常见问题与解决方案 1. Go并发模型简介 Go语言以其内置的并发支持而闻名。通过轻量级的g…

简单介绍下 Java 中的 @Validated 和 @Valid 注解的区别?

文章目录 Valid&#xff1a;专注单个对象的深度验证适用场景使用示例小结 Validated&#xff1a;聚焦接口分组的批量验证适用场景使用示例小结 主要区别总结如何选择&#xff1f;总结推荐阅读文章 在 Java 开发中&#xff0c;为了确保输入数据符合我们的要求&#xff0c;少不了…

新手 Vue 项目运行

前言&#xff1a;前面讲了我们已经将spingboot项目运行起来了&#xff0c;现在我们只需将后台管理的Vue项目运行起来即可完成整个项目。 在运行vue项目之前&#xff0c;请先运行springboot项目&#xff0c;运行步骤请看&#xff1a;运行Springboot Vue 项目_springbootvue项目…

Rollup failed to resolve import “destr“ from ***/node_modules/pinia-plugin-pers

在使用uni-appvuu3piniapinia-plugin-persistedstate开发中&#xff0c; 使用pinia-plugin-persistedstate 一直在报错&#xff0c;其实代码也是比较简单的&#xff0c; import { createPinia } from pinia // 创建 pinia 实例 const pinia createPinia(); import piniaPlugi…

将vscode的终端改为cygwin terminal

现在终端是默认的power shell&#xff0c;没有显示cygwin 接下来选择默认配置文件 找到cygwin的选项即可 然后提示可能不安全什么的&#xff0c;点是&#xff0c;就有了

Java Lambda表达式

Java Lambda 表达式是从 Java 8 开始引入的一个重要特性&#xff0c;它们简化了函数式编程&#xff0c;并且显著减少了代码长度和复杂度。本文将详细介绍 Java Lambda 表达式的概念、语法、用途以及最佳实践。 什么是 Java Lambda 表达式&#xff1f; Java Lambda 表达式是一…

spark的学习-05

SparkSql 结构化数据与非结构化数据 结构化数据就类似于excel表中的数据&#xff08;统计的都是结构化的数据&#xff09;一般都使用sparkSql处理结构化的数据 结构化的文件&#xff1a;JSON、CSV【以逗号分隔】、TSV【以制表符分隔】、parquet、orc 结构化的表&#xff1a;…

STM32解锁

1.flash 全为0或者无法读取 PDR AA设置为BB -> 应用 1.PROT_AREA_START1 值设置为0xff 2.DMEP1取消勾选 1.PROT_AREA_START2 值设置为0xff 2.DMEP2取消勾选 PDR BB设置为AA -> 应用 完成解锁