基于代理的身份验证
如果您已经有一个单点登录(SSO)解决方案,您可能希望将其用作身份验证后端。
大多数解决方案都作为 OpenSearch 和安全插件的前置代理。如果代理身份验证成功,代理会在 HTTP 头部字段中添加(已验证的)用户名及其(已验证的)角色。这些字段的名称取决于您现有的 SSO 解决方案。
然后,安全插件从请求中提取这些 HTTP 头部字段,并使用这些值来确定用户的权限。
启用代理检测
要为 OpenSearch 启用代理检测,请在 config.yml
的 xff
部分进行配置。
---
_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-proxy
和 attr_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-user
和 x-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"