跳转到主要内容

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.serverPrincipalHTTP/_HOST@EXAMPLE.COMDruid 进程使用的 SPNEGO 服务主体 (service principal)
druid.auth.authenticator.kerberos.serverKeytab/etc/security/keytabs/spnego.service.keytabDruid 进程使用的 SPNego 服务密钥表 (keytab)
druid.auth.authenticator.kerberos.authToLocalRULE:[1:$1@$0](druid@EXAMPLE.COM)s/.*/druid DEFAULT它允许您设置将主体名称映射到本地用户名的通用规则。如果对于正在转换的主体名称没有显式映射,则将使用此规则。DEFAULT
druid.auth.authenticator.kerberos.cookieSignatureSecretsecretString用于签署身份验证 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.typekerberos用于内部进程通信的升级客户端类型。不适用
druid.escalator.internalClientPrincipaldruid@EXAMPLE.COM主体用户名,用于内部进程通信不适用
druid.escalator.internalClientKeytab/etc/security/keytabs/druid.keytab用于内部进程通信的 keytab 文件路径不适用
druid.escalator.authorizerNameMyBasicAuthorizer请求应导向的授权器。不适用

在启用 Kerberos 安全性时访问 Druid HTTP 端点

  1. 要通过 curl 访问 Druid HTTP 端点,用户需要首先使用 kinit 命令登录,如下所示:

    kinit -k -t <path_to_keytab_file> user@REALM.COM
  2. 登录成功后,使用 klist 命令验证登录是否成功。

  3. 现在,您可以使用 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 身份验证:

  1. Safari - 无需配置。
  2. Firefox - 打开 Firefox 并执行以下步骤:
    1. 转到 about:config 并搜索 network.negotiate-auth.trusted-uris
    2. 双击并添加以下值:"http://druid-coordinator-hostname:ui-port""http://druid-overlord-hostname:port"
  3. Google Chrome - 从命令行运行以下命令:
    1. google-chrome --auth-server-whitelist="druid-coordinator-hostname" --auth-negotiate-delegate-whitelist="druid-coordinator-hostname"
    2. google-chrome --auth-server-whitelist="druid-overlord-hostname" --auth-negotiate-delegate-whitelist="druid-overlord-hostname"
  4. Internet Explorer -
    1. "druid-coordinator-hostname""druid-overlord-hostname" 添加到受信任站点中。
    2. 允许 UI 网站进行协商。

以编程方式发送查询

许多 HTTP 客户端库(例如 Apache Commons HttpComponents)已经支持执行 SPNego 身份验证。您可以使用任何可用的 HTTP 客户端库与 Druid 集群通信。