跳转到主要内容

用户认证与授权

本文档介绍了 Druid 安全模型,扩展程序通过该模型为 Druid 启用用户身份验证和授权服务。

身份验证与授权模型

Druid 用户身份验证与授权模型的核心是资源 (resources)操作 (actions)。资源是指经过身份验证的用户试图访问或修改的对象。操作是指用户试图执行的行为。

资源类型

Druid 使用以下资源类型:

  • DATASOURCE(数据源) – 每个 Druid 表(即 SQL 中 druid 模式下的 tables)都是一个资源。
  • CONFIG(配置) – 由集群组件公开的配置资源。
  • EXTERNAL(外部) – 通过 SQL 中的 EXTERN 函数读取的外部数据。
  • STATE(状态) – 集群范围的状态资源。
  • SYSTEM_TABLE(系统表) – 当 Broker 属性 druid.sql.planner.authorizeSystemTablesDirectly 为 true 时,Druid 使用此资源类型来授权 SQL 中 sys 模式下的系统表。

有关与资源类型关联的特定资源,请参阅定义权限以及API 参考中相应的端点描述。

操作

用户对资源执行以下操作之一:

  • READ(读取) – 用于只读操作。
  • WRITE(写入) – 用于非只读操作。

对资源的 WRITE 权限不包括 READ 权限。如果用户需要对某项资源同时拥有 READ 和 WRITE 权限,则必须显式授予这两种权限。例如,仅拥有 DATASOURCE READ 权限的用户可能无法访问某些仅限 DATASOURCE WRITE 权限用户使用的 API 或系统模式记录。

用户类型

在实践中,大多数部署只需要定义两类用户:

  • 管理员:对所有资源类型拥有 WRITE 操作权限。这些用户将添加数据源并管理系统。
  • 数据用户:仅需对 DATASOURCE 拥有 READ 访问权限。这些用户应仅通过 API 网关访问查询 API。其他 API 和权限包含应仅限于服务器管理员的功能。

需要注意的是,对 DATASOURCE 的 WRITE 访问权限授予用户广泛的访问权。例如,此类用户可以访问 Druid 文件系统、S3 存储桶和凭据等。因此,添加和管理数据源的能力应有选择地分配给管理员。

默认用户账户

身份验证器 (Authenticator)

如果设置了 druid.auth.authenticator.<authenticator-name>.initialAdminPassword,则会创建一个名为 "admin" 的默认管理员用户,并使用指定的初始密码。如果忽略此配置,则不会创建 "admin" 用户。

如果设置了 druid.auth.authenticator.<authenticator-name>.initialInternalClientPassword,则会创建一个名为 "druid_system" 的默认内部系统用户,并使用指定的初始密码。如果忽略此配置,则不会创建 "druid_system" 用户。

授权器 (Authorizer)

每个授权器都将始终拥有一个拥有完全权限的默认 "admin" 和 "druid_system" 用户。

定义权限

您可以定义权限,然后将其授予用户组。权限由资源类型、操作和资源名称定义。本节介绍每种资源类型可用的资源名称。

DATASOURCE

此类型的资源名称即数据源名称。指定数据源权限允许管理员授予用户对特定数据源的访问权限。

CONFIG

“CONFIG”资源类型有两个可能的资源名称:“CONFIG”和“security”。授予用户对 CONFIG 资源的访问权限允许他们访问以下端点。

“CONFIG”资源名称涵盖以下端点:

端点进程类型
/druid/coordinator/v1/configcoordinator
/druid/indexer/v1/workeroverlord
/druid/indexer/v1/worker/historyoverlord
/druid/worker/v1/disablemiddleManager
/druid/worker/v1/enablemiddleManager

“security”资源名称涵盖以下端点:

端点进程类型
/druid-ext/basic-security/authenticationcoordinator
/druid-ext/basic-security/authorizationcoordinator

EXTERNAL

EXTERNAL 资源类型仅接受资源名称“EXTERNAL”。授予用户对 EXTERNAL 资源的访问权限允许他们运行包含 SQL 中 EXTERN 函数的查询来读取外部数据。

STATE

“STATE”配置资源类型只有一个可能的资源名称:“STATE”。授予用户对 STATE 资源的访问权限允许他们访问以下端点。

“STATE”资源名称涵盖以下端点:

端点进程类型
/druid/coordinator/v1coordinator
/druid/coordinator/v1/rulescoordinator
/druid/coordinator/v1/rules/historycoordinator
/druid/coordinator/v1/serverscoordinator
/druid/coordinator/v1/tierscoordinator
/druid/broker/v1broker
/druid/v2/candidatesbroker
/druid/indexer/v1/leaderoverlord
/druid/indexer/v1/isLeaderoverlord
/druid/indexer/v1/actionoverlord
/druid/indexer/v1/workersoverlord
/druid/indexer/v1/scalingoverlord
/druid/worker/v1/enabledmiddleManager
/druid/worker/v1/tasksmiddleManager
/druid/worker/v1/task/{taskid}/shutdownmiddleManager
/druid/worker/v1/task/{taskid}/logmiddleManager
/druid/historical/v1historical
/druid-internal/v1/segments/historical
/druid-internal/v1/segments/peon
/druid-internal/v1/segments/realtime
/status所有进程类型

SYSTEM_TABLE

此类型的资源名称是 SQL 中 sys 模式下的系统表名,例如 sys.segmentssys.server_segments。仅当 Broker 属性 druid.sql.planner.authorizeSystemTablesDirectly 为 true 时,Druid 才会强制对 SYSTEM_TABLE 资源进行授权。

HTTP 方法

有关特定请求端点支持哪些 HTTP 方法的信息,请参考API 参考

GET 请求需要 READ 权限,而 POSTDELETE 请求需要 WRITE 权限。

SQL 权限

对 Druid 数据源的查询需要针对该数据源的 DATASOURCE READ 权限。

通过 EXTERN 函数访问外部数据的查询需要 EXTERNAL READ 权限。

INFORMATION_SCHEMA 表的查询将返回调用者拥有 DATASOURCE READ 访问权限的数据源信息。其他数据源将被忽略。

系统模式表的查询需要以下权限:

  • segments:Druid 根据 DATASOURCE READ 权限过滤段 (segments)。
  • servers:用户需要 STATE READ 权限。
  • server_segments:用户需要 STATE READ 权限。Druid 根据 DATASOURCE READ 权限过滤段。
  • tasks:Druid 根据 DATASOURCE READ 权限过滤任务。
  • supervisors:Druid 根据 DATASOURCE READ 权限过滤监督者 (supervisors)。

当 Broker 属性 druid.sql.planner.authorizeSystemTablesDirectly 为 true 时,用户还需要系统模式表的 SYSTEM_TABLE 授权才能对其进行查询。

配置传播

为了防止 Coordinator 负载过重,Authenticator 和 Authorizer 的用户/角色 Druid 元数据存储状态会缓存在每个 Druid 进程中。

每个进程将定期轮询 Coordinator 以获取最新的 Druid 元数据存储状态,具体由 druid.auth.basic.common.pollingPerioddruid.auth.basic.common.maxRandomDelay 属性控制。

当发生配置更新时,Coordinator 可以选择通知每个进程更新后的 Druid 元数据存储状态。此行为由身份验证器和授权器上的 enableCacheNotificationscacheNotificationTimeout 属性控制。

请注意,由于缓存的存在,对用户/角色 Druid 元数据存储所做的更改可能不会立即反映在每个 Druid 进程中。