首页 > 其他分享 >Debezium日常分享系列之:使用 Debezium 连接器实现密钥外部化

Debezium日常分享系列之:使用 Debezium 连接器实现密钥外部化

时间:2023-09-11 10:05:15浏览次数:35  
标签:database kafka connector inventory 连接器 mysql Debezium 密钥



Debezium日常分享系列之:使用 Debezium 连接器实现密钥外部化

  • 一、需求背景
  • 二、Debezium connector注册请求
  • 三、实现Debezium连接器密钥外部化


一、需求背景

  • 隐藏数据库的账号和密码
  • 当 Debezium 连接器部署到 Kafka Connect 实例时,有时需要对 Connect API 的其他用户隐藏数据库凭据。

二、Debezium connector注册请求

让我们回顾一下 MySQL Debezium connector的连接器注册请求:

{
    "name": "inventory-connector",
    "config": {
        "connector.class": "io.debezium.connector.mysql.MySqlConnector",
        "tasks.max": "1",
        "database.hostname": "mysql",
        "database.port": "3306",
        "database.user": "debezium",
        "database.password": "dbz",
        "database.server.id": "184054",
        "database.server.name": "dbserver1",
        "database.whitelist": "inventory",
        "database.history.kafka.bootstrap.servers": "kafka:9092",
        "database.history.kafka.topic": "schema-changes.inventory"
    }
}

用户名和密码以纯字符串形式传递给 API。更糟糕的是,任何有权访问 Kafka Connect 集群及其 REST API 的人都可以发出 GET 请求来获取连接器的配置,包括数据库凭据:

curl -s http://localhost:8083/connectors/inventory-connector | jq .
{
  "name": "inventory-connector",
  "config": {
    "connector.class": "io.debezium.connector.mysql.MySqlConnector",
    "database.user": "debezium",
    "database.server.id": "184054",
    "tasks.max": "1",
    "database.hostname": "mysql",
    "database.password": "dbz",
    "database.history.kafka.bootstrap.servers": "kafka:9092",
    "database.history.kafka.topic": "schema-changes.inventory",
    "name": "inventory-connector",
    "database.server.name": "dbserver1",
    "database.whitelist": "inventory",
    "database.port": "3306"
  },
  "tasks": [
    {
      "connector": "inventory-connector",
      "task": 0
    }
  ],
  "type": "source"
}

如果一个 Kafka Connect 集群由多个连接器/团队共享,那么出于安全原因,这种行为可能是不可取的。

三、实现Debezium连接器密钥外部化

外部化期望至少有一个 org.apache.kafka.common.config.provider.ConfigProvider 接口的实现类。

Kafka Connect 提供了从文件读取机密的参考实现 org.apache.kafka.common.config.provider.FileConfigProvider。可用的配置提供程序在 Kafka Connect 工作线程级别进行配置(例如在 connect-distributed.properties 中),并从连接器配置中引用。

config.providers=file
config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider

连接器注册请求将像这样引用它:

{
    "name": "inventory-connector",
    "config": {
        "connector.class": "io.debezium.connector.mysql.MySqlConnector",
        "tasks.max": "1",
        "database.hostname": "mysql",
        "database.port": "3306",
        "database.user": "${file:/secrets/mysql.properties:user}",
        "database.password": "${file:/secrets/mysql.properties:password}",
        "database.server.id": "184054",
        "database.server.name": "dbserver1",
        "database.whitelist": "inventory",
        "database.history.kafka.bootstrap.servers": "kafka:9092",
        "database.history.kafka.topic": "schema-changes.inventory"
    }

这里,占位符 ${file:/secrets/mysql.properties:user} 表示应该使用文件配置提供程序,读取属性文件 /secrets/mysql.properties 并从中提取用户属性。

文件配置提供程序可能是最简单的实现,并且可以预期将会出现与密钥存储库或身份管理系统集成的其他提供程序。值得注意的是,文件配置提供程序在 Kubernetes/OpenShift 部署中是令人满意的,因为机密对象可以作为文件注入到集群 pod 中,从而被集群 pod 消耗。

我们创建了 Debezium 教程示例的一个版本,它演示了外部化机密的部署。请注意 Docker Compose 连接服务中的两个环境变量:

- CONNECT_CONFIG_PROVIDERS=file
- CONNECT_CONFIG_PROVIDERS_FILE_CLASS=org.apache.kafka.common.config.provider.FileConfigProvider

这些环境变量作为 debezium/connect 映像的功能直接映射到 Kafka Connect 工作线程属性中。

当您发出 REST 调用来获取连接器配置时,您将看到敏感信息已被外部化并且对未经授权的用户屏蔽:

curl -s http://localhost:8083/connectors/inventory-connector | jq .
{
  "name": "inventory-connector",
  "config": {
    "connector.class": "io.debezium.connector.mysql.MySqlConnector",
    "database.user": "${file:/secrets/mysql.properties:user}",
    "database.server.id": "184054",
    "tasks.max": "1",
    "database.hostname": "mysql",
    "database.password": "${file:/secrets/mysql.properties:password}",
    "database.history.kafka.bootstrap.servers": "kafka:9092",
    "database.history.kafka.topic": "schema-changes.inventory",
    "name": "inventory-connector",
    "database.server.name": "dbserver1",
    "database.whitelist": "inventory",
    "database.port": "3306"
  },
  "tasks": [
    {
      "connector": "inventory-connector",
      "task": 0
    }
  ],
  "type": "source"
}


标签:database,kafka,connector,inventory,连接器,mysql,Debezium,密钥
From: https://blog.51cto.com/u_12080573/7432189

相关文章

  • Debezium系列之:监控 Debezium 实例
    Debezium系列之:监控Debezium实例一、概述二、实现步骤三、执行四、打开GrafanaUI五、关闭集群DebeziumJMX相关的技术博客:Debezium系列之:安装jmx导出器监控debezium指标Debezium系列之:为Debezium集群JMX页面增加监控,JMX页面出现异常时发送飞书告警,确保任务能够获取debezium集......
  • Debezium系列之:在 Kubernetes 上部署 Debezium
    这Debezium系列之:在Kubernetes上部署Debezium一、概述二、先决条件三、为数据库创建Secrets四、部署ApacheKafka五、部署数据源六、部署Debezium连接器七、创建Debezium连接器八、验证部署K8s相关知识可以阅读博主以下几篇技术博客:K8s系列之:搭建高可用K8sv1.23.5集群详......
  • Debezium系列之:获取Oracle JDBC驱动程序和XStream API文件
    Debezium系列之:获取OracleJDBC驱动程序和XStreamAPI文件一、背景二、详细步骤1.下载OracleClient包2.解压缩3.复制ojdbc8.jar和xstreams.jar文件4.创建环境变量三、XStream连接器属性一、背景DebeziumOracle连接器需要OracleJDBC驱动程序(ojdbc8.jar)才能连接到Oracl......
  • Debezium系列之:Debezium logging
    Debezium系列之:Debeziumlogging一、概述二、日志记录概念三、了解默认日志记录配置四、配置日志记录1.通过配置记录器设置日志记录级别2.使用KafkaConnectRESTAPI动态设置日志记录级别3.使用映射的诊断上下文设置日志记录级别五、配置Debezium容器镜像中的日志级别Debezi......
  • Debezium系列之:发布Debezium 2.3.0.Final
    Debezium系列之:发布Debezium2.3.0.Final一、重大变化1.PostgreSQL/MySQL安全连接更改2.JDBC存储编码更改二、新功能和改进1.DebeziumServer支持K8s2.新的通知子系统3.新的可扩展信号子系统4.JMX信号和通知集成5.新的JDBC存储子系统6.PostgreSQL流式传输的恰好一次传送7.......
  • Debezium系列之:Debezium 通知
    Debezium系列之:Debezium通知一、概述二、Debezium通知格式三、可用的通知四、启用Debezium通知五、访问DebeziumJMX通知六、自定义通知渠道七、配置自定义通知渠道八、Debezium核心模块依赖项九、部署自定义通知渠道十、配置连接器以使用自定义通知通道一、概述Debezium......
  • debezium报错:no longer available on the server. Reconfigure the connector to use
    debezium报错:nolongeravailableontheserver.Reconfiguretheconnectortouseasnapshotwhenneede完整报错如下:-“trace”:"io.debezium.DebeziumException:TheconnectoristryingtoreadbinlogstartingatSourceInfo[currentGtid=null,currentBinlogFilename......
  • debezium报错:Caused by: io.debezium.DebeziumException:whose schema isn‘t known t
    debezium报错:Causedby:io.debezium.DebeziumException:whoseschemaisn’tknowntothisconnector“trace”:"org.apache.kafka.connect.errors.ConnectException:Anexceptionoccurredinthechangeeventproducer.Thisconnectorwillbestopped.Causedby:io.......
  • 密码协议学习笔记(2):密钥交换协议
    密钥交换协议:设计密钥交换协议的目的是在多个用户之间安全地协商出一个共享的会话密钥(用于对称加密协议).博主注:该类协议要求保证在可窃听信道的通信中密钥的安全,而在可篡改信道的通信中,密钥被篡改时可以被识别.Diffie-Hellman密钥交换协议:通信双方Alice,Bob约定素数阶......
  • 482. 密钥格式化
    链接https://leetcode.cn/problems/license-key-formatting/description/思路字符串处理,没啥好说的...代码classSolution:deflicenseKeyFormatting(self,s:str,k:int)->str:valid_len,valid_s=self.get_length(s)first_len=valid_len%......