Link Search Menu Expand Document Documentation Menu

基于代理的身份验证

如果您已经有一个单点登录(SSO)解决方案,您可能希望将其用作身份验证后端。

大多数解决方案都作为 OpenSearch 和安全插件的前置代理。如果代理身份验证成功,代理会在 HTTP 头部字段中添加(已验证的)用户名及其(已验证的)角色。这些字段的名称取决于您现有的 SSO 解决方案。

然后,安全插件从请求中提取这些 HTTP 头部字段,并使用这些值来确定用户的权限。

启用代理检测

要为 OpenSearch 启用代理检测,请在 config.ymlxff 部分进行配置。

---
_meta:
  type: "config"
  config_version: 2

config:
  dynamic:
    http:
      anonymous_auth_enabled: false
      xff:
        enabled: true
        internalProxies: '192\.168\.0\.10|192\.168\.0\.11'
        remoteIpHeader: 'x-forwarded-for'

您可以配置以下设置

名称 描述
enabled 启用或禁用代理支持。默认为 false
internalProxies 包含所有受信任代理 IP 地址的正则表达式。模式 .* 表示信任所有内部代理。
remoteIpHeader 包含主机名链的 HTTP 头部字段名称。默认为 x-forwarded-for

为了确定请求是否来自受信任的内部代理,安全插件会将 HTTP 请求的远程地址与配置的内部代理列表进行比较。如果远程地址不在列表中,插件会将该请求视为客户端请求。

启用代理身份验证

proxy HTTP 身份验证器部分配置携带已验证用户名和角色列表的 HTTP 头部字段名称。

proxy_auth_domain:
  http_enabled: true
  transport_enabled: true
  order: 0
  http_authenticator:
    type: proxy
    challenge: false
    config:
      user_header: "x-proxy-user"
      roles_header: "x-proxy-roles"
  authentication_backend:
    type: noop
名称 描述
user_header 包含已验证用户名的 HTTP 头部字段。默认为 x-proxy-user
roles_header 包含逗号分隔的已验证角色名称列表的 HTTP 头部字段。安全插件将此头部字段中找到的角色用作后端角色。默认为 x-proxy-roles
roles_separator 角色的分隔符。默认为 ,

启用扩展代理身份验证

安全插件拥有 proxy 类型的一个扩展版本,允许您传递额外的用户属性以用于文档级安全。除了 type: extended-proxyattr_header_prefix 之外,配置是相同的。

proxy_auth_domain:
  http_enabled: true
  transport_enabled: true
  order: 0
  http_authenticator:
    type: extended-proxy
    challenge: false
    config:
      user_header: "x-proxy-user"
      roles_header: "x-proxy-roles"
      attr_header_prefix: "x-proxy-ext-"
  authentication_backend:
    type: noop
名称 描述
attr_header_prefix 代理用于提供用户属性的头部前缀。例如,如果代理提供 x-proxy-ext-namespace: my-namespace,则在文档级安全查询中使用 ${attr.proxy.namespace}

示例

以下示例使用 nginx 代理作为三节点 OpenSearch 集群的前置。为了简单起见,我们对 x-proxy-userx-proxy-roles 使用硬编码值。在实际场景中,您会动态设置这些头部。该示例还包含一个用于扩展代理的注释头部。

events {
  worker_connections  1024;
}

http {

  upstream opensearch {
    server node1.example.com:9200;
    server node2.example.com:9200;
    server node3.example.com:9200;
    keepalive 15;
  }

  server {
    listen       8090;
    server_name  nginx.example.com;

    location / {
      proxy_pass https://opensearch;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header x-proxy-user test;
      proxy_set_header x-proxy-roles test;
      #proxy_set_header x-proxy-ext-namespace my-namespace;
    }
  }

}

相应的最小 config.yml 如下所示

---
_meta:
  type: "config"
  config_version: 2

config:
  dynamic:
    http:
      xff:
        enabled: true
        internalProxies: '172.16.0.203' # the nginx proxy
    authc:
      proxy_auth_domain:
        http_enabled: true
        transport_enabled: true
        order: 0
        http_authenticator:
          type: proxy
          #type: extended-proxy
          challenge: false
          config:
            user_header: "x-proxy-user"
            roles_header: "x-proxy-roles"
            #attr_header_prefix: "x-proxy-ext-"
        authentication_backend:
          type: noop

重要部分是启用 X-Forwarded-For (XFF) 解析并正确设置内部代理的 IP 地址。

enabled: true
internalProxies: '172.16.0.203' # nginx proxy

在此示例中,nginx.example.com 运行在 172.16.0.203 上,因此将此 IP 添加到内部代理列表中。请务必将 internalProxies 设置为最小 IP 地址数量,以便安全插件只接受来自受信任 IP 的请求。

OpenSearch Dashboards 代理身份验证

要将代理身份验证与 OpenSearch Dashboards 结合使用,最常见的配置是将代理放置在 OpenSearch Dashboards 前面,并让 OpenSearch Dashboards 将用户和角色头部传递给安全插件。

在这种情况下,HTTP 调用的远程地址是 OpenSearch Dashboards 的 IP,因为它直接位于 OpenSearch 前面。将 OpenSearch Dashboards 的 IP 添加到内部代理列表中。

---
_meta:
  type: "config"
  config_version: 2

config:
  dynamic:
    http:
      xff:
        enabled: true
        remoteIpHeader: "x-forwarded-for"
        internalProxies: '<opensearch-dashboards-ip-address>'

要将认证代理从 OpenSearch Dashboards 添加的用户和角色头部传递给安全插件,请将它们添加到 opensearch_dashboards.yml 中的 HTTP 头部允许列表。

opensearch.requestHeadersAllowlist: ["securitytenant","Authorization","x-forwarded-for","x-proxy-user","x-proxy-roles"]

您还必须在 opensearch_dashboards.yml 中启用身份验证类型。

opensearch_security.auth.type: "proxy"
opensearch_security.proxycache.user_header: "x-proxy-user"
opensearch_security.proxycache.roles_header: "x-proxy-roles"
剩余 350 字符

有问题?

想贡献吗?