一、需求背景
- 隱藏?cái)?shù)據(jù)庫的賬號(hào)和密碼
- 當(dāng) Debezium 連接器部署到 Kafka Connect 實(shí)例時(shí),有時(shí)需要對(duì) Connect API 的其他用戶隱藏?cái)?shù)據(jù)庫憑據(jù)。
二、Debezium connector注冊(cè)請(qǐng)求
讓我們回顧一下 MySQL Debezium connector的連接器注冊(cè)請(qǐng)求:
{
"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。更糟糕的是,任何有權(quán)訪問 Kafka Connect 集群及其 REST API 的人都可以發(fā)出 GET 請(qǐng)求來獲取連接器的配置,包括數(shù)據(jù)庫憑據(jù):
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"
}
如果一個(gè) Kafka Connect 集群由多個(gè)連接器/團(tuán)隊(duì)共享,那么出于安全原因,這種行為可能是不可取的。
三、實(shí)現(xiàn)Debezium連接器密鑰外部化
外部化期望至少有一個(gè) org.apache.kafka.common.config.provider.ConfigProvider 接口的實(shí)現(xiàn)類。
Kafka Connect 提供了從文件讀取機(jī)密的參考實(shí)現(xiàn) org.apache.kafka.common.config.provider.FileConfigProvider。可用的配置提供程序在 Kafka Connect 工作線程級(jí)別進(jìn)行配置(例如在 connect-distributed.properties 中),并從連接器配置中引用。
config.providers=file
config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider
連接器注冊(cè)請(qǐng)求將像這樣引用它:
{
"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} 表示應(yīng)該使用文件配置提供程序,讀取屬性文件 /secrets/mysql.properties 并從中提取用戶屬性。
文件配置提供程序可能是最簡(jiǎn)單的實(shí)現(xiàn),并且可以預(yù)期將會(huì)出現(xiàn)與密鑰存儲(chǔ)庫或身份管理系統(tǒng)集成的其他提供程序。值得注意的是,文件配置提供程序在 Kubernetes/OpenShift 部署中是令人滿意的,因?yàn)闄C(jī)密對(duì)象可以作為文件注入到集群 pod 中,從而被集群 pod 消耗。
我們創(chuàng)建了 Debezium 教程示例的一個(gè)版本,它演示了外部化機(jī)密的部署。請(qǐng)注意 Docker Compose 連接服務(wù)中的兩個(gè)環(huán)境變量:
- CONNECT_CONFIG_PROVIDERS=file
- CONNECT_CONFIG_PROVIDERS_FILE_CLASS=org.apache.kafka.common.config.provider.FileConfigProvider
這些環(huán)境變量作為 debezium/connect 映像的功能直接映射到 Kafka Connect 工作線程屬性中。文章來源:http://www.zghlxwxcb.cn/news/detail-563659.html
當(dāng)您發(fā)出 REST 調(diào)用來獲取連接器配置時(shí),您將看到敏感信息已被外部化并且對(duì)未經(jīng)授權(quán)的用戶屏蔽:文章來源地址http://www.zghlxwxcb.cn/news/detail-563659.html
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"
}
到了這里,關(guān)于Debezium日常分享系列之:使用 Debezium 連接器實(shí)現(xiàn)密鑰外部化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!