ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kafka 怎么用 Configuration Providers 从文件或环境变量读取敏感配置

Kafka 怎么用 Configuration Providers 从文件或环境变量读取敏感配置 Kafka 怎么用 Configuration Providers 从文件或环境变量读取敏感配置【免费下载链接】KafkaApache Kafka - A distributed event streaming platform项目地址: https://gitcode.com/GitHub_Trending/kafka4/kafkaBroker、客户端或 Connect 的 properties 文件里通常存放着 keystore 密码、SASL 凭据、数据库密码这类秘密直接以明文写进纳入版本控制的配置文件是一个安全隐患。Apache Kafka 的 Configuration Provider 机制就是为这个场景设计的把敏感值放到外部来源文件或环境变量中properties 文件里只保留一段引用模板运行时再由 provider 解析出真实值。本文给出内置FileConfigProvider从文件读取和EnvVarConfigProvider从环境变量读取的完整配置方法以及验证方式和安全限制。注册 Provider 的通用格式使用任何配置 provider 都是通过config.providers属性声明的支持用逗号分隔的别名列表挂多个 providerconfig.providersprovider1,provider2 config.providers.provider1.classcom.example.Provider1 config.providers.provider2.classcom.example.Provider2每个 provider 还可以接收自己的参数参数统一按下面的格式传递name和value替换为该 provider 实际支持的参数config.providers.provider_alias.param.namevalueKafka 在org.apache.kafka.common.config.provider包中内置了三个 providerFileConfigProvider、DirectoryConfigProvider 和 EnvVarConfigProvider。它们都实现了 ConfigProvider 接口这也是自定义 provider 需要实现的接口。主路径用 FileConfigProvider 从文件读取下面的完整示例来自官方文档场景是用 Kafka Connect 的 connector 从文件读取数据库认证凭据而不是把密码写进 connector 配置里。第 1 步创建凭据文件。文档示例创建了一个connector-credentials.properties文件dbUsernamemy-username dbPasswordmy-password其中my-username、my-password是文档示例值替换为你自己的实际凭据文件放在需要被读取的位置。第 2 步在 Kafka Connect 配置中声明 providerconfig.providersfileProvider config.providers.fileProvider.classorg.apache.kafka.common.config.provider.FileConfigProvider第 3 步在 connector 配置中用占位符引用文件里的属性。占位符语法是${别名:文件路径:属性名}下面的/path/to/connector-credentials.properties是文档占位路径替换成第 1 步文件的实际位置database.user${fileProvider:/path/to/connector-credentials.properties:dbUsername} database.password${fileProvider:/path/to/connector-credentials.properties:dbPassword}第 4 步安全加固用allowed.paths限制可访问路径。该参数接收逗号分隔的路径列表provider 只能访问列表内的路径不设置则所有路径都允许config.providers.fileProvider.param.allowed.paths/path/to/config1,/path/to/config2docs/security/security-model.md明确建议对基于文件的 provider 要把allowed.paths设置为实际存放秘密的特定目录防止恶意或错误的配置诱使 provider 读取主机上其他位置的文件。上面的路径同样是示例值按实际部署位置替换。如何判断配置生效运行时配置 provider 会读取文件并从中提取值——也就是说 connector 配置中的模板字符串会被解析为文件中的真实凭据connector 用解析后的值连接数据库。在 Kafka Connect 中还有一个可核对的行为直接使用ConfigProvider引用时写进config.storage.topic的只有模板字符串形如${alias:fields}而不是解析后的值秘密本身不会落进这个 topic。但要注意这并不隐藏秘密——任何能访问 Connect REST API 的人只要知道有效的模板字符串通常就能通过 REST API 取到解析后的值。provider 的隔离程度只取决于它前面的 REST API 的访问控制。可选分支用 EnvVarConfigProvider 从环境变量读取如果应用跑在容器里文档指出EnvVarConfigProvider适合用来从环境变量加载证书或 JAAS 配置这些环境变量通常由 secrets 映射而来例如 Kubernetes 把 Secret 挂载为环境变量后由 provider 读取。它直接从指定环境变量读取不需要额外参数config.providersenvVarProvider config.providers.envVarProvider.classorg.apache.kafka.common.config.provider.EnvVarConfigProvider同样有访问收窄参数allowlist.pattern接收一个正则表达式只有名称匹配该正则的环境变量才允许被读取config.providers.envVarProvider.param.allowlist.pattern^MY_ENVAR1_.*在配置中用下面的占位符语法引用enVar_name替换为实际环境变量名${envVarProvider:enVar_name}可选分支DirectoryConfigProvider 与自定义 ProviderDirectoryConfigProvider从指定目录中的文件读取配置目录中每个文件代表一个 key文件内容就是 value适合把多个配置拆成独立文件来组织。它同样支持allowed.paths参数收窄可访问目录占位符语法是${dirProvider:path_to_file:file_name}配置方式与上面两个 provider 一致class 为org.apache.kafka.common.config.provider.DirectoryConfigProvider。自定义 provider用于内置来源都不满足的场景实现ConfigProvider接口核心方法是按 path 取值的get打包成 JAR 加入 classpath再在配置中引用该类的完全限定名参数通过config.providers.alias.param.name传入。如果 provider 用于 Kafka Connect接口源码 的说明指出 Connect 通过 JavaServiceLoader机制发现实现因此 JAR 中还应包含META-INF/services/org.apache.kafka.common.config.provider.ConfigProvider服务提供程序配置文件。边界与限制以下几点来自docs/security/security-model-connect.md的 Secrets in Configuration 一节在使用时需要注意Config providers 通过共享的 REST API 解析。任何能猜到或枚举 provider 别名的调用方都可以解析出完整值所以 provider 只和它前面的 REST API 一样安全。模板字符串不等于保密。config.storage.topic中只存模板字符串但知道模板字符串的人通常能通过 REST API 拿到解析值。对基于文件的 provider 未设置allowed.paths时默认允许访问所有路径这在安全上是一个应主动收窄的默认行为。完成以上配置后判断标准是properties 文件中不再出现明文凭据只有占位符模板运行时 connector 能用文件或环境变量中的真实值完成认证且allowed.paths或allowlist.pattern已限定到存放秘密的最小范围。更多细节可参考 Configuration Providers 文档 与 Kafka 安全模型。【免费下载链接】KafkaApache Kafka - A distributed event streaming platform项目地址: https://gitcode.com/GitHub_Trending/kafka4/kafka创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表