第 13 章 使用 vault 获取 secret
红帽构建的 Keycloak 目前提供 Vault SPI 的两个开箱即用实现:基于纯文本文件的 vault 和基于 Java KeyStore 的 vault。
要从密码库获取 secret,而不是直接输入它,请在适当的字段中输入以下特殊设计的字符串:
${vault.key}
其中,键是
密码库识别的 secret 的名称。
为了防止 secret 泄漏跨域,红帽构建的 Keycloak 会将域名与从 vault 表达式获取 的密钥
合并。此方法意味着 密钥
不会直接映射到密码库中的条目,而是根据用于组合键和域名称的算法创建最终条目名称。如果是基于文件的库,此类组合反映了特定文件名,对于基于 Java KeyStore 的库,它是特定的别名名称。
您可以在以下字段从 vault 获取 secret:
- SMTP 密码
- 在 realm SMTP 设置中
- LDAP 绑定凭证
- 在基于 LDAP 的用户联邦的 LDAP 设置中。
- OIDC 身份提供程序 secret
- 在身份提供程序 OpenID Connect Config中的 Client Secret 中
13.1. 密钥解析器
所有内置供应商都支持配置密钥解析器。密钥解析器实施算法或策略,用于将域名与从 ${vault.key}
表达式获取的键合并到用于从密码库检索 secret 的最终条目名称。Red Hat build of Keycloak 使用 keyResolvers
属性来配置供应商使用的解析器。该值是一个以逗号分隔的解析器名称列表。files-plaintext
供应商配置示例如下:
kc.[sh|bat] start --spi-vault-file-key-resolvers=REALM_UNDERSCORE_KEY,KEY_ONLY
解析器会按照您在配置中声明的顺序运行相同的顺序。对于每个解析器,红帽构建的 Keycloak 使用解析器生成的最后一个条目名称,它将 realm 与 vault 密钥合并,以搜索 vault 的 secret。如果红帽构建的 Keycloak 找到 secret,它会返回 secret。如果没有,Red Hat build of Keycloak 会使用下一个解析器。这个搜索会一直进行,直到红帽构建的 Keycloak 找到非空的 secret 或不使用解析器。如果红帽构建的 Keycloak 找不到 secret,红帽构建的 Keycloak 会返回一个空的 secret。
在上例中,红帽构建的 Keycloak 首先使用 REALM_UNDERSCORE_KEY
解析器。如果红帽构建的 Keycloak 在使用该解析器的 vault 中查找条目,红帽构建的 Keycloak 会返回该条目。如果没有,红帽使用 KEY_ONLY
解析器再次搜索 Keycloak。如果红帽构建的 Keycloak 使用 KEY_ONLY
解析器查找条目,红帽构建的 Keycloak 会返回该条目。如果红帽构建的 Keycloak 使用所有解析器,红帽构建的 Keycloak 会返回一个空的 secret。
当前可用的解析器列表如下:
Name | 描述 |
---|---|
KEY_ONLY |
红帽构建的 Keycloak 忽略了域名,并使用 vault 表达式中的密钥。红帽构建的 Keycloak 转义在键中用另一个下划线字符出现下划线。例如,如果密钥名为 |
REALM_UNDERSCORE_KEY |
Red Hat build of Keycloak 使用下划线字符组合 realm 和 key。红帽构建的 Keycloak 转义在 realm 或 key 中出现带有另一个下划线字符的下划线。例如,如果域名为 |
REALM_FILESEPARATOR_KEY | Red Hat build of Keycloak 使用平台文件分隔符字符组合 realm 和 key。vault 表达式禁止使用可能会导致路径遍历的字符,从而防止访问对应域之外的 secret。 |
如果您还没有为内置提供程序配置解析器,红帽构建的 Keycloak 将选择 REALM_UNDERSCORE_KEY
。