跳转到主要内容

身份验证与授权

本文档描述了非扩展特定的 Apache Druid 身份验证和授权配置。

属性类型描述默认值是否必须
druid.auth.authenticatorChain字符串的 JSON 列表身份验证器(Authenticator)类型名称列表["allowAll"]
druid.escalator.typeString用于 Druid 内部通信的提升器(Escalator)类型。此提升器必须使用 druid.auth.authenticatorChain 中身份验证器所支持的身份验证方案。"noop"
druid.auth.authorizers字符串的 JSON 列表授权器(Authorizer)类型名称列表["allowAll"]
druid.auth.unsecuredPaths字符串列表不需要进行安全检查的路径列表。所有针对这些路径的请求都将被允许。[]
druid.auth.allowUnauthenticatedHttpOptions布尔值如果设置为 true,则允许未经身份验证的用户发送 HTTP OPTIONS 请求。这主要用于支持 CORS 预检请求(Druid 本身不直接支持,但可以使用第三方扩展启用)。

请注意,您必须将 "OPTIONS" 添加到 druid.server.http.allowedHttpMethods 中。

另请注意,禁用 OPTIONS 请求的身份验证检查将允许未经身份验证的用户确定哪些 Druid 端点是有效的(通过检查 OPTIONS 请求是否返回 200 而不是 404)。启用此选项会向未经身份验证的用户泄露有关服务器配置的信息,包括加载了哪些扩展的信息。
false

启用身份验证/授权LoadingLookupTest

身份验证器链

身份验证决策由一系列身份验证器实例处理。请求将按照 druid.auth.authenticatorChain 中定义的顺序由身份验证器进行检查。

身份验证器实现由扩展提供。

例如,以下身份验证器链定义分别启用了来自 druid-kerberosdruid-basic-security 核心扩展的 Kerberos 和 HTTP Basic 身份验证器

druid.auth.authenticatorChain=["kerberos", "basic"]

请求将通过链中的所有身份验证器,直到其中一个身份验证器成功验证了请求或发送了 HTTP 错误响应。在第一次成功验证之后,或者如果请求以错误响应终止,链中后续的身份验证器将被跳过。

如果链中没有身份验证器成功验证请求或发送 HTTP 错误响应,则在链的末尾将发送 HTTP 错误响应。

Druid 包含两个内置的身份验证器,其中一个用于默认的非安全配置。

AllowAll 身份验证器

此内置身份验证器会对所有请求进行身份验证,并始终将其导向名为 allowAll 的授权器。它不打算用于默认非安全配置以外的任何用途。

druid.auth.authorizer.allowAll.type=allowAll

匿名身份验证器

此内置身份验证器会对所有请求进行身份验证,并将它们导向用户在配置中指定的授权器。它旨在用于添加默认访问级别,因此应将匿名身份验证器添加到身份验证器链的末尾。当请求到达链末尾的匿名身份验证器时,其成功或失败取决于与匿名身份验证器链接的授权器是如何配置的。

属性描述默认值是否必须
druid.auth.authenticator.<authenticatorName>.authorizerName请求应导向的授权器。不适用
druid.auth.authenticator.<authenticatorName>.identity请求者的身份。defaultUser

要使用匿名身份验证器,请向 authenticatorChain 添加类型为 anonymous 的身份验证器。

例如,以下配置通过 druid-basic-security 扩展启用了匿名身份验证器

druid.auth.authenticatorChain=["basic", "anonymous"]

druid.auth.authenticator.anonymous.type=anonymous
druid.auth.authenticator.anonymous.identity=defaultUser
druid.auth.authenticator.anonymous.authorizerName=myBasicAuthorizer

# ... usual configs for basic authentication would go here ...

受信任域身份验证器

此内置受信任域身份验证器对源自配置的受信任域的请求进行身份验证,并将其导向用户在配置中指定的授权器。它旨在用于添加默认信任级别,并允许同一域内的主机进行访问。

属性描述默认值是否必须
druid.auth.authenticator.<authenticatorName>.name身份验证器名称。不适用
druid.auth.authenticator.<authenticatorName>.domain应验证请求的受信任域。如果只允许来自特定主机的连接,则需要指定该主机的完全限定主机名。不适用
druid.auth.authenticator.<authenticatorName>.useForwardedHeaders连接到 Druid 的客户端可能会经过多层代理。一些代理在将请求传递给下一个代理之前,还会将自己的 IP 地址附加到 'X-Forwarded-For' 标头中。一些代理还代表客户端进行连接。如果此配置设置为 true 且存在 'X-Forwarded-For',则受信任域身份验证器将使用 X-Forwarded-For 标头中最左侧的主机名。注意:HTTP 请求中的 X-Forwarded-For 标头是可以伪造的,请谨慎启用此选项。false
druid.auth.authenticator.<authenticatorName>.authorizerName请求应导向的授权器。不适用
druid.auth.authenticator.<authenticatorName>.identity请求者的身份。defaultUser

要使用受信任域身份验证器,请向 authenticatorChain 添加类型为 trustedDomain 的身份验证器。

例如,以下配置启用了受信任域身份验证器

druid.auth.authenticatorChain=["trustedDomain"]

druid.auth.authenticator.trustedDomain.type=trustedDomain
druid.auth.authenticator.trustedDomain.domain=trustedhost.mycompany.com
druid.auth.authenticator.trustedDomain.identity=defaultUser
druid.auth.authenticator.trustedDomain.authorizerName=myBasicAuthorizer
druid.auth.authenticator.trustedDomain.name=myTrustedAutenticator
# ... usual configs for druid would go here ...

提升器 (Escalator)

druid.escalator.type 属性决定了 Druid 集群内部通信(例如 Broker 进程与 Historical 进程进行查询处理通信时)应使用何种身份验证方案。

为此属性选择的提升器必须使用 druid.auth.authenticatorChain 中身份验证器所支持的身份验证方案。如果扩展开发者打算将特定的身份验证方案用于 Druid 内部通信,则必须同时提供相应的提升器实现。

无操作 (Noop) 提升器

此内置默认提升器仅用于默认的 AllowAll 身份验证器和授权器。

授权器

授权决策由授权器处理。druid.auth.authorizers 属性决定了哪些授权器实现将被激活。

有两个内置授权器:"default" 和 "noop"。其他实现由扩展提供。

例如,以下授权器定义启用了来自 druid-basic-security 的 "basic" 实现

druid.auth.authorizers=["basic"]

对于任何给定的请求,只能由一个授权器进行授权。

Druid 包含一个内置授权器

AllowAll 授权器

类型名称为 "allowAll" 的授权器接受所有请求。

默认非安全配置

druid.auth.authenticatorChain 为空或未指定时,Druid 将创建一个仅包含一个名为 "allowAll" 的 AllowAll 身份验证器的链。

druid.auth.authorizers 为空或未指定时,Druid 将创建一个名为 "allowAll" 的单个 AllowAll 授权器。

druid.escalator.type 的默认值为 "noop",以匹配默认的非安全身份验证器/授权器配置。

身份验证器到授权器的路由

当身份验证器成功验证请求时,它必须将 AuthenticationResult 附加到请求中,其中包含有关请求者身份的信息,以及应授权该已验证请求的授权器的名称。

身份验证器实现应通过配置提供某种方式,允许用户选择身份验证器应将请求路由到哪些授权器。

内部系统用户

Druid 进程之间的内部请求(非用户发起的通信)需要附加身份验证凭据。

这些请求应以“内部系统用户”身份运行,该身份代表 Druid 集群本身,并具有完全访问权限。

内部系统用户如何定义的细节留给扩展实现来处理。

授权器内部系统用户处理

授权器实现必须识别并授权“内部系统用户”的身份,并给予其完全访问权限。

身份验证器和提升器内部系统用户处理

旨在支持 Druid 内部通信的身份验证器实现必须识别由相应提升器实现提供的“内部系统用户”的凭据。

提升器必须实现三个与内部系统用户相关的方法

  public HttpClient createEscalatedClient(HttpClient baseClient);

public org.eclipse.jetty.client.HttpClient createEscalatedJettyClient(org.eclipse.jetty.client.HttpClient baseClient);

public AuthenticationResult createEscalatedAuthenticationResult();

createEscalatedClient 返回一个包装后的 HttpClient,该客户端将“内部系统用户”的凭据附加到请求中。

createEscalatedJettyClientcreateEscalatedClient 类似,区别在于它操作的是 Jetty HttpClient。

createEscalatedAuthenticationResult 返回一个包含“内部系统用户”身份的 AuthenticationResult。

保留名称配置属性

对于扩展开发者,请注意以下配置属性是为身份验证器和授权器的名称保留的

druid.auth.authenticator.<authenticator-name>.name=<authenticator-name>
druid.auth.authorizer.<authorizer-name>.name=<authorizer-name>

这些属性将身份验证器和授权器名称作为 @JsonProperty 参数提供给实现,在配置同一类型的多个身份验证器或授权器时可能很有用。