更新时间:2024-12-24 GMT+08:00

ClickHouse安全通道加密

您可以通过创建集群开启加密通道,实现数据加密传输。此章节介绍如何开通ClickHouse安全通道。

打开安全通道操作步骤

  1. 登录表格存储服务管理控制台。
  2. 单击管理控制台左上角的,选择区域。
  3. 单击右上角的购买集群按钮,进入“购买集群”页面。
  4. 完成其他配置后,查看安全通道加密按钮是否开启,默认开启。

    图1 安全通道
    • 关闭https会给企业服务带来风险。
    • 创建集群开启https选项,后续无法关闭。
    • 创建集群未开启https选项,后续无法开启。

  5. 配置好参数,单击“立即购买”。
  6. 进入“规格详情”页面,确认集群规格订单信息,单击“提交”,成功提交集群创建任务,集群创建成功后,进入详情页面查看通道开启状态。

打开安全和非安全通道步骤

  1. 登录表格存储服务管理控制台。
  2. 单击管理控制台左上角的,选择区域。
  3. 单击右上角的购买集群按钮,进入“购买集群”页面。
  4. 配置好参数,单击“立即购买”。
  5. 进入“规格详情”页面,确认集群规格订单信息,单击“提交”,成功提交集群创建任务。
  6. 集群创建成功后,进入详情页面打开“同时开启安全通道和非安全通道”按钮,弹出确认框,确认无误后,单击“确定”。

    • 在详情页面开启安全通道后,集群会重启。
    • 安全通道和非安全通道同时开启后无法关闭。

安全集群连接步骤

  1. 安全集群创建后,打开详情页面,下载证书。
  2. 下载证书后,连接客户端指定配置文件。

    ./clickhouse client --host 集群内网地址 --port port --user admin --password password --secure --config-file /root/config.xml

    配置文件。

    <config>
        <secure>true</secure>
        <openSSL>
          <client>
            <caConfig>/etc/ssl/certificate.crt</caConfig>
          </client>
        </openSSL>
    </config>
    • <caConfig>/etc/ssl/certificate.crt</caConfig>指放证书的路径。
    • root指的是配置文件的存放路径。
    • 证书下载限流,一分钟只能下载一次。

HTTPS连接步骤

  1. 安全集群创建后,打开详情页面,下载证书。
  2. 下载证书后,自定义存放路径。
  3. 通过https协议执行样例sql。

    echo 'select 1' | curl -H 'X-ClickHouse-User: user' -H 'X-ClickHouse-Key: password' --cacert /clickhouse/client/client/bin/certificate.crt 'https://host:port/?' --data-binary @-
    • select 1:执行的sql语句。
    • user:用户名。
    • password:创集群时创建的密码。
    • /clickhouse/client/client/bin/certificate.crt:指证书存放路径。
    • host、port:host指的是内网地址,port指的是https协议端口。

JDBC连接

public void run()
        throws InterruptedException {
    final ClickHouseProperties clickHouseProperties = new ClickHouseProperties();
    // 认证用的密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
    // 本示例以密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量CK_PASSWORD
    String password = System.getenv("CK_PASSWORD");
    clickHouseProperties.setSslRootCertificate("/etc/ssl/certificate.crt");
    clickHouseProperties.setSsl(true);
    clickHouseProperties.setSslMode("strict");
    clickHouseProperties.setUser("test");
    clickHouseProperties.setPassword(password);
    clickHouseProperties.setSocketTimeout(2 * 3600 * 1000);
    final BalancedClickhouseDataSource dataSource = new BalancedClickhouseDataSource("xxxx.mycloudtable.com:8443/default?ssl=true", clickHouseProperties);
    try {
        final ClickHouseConnection conn = dataSource.getConnection();
        conn.createStatement().executeQuery("select now()");
    } catch (Throwable e) {
        e.printStackTrace();
    }
}

clickHouseProperties.setSslRootCertificate("/etc/ssl/certificate.crt");中的/etc/ssl/certificate.crt指存放证书路径。