Kerberos
Apache Druid 扩展,用于启用通过 Kerberos 对 Druid 进程进行身份验证。此扩展添加了一个身份验证器,用于通过简单且受保护的 GSSAPI 协商机制 SPNEGO 来保护 HTTP 端点。请务必将 druid-kerberos 包含 在扩展加载列表中。
配置
创建身份验证器
druid.auth.authenticatorChain=["MyKerberosAuthenticator"]
druid.auth.authenticator.MyKerberosAuthenticator.type=kerberos
要使用 Kerberos 身份验证器,请向 authenticatorChain 添加一个类型为 kerberos 的身份验证器。上面的示例对身份验证器使用了名称“MyKerberosAuthenticator”。
命名身份验证器的配置通过以下形式的属性进行分配:
druid.auth.authenticator.<authenticatorName>.<authenticatorProperty>
本文档其余部分的配置示例将使用“kerberos”作为所配置身份验证器的名称。
属性
| 属性 | 可能的值 | 描述 | 默认值 | 必需 |
|---|---|---|---|---|
druid.auth.authenticator.kerberos.serverPrincipal | HTTP/_HOST@EXAMPLE.COM | Druid 进程使用的 SPNEGO 服务主体 (service principal) | 空 | 是 |
druid.auth.authenticator.kerberos.serverKeytab | /etc/security/keytabs/spnego.service.keytab | Druid 进程使用的 SPNego 服务密钥表 (keytab) | 空 | 是 |
druid.auth.authenticator.kerberos.authToLocal | RULE:[1:$1@$0](druid@EXAMPLE.COM)s/.*/druid DEFAULT | 它允许您设置将主体名称映射到本地用户名的通用规则。如果对于正在转换的主体名称没有显式映射,则将使用此规则。 | DEFAULT | 否 |
druid.auth.authenticator.kerberos.cookieSignatureSecret | secretString | 用于签署身份验证 cookie 的密钥 | 空 | 是 |
druid.auth.authenticator.kerberos.authorizerName | 取决于可用的授权器 | 请求应指向的授权器 | 空 | 是 |
注意:Druid 进程使用的 SPNego 主体必须以 HTTP 开头(这是由 RFC-4559 规定的),并且必须采用“HTTP/_HOST@REALM”的形式。特殊字符串 _HOST 将自动替换为配置 druid.host 的值。
druid.auth.authenticator.kerberos.excludedPaths
在旧版本中,Kerberos 身份验证器具有一个 excludedPaths 属性,允许用户指定跳过身份验证检查的路径列表。此属性已从 Kerberos 身份验证器中移除,因为路径排除功能现在通过设置 druid.auth.unsecuredPaths 在所有身份验证器/授权器中处理,如 主要身份验证文档 中所述。
Auth to Local 语法
druid.auth.authenticator.kerberos.authToLocal 允许您设置将主体名称映射到本地用户名的通用规则。映射规则的语法为 RULE:[n:string](regexp)s/pattern/replacement/g。整数 n 表示目标主体应具有多少个组件。如果匹配,则会从字符串中形成一个字符串,用 $0 替换主体的领域 (realm),用 $n 替换主体的第 n 个组件。例如,如果主体是 druid/admin,则 [2:$2$1suffix] 将生成字符串 admindruidsuffix。如果该字符串匹配 regexp,则 s//[g] 替换命令将作用于该字符串。可选的 g 将导致替换在整个字符串中全局执行,而不是仅替换字符串中的第一个匹配项。如果需要,多条规则可以用换行符连接并指定为一个字符串。
针对大型 SPNEGO 协商头增加 HTTP 标头大小
在 Active Directory 环境中,Authorization 标头中的 SPNEGO 令牌包含 PAC(特权访问证书)信息,其中包含用户的所有安全组。在某些情况下,当用户属于许多安全组时,标头的大小会超过 Druid 默认能处理的范围。在这种情况下,可以通过设置 druid.server.http.maxRequestHeaderSize(默认为 8KiB)和 druid.router.http.maxRequestBufferSize(默认为 8KiB)来增加 Druid 能处理的最大请求标头大小。
配置 Kerberos 升级客户端
Druid 内部进程使用升级后的 HTTP 客户端进行通信。可以通过以下属性配置启用了 Kerberos 的升级后 HTTP 客户端:
| 属性 | 示例值 | 描述 | 默认值 | 必需 |
|---|---|---|---|---|
druid.escalator.type | kerberos | 用于内部进程通信的升级客户端类型。 | 不适用 | 是 |
druid.escalator.internalClientPrincipal | druid@EXAMPLE.COM | 主体用户名,用于内部进程通信 | 不适用 | 是 |
druid.escalator.internalClientKeytab | /etc/security/keytabs/druid.keytab | 用于内部进程通信的 keytab 文件路径 | 不适用 | 是 |
druid.escalator.authorizerName | MyBasicAuthorizer | 请求应导向的授权器。 | 不适用 | 是 |
在启用 Kerberos 安全性时访问 Druid HTTP 端点
-
要通过 curl 访问 Druid HTTP 端点,用户需要首先使用
kinit命令登录,如下所示:kinit -k -t <path_to_keytab_file> user@REALM.COM -
登录成功后,使用
klist命令验证登录是否成功。 -
现在,您可以使用 curl 命令访问 Druid HTTP 端点,如下所示:
curl --negotiate -u:anyUser -b ~/cookies.txt -c ~/cookies.txt -X POST -H'Content-Type: application/json' <HTTP_END_POINT>例如,要将文件
query.json中的查询发送到 Druid Broker,请使用此命令:curl --negotiate -u:anyUser -b ~/cookies.txt -c ~/cookies.txt -X POST -H'Content-Type: application/json' http://broker-host:port/druid/v2/?pretty -d @query.json注意:上述命令将首先使用 SPNego 协商机制对用户进行身份验证,并将身份验证 cookie 存储在文件中。后续请求将使用该 cookie 进行身份验证。
通过 Web 浏览器访问 Coordinator 或 Overlord 控制台
要从浏览器访问 Coordinator/Overlord 控制台,您需要按如下方式配置浏览器的 SPNego 身份验证:
- Safari - 无需配置。
- Firefox - 打开 Firefox 并执行以下步骤:
- 转到
about:config并搜索network.negotiate-auth.trusted-uris。 - 双击并添加以下值:
"http://druid-coordinator-hostname:ui-port"和"http://druid-overlord-hostname:port"
- 转到
- Google Chrome - 从命令行运行以下命令:
google-chrome --auth-server-whitelist="druid-coordinator-hostname" --auth-negotiate-delegate-whitelist="druid-coordinator-hostname"google-chrome --auth-server-whitelist="druid-overlord-hostname" --auth-negotiate-delegate-whitelist="druid-overlord-hostname"
- Internet Explorer -
- 将
"druid-coordinator-hostname"和"druid-overlord-hostname"添加到受信任站点中。 - 允许 UI 网站进行协商。
- 将
以编程方式发送查询
许多 HTTP 客户端库(例如 Apache Commons HttpComponents)已经支持执行 SPNego 身份验证。您可以使用任何可用的 HTTP 客户端库与 Druid 集群通信。