暂无图片
暂无图片
13
暂无图片
暂无图片
暂无图片

OceanBase数据传输加密

OceanBase 2022-11-12
826

安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。OceanBase 数据库在原有的 TCP 通信上扩展支持 SSL/TLS 协议,解决通信加密的问题。

OceanBase 数据库从产品架构层面可以分为以下三个基本部分。

传输加密

其中采用两种协议进行通信:

  • MySQL 协议:驱动层 <=> 数据链路层,数据链路层 <=> DB 层之间的通信采用扩展的 MySQL 协议。

  • OB-RPC 协议:OBServer 与 OBServer 之间/OBServer 与 liboblog、ob_admin 等之间的通信采用 OBServer 自有的 RPC 协议通信。

其中数据链路层,DB 层的 OBServer、liboblog、ob_admin 等组件均支持 SSL/TLS 加密通信,底层均依赖 OpenSSL 或者第三方的 SSL 库,为业务提供安全的加密传输服务。

支持的私钥/证书加载方式

OBServer、liboblog、obadmin 等组件由于底层通信均依赖 Libeasy 库,因此支持的私钥/证书加载方式均相同,一种是本地文件模式,另一种是 BKMI 模式。

  • 本地文件模式

    将 CA 证书、用户证书、私钥放在 wallet 文件夹下,根据配置项开启时从该目录下读取加载,安全性较差。

  • BKMI 模式

    BKMI(基础密钥服务)可以理解为密钥、证书产生和托管的仓库,当需要加载时可以通过 BKMI 分配给用户( OBServer 等)的应用身份私钥,用户身份信息等通过 URL 访问的方式,从 BKMI 获取加密后的私钥,之后通过应用身份私钥解密解出应用私钥来进行加载配置,安全性较高。

开启方式

OBServer 传输加密的开启通过多个配置项配合使用。

  1. 指定私钥/证书/CA 证书的获取方式。

    本地文件模式

    alter system set ssl_external_kms_info = '
    {
    "ssl_mode":"file"
    }';
    

    或者

    alter system set ssl_external_kms_info = '';
    

    BKMI 模式

    alter system set ssl_external_kms_info = '
    {
    "ssl_mode":"bkmi",
    "kms_host":"http://xxx",  bkmi主站的url
    "root_cert": CA证书内容
    "private_key": bkmi分配给用户的应用身份私钥,用来解密从bkmi获取的加密的应用私钥
    "PRIVATE_KEY_PHRASE":"123456", bkmi分配给用户的应用身份私钥的解密密码
    "SCENE":"ANT", 应用场景
    "CALLER":"xxx", 进行服务调用的用户名,由bkmi分配
    "CERT_NAME":"xxx", 用户证书的名称
    "PRIVATE_KEY_NAME":"xxx", 用户私钥的名称
    "KEY_VERSION":"1"
    }';
    
  2. 配置对应协议的 SSL 使能。

    alter system set ssl_client_authentication = 'TRUE';
    配置为TRUE后,mysql通信ssl即时开启
    
  3. 配置 RPC 通信的 SSL 白名单,由于 OBServer 之间 TCP 连接都是长连接,因此需要重启 OBServer 后 RPC SSL 加密通信才能开启。

    rpc通信ssl需要配置白名单
    alter system set _ob_ssl_invited_nodes='ALL'; 整个集群都开启
    alter system set _ob_ssl_invited_nodes='123.12.21.12, 128.191.11.12'; 指定ip的observer开启
    ssl
    

OBServer 如何确定通信加密开启成功

最简单的方法是对 MySQL 端口和 RPC 端口进行抓包,查看是否开启加密,此外可以通过以下方式:

  • OBClient/MySQL 登陆 OBServer,系统租户检索oceanbase.__all_virtual_server_stat表的ssl_key_expired_time字段确认是否开启。

  • 该字段记录当前 OBServer 开启 SSL 时,当前 OBServer 使用的 SSL 证书过期时间, utc 时间,单位微秒。

    obclient> select svr_ip, svr_port,zone, ssl_key_expired_time, from_unixtime(ssl_key_expired_time/1000000) from oceanbase.__all_virtual_server_stat;
    +--------------+----------+-------+----------------------+---------------------------------------------+
    | svr_ip       | svr_port | zone  | ssl_key_expired_time | from_unixtime(ssl_key_expired_time/1000000) |
    +--------------+----------+-------+----------------------+---------------------------------------------+
    | 100.83.6.189 |    13212 | zone1 |           1871860075 | 2029-04-26 09:07:55                         |
    +--------------+----------+-------+----------------------+---------------------------------------------+
    1 row in set (0.00 sec)
    

检查 MySQL 端口是否开启 SSL

通过 MySQL/OBClient 登录,执行\s查看 SSL 字段的示例如下:

obclient> \s
--------------
obclient  Ver 1.1.8 Distrib 5.7.24, for Linux (x86_64) using  EditLine wrapper

Connection id:  3221506046
Current database: test
Current user:  root@xx.xx.xx.39
SSL:   Cipher in use is DHE-RSA-AES128-GCM-SHA256
Current pager:  less
Using outfile:  ''
Using delimiter: ;
Server version:  5.7.25 OceanBase 2.2.60 (r1-63cbd3084a3283523f09d6ba20795f77b95e046b) (Built Jun 30 2020 10:10:29)
Protocol version: 10
Connection:  xx.xx.xx.189 via TCP/IP
Server characterset: utf8mb4
Db     characterset: utf8mb4
Client characterset: utf8mb4
Conn.  characterset: utf8mb4
TCP port:  13213
Active   --------------

检查 RPC 端口是否开启 SSL

在 OBServer.log 中的日志,搜索关键字 "RPC connection accept" 查看 use_ssl = True 还是 False 判定是否 RPC SSL 开启成功。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论