elasticserach安装的安全插件

Search Guard 免费的开源的

官网:https://docs.search-guard.com/
当涉及到Elasticsearch的简便且负担得起的安全性时,您可能会倾向于依赖基于代理的“自行拥有”安全性基础架构。本文说明了为什么这样做不是一个好主意,以及为什么不应该使用这种方法来保护生产中的敏感数据。
tl; dr:许多组织正在使用反向代理来保护其Elasticsearch基础架构。我们的观点是,代理服务器不能针对大量的广泛攻击媒介提供防御,尤其是内部产生的攻击媒介。尽管代理可以增加防御能力,但它本身不足以满足企业的任何类型的安全/风险配置文件。
设定在典型设置中,反向代理(例如nginx)位于Elasticsearch集群的前面。代理将所有请求转发到Elasticsearch。它通常实现以下功能:
终止TLS,Elasticsearch本身不支持TLS / SSL
例如,通过简单的基本身份验证或LDAP等高级技术
它基于请求的URL实现访问控制
在很多情况下(但并非全部),URL包含索引名称和文档类型名称
通过此设置,看来您已经充分保护了群集。流量被加密,用户必须进行身份验证,并且您可以基于请求类型,索引名称和可选的文档类型来允许或拒绝请求。
但是,仔细观察,类似这样的设置仅是“安全剧院”:您给人的印象是安全的,而实际上,您的集群很容易受到攻击,并且数据仍然处于危险之中。原因如下:
未加密的HTTP流量
由于TLS由代理终止,因此其背后的完整流量仍然是HTTP。这意味着可以对其进行嗅探和篡改。有人可能会认为Elasticsearch集群位于大量防火墙和其他安全系统后面的专用网络上。因此,恶意黑客无法访问该流量。60%的攻击来自内部
IBM的案例研究表明,所有攻击中有??60%来自内部,而不是外部。即使您的敏感数据被防火墙和VPN包围,也极有可能被劫持。未加密的节点间流量
上面的陈述也适用于集群中节点之间的流量:它是未加密和不安全的,这使得访问和修改它非常容易。Search Guard绝对免费地在HTTP和传输层上提供TLS加密,因此不应有任何理由不使用TLS来保护流量。TLS确保没有人可以嗅探或篡改您的数据。
传输客户端和群集拓扑漏洞
尽管代理可以帮助控制客户端在HTTP级别上可以执行的操作,但无法限制传输客户端可以执行的操作。这还包括您的集群拓扑:任何人都可以启动新的Elasticsearch节点,使其加入集群并执行恶意操作。
复合请求漏洞
在大多数情况下,Elasticsearch调用的URL包含索引名称和可选的文档类型,可用于实施安全控制。但是,对于某些呼叫,与安全相关的信息包含在请求的主体中,而不包含在URL中。这使得无法仅通过分析URL来实现声音安全层。例如:
大量API
批量API“?使在单个API调用中执行许多索引/删除操作成为可能?”。这意味着单个API请求可以携带任意数量的子请求,并对不同的索引执行不同的操作。

您还必须检查请求正文
如果不检查和分析此JSON有效负载,并将其与用户的实际权限进行匹配,则无法实施适当的安全检查。Search Guard可以正确解析所有受影响的索引和操作,也可以批量处理,然后分别对每个子请求应用安全检查。

(https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/docs-bulk.html)

多获取和多搜索API
这些API使得可以在一次调用中针对不同的索引提交多个get或search请求。与批量API一样,子请求也包含在请求正文中。Search Guard分别检查每个子请求,并相应地允许/拒绝访问。仅使用代理是不可能的。

(https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/multi-index.html)
(https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/search-multi-search.html)

Kibana还大量使用了这些组合请求,因此很难建立可靠的安全规则,但仍然允许Kibana正常工作。Search Guard开箱即用地支持Kibana。
多个索引和通配符扩展漏洞
接受索引名称作为参数的大多数Elasticsearch API也支持跨多个索引的执行。您可以按任意顺序指定多个索引,并以逗号分隔,例如:

https:// localhost:9200 / index1,index2 / _search

Elasticsearch还允许使用通配符,例如:

https:// localhost:9200 / i * ex * / _ search

多个索引和通配符,也可以组合使用:

https:// localhost:9200 / i * ex *,otherindex / _search

这使得很难或不可能通过代理正确处理所有情况。Search Guard将带通配符的索引解析为实际的索引名称,从而确保只能访问允许的索引。

(https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/multi-index.html)

按查询删除和按查询更新漏洞
同样,受影响的文档类型隐式包含在请求的JSON有效负载中,从而使得无法仅通过基于代理的解决方案进行控制。

(https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/docs-delete-by-query.html)

别名处理漏洞
索引别名API“?允许对别名使用名称进行别名,所有API都会自动将别名转换为实际的索引名称?”。索引别名也可以一次映射到多个索引!因此,在请求到达Elasticsearch并扩展别名之前,您如何知道该请求影响了哪些实际索引?
与通配符一样,Search Guard将任何索引别名解析为其实际索引名称,以确保正确应用权限检查。这对用户是透明的。

(https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/indices-aliases.html)

日期数学索引名称解析漏洞
索引名称还可以包含日期数学表达式,以便于处理基于日期的索引名称。使用日期数学表达式的请求可能如下所示:
GET / <logstash- {now / d}> / _ search
这是不可能用代理来控制的,而Search Guard使用已经扩展的实际索引名来应用权限检查。

(https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/date-math-index-names.html)

权限的粒度–文档和字段级别
基于代理的解决方案仅限于索引和文档类型。无法在更高级的级别上实现访问控制。Search Guards支持 对文档和字段级别的控制,因此用户只能看到他们可以看到的文档和字段。
缺少审核日志记录功能会阻碍合规性
审计日志记录不能仅由代理实现。代理只能看到HTTP通信,而完全省略了传输层。使用别名和通配符时,它也看不到实际的索引名称。它无法评估HTTP正文中包含的子请求。对于审计日志记录,代理几乎没有用,这使得很难满足HIPAA,PCI DSS,FISMA或ISO合规性规则。
Search Guard将审核日志记录功能??直接添加到Elasticsearch,从而可以记录集群上的任何活动,包括实际的扩展索引名,提交的查询和子查询以及传输层上的任何流量。
附加攻击面
拥有代理显然会扩大攻击面。更好的方法是使用Search Guard增强现有基础结构,而不是引入新的攻击面。攻击面也与孔隙率直接相关,并且代理也增加孔隙率。

Shield es官网提供的收费插件
shield是6.3版本之前plugin的叫法,现在都集成到es里面了,尤其6.8/7.1之后也开放了部分安全功能

使用基本身份验证控制访问
Shield使您可以轻松地用密码保护您的Elasticsearch集群。一旦安装了Shield,就需要用户名和密码才能与群集进行通信。
如果您提交的请求中没有用户名和密码,则该请求将被拒绝:
curl - XGET’http :// localhost:9200 /’

使用基本身份验证所需要做的就是设置用户并将他们分配给基本预定义角色之一:
admin
可以执行任何群集或索引操作。
power_user
可以监视集群并执行任何索引操作。
user
可以对任何索引执行读取操作。
首先,创建一个具有以下admin角色的“超级用户”?:
1.使用该esusers工具创建管理员用户:
bin / shield / esusers用户添加es_admin - r admin
2.出现提示时,输入新用户的密码。密码必须至少包含6个字符。
现在,您可以以管理员用户身份提交请求:
curl -u es_admin -XGET ‘http://localhost:9200/’

而已!这就是为您的Elasticsearch集群设置第一层安全性所需的全部工作。
要设置其他用户,请使用您的管理员用户凭据将请求提交给Users API。有关更多信息,请参见管理本机用户。您还可以与外部用户管理系统集成,例如LDAP和Active Directory。有关更多信息,请参见用户验证。
安装Kibana的Shield插件!
要使用户能够登录到Kibana并访问您的安全集群,请安装Shield插件。有关更多信息,请参阅将Kibana与Shield一起使用。
对用户进行身份验证是迈出的重要第一步,但是Shield提供的不仅仅是简单的密码保护。例如,您可以:
?启用消息身份验证以验证消息在传输过程中未被篡改或破坏。
?启用审核以跟踪与Elasticsearch集群的尝试和成功的交互。
一旦采取了这些基本的安全措施,我们强烈建议您通过将群集配置为使用SSL / TLS加密来保护与节点之间的通信安全。未启用加密的节点将以纯文本格式发送密码!
如果您的安全要求更加复杂,则还可以:
?定义和使用自定义角色进行细粒度的访问控制。
?与LDAP或Active Directory集成,或要求证书进行身份验证。
?使用IP筛选可允许或拒绝来自特定IP地址或地址范围的请求。
启用消息身份验证
消息身份验证可验证消息在节点到节点的通信过程中没有被篡改或破坏。
要启用消息身份验证:
1.syskeygen从ES_HOME没有任何选项的情况下运行该工具:
bin/shield/syskeygen
这将在中创建系统密钥文件CONFIG_DIR/shield/system_key。

2.将生成的系统密钥复制到集群中的其余节点。
系统密钥是对称密钥,因此同一密钥必须位于集群中的每个节点上。

现在,您已经启用了消息身份验证,您可能还希望启用审计来跟踪与Elasticsearch集群的尝试和成功的交互。

启用审核
启用审核时,Shield会存储与Elasticsearch集群的尝试和成功交互的记录。您可以使用此信息来跟踪谁在对集群执行操作,并确定潜在的安全问题。
要启用审核,请将以下设置添加到elasticsearch.yml:
shield.audit.enabled: true

默认情况下,事件记录到中的专用elasticsearch-access.log文件中ES_HOME/logs。您还可以将事件存储在Elasticsearch索引中,以便于分析和控制记录哪些事件。有关更多信息,请参见配置审核。

Moving On
既然Shield已启动并正在运行,我们强烈建议您通过将群集配置为使用SSL / TLS加密来保护与节点之间的通信安全。未启用加密的节点将以纯文本格式发送密码!
根据您的安全要求,您可能还需要:
?定义和使用自定义角色进行细粒度的访问控制。
?与LDAP或Active Directory集成,或要求证书进行身份验证。
?使用IP筛选可允许或拒绝来自特定IP地址或地址范围的请求。

用户身份验证

用户认证

身份验证可识别个人。为了获得对受限资源的访问,用户必须通过密码,凭据或其他某种方式(通常称为身份验证令牌)证明其身份。
经过身份验证的用户如果拥有适当的run_as特权,则可以代表其他用户提交请求。有关更多信息,请参见?代表其他用户提交请求。
您可以使用Shield的本机支持来管理和验证用户,也可以与LDAP和Active Directory等外部用户管理系统集成。有关管理本机用户的信息,请参阅《管理本机用户》。

身份验证的工作方式
一个领域是用来解决和验证用户和他们的角色。Shield支持以下类型的领域:
本机 Shield内置的本地身份验证系统,默认情况下可用。请参阅本机用户身份验证。
文件 Shield内置的基于文件的身份验证系统,默认情况下可用。请参阅基于文件的用户身份验证。
LDAP 通过外部轻量目录协议进行身份验证。请参阅LDAP用户身份验证。
活动目录 通过外部Active Directory服务进行身份验证。请参阅Active Directory用户身份验证。
公钥基础设施 通过使用受信任的X.509证书进行身份验证。请参阅1.3.0中添加的?PKI用户身份验证?[?1.3.0?]?。。
在本地,文件,LDAP和Active Directory的领域进行身份验证使用的用户名和密码身份验证令牌。
Shield还支持自定义领域。如果需要与其他身份验证系统集成,则可以构建自定义领域插件。有关更多信息,请参见与其他身份验证系统集成。
领域生活在领域链中。它本质上是已配置领域(通常是各种类型)的优先列表。列表的顺序决定了查询领域的顺序。在身份验证过程中,Shield将一次咨询并尝试对一个领域进行身份验证。一旦其中一个领域成功验证了请求,就认为验证成功,并且已验证的用户将与该请求相关联(然后将继续进行授权阶段)。如果某个领域无法验证请求,则将查询链中的下一个在线领域。如果链中的所有领域都不能对请求进行身份验证,则认为身份验证不成功,并且将返回身份验证错误(作为HTTP状态代码401)。
Shield尝试按顺序对每个配置的领域进行身份验证。某些系统(例如Active Directory)在几次连续的失败登录尝试之后都有一个临时锁定期。如果在多个领域中存在相同的用户名,则可能会意外锁定帐户。有关更多信息,请参见此处。
例如,如果UserAActive Directory和文件领域中都存在,并且首先检查Active Directory领域,然后检查文件,那么像UserA在文件领域中一样进行身份验证的尝试将首先尝试针对Active Directory进行身份验证并失败,然后再成功针对文件领域进行身份验证。因为对每个请求都验证了身份验证,所以将针对UserA文件领域中的每个请求对Active Directory领域进行检查(如果失败)。在这种情况下,虽然Shield请求成功完成,但Active Directory上的帐户将收到几次失败的登录尝试,并且该帐户可能会暂时锁定。相应地计划领域的顺序。
可以在elasticsearch.yml文件中配置领域链。如果未显式配置,则会创建一个默认链,其中包含native和file领域。明确配置后,创建的链将完全反映配置(例如,链中唯一的领域将是已启用的那些已配置领域)
以下代码段显示了领域配置的示例:
屏蔽。authc:
领域:
本机:
类型:本机
顺序:0
文件:
类型:文件
顺序:1
ldap1:
类型:ldap
命令:2已
启用:错误
url:‘url_to_ldap1’ …
ldap2:
类型:ldap
命令:3
url:‘url_to_ldap2’ …
ad1:
类型:active_directory
顺序:4
url:‘url_to_ad’

从上面可以看出,每个领域都有一个唯一的名称来标识它。所有领域共有三种设置:
?type(必需) -标识令的类型(目前可以是native,file,ldap,active_directory,或pki)。领域类型决定应使用哪些其他设置来配置领域。
?order(可选)-定义领域链中领域的优先级/索引。这将确定在身份验证期间何时查询领域,首先将查询较低顺序。
?enabled(可选)-设置为false领域时,将被禁用,并且不会添加到领域链中。这对于调试目的很有用,因为调试时可以从链中删除领域,而不会删除和丢失其配置。
领域类型可以大致分为两类:
?internal-内部领域类型是Elasticsearch内部的领域,不需要与外部各方进行任何通信-它们由Shield完全管理。每个内部领域类型最多只能有一个配置的领域。(当前,内部领域类型为native和file)。
?external-外部领域类型是需要与Elasticsearch外部的参与方/组件进行交互的领域,通常需要与企业级身份管理系统进行交互。与internal领域不同,领域可以多达external一个,每个领域都有唯一的名称和不同的设置。(目前唯一external存在的境界类型ldap,active_directory和pki)。
启用匿名访问?[?1.1.0?]在1.1.0中添加。
身份验证过程可以分为两个阶段-令牌提取和用户身份验证。在第一阶段(令牌提取阶段)期间,请求配置的领域尝试从传入请求中提取/解析身份验证令牌。在请求“ wins”中找到身份验证令牌的第一个领域,即所找到的身份验证令牌将用于身份验证(进入第二阶段-用户身份验证-支持该身份验证令牌类型的每个领域都将尝试对身份验证进行身份验证用户)。
如果任何活动领域都没有解析身份验证令牌,则传入请求被视为匿名请求。
默认情况下,匿名请求被拒绝,并返回验证错误(状态码401)。可以更改此行为,并指示Shield将默认/匿名用户与匿名请求相关联。可以通过在elasticsearch.yml文件中配置以下设置来完成:
屏蔽。authc:
匿名:
用户名:anonymous_user 1
角色:role1,role2 2
authz_exception:true 3

1.匿名用户的用户名/密码。此设置是可选的,_es_anonymous_user未配置时默认设置为。

2.与匿名用户关联的角色。此设置是强制性的-如果没有此设置,匿名访问将被禁用(即匿名请求将被拒绝并返回身份验证错误)
3.如果为true,则匿名用户没有所请求操作的适当权限时,将返回HTTP 403响应。Web浏览器将不会提示用户提供凭据来访问所请求的资源。设置false为时,将返回HTTP 401,以允许向具有适当权限的用户提供凭据。如果您将匿名访问与HTTP结合使用,false则如果您的客户端不支持抢占式基本身份验证,则可能需要将此设置为。此设置是可选的,true默认设置为。

本机用户身份验证
管理和认证用户的最简单方法是内部native领域。您可以使用REST API来添加和删除用户,分配用户角色以及管理用户密码。
配置本机领域
默认情况下,本机领域已添加到领域链。您无需显式配置本机领域即可通过REST API管理用户。
但是,您可以native在中的shield.authc.realms名称空间中为领域?配置选项elasticsearch.yml。显式配置本机领域可以使您设置它在领域链中的显示顺序,暂时禁用该领域以及控制缓存选项。
要配置本机领域:
1.在?名称空间中添加类型native为的领域配置。至少必须将领域设置?为。如果要配置多个领域,则还应该显式设置属性。有关可为领域设置?的所有选项,请参见本机领域设置。elasticsearch.ymlshield.authc.realmstypenativeordernative
例如,以下代码片段显示了一个域native配置,该配置将设置order为零,因此首先检查该域:
屏蔽:
authc:
领域:
native1:
类型:本机
顺序:0
2.重新启动Elasticsearch。

本机领域设置
设置 需要 描述
type 是 指示领域类型。必须设置为native。
order 没有 指示此领域在领域链中的优先级。首先查询低级领域。尽管不是必需的,但我们建议您在配置多个领域时显式设置此值。默认为Integer.MAX_VALUE。
enabled 没有 指示是启用还是禁用此领域。使您可以禁用领域而不删除其配置。默认为true。
cache.ttl 没有 指定缓存的用户条目的生存时间。在此时间段内将缓存用户的凭据。使用标准Elasticsearch?时间单位指定时间段?。默认为20m。
cache.max_users 没有 指定一次可以存储在高速缓存中的最大用户条目数。默认值为100,000。
cache.hash_algo 没有 指定用于缓存的用户凭据的哈希算法。有关可能的值,请参见缓存哈希算法。(专家设置)

管理本机用户
您可以native通过Users API在领域中管理用户。
从基于文件的领域迁移到本机领域
有一个迁移工具可帮助将基于文件的用户和角色迁移到本机领域。
添加本机用户
要添加或更新用户,请向/shield/user/?端点提交PUT或POST请求。用户名必须至少包含1个字符,并且不能超过30个字符。第一个字符必须是字母(a-z或A-Z)或下划线()。随后的字符可以是字母,下划线(_),数字(0-9),或任何下列符号@,-,.或$

POST /_shield/user/ironman
{ “password” : “j@rV1s”, ①
“ roles” :[ “ admin” ,“ other_role1” ], ②
“ full_name” :“ Tony Stark” , ③
“email” :“ tony@starkcorp.co” , ④
“metadata” :{ ⑤
“intelligence” :7 } }

1.添加用户时必须指定密码。密码必须至少包含6个字符。
2.您必须为用户分配至少一个角色。角色确定用户的访问权限。
3.用户的全名。可选的。
4.用户的电子邮件地址。可选的。
5.您要与用户关联的任意元数据。可选的。

如果要更新用户,则可以省略该password字段,除非您想更改用户密码。您必须指定用户的角色。省略可选full_name,email或metadata字段设置这些值null。

成功调用将返回一个JSON结构,该结构显示用户是否已创建或更新。

{ “ user” :{ “ created” :true

} }

1.当现有用户更新时,created设置为false。

检索本机用户
要检索所有用户,请向/_shield/user端点提交GET请求:
GET / _shield / user

要检索特定用户,请将用户指定为以逗号分隔的列表:
GET /_shield/user/ironman,hulk

返回一个用户数组,其中包含每个用户的JSON表示形式。请注意,不包括用户密码。

{ “ found” :true ,

“ users” :[ { “ username” :“ ironman” ,“ roles” :[ “ admin” ,“ other_role1” ],“ full_name” :“ Tony Stark” ,“ email” :“ tony@starkcorp.co” ,“元数据” :{ “智能” :7 } } } ] }

如果用户未在native领域中定义,found则设置为false。

删除本机用户
要删除用户,请向/_shield/user/端点提交DELETE请求:
DELETE /_shield/user/ironman

如果成功删除了用户,则请求返回{“found”: true}。否则,found设置为false。
{ “ found” :true }

LDAP用户认证
您可以将Shield配置为与轻型目录访问协议(LDAP)目录通信以对用户进行身份验证。要与LDAP集成,请配置LDAP域,并将LDAP组分配给角色映射文件中的Shield角色。
为了保护密码,应该使用SSL / TLS对Shield与LDAP服务器之间的通信进行加密。通过SSL / TLS连接到LDAP服务器的客户端和节点需要在其密钥库或信任库中安装LDAP服务器的证书或服务器的根CA证书。有关安装证书的更多信息,请参阅“?设置SSL”。

配置LDAP领域
LDAP分层存储用户和组,类似于在文件系统中对文件夹进行分组的方式。LDAP目录的层次结构是根据诸如组织单位(ou),组织(o)和域控制器(dc)之类的容器构建的?。
条目的路径是唯一标识用户或组的专有名称(DN)。用户名和组名通常具有诸如公用名(cn)或唯一ID(uid)之类的属性。DN指定为字符串,例如?“cn=admin,dc=example,dc=com”。空格被忽略。
LDAP领域支持两种操作模式,即用户搜索模式和具有用于用户DN的特定模板的模式。有关可为LDAP领域设置?的所有选项,请参见LDAP领域设置。

使用用户搜索配置LDAP领域?[?1.1.0?]在1.1.0中添加。
LDAP用户搜索是最常见的操作模式。在这种模式下,具有搜索LDAP目录权限的特定用户用于根据用户名和LDAP属性搜索用户DN。
要使用用户搜索配置LDAP领域:
1.在?名称空间中添加类型ldap为的领域配置。至少必须将领域设置?为,指定LDAP服务器的,并指定容器DN以使用选项搜索用户。如果要配置多个领域,则还应该显式设置属性以控制身份验证期间对领域的查询顺序。有关可为LDAP领域设置?的所有选项,请参见LDAP领域设置。
elasticsearch.ymlshield.authc.realmstypeldapurluser_search.base_dnorder

例如,以下代码片段显示了使用用户搜索配置的LDAP领域:

shield: authc: realms: ldap1: type: ldap
order: 0
url: “ldaps://ldap.example.com:636”
bind_dn: “cn=ldapuser, ou=users, o=services, dc=example, dc=com”
bind_password: changeme
user_search: base_dn: “dc=example,dc=com”
attribute: cn
group_search: base_dn: “dc=example,dc=com”
files: role_mapping: “CONFIG_DIR/shield/role_mapping.yml”
unmapped_groups_as_roles: false

2.重新启动Elasticsearch

使用用户DN模板配置LDAP领域
如果您的LDAP环境为用户使用一些特定的标准命名条件,则可以使用用户DN模板来配置领域。此方法的优点是不必执行搜索即可找到用户DN。但是,可能需要多次绑定操作才能找到正确的用户DN。
要使用用户搜索配置LDAP领域:

1.在?名称空间中添加类型ldap为的领域配置。至少必须将领域设置?为,指定LDAP服务器的,并使用选项至少指定一个模板?。如果要配置多个领域,则还应该显式设置属性以控制身份验证期间对领域的查询顺序。有关可为LDAP领域设置?的所有选项,请参见LDAP领域设置。
elasticsearch.ymlshield.authc.realmstypeldapurluser_dn_templatesorder

例如,以下代码片段显示了使用用户DN模板配置的LDAP领域:
shield: authc: realms: ldap1: type: ldap
order: 0
url: “ldaps://ldap.example.com:636”
user_dn_templates: - “cn={0}, ou=users, o=marketing, dc=example, dc=com”
- “cn={0}, ou=users, o=engineering, dc=example, dc=com”
group_search: base_dn: “dc=example,dc=com”
files: role_mapping: “/mnt/elasticsearch/group_to_role_mapping.yml”
unmapped_groups_as_roles: false

LDAP负载平衡和故障转移?[?2.3.0?]在2.3.0中添加。
该load_balance.type设置可在领域级别使用,以配置Shield应如何与多个LDAP服务器进行交互。Shield支持故障转移和负载平衡操作模式。
表1.负载平衡和故障转移类型
类型 描述
failover 指定的URL按照指定的顺序使用。可以连接的第一台服务器将用于所有后续连接。如果与该服务器的连接失败,则可以建立连接的下一个服务器将用于后续连接。
dns_failover 在这种操作模式下,只能指定一个URL。该URL必须包含DNS名称。将查询系统中与此DNS名称对应的所有IP地址。始终会按照检索顺序尝试与LDAP服务器的连接。区别在于failover没有对列表进行重新排序,并且如果服务器在列表的开头出现故障,则仍将为每个后续连接尝试使用该服务器。
round_robin 连接将不断迭代提供的URL列表。如果服务器不可用,将继续遍历URL列表,直到建立成功连接为止。
dns_round_robin 在这种操作模式下,只能指定一个URL。该URL必须包含DNS名称。将查询系统中与此DNS名称对应的所有IP地址。连接将不断迭代地址列表。如果服务器不可用,将继续遍历URL列表,直到建立成功连接为止。

LDAP领域设置
表2.通用LDAP领域设置
设置 需要 描述
type 是 指示领域类型。必须设置为ldap。
order 没有 指示此领域在领域链中的优先级。首先查询低级领域。尽管不是必需的,但我们建议您在配置多个领域时显式设置此值。默认为Integer.MAX_VALUE。
enabled 没有 指示是启用还是禁用此领域。使您可以禁用领域而不删除其配置。默认为true。
url 是 指定格式为的一个或多个LDAP URL?ldap[s]😕/:。可以使用逗号分隔值或数组语法定义多个URL?[ “ldaps://server1:636”, “ldaps://server2:636” ]。ldaps和ldap?URL不能在同一领域中混合。
load_balance.type 没有 定义了多个LDAP URL时使用的行为。有关受支持的值,请参阅LDAP负载平衡和故障转移类型。
load_balance.cache_ttl 没有 当使用dns_failover或dns_round_robin作为负载平衡类型时,此设置控制缓存DNS查找的时间。默认为?1h。
user_group_attribute 没有 指定要在用户上检查的组成员资格属性。默认值为memberOf。如果group_search指定了任何设置,则将忽略此设置。
group_search.base_dn 没有 指定容器DN来搜索用户具有成员资格的组。不存在此元素时,Shield将搜索user_group_attribute用户set所指定的属性,?以确定组成员身份。
group_search.scope 没有 指定是否该组搜索应该是?sub_tree,one_level或base。?one_level仅搜索直接包含在中的对象?base_dn。默认sub_tree搜索包含在中的所有对象base_dn。base指定?base_dn是组对象,并且是唯一考虑的组。
group_search.filter 没有 指定用于查找组的过滤器。如果未设置,则领域使用或属性搜索group,?或。过滤器中的任何实例都?将替换为中定义的用户属性groupOfNamesgroupOfUniqueNamesmembermemberOf{0}group_search.user_attribute
group_search.user_attribute 没有 指定获取的用户属性并将其作为参数提供给过滤器。如果未设置,则将用户DN传递到过滤器。
unmapped_groups_as_roles 没有 指定是否将任何未映射的LDAP组的名称用作角色名称并分配给用户。默认为false。
timeout.tcp_connect 没有 指定用于建立LDAP连接的TCP连接超时时间。一个s在末端指示秒,或ms?表示毫秒。默认为5s(5秒)。
timeout.tcp_read 没有 指定建立LDAP连接后的TCP读取超时时间。一个s在末端指示秒,或ms表示毫秒。默认为5s(5秒)。
timeout.ldap_search 没有 指定LDAP搜索的LDAP服务器强制超时期限。一个s在末端指示秒,或ms表示毫秒。默认为5s(5秒)。
files.role_mapping 没有 指定YAML角色映射配置文件的路径和文件名?。默认为?ES_HOME/config/shield/role_mapping.yml。
follow_referrals 没有 指定Shield是否应遵循LDAP服务器返回的引用。引荐是服务器返回的URL,这些URL将用于继续LDAP操作(例如,搜索)。默认为?true。
hostname_verification 没有 指定在连接到LDAP服务器时是否执行主机名验证。设为时true,所使用的主机名或IP地址url必须与证书中的名称之一匹配,否则将不允许连接。由于其潜在的安全影响,?hostname_verification因此不会通过node info API公开?。默认为true。
cache.ttl 没有 指定缓存的用户条目的生存时间。在此时间段内将缓存用户的凭据。使用标准Elasticsearch?时间单位指定时间段?。默认为20m。
cache.max_users 没有 指定一次可以存储在高速缓存中的最大用户条目数。默认值为100,000。
cache.hash_algo 没有 指定用于缓存的用户凭据的哈希算法。有关可能的值,请参见缓存哈希算法。(专家设置)

表3.用户模板LDAP领域设置
设置 需要 描述
user_dn_templates 是 指定使用字符串替换用户名的DN模板{0}。该元素是多值的,允许多个用户上下文。

表4.用户搜索LDAP领域设置?[?1.1.0?]在1.1.0中添加。
设置 需要 描述
bind_dn 没有 用于绑定到LDAP并执行搜索的用户的DN。如果未指定,则尝试进行匿名绑定。由于其潜在的安全影响,hostname_verification因此不会通过?node info API公开?。
bind_password 没有 用于绑定到LDAP的用户的密码。由于其潜在的安全影响,hostname_verification因此不会通过?node info API公开?。
user_search.base_dn 是 指定要搜索用户的容器DN。
user_search.scope 没有 用户搜索的范围。有效值sub_tree,one_level或base。?one_level仅搜索直接包含在中的对象base_dn。?sub_tree搜索包含在下的所有对象base_dn。base指定,?base_dn是用户对象,并且是唯一考虑的用户。默认为?sub_tree。
user_search.attribute 没有 指定与提供给Shield的用户名匹配的属性。默认为?uid。
user_search.pool.size 没有 指定连接池中允许的与LDAP服务器的最大连接数。默认为20。
user_search.pool.initial_size 没有 启动时创建到LDAP服务器的初始连接数。默认为5。
user_search.pool.health_check.enabled 没有 对连接池中的LDAP连接启用或禁用运行状况检查。在后台按指定间隔检查连接。默认为true。
user_search.pool.health_check.dn 没有 指定要作为运行状况检查的一部分检索的专有名称。默认值为bind_dn。如果bind_dn未配置,则必须指定一个值。
user_search.pool.health_check.interval 没有 多久执行一次池中连接的后台检查。默认为?60s。

注:如果user_search指定了任何以开头user_dn_templates?的设置,则将忽略这些设置。
将LDAP组分配给角色
要为LDAP用户配置特权,您可以将LDAP组分配给存储在每个节点上的角色映射文件中的角色。当用户通过LDAP进行身份验证时,该用户的特权是由分配给该用户所属的组的角色所定义的所有特权的并集。
您可以使用组的专有名称来指定组。例如,下面的映射配置分配LDAP?admins组两个monitoring和user角色,并分配?user作用于users组。

monitoring: ①

  • “cn=admins,dc=example,dc=com” ②
    user:
  • “cn=users,dc=example,dc=com” ③
  • “cn=admins,dc=example,dc=com”

1.中定义的角色名称roles.yml。

2.组的可分辨名称admins。

3.组的可分辨名称users。

有关更多信息,请参见将用户和组映射到角色。

使用SSL / TLS加密Shield和LDAP之间的通信
您应该加密Shield与LDAP服务器之间的通信,以保护发送给进行身份验证的用户凭据。通过SSL / TLS连接可确保在Shield传输用户凭据之前对LDAP服务器的身份进行身份验证,并且在传输过程中对用户名和密码进行加密。
要加密Shield与LDAP服务器之间的通信,请执行以下操作:
1.配置每个节点以信任由签署您的LDAP服务器证书的CA签署的证书。例如,以下命令将导入cacert.pem?到node01的密钥库中。(有关使用信任库的信息,请参阅配置单独的信任库。)

cd CONFIG_DIR/shield
keytool -importcert -keystore node01.jks -file cacert.pem -alias ldap_ca

CA证书必须是PEM编码的证书。

您也可以导入单个服务器证书而不是CA证书,但这仅在具有单个LDAP服务器的情况下才建议这样做。您可以使用获取LDAP服务器证书openssl。例如,以下命令获取的证书ldap.example.com并将其本地存储在中ldap.crt。
echo | openssl s_client -connect ldap.example.com:636 2>/dev/null | openssl x509 > ldap.crt

如果您使用的是OpenSSL的旧版本,则可能需要使用-host和?-port选项,而不是-connect选项。

2.如果尚未在中配置节点的密钥库或信任库的路径?elasticsearch.yml,请设置shield.ssl.keystore.path或shield.ssl.truststore.path?属性。例如:
shield.ssl.keystore.path: /home/es/config/shield/node01.jks ①
shield.ssl.keystore.password: myPass ②
shield.ssl.keystore.key_password: myKeyPass ③

1节点密钥库文件的完整路径。该位置必须在Elasticsearch配置目录中。

2访问密钥库的密码。

3.用于访问证书的密码。仅当在生成证书时指定了单独的证书密码时才需要。
有关更多信息,请参阅“节点配置”中的“启用SSL / TLS”。
3.url在领域配置中?设置属性以指定LDAPS协议和安全端口号。例如,url: ldaps://ldap.example.com:636。
4.重新启动Elasticsearch以获取对的更改elasticsearch.yml。

默认情况下,当您将Shield配置为使用SSL / TLS连接到LDAP服务器时,Shield尝试使用url证书中的值来验证在领域配置中使用该属性指定的主机名或IP地址。如果证书和领域配置中的值不匹配,则Shield不允许连接到LDAP服务器。这样做是为了防止中间攻击的人。如有必要,可以通过将hostname_verification?属性设置为来禁用此行为false。hostname_verification被视为敏感设置,不会通过节点信息API公开。

Active Directory用户身份验证
您可以配置Shield与Active Directory通信以对用户进行身份验证。要与Active Directory集成,您可以配置Active Directory领域,并将Active Directory用户和组分配给角色映射文件中的Shield角色。
为了保护密码,应该使用SSL / TLS对Shield与LDAP服务器之间的通信进行加密。通过SSL / TLS连接到LDAP服务器的客户端和节点需要在其密钥库或信任库中安装LDAP服务器的证书或服务器的根CA证书。有关安装证书的更多信息,请参阅使用SSL / TLS加密Shield和Active Directory之间的通信。
配置Active Directory领域
Shield使用LDAP与Active Directory通信,因此Active Directory领域类似于LDAP领域。与LDAP目录一样,Active Directory会分层存储用户和组。目录的层次结构是根据诸如组织单位(ou),组织(o)和域控制器(dc)之类的容器构建的。
条目的路径是唯一标识用户或组的专有名称(DN)。用户名和组名通常具有诸如公用名(cn)或唯一ID(uid)之类的属性。DN指定为字符串,例如?“cn=admin,dc=example,dc=com”。空格被忽略。Shield仅支持Active Directory安全组。您不能将通讯组映射到角色。

注:当您使用Active Directory进行身份验证时,用户输入的用户名应与sAMAccountName或匹配userPrincipalName,而不是通用名。

要配置Active Directory领域:
1。在?名称空间中添加类型active_directory为的领域配置。至少必须将领域设置?为并指定Active Directory?。要使用SSL / TLS加密与Active Directory服务器的通信,还必须设置属性并指定LDAPS协议和安全端口号。如果要配置多个领域,则还应该显式设置属性以控制身份验证期间对领域的查询顺序。有关可为Active Directory领域设置?的所有选项,请参见Active Directory领域设置。
elasticsearch.ymlshield.authc.realmstypeactive_directorydomain_nameurlorder

注:
如果域名未在DNS中映射,则绑定到Active Directory失败。如果Windows DNS服务器未提供DNS,请在本地/etc/hosts文件中添加域的映射?。

例如,以下领域配置将Shield配置为ldaps://example.com:636通过Active Directory?连接?到身份验证用户。

shield: authc: realms: active_directory: type: active_directory
order: 0 ①
domain_name: ad.example.com
url: ldaps://ad.example.com:636 ②
unmapped_groups_as_roles: true ③

1.领域顺序控制在验证用户身份时检查配置的领域的顺序。

2.如果您未指定网址,则默认为ldap:<domain_name>:389。
3.启用此选项后,Shield会自动将Active Directory组映射到中定义的相同名称的角色roles.yml。

2.重新启动Elasticsearch。
LDAP负载平衡和故障转移?[?2.3.0?]在2.3.0中添加。
该load_balance.type设置可以在领域级别使用,以配置Shield如何与多个Active Directory服务器进行交互。Shield支持故障转移和负载平衡操作模式。
该load_balance.type设置可在领域级别使用,以配置Shield应如何与多个LDAP服务器进行交互。Shield支持故障转移和负载平衡操作模式。
表5.负载平衡和故障转移类型
类型 描述
failover 指定的URL按照指定的顺序使用。可以连接的第一台服务器将用于所有后续连接。如果与该服务器的连接失败,则可以建立连接的下一个服务器将用于后续连接。
dns_failover 在这种操作模式下,只能指定一个URL。该URL必须包含DNS名称。将查询系统中与此DNS名称对应的所有IP地址。始终会按照检索顺序尝试与LDAP服务器的连接。区别在于failover没有对列表进行重新排序,并且如果服务器在列表的开头出现故障,则仍将为每个后续连接尝试使用该服务器。
round_robin 连接将不断迭代提供的URL列表。如果服务器不可用,将继续遍历URL列表,直到建立成功连接为止。
dns_round_robin 在这种操作模式下,只能指定一个URL。该URL必须包含DNS名称。将查询系统中与此DNS名称对应的所有IP地址。连接将不断迭代地址列表。如果服务器不可用,将继续遍历URL列表,直到建立成功连接为止。

Active Directory领域设置
设置 需要 描述
type 是 指示领域类型。必须设置为?active_directory。
order 没有 指示此领域在领域链中的优先级。首先查询低级领域。尽管不是必需的,但我们建议您在配置多个领域时显式设置此值。默认为Integer.MAX_VALUE。
enabled 没有 指示是启用还是禁用此领域。使您可以禁用领域而不删除其配置。默认为true。
domain_name 是 指定活动目录的域名。Shield使用域名来导出LDAP URL,user_search_dn如果未指定这些字段,则使用LDAP URL?。
url 没有 指定形式的LDAP URL?ldap[s]😕/:。Shield尝试根据此URL进行身份验证。如果未指定URL,则Shield会从派生该URL?domain_name,并假定与端口389的连接未加密。例如,ldap://<domain_name>:389。您必须指定URL才能使用SSL / TLS连接或连接到自定义端口。
load_balance.type 没有 定义了多个LDAP URL时使用的行为。有关受支持的值,请参阅LDAP负载平衡和故障转移类型。
load_balance.cache_ttl 没有 当使用dns_failover或dns_round_robin作为负载平衡类型时,此设置控制缓存DNS查找的时间。默认为1h。
user_search.base_dn 没有 指定要搜索用户的上下文。默认为Active Directory域的根。
user_search.scope 没有 指定用户搜索应为sub_tree?(默认)one_level还是base。?sub_tree搜索包含在下的所有对象base_dn。one_level仅搜索直接包含在中的用户base_dn。?base指定,base_dn是用户对象,并且是唯一考虑的用户。
user_search.filter 没有 指定用于查找给定用户名的用户的过滤器。默认过滤器user使用sAMAccountName或查找对象userPrincipalName。如果指定,则必须是正确的LDAP用户搜索过滤器,例如(&(objectClass=user)(sAMAccountName={0}))。有关更多信息,请参见搜索过滤器语法。
group_search.base_dn 没有 指定上下文以搜索用户具有成员资格的组。默认为Active Directory域的根。
group_search.scope 没有 指定组搜索应为sub_tree?(默认)one_level还是base。?sub_tree搜索包含在下的所有对象base_dn。one_level?搜索直接包含在中的组?base_dn。base指定,它base_dn是一个组对象,并且是唯一考虑的组。
unmapped_groups_as_roles 没有 指定是否将任何未映射的LDAP组的名称用作角色名称并分配给用户。默认为false。
files.role_mapping 没有 指定YAML角色映射配置文件的路径和文件名?。默认为CONF_DIR/shield/role_mapping.yml,其中CONF_DIR为ES_HOME/config(zip / tar安装)或/etc/elasticsearch(软件包安装)。
follow_referrals 没有 指定Shield是否应遵循LDAP服务器返回的引用。引荐是服务器返回的URL,这些URL将用于继续LDAP操作(例如search)。默认为true。
hostname_verification 没有 指定在连接到LDAP服务器时是否执行主机名验证。设为时true,所使用的主机名或IP地址url必须与证书中的名称之一匹配,否则将不允许连接。由于其潜在的安全影响,?hostname_verification因此不会通过node info API公开?。默认为true。
cache.ttl 没有 指定缓存的用户条目的生存时间。在此时间段内将缓存用户的凭据。使用标准Elasticsearch?时间单位指定时间段?。默认为20m。
cache.max_users 没有 指定一次可以存储在高速缓存中的最大用户条目数。默认值为100,000。
cache.hash_algo 没有 指定用于缓存的用户凭据的哈希算法。有关可能的值,请参见缓存哈希算法。(专家设置)

将Active Directory用户和组分配给角色
要为Active Directory用户和组配置特权,您可以将它们分配给存储在每个节点上的角色映射文件中的角色。您可以使用其专有名称指定用户和组。例如,以下映射配置将Active Directory?admins?组分配给monitoring和user角色,并将user角色分配?给users?组和John Doe。
monitoring: ①

  • “cn=admins,dc=example,dc=com” ②
    user:
  • “cn=users,dc=example,dc=com” ③
  • “cn=admins,dc=example,dc=com”
  • “cn=John Doe,cn=contractors,dc=example,dc=com” ④

1中定义的角色名称roles.yml。
2组的可分辨名称admins。
3.组的可分辨名称users。
4.用户的专有名称John Doe。

有关更多信息,请参见将用户和组映射到角色。

使用SSL / TLS加密Shield和Active Directory之间的通信
您应该加密Shield与Active Directory之间的通信,以保护发送到Active Directory进行身份验证的用户凭据。通过SSL / TLS连接可确保在Shield传输用户凭据之前对Active Directory服务器的身份进行身份验证,并且在传输过程中对用户名和密码进行加密。
加密Shield与Active Directory之间的通信:
1.配置每个节点以信任由签署您的Active Directory服务器证书的CA签署的证书。例如,以下命令将导入cacert.pem?到node01的密钥库中。(有关使用信任库的信息,请参阅配置单独的信任库。)
cd CONFIG_DIR/shield
keytool -importcert -keystore node01.jks -file cacert.pem -alias ad_ca

CA证书必须是PEM编码的证书。

您也可以导入单个服务器证书而不是CA证书,但是只有在具有单个Active Directory服务器的情况下才建议这样做。您可以使用获取Active Directory服务器证书openssl。例如,以下命令获取的证书ad.example.com并将其本地存储在中ldap.crt。

echo | openssl s_client -connect ad.example.com:636 2>/dev/null | openssl x509 > ldap.crt

如果您使用的是OpenSSL的旧版本,则可能需要使用-host和?-port选项,而不是-connect选项。

2.如果尚未在中配置节点的密钥库或信任库的路径?elasticsearch.yml,请设置shield.ssl.keystore.path或shield.ssl.truststore.path?属性。例如:
shield.ssl.keystore.path: /home/es/config/shield/node01.jks ①
shield.ssl.keystore.password: myPass ②
shield.ssl.keystore.key_password: myKeyPass ③

1节点密钥库文件的完整路径。该位置必须在Elasticsearch配置目录中。

2访问密钥库的密码。

3.用于访问证书的密码。仅当在生成证书时指定了单独的证书密码时才需要。
有关更多信息,请参阅“节点配置”中的“启用SSL / TLS”。
3url在领域配置中?设置属性以指定LDAPS协议和安全端口号。例如,url: ldaps://ldap.example.com:636。
4.重新启动Elasticsearch以获取对的更改elasticsearch.yml。

默认情况下,当您将Shield配置为使用SSL / TLS连接到LDAP服务器时,Shield尝试使用url证书中的值来验证在领域配置中使用该属性指定的主机名或IP地址。如果证书和领域配置中的值不匹配,则Shield不允许连接到LDAP服务器。这样做是为了防止中间攻击的人。如有必要,可以通过将hostname_verification?属性设置为来禁用此行为false。hostname_verification被视为敏感设置,不会通过节点信息API公开。

PKI用户认证?[?1.3.0?]在1.3.0中添加。
您可以将Shield配置为使用公钥基础结构(PKI)证书对用户进行身份验证。这要求客户端出示X.509证书。要使用PKI,您需要配置PKI领域,在所需的网络层(传输或http)上启用客户端身份验证,并将DN从用户证书映射到角色映射文件中的Shield角色。

您可以结合使用PKI加密和用户名和密码身份验证。例如,可以在传输层上启用SSL / TLS并定义PKI领域,以要求传输客户端使用X.509证书进行身份验证,同时仍使用用户名和密码来身份验证HTTP通信。您还可以设置shield.transport.ssl.client.auth为optional?允许没有证书的客户端使用其他凭据进行身份验证。

您必须启用SSL / TLS才能使用PKI。有关更多信息,请参阅?在群集上设置SSL / TLS。

PKI领域配置
与领域一样,您可以pki在中的shield.authc.realms名称空间中?为领域配置选项elasticsearch.yml。
要配置PKI领域:
1.在?名称空间中添加类型pki为的领域配置。至少必须将领域设置?为。如果要配置多个领域,则还应该显式设置属性。有关可?为领域设置的所有选项,请参见PKI领域设置。elasticsearch.ymlshield.authc.realmstypepkiorderpki

例如,以下代码片段显示了最基本的PKI领域配置:
shield: authc: realms: pki1: type: pki

使用此配置,可以接受SSL / TLS层信任的任何证书进行身份验证。用户名是从证书的DN中提取的公用名(CN)。
如果要使用DN的CN以外的其他名称作为用户名,则可以指定一个正则表达式来提取所需的用户名。例如,以下配置中的正则表达式从DN中提取电子邮件地址:
shield: authc: realms: pki1: type: pki
username_pattern: “EMAILADDRESS=(.*?)(?:,|$)”

您还可以指定用于身份验证的信任库。当SSL / TLS层信任客户端使用由不同CA签名的证书而不是签署用户证书的CA时,此功能很有用。要指定信任库的位置,请指定以下truststore.path选项:
shield: authc: realms: pki1: type: pki
truststore: path: “/path/to/pki_truststore.jks”
password: “changeme”

2重新启动Elasticsearch。

PKI领域设置
设置 需要 描述
type 是 指示领域类型。必须设置为pki
order 没有 指示此领域在领域链中的优先级。首先查询低级领域。尽管不是必需的,但我们建议您在配置多个领域时显式设置此值。默认为Integer.MAX_VALUE。
enabled 没有 指示是启用还是禁用此领域。使您可以禁用领域而不删除其配置。默认为true。
username_pattern 没有 指定用于从证书DN提取用户名的正则表达式模式。第一个匹配组用作用户名。默认为?CN=(.*?)(?:,|$)。
truststore.path 没有 信任库的路径。默认为SSL / TLS设置定义的路径。
truststore.password 没有 指定信任库的密码。如果设置,则必须提供truststore.path。
truststore.algorithm 没有 指定用于信任库的算法。默认为?SunX509。
files.role_mapping 没有 指定位置?的YAML角色映射配置文件。默认为?CONFIG_DIR/shield/role_mapping.yml。
为PKI用户分配角色
您可以在每个节点上存储的角色映射文件中为PKI用户分配角色。您可以通过证书中的专有名称来识别用户。例如,下面的映射配置分配John Doe的user角色:
user: ①

  • “cn=John Doe,ou=example,o=com” ②

    1.角色文件中定义的Shield角色的名称
    2.PKI用户的专有名称。

基于文件的用户身份验证
您可以使用内置file领域来管理和认证用户。安装Shield时,默认情况下会创建一个文件领域。您可以使用?esusers命令行工具来添加和删除用户,分配用户角色以及管理用户密码。

从2.3.0REST API和native领域开始,管理用户是首选方法。有关更多信息,请参阅本机用户身份验证。仍然支持该file领域(以前称为esusers),现在可以用作后备/恢复领域。例如,如果所有用户都将自己锁定在系统之外(没人记得他们的用户名和密码),则可以admin在file领域中定义一个用户?并使用这些凭据来恢复访问权限。

配置基于文件的领域
默认情况下,文件领域已添加到领域链。您无需显式配置文件领域即可使用该esusers工具管理用户。
与其他领域一样,您可以file在中的shield.authc.realms名称空间中为领域?配置选项elasticsearch.yml。
要配置esusers领域:

1.在?名称空间中添加类型file为的领域配置。至少必须将领域设置?为。如果要配置多个领域,则还应该显式设置属性。有关可?为领域设置的所有选项,请参见文件领域设置。elasticsearch.ymlshield.authc.realmstypefileorderfile
例如,以下代码片段显示了一个域file配置,该配置将设置order为零,因此首先检查该域:

2.重新启动Elasticsearch。

文件领域设置
设置 需要 描述
type 是 指示领域类型。必须设置为file。
order 没有 指示此领域在领域链中的优先级。首先查询低级领域。尽管不是必需的,但我们建议您在配置多个领域时显式设置此值。默认为Integer.MAX_VALUE。
enabled 没有 指示是启用还是禁用此领域。使您可以禁用领域而不删除其配置。默认为true。
files.users 没有 点的位置?在的users地方的用户和他们的密码存储文件。默认情况下为CONFIG_DIR/shield/users。
files.users_roles 没有 点的位置?在的users_roles地方的用户和他们的角色存储文件。默认为?CONFIG_DIR/shield/users_roles。
cache.ttl 没有 指定缓存的用户条目的生存时间。在此时间段内将缓存用户的凭据。使用标准Elasticsearch?时间单位指定时间段?。默认为20m。
cache.max_users 没有 指定一次可以存储在高速缓存中的最大用户条目数。默认值为100,000。
cache.hash_algo 没有 指定用于缓存的用户凭据的哈希算法。有关可能的值,请参见缓存哈希算法。(专家设置)

在基于文件的领域中管理用户
从2.3.0REST API和native领域开始,管理用户是首选方法。有关更多信息,请参阅本机用户身份验证。仍然支持该file领域(以前称为esusers),现在可以用作后备/恢复领域。例如,如果所有用户都将自己锁定在系统之外(没人记得他们的用户名和密码),则可以admin在file领域中定义一个用户?并使用这些凭据来恢复访问权限。

该esusers命令行工具位于ES_HOME/bin/shield并且能够管理用户的若干管理任务:

新增使用者
该esusers useradd命令将用户添加到您的集群。

为了确保Elasticsearch在启动时可以读取用户和角色信息,esusers useradd请以与运行Elasticsearch时所用的同一用户身份运行。以root或其他用户身份运行命令将更新users和users_roles文件的权限,并阻止Elasticsearch访问它们。

esusers useradd

用户名必须至少包含1个字符,并且不能超过30个字符。第一个字符必须是字母(a-z或A-Z)或下划线()。随后的字符可以是字母,下划线(),数字(0-9),或任何下列符号@,-,.或$
您可以在命令行中使用-p选项指定用户密码。如果没有此选项,该?esusers命令将提示您输入密码。忽略-p将纯文本密码保留在终端会话的命令历史记录之外的选项。

esusers useradd -p
密码必须至少包含6个字符。
您可以使用-r参数定义用户的角色。此参数接受用逗号分隔的角色名称列表以与用户关联。
esusers useradd -r

以下示例将一个新用户添加jacknich到file领域。该用户的密码为?theshining,并且该用户与logstash和marvel角色相关联。
esusers useradd jacknich -p theshining -r logstash,marvel
有关有效的角色名称,请参见“?角色定义”。
列出用户
该esusers list命令列出了在file领域中注册的用户,如以下示例所示:
esusers list
rdeniro : admin
alpacino : power_user
jacknich : marvel,logstash
用户位于左侧列中,而其相应的角色则位于右侧列中。
该esusers list 命令列出了特定的用户。使用此命令来验证用户是否已成功添加到集群中。

esusers list jacknich
jacknich : marvel,logstash

管理用户密码
该esusers passwd命令使您可以重置用户密码。您可以直接使用-p选项指定新密码?。如果-p省略选项,该工具会提示您输入并确认在交互模式的口令。
esusers passwd
esusers passwd -p

为用户分配角色
该esusers roles命令管理与特定用户关联的角色。该-a选项向用户添加一个逗号分隔的角色列表。该-r选项从用户删除以逗号分隔的角色列表。您可以在同一命令中组合添加和删除角色,以更改用户的角色。

esusers roles -a -r

以下命令从user?删除logstash和marvel角色jacknich,以及添加user角色:

esusers roles jacknich -r logstash,marvel -a user

列出用户将显示新的角色分配:

esusers list jacknich
jacknich : user

删除用户
该esusers userdel命令删除用户。
userdel

关于?esusers
该esusers工具操纵两个文件,users并users_roles在CONFIG_DIR/shield/。这两个文件存储该file领域的所有用户数据,并在启动时读取。
默认情况下,安全性每5秒检查一次这些文件的更改。您可以通过更改文件中watcher.interval.high设置的值来更改此默认行为elasticsearch.yml。

这些文件由节点本地管理,而不由群集全局管理。这意味着对于典型的多节点群集,需要在群集中的每个节点上应用完全相同的更改。
一种更安全的方法是将更改应用到一个节点上,并将?users和users_roles文件分发/复制到群集中的所有其他节点(手动或使用配置管理系统,如Puppet或Chef)。
尽管可以使用任何标准的文本编辑器直接修改这些文件,但我们强烈建议您使用esusers命令行工具来应用所需的更改。
该users文件
该users文件存储所有用户及其密码。users文件中的每一行代表一个由用户名和哈希密码组成的单个用户条目。

rdeniro :$ 2a $ 10 $ BBJ / ILiyJ1eBTYoRKxkqbuDEdYECplvxnqQ47uiowE7yGqvCEgj9W
alpacino :$ 2a $ 10 $ cNwHnElYiMYZ / T3K4PvzGeJ1KbpXZp2PfoQD 。gfaVdImnHOwIuBKS
jacknich :$ 2a $ 10 $ GYUNWyABV / Ols /。bcwxuBuuaQzV6WIauW6RdboojxcixBq3LtI3ni

该esusers命令行工具使用bcrypt哈希默认密码。

该users_roles文件
该users_roles文件存储与用户关联的角色,如以下示例所示:
admin:rdeniro
power_user:alpacino,jacknich
user:jacknich

每行将一个角色映射到与该角色相关联的所有用户的逗号分隔列表。

与其他身份验证系统集成
如果您使用的不是LDAP,Active Directory或PKI身份验证系统,则可以创建自定义领域来与系统交互以对用户进行身份验证。您将自定义领域实现为Elasticsearch插件。
实施自定义领域
GitHub上的shield-custom-realm-example存储库中提供了示例代码,用于说明自定义领域的结构和实现?。您可以将此代码用作创建自己的领域的起点。
要创建自定义领域,您需要:
1.扩展org.elasticsearch.shield.authc.Realm与身份验证系统的通信以对用户进行身份验证。
2.扩展org.elasticsearch.shield.authc.Realm.Factory以构造新的领域类型。
3.扩展org.elasticsearch.shield.authc.DefaultAuthenticationFailureHandler以处理使用自定义领域时的身份验证失败。
要将您的自定义领域打包为Elasticsearch插件:
1.为您的领域实现扩展的插件类org.elasticsearch.plugins.Plugin。你需要:
a.导入您的领域实现文件org.elasticsearch.plugins.Plugin和?org.elasticsearch.shield.authc.AuthenticationModule。
b.实现name和description方法。
c.实现该onModule方法以向Shield注册自定义领域AuthenticationModule?并指定您的身份验证失败处理程序。
2.pom.xml为插件?创建一个Maven配置文件()。
3.为插件?创建一个plugin-descriptor.properties文件。
有关Elasticsearch插件的更多信息,请参见Elasticsearch插件和集成。

使用自定义领域来验证用户
要使用自定义领域:
1.在集群中的每个节点上安装领域插件。bin/plugin使用该install?选项运行,并指定包含插件的zip文件的位置。例如:

bin/plugin install file:/// /example-realm-plugin-1.0.zip

2.elasticsearch.yml在?shield.authc.realms名称空间中?添加适当领域类型的领域配置。您可以设置的选项取决于自定义领域公开的设置。至少,您必须将领域设置type为插件实现中定义的类型。如果要配置多个领域,则还应该显式设置?order属性以控制身份验证期间对领域的查询顺序。
3.重新启动Elasticsearch。

控制用户缓存
用户凭据被缓存在每个节点的内存中,以避免连接到远程身份验证服务器或为每个传入请求访问磁盘。您可以配置与用户高速缓存的特性cache.ttl,cache.max_users和cache.hash_algo领域设置。
注意:PKI领域不使用用户缓存。
缓存的用户凭据将散列在内存中。默认情况下,Shield使用加盐的sha-256?哈希算法。您可以通过将设置cache-hash_algo设置为任何受支持的缓存哈希算法来使用其他算法:

表6.高速缓存哈希算法
算法 描述
ssha256 使用加盐sha-256算法(默认)。
md5 使用MD5算法。
sha1 使用SHA1算法。
bcrypt 使用bcrypt10轮产生的盐算法。
bcrypt4 使用bcrypt算法并生成4轮盐。
bcrypt5 使用bcrypt算法并生成5轮盐。
bcrypt6 使用bcrypt算法并生成6轮盐。
bcrypt7 使用bcrypt7轮产生的盐算法。
bcrypt8 使用bcrypt8轮产生的盐算法。
bcrypt9 使用bcrypt算法,并在9轮内生成盐。
noop,clear_text 不散列凭据,并以明文形式将其保留在内存中。注意:保持清晰的文本被认为是不安全的,并且可能会在操作系统级别上受到损害(例如,通过内存转储和使用ptrace)。

从缓存中逐出用户
Shield公开了一个Clear Cache API,您可以使用该API强制驱逐已缓存的用户。例如,以下请求将所有用户逐出该ad1领域:
$ curl -XPOST ‘http://localhost:9200/_shield/realm/ad1/_clear_cache’

要清除多个领域的缓存,请将领域指定为以逗号分隔的列表:
$ curl - XPOST’http :// localhost:9200 / _shield / realm / ad1,ad2 / _clear_cache’

您也可以逐出特定用户:
$ curl - XPOST’http :// localhost:9200 / _shield / realm / ad1 / _clear_cache?usernames = rdeniro,alpacino’

用户和角色的迁移工具
从基于文件的用户和角色迁移到本机领域的最简单方法是使用migrateshield插件随附的工具。迁移工具读取文件领域文件以加载定义的用户和领域,并执行HTTP请求以将指定的用户和角色添加到存储中。
要在安装shield插件后运行迁移工具,请按以下方式运行迁移工具:
$ bin/shield/migrate native -U http://localhost:9200 -u test_user -p changeme -n lee,foo -r role1,role2,role3,role4,foo
starting migration of users and roles…
importing users from [/home/es/config/shield/users]…
found existing users: [test_user, joe3, joe2]
migrating user [lee]{“user”:{“created”:true}}
no user [foo] found, skipping
importing roles from [/home/es/config/shield/roles.yml]…
found existing roles: [marvel_user, role_query_fields, admin_role, role3, admin, remote_marvel_agent, power_user, role_new_format_name_array, role_run_as, logstash, role_fields, role_run_as1, role_new_format, kibana4_server, user, transport_client, role1.ab, role_query]
migrating role [role1]{“role”:{“created”:true}}
migrating role [role2]{“role”:{“created”:true}}
role [role3] already exists, skipping
no role [foo] found, skipping
users and roles imported.

现有用户或角色将不会被替换或覆盖,并且如果用户或角色不在基于文件的配置中,则将被跳过。
“ native”子命令支持以下选项:

表7.迁移工具设置
参数 需要 描述
-U,?–url 是 将用户和角色添加到的Elasticsearch集群的URL端点
-u,?–username 没有 用于认证的用户名
-p,?–password 没有 用于认证的密码
-c,?–config 没有 要使用的配置目录,而不是默认的SSL配置,用户和角色文件
-n,?–users 没有 以逗号分隔的要迁移的用户名列表,如果为空,则将迁移所有找到的用户
-r,?–roles 没有 以逗号分隔的要迁移的角色名称列表,如果为空,将迁移所有找到的角色

基于角色的访问控制
Shield为Elasticsearch提供基于角色的访问控制(RBAC)。RBAC使您可以控制用户可以在Elasticsearch集群上执行的操作。默认情况下,所有操作都是受限制的。分配给用户的角色指定用户可以执行的操作。

角色和特权
一个角色是一组指定的特权。角色内指定的特权控制该角色向其授予访问权限的Elasticsearch动作:
?群集特权授予对群集范围内的管理和监视操作的访问权限。
?索引特权授予对群集中特定索引的访问权限,包括数据访问以及管理和监视操作。
?运行?身份特权使经过身份验证的用户可以代表另一个用户提交请求。有关更多信息,请参见为其他用户提交请求。
例如,您可以定义一个日志记录管理员角色,该角色允许日志记录管理员对名称与pattern匹配的索引执行所有操作logs-*。
定义角色并将角色分配给用户需要manage_security特权。有关可以在角色中分配的群集和索引特权的完整列表,请参阅特权。
用户可以与任意数量的角色相关联。有关为用户分配角色的更多信息,请参阅设置身份验证。

管理角色
您使用REST API创建,更新和删除角色。如果使用本地域对用户进行身份验证,则可以通过用户管理API向用户分配角色?。如果使用Active Directory,LDAP或PKI领域,请?在YAML文件中配置角色映射。要将角色分配给file领域中的用户,请使用?esusers命令行工具。

注意:从2.3.0REST开始,API是管理角色的首选方法。但是,您仍然可以配置基于文件的角色,如果要定义仅具有对群集中节点的物理访问权限的管理员可以修改的角色,这将很有用。

添加角色
要添加或修改角色,请向/shield/role/?端点提交PUT或POST请求。
角色名称必须至少包含1个字符且不超过30个字符。它必须以字母(a-z)或下划线(
)开头。随后的字符可以是字母,下划线(_),数字(0-9)或任何下列符号@,-,.或$。
在角色定义中,指定角色授予的集群特权和?索引特权。(可选)您还可以配置字段和文档级别的安全性并分配run_as特权。
POST /_shield/role/my_admin_role{
“cluster”: [“all”], ①
“indices”: [ ②
{
“names”: [ “index1”, “index2” ], ③
“privileges”: [“all”], ④
“fields”: [ “title”, “body” ], ⑤
“query”: “{“match”: {“title”: “foo”}}” ⑥
}
],
“run_as”: [ “other_user” ] ⑦
}

1.角色授予的群集特权。可选的
2.角色授予的索引特权。可选的

3.角色适用的索引。索引特权所必需。

4.角色授予的索引特权。索引特权所必需。

5.角色授予访问权限的特定索引字段。可选,默认为所有字段。
6.定义角色授予访问权限的文档的查询。可选,默认为所有文档。
7.角色授予的运行方式特权。允许具有此角色的用户代表指定的用户执行操作other_user。可选的

注意:
更新角色时,您需要指定完整的角色定义,而不仅是要修改的字段。

成功调用将返回一个JSON结构,该结构显示角色是否已创建或更新。

{ “ role” :{ “ created” :true

} }

1.当现有角色更新时,created设置为false。
在角色中指定索引名称
在indices.names数组中,您可以使用通配符和正则表达式来引用多个索引。
?通配符-默认情况下,您可以使用简单的通配符匹配,其中*是零个或多个字符?的占位符,是单个字符的占位符,并且\可以用作转义符。
?正则表达式-为了匹配更复杂的模式,您可以通过将模式包装在一对正斜杠(/)中来启用正则表达式。正则表达式基于Lucene的regexp自动机语法。任何以开头/和结尾都不结尾的模式都/?被认为格式不正确。
示例正则表达式。

“foo-bar”: # match the literal foo-bar
“foo-": # match anything beginning with “foo-”
"logstash-201?-
”: # ? matches any one character
“/.-201[0-9]-./”: # use a regex to match anything containing 2010-2019
“/foo”: # syntax error - missing final /

检索角色
要检索所有角色,请向/_shield/role端点提交GET请求:
GET /_shield/role

要检索特定角色,请将角色指定为以逗号分隔的列表:
GET /_shield/role/my_admin_role,log_admin_role

返回一个角色数组,其中包含每个角色的JSON表示形式。
{
“found” : true, ①
“roles” : [ {
“name” : “my_admin_role”,
“cluster” : [ “all” ],
“indices” : [ {
“names” : [ “index1”, “index2” ],
“privileges” : [ “all” ],
“fields” : [ “title”, “body” ],
“query” : “{“match”: {“title”: “foo”}}”
} ],
“run_as” : [ “other_user” ]
},
{
“name” : “log_admin_role”,
“cluster” : [ “all” ],
“indices” : [ {
“names” : [ “logs-*” ],
“privileges” : [ “all” ],
} ]
}]}

1.如果指定的角色未在native领域中定义,found?则设置为false。

删除角色
要删除角色,请向/_shield/role/?端点提交DELETE请求:

DELETE /_shield/role/my_admin_role

如果成功删除了角色,则请求返回{“found”: true}。否则,found设置为false。
{
“found” : true}

基于文件的角色
在大多数情况下,应该通过REST API管理角色。但是,可以将roles.yml位于其中的文件中定义的角色?CONFIG_DIR/shield与file领域结合使用。这是一个YAML文件,其中每个条目定义唯一的角色名称以及与其关联的集群和索引特权。

注意:该roles.yml文件由节点本地管理,而不由群集全局管理。这意味着对于典型的多节点群集,需要在群集中的每个节点上应用完全相同的更改。

一种更安全的方法是将更改应用到一个节点上,并将其roles.yml分发/复制到群集中的所有其他节点(手动或使用配置管理系统,如Puppet或Chef)。

以下示例配置四个角色:
admin 对群集具有完全访问权限(所有特权),并且对群集中的所有索引具有完全访问权限。
power_user 在群集上具有仅监视的访问权限,使用户能够请求群集指标,信息和设置,而无须更新设置。该用户还具有群集中所有索引的完全访问权限。
user 无法更新或监视群集。对集群中的所有索引具有只读访问权限。
events_user 对具有events_前缀的所有索引具有只读访问权限。

All cluster rights

All operations on all indices

admin:
cluster:

  • all
    indices:
    • names: ‘*’
      privileges:
      • all

Monitoring cluster privileges

All operations on all indices

power_user:
cluster:

  • monitor
    indices:
  • names: ‘*’
    privileges:
    • all

Only read operations on indices

user:
indices:

  • names: ‘*’
    privileges:
    • read

Only read operations on indices named events_*

events_user:
indices:

  • names: ‘events_*’
    privileges:
  • read

有关可以在角色中分配的群集和索引特权的完整列表,请参阅特权。

不推荐使用的角色格式
警示:在2.3.0中已弃用。
角色格式以前允许将索引表达式设置为一组特权的键,如下所示,但是为了支持namesand?privileges字段,已经弃用了该格式。

特权也可以直接在索引表达式上设置。如果未配置其他安全功能,则此符号很有用。

较短的特权表示法。

shorter privilege notation using index name as key and privilege as value

get_user:
indices:
‘events_index’: read

索引表达键符号。

this notation uses the index name as the key with privileges as a value within the object

get_user:
indices: ‘events_index’:
privileges: read

定义这些角色的更新方法是:
集合符号。

this notation uses collections equivalent to the above examples

get_user: indices:

  • names:
  • events_index
    privileges:
  • read
    扩展示例显示角色中的群集特权和多个索引特权:

get_user:
cluster:

  • monitor
    indices:
  • names:
    • events_index
      privileges:
      • read
  • names:
    • get_user_index
      privileges:
      • monitor
      • index
      • read

授予索引别名的特权
您授予对索引别名的访问权限与授予对特定索引的访问权限的方法相同。要对索引别名执行操作,用户必须具有该别名的特权。访问别名索引不会自动授予对别名的访问权限。

注释:
别名可以具有一个过滤器,该过滤器指定物理索引中文档的子集。这些过滤器并不总是适用,不应代替文档级安全性使用。
例如,如果您有2016一个名为index的索引和一个名为的指向它的别名current_year,以授予用户使用别名的权限,则可以分配以下角色:
{ “ current_year_read” :{ “ cluster” :[],“ indices” :[{ “ names” :[ “ current_year” ],“ privileges” :[ “ read” ]}],“ run_as” :[] } }}

授予对2016索引的读取访问权限不会使用户使用?current_year别名。

管理别名
对索引别名执行CRUD操作需要manage同时具有目标索引和别名的特权。创建索引时添加别名也需要create_index特权。

例如,以下角色将使用户能够创建一个别名current_year,该别名被称为?2016?通过专用别名API?命名的索引:
{ “ admin” :{ “ cluster” :[],“ indices” :[{ “ names” :[ “ 2016” ,“ current_year” ],“ privileges” :[ “ manage” ]}]],“ run_as” :[ ] } }

将用户和组映射到角色
如果您通过native领域对用户进行身份验证,则可以通过User Management API向用户分配角色。如果使用file领域,则可以使用esusers命令行工具分配角色?。

对于其他类型的领域,可以在YAML文件中为用户和组配置角色映射,然后将其复制到群集中的每个节点。Puppet或Chef之类的工具可以帮助解决此问题。

默认情况下,角色映射存储在中CONF_DIR/shield/role_mapping.yml,其中CONF_DIR?是ES_HOME/config(zip / tar安装)或/etc/elasticsearch(软件包安装)。要指定其他位置,请在中配置role_mapping设置elasticsearch.yml。这些role_mapping设置使您可以为每种领域类型使用一组不同的映射:

shield.authc.ldap.files.role_mapping
LDAP领域的角色映射的位置。
shield.authc.active_directory.files.role_mapping
Active Directory领域的角色映射的位置。
shield.authc.pki.files.role_mapping
PKI领域的角色映射的位置。
重点:为了Shield读取映射文件,必须将其存储在Elasticsearch中CONF_DIR。

在角色映射文件中,Shield角色是键和组,用户是值。映射可以具有多对多关系。将角色映射到组时,该组中用户的角色是分配给该组的角色和分配给该用户的角色的组合。

可用角色在角色文件中定义。要在角色映射中指定用户和组,请使用其专有名称(DN)。DN是唯一标识用户或组的字符串,例如?“cn=John Doe,cn=contractors,dc=example,dc=com”。

注意:
Shield仅支持Active Directory安全组。您不能将通讯组映射到角色。

例如,以下片段将admins组映射到monitoring角色,将John Doe,users组和admins组映射?到user角色。

monitoring: ①

  • “cn=admins,dc=example,dc=com” ②
    user:
  • “cn=John Doe,cn=contractors,dc=example,dc=com” ③
    • “cn=users,dc=example,dc=com”
    • “cn=admins,dc=example,dc=com”

1.在角色文件中定义的Shield角色的名称。

2.LDAP组或Active Directory安全组的专有名称。

3.LDAP或Active Directory用户的专有名称。?[?1.1.0?]

PKI领域仅支持将用户映射到角色,因为PKI中没有组的概念。例如:

monitoring:

  • “cn=Admin,ou=example,o=com”
    user:
  • “cn=John Doe,ou=example,o=com”

设置字段和文档级别的安全性
您可以通过向角色添加字段和文档级别的安全权限来控制对索引内数据的访问。字段级别的安全权限将限制对文档中特定字段的访问。文档级安全权限限制对索引中特定文档的访问。

注意:文档和字段级别的安全性目前旨在与只读特权帐户一起使用。为索引启用了文档和字段级安全性的用户不应执行写操作。

角色可以基于每个索引定义字段和文档级别的权限。未指定字段级别权限的角色将授予对所有字段的访问权限。同样,不指定文档级别权限的角色将授予对索引中所有文档的访问权限。

重要:
为用户分配多个角色时,请注意不要无意间授予超出预期范围的访问权限。每个用户每个索引具有一组字段级别和文档级别权限。当您为用户分配多个角色时,权限将进行“或”运算。这意味着,如果您分配一个角色来限制对索引中特定字段的访问,而另一个角色没有为该索引指定任何字段级别的访问限制,则用户将有权访问所有字段。文档级权限也是如此。

例如,假设role_a仅授予address?对中文档字段的访问权限index1,但未指定任何文档限制。相反,在中role_b限制对文档子集的访问index1,但未指定任何字段限制。如果您为用户分配了两个角色,则role_a授予该用户访问所有文档的权限,并role_b授予该用户访问所有字段的权限。
如果您需要限制对文档和字段的访问,请考虑按索引拆分文档。

现场级安全
要启用字段级安全性,您可以在角色定义中指定每个角色可以访问的字段。您在fields条目中列出允许的字段。(忽略该fields条目将禁用字段级安全性。)字段与特定的索引或索引模式相关联,并与为索引指定的特权结合使用。

POST /_shield/role/my_fls_role{
“indices”: [
{
“names”: [ “index1”, “index2” ],
“privileges”: [“read”], ①
“fields”: [ “title”, “body” ]
}
]}

1.为索引启用了文档和字段级安全性的用户不应执行写操作。

要允许访问_allmeta字段,必须将其明确列出为允许的字段。始终允许访问以下元字段:_id,_type,_parent,_routing,_timestamp,_ttl,_size和_index。如果您指定字段的空列表,则只能访问这些元字段。

例如,以下customer_care角色授予对任何索引中六个字段的读取访问权限:
POST /_shield/role/customer_care{
“indices”: [
{
“names”: [ “*” ],
“privileges”: [“read”],
“fields”: [
“issue_id”,
“description”,
“customer_handle”,
“customer_email”,
“customer_address”,
“customer_phone”
]
}
]}

在角色中指定字段名称
在indices.fields数组中,您可以使用通配符和正则表达式来引用多个字段:
?通配符-默认情况下,您可以使用简单的通配符匹配,其中*是零个或多个字符?的占位符,是单个字符的占位符,并且\可以用作转义符。
?正则表达式-为了匹配更复杂的模式,您可以通过将模式包装在一对正斜杠(/)中来启用正则表达式。正则表达式基于Lucene的regexp自动机语法。任何以开头/和结尾都不结尾的模式都/?被认为格式不正确。

例如,以下角色与上一个角色相同:
POST /shield/role/customer_care{
“indices”: [
{
“names”: [ “*” ],
“privileges”: [“read”],
“fields”: [
“issue_id”,
“description”,
"customer
*"
]
}
]}

如果索引中的文档更复杂并且包含JSON对象,请使用点号概念指定可访问字段。

例如,如果您具有以下客户文档:
{ “ customer” :{ “ handle” :“ Jim” ,“ email” :“ jim@mycompany.com” ,“ phone” :“ 555-555-5555” } }
要仅允许访问该handle字段,请customer.handle在fields条目中指定:
POST / _shield / role / my_role
{ “ indices” :[ { “ names” :[ “ *” ],“ privileges” :[ “ read” ],“ fields” :[ “ customer.handle” ] } ] }

要允许访问整个customer对象,可以使用通配符
POST / _shield / role / my_role
{ “ indices” :[ { “ names” :[ “ ” ],“ privileges” :[ “ read” ],“ fields” :[ “ customer。” ] } ] }

文件级安全性
启用文档级安全性限制了可以从任何基于文档的API中访问哪些文档。您使用查询来指定可以访问的文档。要启用文档级安全性,请query在角色定义中包含一个条目。(省略?query条目将禁用文档级安全性。)查询与特定的索引或索引模式相关联,并与为索引指定的特权结合使用。

POST / _shield / role / my_dls_role
{ “ indices” :[ { “ names” :[ “ index1” ,“ index2” ],“ privileges” :[ “ read” ],

      ①
    
  “ query” :{ “ term” :{ “ department_id” :“ 12” }}      ②
} ] }

1.为索引启用了文档和字段级安全性的用户不应执行写操作。
2.来自Elasticsearch query-dsl的任何查询都可以用于该query条目。该查询限制只能访问这些文件,其department_id是12。

具有文档和字段级安全性的多个角色
一个用户可以有多个角色,并且每个角色可以对同一索引定义不同的权限。文档和字段级别的安全性考虑到了用户所扮演的每个角色,并结合了以下权限:

?文档级安全性通过OR操作将针对特定索引的每个文档级安全性查询组合在一起。这意味着,如果文档与任何角色查询匹配,则可以对其进行访问。如果一个角色在禁用文档级别安全性的情况下授予对索引的访问权限,而另一个角色在索引中限制了对特定文档的访问权限,则两个角色的用户都可以访问索引中的任何文档。

?字段级别的安全性将考虑用户所担任的每个角色,并将列出的所有字段合并到每个索引的单个集合中。如果一个角色授予对没有字段级安全性的索引的访问权限,而另一个角色授予了具有字段级安全性的访问权限,则不会应用字段级安全性;具有这两种角色的用户将有权访问索引中文档中的所有字段。

代表其他用户提交请求
Shield支持一种特权,该特权使经过身份验证的用户可以代表其他用户提交请求。如果您的应用程序已经对用户进行身份验证,则可以使用此?运行方式机制来根据Shield权限限制数据访问,而不必通过Shield重新验证每个用户。

要以其他用户身份运行,您必须能够从用于身份验证的领域中检索该用户。在native和file领域支持这一开箱即用。要run_as与LDAP领域一起使用,必须将其配置为启用用户搜索。有关更多信息,请参见使用用户搜索配置LDAP领域。

要代表其他用户提交请求,您需要具有run_as?特权。例如,以下run_as_role授予代表jacknich或提交请求的权限redeniro:
POST /_shield/role/run_as_role{
“run_as”: [ “jacknich”, “rdeniro” ]}

有关分配角色的信息,请参阅将用户和组映射到角色。

要以另一个用户身份提交请求,请在请求标头中指定该用户。例如:
curl -H “es-shield-runas-user: jacknich” -u es_admin -XGET ‘http://localhost:9200/’

审核安全事件
重要:默认情况下,审核日志是禁用的。要启用审核日志记录,请shield.audit.enabled在中进行?设置elasticsearch.yml:
shield.audit.enabled: true

您可以启用审核以跟踪与安全性相关的事件,例如身份验证失败和拒绝连接。记录这些事件使您可以监视群集中的可疑活动,并在发生攻击时提供证据。

Shield提供了两种保留审核日志的方法:
?access.log主机文件系统上的?专用文件。
?Elasticsearch索引。审核索引可以位于同一群集或单独的群集上。

默认情况下,审核事件会写入access.log。为了方便浏览和分析事件,您还可以通过设置shield.audit.outputs?来启用索引elasticsearch.yml:

shield.audit.outputs: [index, logfile]

的index输出类型应与结合使用logfile的输出类型。因为index如果目标索引不可用,则logfile输出类型可能会丢失消息,因此?应将输出类型用作事件的正式记录。

注意:审核事件被批处理以建立索引,因此在事件出现在索引中之前会有一个滞后。您可以控制如何频繁的事件批次通过设置推到指数shield.audit.index.flush_interval?在elasticsearch.yml。

日志条目类型
每个审核事件由单个日志条目表示。日志条目中指定的类型表示发生的事件的类型:

?anonymous_access_denied?由于缺少身份验证令牌而拒绝请求时,将记录日志。
?authentication_failed?当身份验证令牌无法与已知用户匹配时,将记录日志。
?authentication_failed []?对于未能提供有效身份验证令牌的每个领域,都会记录日志。的值是领域类型。
?access_denied?经过身份验证的用户尝试该用户没有权限执行的操作时,将记录该日志?。
?access_granted?经过身份验证的用户尝试执行该用户具有正确权限的操作时,将记录该日志。在TRACE级别中,还记录了所有系统(内部)操作(在所有其他级别中,都未记录它们,以避免日志混乱。
?tampered_request?在检测到请求被篡改时记录日志(通常与search/scroll认为滚动ID被篡改的请求有关)
?connection_granted?当传入的TCP连接已通过特定配置文件的ip过滤时记录
?connection_denied?当传入的TCP连接未通过特定配置文件的IP过滤时,将记录日志

您可以设置日志级别logging.yml来控制记录什么类型的事件。下表列出了每种可能的日志级别记录的日志条目类型。

表8.日志条目的类型和级别
日志级别 输入类型
ERROR authentication_failed,access_denied,tampered_request,connection_denied
WARN authentication_failed,access_denied,tampered_request,connection_denied,anonymous_access_denied
INFO authentication_failed,access_denied,tampered_request,connection_denied,anonymous_access_denied,access_granted
DEBUG (不会输出以外的其他条目类型INFO,但会扩展为每个条目发出的信息(请参阅下面的日志条目格式)
TRACE authentication_failed,access_denied,tampered_request,connection_denied,anonymous_access_denied,access_granted,connection_granted,authentication_failed []。此外,还将记录内部系统请求(由Elasticsearch本身触发的自我管理请求)的access_granted条目类型。

有关配置审核日志的更多信息,请参阅审核日志设置。

日志输入格式
每个日志条目均包含以下信息:
?指示事件发生时间的时间戳。
?事件与之关联的组件/层
?发生的事件的类型。
?有关事件的信息(取决于事件的类型)
日志条目的格式为:
[] [<local_node_info>] [] [<entry_type>] <attribute_list>

哪里:
?-事件发生的时间。您可以在中配置时间戳格式logging.yml。
?<local_node_info>-有关生成此日志条目的本地节点的信息。您可以通过配置本地节点信息设置来控制包括哪些节点信息。
?-该层作为此事件起源:rest,transport或ip_filter。
?<entry_type>-发生的事件的类型:anonymous_access_denied,authentication_failed,?access_denied,access_granted,connection_granted,connection_denied。
?<attribute_list>-键值对的逗号分隔列表,其中包含与事件有关的数据。格式化为attr1=[val1], attr2=[val2],…)。有关每种事件类型可以包含的属性,请参阅日志条目属性。

表9.本地节点信息设置
名称 默认 描述
shield.audit.logfile.prefix.emit_node_name 真正 在本地节点信息中包含或排除节点的名称。
shield.audit.logfile.prefix.emit_node_host_address 假 从本地节点信息中包括或排除节点的IP地址。
shield.audit.logfile.prefix.emit_node_host_name 假 在本地节点信息中包括或排除节点的主机名。

日志条目属性
下表显示了可以与每种事件类型关联的属性。日志级别确定日志条目中包括哪些属性。
表10.?[rest] [anonymous_access_denied]属性
属性 最低日志级别 描述
origin_address 警告 发出请求的IP地址
uri 警告 REST端点URI
request_body 调试 请求的正文
表11.?[rest] [authentication_failed]属性
属性 最低日志级别 描述
origin_address 错误 发出请求的IP地址
principal 错误 身份验证失败的主体(用户名)
uri 错误 REST端点URI
request_body 调试 请求的正文
realm 跟踪 无法验证用户身份的领域注意:为每个查询的领域生成一个单独的日志条目。
表12.?[transport] [anonymous_access_denied]属性
属性 最低日志级别 描述
origin_type 警告 请求发起的位置:(rest请求源自REST API请求),transport(请求是在传输通道上收到的),local_node(本地节点发出了请求)
origin_address 警告 发出请求的IP地址
action 警告 执行的动作的名称
request 调试 执行的请求类型
indices 警告 请求所属索引的逗号分隔列表(适用时)
表13.?[transport] [authentication_failed]属性
属性 最低日志级别 描述
origin_type 错误 请求发起的位置:(rest请求源自REST API请求),transport(请求是在传输通道上收到的),local_node(本地节点发出了请求)
origin_address 错误 发出请求的IP地址
principal 信息 身份验证失败的主体(用户名)
action 错误 执行的动作的名称
request 调试 执行的请求类型
indices 错误 请求所属索引的逗号分隔列表(适用时)
realm 跟踪 无法验证用户身份的领域注:为每个查询的领域生成一个单独的日志条目
表14.?[transport] [access_granted]属性
属性 最低日志级别 描述
origin_type 信息 请求发起的位置:(rest请求源自REST API请求),transport(请求是在传输通道上收到的),local_node(本地节点发出了请求)
origin_address 信息 发出请求的IP地址
principal 信息 身份验证失败的主体(用户名)
action 信息 执行的动作的名称
request 调试 执行的请求类型
indices 信息 请求所属索引的逗号分隔列表(适用时)
表15.?[transport] [access_denied]属性
属性 最低日志级别 描述
origin_type 错误 请求来源的来源类型。可以是rest(请求源自其他API请求),transport(在传输通道上收到的请求),(local_node本地节点发出的请求)
origin_address 错误 发出请求的IP地址
principal 错误 身份验证失败的主体(用户名)
action 错误 执行的动作的名称
request 调试 执行的请求类型
indices 错误 请求所属索引的逗号分隔列表(适用时)
表16.?[transport] [tampered_request]属性
属性 最低日志级别 描述
origin_type 错误 请求来源的来源类型。可以是rest(请求源自其他API请求),transport(在传输通道上收到的请求),(local_node本地节点发出的请求)
origin_address 错误 发出请求的IP地址
principal 错误 身份验证失败的主体(用户名)
action 错误 执行的动作的名称
request 调试 执行的请求类型
indices 错误 请求所属索引的逗号分隔列表(适用时)
表17.?[ip_filter] [connection_granted]属性
属性 最低日志级别 描述
origin_address 跟踪 发出请求的IP地址
transport_profile 跟踪 身份验证失败的主体(用户名)
rule 跟踪 授予请求的IP过滤规则
表18.?[ip_filter] [connection_denied]属性
属性 最低日志级别 描述
origin_address 错误 发出请求的IP地址
transport_profile 错误 身份验证失败的主体(用户名)
rule 错误 拒绝请求的IP过滤规则

审核日志设置
您可以在中的logging.yml文件中配置审核日志选项CONFIG_DIR/shield。以下代码段显示了默认的日志配置:
默认logging.yml文件
logger:
shield.audit.logfile: INFO, access_log

additivity:
shield.audit.logfile: false

appender:

access_log:
type: dailyRollingFile
file: p a t h . l o g s / {path.logs}/ path.logs/{cluster.name}-access.log
datePattern: “’.'yyyy-MM-dd”
layout:
type: pattern
conversionPattern: “[%d{ISO8601}] %m%n”

默认情况下,审核信息会附加到access.log位于标准Elasticsearch?logs目录(通常位于$ES_HOME/logs)中的文件中。

在Elasticsearch索引中存储审核日志
除了记录到文件之外,您还可以将审核日志存储在Elasticsearch索引中。您可以配置以下设置elasticsearch.yml来控制如何对审核日志条目建立索引。

表19.审核日志索引设置
属性 默认设置 描述
shield.audit.outputs logfile 必须设置为index或[index, logfile]才能启用审核日志记录。
shield.audit.index.bulk_size 1000 控制一次写入中批处理了多少个审核事件
shield.audit.index.flush_interval 1s 控制将缓冲事件刷新到索引的频率
shield.audit.index.rollover daily 控制多久翻转到一个新的指标:?hourly,daily,weekly,monthly
shield.audit.index.events.include anonymous_access_denied, authentication_failed, access_granted, access_denied, tampered_request, connection_granted, connection_denied 要编制索引的审计事件。有效值:anonymous_access_denied, authentication_failed, access_granted, access_denied, tampered_request, connection_granted, connection_denied,system_access_granted。_all是包含所有类型的特殊值。
shield.audit.index.events.exclude system_access_granted 从索引中排除的审核事件。默认情况下,system_access_granted事件被排除。如果包含这些事件,则将对所有内部节点通信进行索引,这将大大增加审核索引的大小。

您还可以在中为审核日志索引配置标准索引设置shield.audit.index.settings。例如,以下配置将审计索引的分片和副本数设置为1:

shield.audit.index.settings: index: number_of_shards: 1
number_of_replicas: 1

将审核日志转发到远程群集
要将审核事件索引到远程Elasticsearch群集,请配置以下shield.audit.index.client设置。
表20.远程审核日志索引设置
属性 默认 描述
shield.audit.index.client.hosts 没有 以逗号分隔的host:port对列表。这些主机应该是群集中要索引的节点。
shield.audit.index.client.cluster.name 没有 远程集群的名称。
shield.audit.index.client.shield.user 没有 用于对远程集群进行身份验证的username:password对。

您可以使用shield.audit.index.client名称空间将其他设置传递给远程客户端。例如,要允许远程客户端发现远程集群中的所有节点,可以设置?client.transport.sniff:

shield.audit.index.client.transport.sniff: true

通过加密和IP过滤保护通信安全
Elasticsearch节点存储可能是机密的数据。数据攻击可能来自网络。这些攻击可能包括对数据的嗅探,对数据的操纵,以及试图获得对服务器的访问权限,从而试图访问存储数据的文件。通过以下步骤保护节点,有助于降低基于网络的攻击的风险。
本节说明如何:
?使用SSL / TLS对往返Elasticsearch节点的流量进行加密,
?要求节点使用SSL证书对加入群集的新节点进行身份验证,并且
?使远程攻击者更难向Elasticsearch发布任何命令。
新节点的身份验证有助于防止恶意节点加入群集并通过复制接收数据。

在群集上设置SSL / TLS
Shield使您可以加密往返Elasticsearch集群中节点的流量。使用传输层安全性(TLS)保护连接的安全。
重要:未启用加密的节点将以纯文本格式发送密码。

要启用加密,您需要在集群中的每个节点上执行以下步骤:
1.安装X.509证书。
2.将节点配置为:
a.使用其签名证书进行自我识别。
b.在传输层和HTTP层上启用SSL。
c.配置节点可以联系以加入集群的单播主机。
3.重新启动Elasticsearch。

安装节点证书
节点证书应该由群集中每个节点都信任的证书颁发机构(CA)签名。您可以使用第三方CA,组织的现有CA,或?设置专门用于签署节点证书的证书颁发机构。

当客户端使用SSL / TLS连接到节点时,该节点向客户端提供其证书,并证明它拥有与证书链接的私钥。然后,客户端确定节点的证书是否有效,受信任,并且与尝试连接的主机名或IP地址匹配。连接到集群中的其他节点时,节点充当客户端,因此每个节点必须信任集群中的所有其他节点。

注意:
尽管从技术上讲可以使用自签名证书,但我们强烈建议使用由CA签名的证书在节点之间建立信任。自签名证书必须被单独信任,这意味着每个节点都必须安装其他每个节点的证书。如果将节点添加到群集,则必须在所有现有节点上安装新节点的自签名证书,然后重新启动它们。使用CA签名的证书时,现有节点只需要信任用于签署新节点的证书的CA。(您应该使用相同的CA来签署所有节点证书。)
要安装签名证书,您需要:
1.创建密钥库并为该节点生成证书。
2.创建证书签名请求(CSR)。
3.将证书发送到您的CA进行签名。
4.将签名的证书添加到节点的密钥库中。

创建密钥库并生成证书
要创建密钥库并生成节点证书:

1.创建一个节点密钥库,并使用Java Keytool导入您的CA证书。这会将节点配置为信任由CA签名的证书。为了使Elasticsearch访问密钥库,它必须位于Elasticsearch配置目录下。例如,以下命令为创建一个密钥库node01并导入CA证书cacert.pem。

cd CONFIG_DIR/shield
keytool -importcert -keystore node01.jks -file cacert.pem -alias my_ca

Java密钥库文件(.jks)安全地存储该节点的证书。CA证书必须是PEM编码的证书。
创建密钥库时,系统会提示您设置密码。此密码可保护密钥库的完整性。与密钥库交互时,需要提供它。

重要:CA证书过期时,必须使用新的CA证书更新节点的密钥库。

您也可以将CA证书存储在单独的信任库中。有关更多信息,请参阅配置信任库。
2.使用Java Keytool为节点生成私钥和证书。例如,以下命令为创建一个密钥和证书node01:

keytool -genkey -alias node01 -keystore node01.jks -keyalg RSA -keysize 2048 -validity 712 -ext san=dns:node01.example.com,ip:192.168.1.1

此命令将创建RSA私钥,其密钥大小为2048位,并具有有效期712天的公共证书。密钥和证书存储在node01.jks密钥库中。

该san值指定该节点的所有替代名称。生成的证书对于指定为备用名称的DNS名称和IP地址有效。您可以将多个DNS或IP地址条目指定为以逗号分隔的列表。

重要:
指定节点身份
启用SSL / TLS后,当节点A连接到节点B时,节点A通常通过检查节点B的证书中指定的身份信息来验证节点B的身份。这意味着在创建节点的证书时必须包含节点身份信息。
创建证书时指定节点身份的推荐方法是指定?-ext选项,并在san?(主题备用名称)属性中列出所有节点的名称和IP地址。
如果使用商业CA,则用于标识节点的DNS名称和IP地址必须是可公开解析的。出于安全考虑,不接受内部DNS名称和私有IP地址?。
如果需要使用私有DNS名称和IP地址,则使用内部CA是最安全的选择。它使您可以指定节点身份,并确保在节点连接时验证节点身份。如果必须使用商业CA和专用DNS名称或IP地址,则不能在证书中包括节点身份,因此唯一的选择是禁用?主机名验证。

在运行时keytool -genkey,Keytool会提示您提供信息,以填充存储证书的节点的专有名称。例如:

What is your first and last name?
[Unknown]: Elasticsearch node01 ①
What is the name of your organizational unit?
[Unknown]: test
What is the name of your organization?
[Unknown]: Elasticsearch
What is the name of your City or Locality?
[Unknown]: Amsterdam
What is the name of your State or Province?
[Unknown]: Amsterdam
What is the two-letter country code for this unit?
[Unknown]: NL
Is CN=Elasticsearch node01, OU=test, O=elasticsearch, L=Amsterdam, ST=Amsterdam, C=NL correct?
[no]: yes
Enter key password for ②
(RETURN if same as keystore password):

1.提供有关此证书打算用于的节点的信息。过去,此字段使用DNS名称指定节点的身份,但是不建议使用该行为。

2.如果您没有为证书指定密码,则使用密钥库密码。

重要:
扩展密钥用法
证书中的“扩展密钥用法”属性用于指示密钥的用途。默认情况下keytool,不会在证书中设置此属性。如果要使用其他工具生成证书,请确保证书同时支持这两种证书,serverAuth并且确保clientAuth设置了“扩展密钥用法”属性。

创建证书签名请求
节点的证书需要由受信任的CA签名才能使该证书受信任。要获得证书签名,您需要创建一个证书签名请求(CSR)并将其发送到您的CA。

要使用Java Keytool创建CSR,请使用keytool t-certreq命令。您指定与创建节点证书时使用的别名,密钥库,密钥算法以及DNS名称和IP地址相同的别名。使用-file选项指定要存储CSR的位置。

keytool -certreq -alias node01 -keystore node01.jks -file node01.csr -keyalg rsa -ext san=dns:node01.example.com,ip:192.168.1.1

发送签名请求
要获得签名证书,请将生成的CSR文件发送到您的CA。CA将对其进行签名,然后将证书的签名版本发送给您。

注意:如果您正在运行自己的CA,请参阅对CSR签名以获取签名说明。

安装签名证书
要安装签名证书,请使用keytool -importcert将其添加到节点的密钥库中。您可以指定创建节点证书时使用的别名和密钥库。
cd CONFIG_DIR/shield
keytool -importcert -keystore node01.jks -file node01-signed.crt -alias node01

注意:
如果尝试导入包含额外文本标题的PEM编码证书,则可能会收到错误:java.security.cert.CertificateParsingException: invalid DER-encoded certificate data。使用以下openssl命令删除多余的标头,然后用于keytool导入证书。

openssl x509 -in node01-signed.crt -out node01-signed-noheaders.crt

在节点配置中启用SSL
将签名证书添加到节点的密钥库后,需要修改节点配置以启用SSL。

注意:
所有与SSL / TLS相关的节点设置都被认为是高度敏感的,因此不会通过node info API公开。
要启用SSL,请在中进行以下更改elasticsearch.yml:
1.指定节点的密钥库的位置以及访问节点的证书所需的密码。例如:
shield.ssl.keystore.path: /home/es/config/shield/node01.jks ①
shield.ssl.keystore.password: myPass ②
shield.ssl.keystore.key_password: myKeyPass③

1.节点密钥库文件的完整路径。该位置必须在Elasticsearch配置目录中。

2.用于访问密钥库的密码。

3.用于访问证书的密码。仅当在生成证书时指定了单独的证书密码时才需要。

您无需将密码以纯文本格式存储在中elasticsearch.yml。指定${prompt.secret}代替实际的密钥库和证书密码,Elasticsearch将在启动时提示您输入密码。有关更多信息,请参阅Elasticsearch参考中的?配置样式。]

2.在传输网络层上启用SSL以确保对节点之间的通信进行加密:

shield.transport.ssl: true

注意:
即使禁用此设置,传输客户端也只能使用有效的用户名和密码连接到群集。

3.在HTTP层上启用SSL,以确保HTTP客户端与群集之间的通信已加密:

shield.http.ssl: true

注意:
即使禁用此设置,HTTP客户端也只能使用有效的用户名和密码连接到群集。

4.指定节点可以联系以加入集群的单播主机:

discovery.zen.ping.unicast.hosts: [“node01:9300”, “node02:9301”]

5.重新启动Elasticsearch,以使这些配置更改生效。

配置单独的信任库
您可以将受信任的CA证书存储在节点的密钥库中,或为CA证书创建单独的信任库。
要使用单独的信任库:
1.创建节点信任库,然后导入要使用Java Keytool信任的CA证书。例如,以下命令将CA证书cacert.pem导入truststore.jks。如果指定的信任库不存在,则会创建它。
cd CONFIG_DIR/shield
keytool -importcert -keystore truststore.jks -file cacert.pem

创建信任库时,系统会提示您设置密码。此密码可保护信任库的完整性。与信任库进行交互时,需要提供它。

2.在中elasticsearch.yml,指定节点的信任库的位置以及访问它的密码。例如:
shield.ssl.truststore.path: /home/es/config/shield/truststore.jks ①
shield.ssl.truststore.password: myPass ②

1.信任库文件的完整路径。该位置必须在Elasticsearch配置目录中。

2.访问信任库所需的密码。

启用密码套件以增强加密
SSL / TLS协议使用密码套件,该密码套件确定用于保护数据的加密强度。您可能想提高使用Oracle JVM时使用的加密强度。IcedTea OpenJDK出厂时就没有这些限制。成功使用Shield不需要此步骤。

Java密码术扩展(JCE)无限强度管辖权策略文件在单独的JAR文件中启用了Java的其他密码套件,您需要将其添加到Java安装中。您可以从Oracle的下载页面下载该JAR文件。密钥长度大于128位的加密(例如256位AES加密)需要使用JCE无限强度管辖权策略文件。
安装后,可以使用JCE中的所有密码套件。要在Shield中使用更强大的密码套件,请配置ciphers参数。有关特定参数的信息,请参阅本文档的TLS / SSL的配置参数部分。
注意:必须在所有节点上安装JCE无限强度权限策略文件,以建立更高级别的加密强度。

分离节点到节点和客户端的流量
Elasticsearch具有所谓的tcp传输配置文件的功能。这允许Elasticsearch绑定到多个端口和地址。Shield扩展了此功能,以通过将节点到节点的传输流量与客户端的传输流量分开来增强集群的安全性。如果客户端传输流量不受信任并且可能是恶意的,这一点很重要。要将节点间的流量与客户端流量分开,请将以下内容添加到elasticsearch.yml:

transport.profiles.client: ①
port: 9500-9600 ②
shield: type: client ③

1.client?是此示例配置文件的名称
2.传输客户端将用于与此群集通信的端口范围
3.client通过拒绝内部集群操作(例如,分片级操作和ping请求),一种启用附加过滤器以提高安全性的方法

如果您的环境支持,则可以通过将以下内容添加到内部网络中,以将内部网络用于节点到节点的流量,并将公共网络用于客户端流量elasticsearch.yml:

transport.profiles.default。bind_host:10.0.0.1①
transport.profiles.client。bind_host:1.1.1.1②

1将用于节点到节点通信的网络的绑定地址
2.用于客户端通信的网络的绑定地址

如果没有单独的网络,则可以启用IP筛选以限制对配置文件的访问。
tcp传输配置文件还允许在每个配置文件的基础上启用SSL。如果您具有用于节点到节点通信的安全网络,但是客户端位于不安全的网络上,则这很有用。要在禁用节点到节点通信的SSL时在客户端配置文件上启用SSL,请将以下内容添加到elasticsearch.yml:

transport.profiles.client.ssl: true ①

1.这将在客户端配置文件上启用SSL。此设置的默认值为的值shield.transport.ssl。

使用SSL进行传输时,还可以通过将以下内容添加到来将另一组证书用于客户端流量elasticsearch.yml:

transport.profiles.client.shield.truststore: path: /path/to/another/truststore
password: changeme

transport.profiles.client.shield.keystore: path: /path/to/another/keystore
password: changeme

若要更改需要传输客户端证书的默认行为,请在elasticsearch.yml?文件中设置以下值:
transport.profiles.client.shield.ssl.client.auth: no

此设置使证书身份验证对于节点到节点的通信保持活动状态,但是消除了将已签名证书分发给传输客户端的要求。请参阅运输客户端部分。
传输配置文件还允许将单独的密钥库和信任库用于HTTP通信和节点/传输客户端通信:
shield.http.ssl: true
shield.transport.ssl: true
shield.ssl.keystore.path: /home/es/config/shield/node01_http.jks①
shield.ssl.keystore.password: myPass
transport.profiles.default:
shield:
keystore:
path: /home/es/config/shield/node01_transport.jks ②
password: myOtherPass

1.包含用于HTTP层的密钥和证书的密钥库的路径
2.包含用于传输层的密钥和证书的密钥库的路径

使用IP过滤
除了尝试加入群集的其他节点之外,您还可以将IP筛选应用于应用程序客户端,节点客户端或传输客户端。
如果节点的IP地址在黑名单中,Shield仍将允许连接到Elasticsearch。连接将立即被删除,并且不会处理任何请求。
注意:
Elasticsearch安装并非旨在通过Internet公开访问。IP筛选和Shield的其他安全功能不会更改此条件。

启用IP过滤
Shield具有访问控制功能,该功能允许或拒绝主机,域或子网。
您可以通过指定中的shield.transport.filter.allow和shield.transport.filter.deny设置来配置IP过滤elasticsearch.yml。允许规则优先于拒绝规则。
示例1.允许/拒绝语句优先级。
shield.transport.filter.allow: “192.168.0.1”
shield.transport.filter.deny: “192.168.0.0/24”

该_all关键字否认未明确早期文件中允许所有连接。

示例2.?_all关键字用法。
shield.transport.filter.allow: [?“192.168.0.1”, “192.168.0.2”, “192.168.0.3”, “192.168.0.4” ]
shield.transport.filter.deny: _all

IP筛选配置文件支持IPv6地址。

示例3. IPv6过滤。

shield.transport.filter.allow: “2001:0db8🔢:/48”
shield.transport.filter.deny: “1234:0db8:85a3:0000:0000:8a2e:0370:7334”
当DNS查找可用时,Shield支持主机名过滤。

示例4.主机名过滤。

shield.transport.filter.allow: localhost
shield.transport.filter.deny: ‘*.google.com’

禁用IP过滤
在某些情况下,禁用IP筛选可以稍微提高性能。要完全禁用IP过滤,请将配置文件中的shield.transport.filter.enabled属性值设置elasticsearch.yml为false。

示例5.禁用的IP过滤。
shield.transport.filter.enabled: false

您还可以为传输协议禁用IP筛选,但仅像这样为HTTP启用它

示例6.启用基于HTTP的IP过滤。
shield.transport.filter.enabled: false
shield.http.filter.enabled: true

指定TCP传输配置文件
为了支持多个主机上的绑定,您可以将配置文件名称指定为前缀,以便基于配置文件允许/拒绝

示例7.基于概要的过滤。
shield.transport.filter.allow: 172.16.0.0/24
shield.transport.filter.deny: _all
transport.profiles.client.shield.filter.allow: 192.168.0.0/24
transport.profiles.client.shield.filter.deny: _all

注意:当您不指定配置文件时,default将自动使用。

HTTP过滤
您可能希望在传输协议和HTTP协议之间进行不同的过滤
示例8.仅HTTP过滤。
shield.transport.filter.allow: localhost
shield.transport.filter.deny: ‘*.google.com’
shield.http.filter.allow: 172.16.0.0/16
shield.http.filter.deny: _all

动态更新IP过滤器设置?[?1.1.0?]在1.1.0中添加。
如果在具有高度动态IP地址的环境中运行(例如基于云的托管),则在预配计算机时很难预先知道IP地址。您可以像这样使用“群集更新设置” API,而不用更改配置文件并重新启动节点。
curl -XPUT localhost:9200/_cluster/settings -d ‘{
“persistent” : {
“shield.transport.filter.allow” : “172.16.0.0/24”
}}’

您也可以shield.transport.filter.enabled像这样完全禁用过滤设置

curl -XPUT localhost:9200/_cluster/settings -d ‘{
“persistent” : {
“shield.transport.filter.enabled” : false
}}’

注意:为了不让自己受到限制,将永远不会拒绝默认的绑定传输地址。这意味着您可以始终通过SSH进入系统并使用curl来应用更改。

将部落节点与安全集群一起使用
部落节点充当跨多个集群的联合客户端。将部落节点与安全集群一起使用时,所有集群都必须安装Shield并共享相同的安全配置(用户,角色,用户角色映射,SSL / TLS CA)。还必须将部落节点本身配置为授予对所有连接的集群上的动作和索引的访问权限,因为安全性检查主要在部落节点上进行。

要将部落节点与安全集群一起使用:
1.在部落节点和每个连接的群集中的每个节点上安装Shield。
2.全局启用消息认证。在一个节点上生成系统密钥,并将其复制到部落节点以及每个连接的集群中的每个其他节点。

重要:
为了使消息身份验证在多个群集之间正常工作,部落节点和所有连接的群集必须共享相同的系统密钥。默认情况下,Shield从中读取系统密钥CONFIG_DIR/shield/system_key。如果将密钥存储在其他位置,则必须在中配置shield.system_key.file设置elasticsearch.yml。
3.全局启用加密。要加密通信,必须在每个节点上启用SSL / TLS。

为了简化SSL / TLS配置,请使用相同的证书颁发机构为所有连接的群集生成证书。

4.在部落节点的elasticsearch.yml文件中配置部落。您必须指定属于部落的每个集群,并为每个集群配置发现和加密设置。例如,以下配置将两个集群添加到部落:
tribe:
on_conflict: prefer_cluster1 ①
c1: ②
cluster.name: cluster1
discovery.zen.ping.unicast.hosts: [ “cluster1-node1:9300”, “cluster1-node2:9300”]
shield.ssl.keystore.path: /path-to-keystore/es-tribe-01.jks
shield.ssl.keystore.password: secretpassword
shield.ssl.keystore.key_password: secretpassword
shield.transport.ssl: true
shield.http.ssl: true
c2:
cluster.name: cluster2
discovery.zen.ping.unicast.hosts: [ “cluster2-node1:9300”, “cluster2-node2:9300”]
shield.ssl.keystore.path: /path-to-keystore/es-tribe-01.jks
shield.ssl.keystore.password: secretpassword
shield.ssl.keystore.key_password: secretpassword
shield.transport.ssl: true
shield.http.ssl: true

1.如果命名索引存在于多个群集中,则从首选群集返回结果。
2.代表与集群的连接的任意名称。

5.在所有节点(包括部落节点)上为用户配置相同的索引特权。每个群集中的节点必须授予对其他连接的群集以及它们自己的索引的访问权限。

例如,假设cluster1且cluster2每个都有一个索引,index1而index2。要使用户能够通过部落节点提交请求以搜索两个集群,请执行以下操作:
a在部落节点和两个集群上,定义一个tribe_user具有对index1和的读取访问权限的角色index2:
tribe_user:
indices:
‘index*’: search

b.将tribe_user角色分配给部落节点和两个集群上的用户。例如,在每个节点上运行以下命令以创建my_tribe_user和分配tribe_user角色:
./bin/shield/esusers useradd my_tribe_user -p password -r tribe_user

6.授予选定的用户权限,以从部落节点中检索部落的合并集群状态信息。为此,请向他们授予部落节点上的监视器特权。例如,您可以创建一个tribe_monitor分配monitor特权的角色:
tribe_monitor: cluster: monitor

每个群集可以拥有自己的用户,具有管理员特权。实际上,您无法通过部落节点执行诸如创建索引之类的管理任务,必须将请求直接发送到适当的集群。

7.启动部落节点。如果您对连接的集群中的节点进行了配置更改,则还需要重新启动它们。

配置客户端和集成
您将需要更新几个客户端的配置,以使用Shield安全插件。右侧栏中的跳转列表列出了支持Shield的客户端的配置信息。

将Elasticsearch Java Client与Shield结合使用
Shield支持Elasticsearch?的Java?传输客户端。传输客户端使用与群集节点用于节点间通信的相同传输协议。它非常有效,因为它不必像典型的REST客户端一样编组和解组JSON请求。
注意:不建议或不支持将Java Node Client与Shield一起使用。

配置传输客户端以使用Shield
要将传输客户端与Shield一起使用,您需要:

1.为用户配置启动传输客户端所需的特权。transport_client在roles.yml其中定义了默认?角色,该角色授予transport_client群集特权。传输客户端使用节点信息API来获取有关集群中节点的信息。
2.将Shield JAR文件(shield-2.2.0.jar)添加到CLASSPATH。您可以下载Shield发行版并手动提取JAR文件,也可以从Elasticsearch Maven存储库中获取它。

如果使用的是Maven,则需要将Shield JAR文件添加为项目文件中的依赖项pom.xml:
<项目… >
<!-添加elasticsearch 仓库-> elasticsearch-releases </ id> https://artifacts.elastic.co/maven </ url> <已启用> true </ enabled> </ releases> false </ enabled> </ snapshots> </ repository>

  ...

</ repositories>

<!-将盾牌jar添加为依赖项-> org.elasticsearch.plugin </ groupId> shield </ artifactId> 2.2.0 </ version> </ dependency>

  ...

</ dependencies>

</ project>

如果使用的是Gradle,则需要将Shield JAR文件作为依赖项添加到build.gradle文件中:
repositories {
/* … Any other repositories … */

// Add the Elasticsearch Maven Repository
maven {
url “https://artifacts.elastic.co/maven”
}}

dependencies {
// Provide the Shield jar on the classpath for compilation and at runtime
// Note: Many projects can use the Shield jar as a runtime dependency
compile “org.elasticsearch.plugin🛡2.2.0”

/* … */}

3.设置传输客户端。至少,您必须配置shield.user为在请求中包括传输客户端用户的名称和密码。以下代码段全局配置了用户凭据-与此客户端提交的每个请求都transport_client_user在其标头中包含凭据。
import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.shield.ShieldPlugin…
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(Settings.builder()
.put(“cluster.name”, “myClusterName”)
.put(“shield.user”, “transport_client_user:changeme”)

.build())
.addTransportAddress(new InetSocketTransportAddress(“localhost”, 9300))
.addTransportAddress(new InetSocketTransportAddress(“localhost”, 9301));

如果您配置不使用SSL的传输客户端,则密码以明文形式发送。

您还可以Authorization向每个请求添加标头。如果配置了全局授权凭据,则Authorization标题将覆盖全局身份验证凭据。当一个应用程序有多个用户使用同一客户端访问Elasticsearch时,这很有用。您可以将全局令牌设置为仅具有该transport_client角色的用户,然后将该transport_client角色添加到各个用户。
例如,以下代码段将Authorization标头添加到搜索请求中:

import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.transport.InetSocketTransportAddress;import org.elasticsearch.shield.authc.support.SecuredString;import org.elasticsearch.shield.ShieldPlugin
import static org.elasticsearch.shield.authc.support.UsernamePasswordToken.basicAuthHeaderValue;…
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(Settings.builder()
.put(“cluster.name”, “myClusterName”)
.put(“shield.user”, “transport_client_user:changeme”)

.build())
.build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(“localhost”), 9300))
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(“localhost”), 9301))
String token = basicAuthHeaderValue(“test_user”, new SecuredString(“changeme”.toCharArray()));

client.prepareSearch().putHeader(“Authorization”, token).get();

4.启用SSL以验证客户端并加密通信。要启用SSL,您需要:
a.配置客户端的密钥库路径和密码。客户端身份验证要求每个客户端都具有由受信任的CA签名的证书。
注意:
默认情况下启用客户端身份验证。有关禁用客户端身份验证的信息,请参阅禁用客户端身份验证。
import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.shield.ShieldPlugin…
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(Settings.builder()
.put(“cluster.name”, “myClusterName”)
.put(“shield.user”, “transport_client_user:changeme”)
.put(“shield.ssl.keystore.path”, “/path/to/client.jks”) (1)
.put(“shield.ssl.keystore.password”, “password”)

.build());
(1)client.jks密钥库必须包含客户端的签名证书和CA证书。
b.通过在客户端配置中将设置shield.transport.ssl为启用S??SL传输true。
import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.shield.ShieldPlugin…
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(Settings.builder()
.put(“cluster.name”, “myClusterName”)
.put(“shield.user”, “transport_client_user:changeme”)
.put(“shield.ssl.keystore.path”, “/path/to/client.jks”) (1)
.put(“shield.ssl.keystore.password”, “password”)
.put(“shield.transport.ssl”, “true”)

.build())
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(“localhost”), 9300))
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(“localhost”), 9301))

禁用客户端身份验证
如果要禁用客户端身份验证,则可以使用特定于客户端的传输协议。有关更多信息,请分离节点到节点和客户端流量。
如果您不使用客户端身份验证,并使用自己的CA对Elasticsearch节点证书进行签名,则需要在客户端配置中设置信任库路径和密码:
import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.shield.ShieldPlugin…
TransportClient client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(Settings.builder()
.put(“cluster.name”, “myClusterName”)
.put(“shield.user”, “test_user:changeme”)
.put(“shield.ssl.truststore.path”, “/path/to/truststore.jks”) (1)
.put(“shield.ssl.truststore.password”, “password”)
.put(“shield.transport.ssl”, “true”)

.build())
.addTransportAddress(new InetSocketTransportAddress(“localhost”, 9300))
.addTransportAddress(new InetSocketTransportAddress(“localhost”, 9301));

1.truststore.jks信任库必须包含签署了Elasticsearch节点证书的CA的证书。
注意:
如果您正在使用Java运行时已经信任的公共CA,则无需设置shield.ssl.truststore.path和shield.ssl.truststore.password。

匿名连接?[?1.1.0?]在1.1.0中添加。
要使传输客户端能够匿名连接,您必须为匿名用户分配transport_client角色中定义的特权?。当然,还必须启用匿名访问。有关更多信息,请参阅?启用匿名访问。

Shield客户
Shield通过ShieldClient该类公开其自己的API?。目前,此API仅公开一项操作,用于清除领域缓存。ShieldClient是现有客户端(任何实现的客户端类org.elasticsearch.client.Client)的包装。
以下示例显示了如何使用清除Shield的领域缓存ShieldClient:
import static org.elasticsearch.node.NodeBuilder.*;…
Client client = … // create the transport client
ShieldClient shieldClient = new ShieldClient(client);ClearRealmCacheResponse response = shieldClient.authc().prepareClearRealmCache()
.realms(“ldap1”, “ad1”) (1)
.usernames(“rdeniro”)
.get();

1)清除用户的ldap1和ad1领域缓存rdeniro。

将Elasticsearch HTTP / REST客户端与Shield结合使用
Elasticsearch与标准HTTP?基本身份验证?标头一起使用以识别请求者。由于Elasticsearch是无状态的,因此此标头必须与每个请求一起发送:
Authorization: Basic ①
该计算为base64(USERNAME:PASSWORD)

客户实例
本示例使用curl不带基本身份验证的索引来创建索引:
curl -XPUT ‘localhost:9200/idx’

{
“error”: “AuthenticationException[Missing authentication token]”,
“status”: 401}

由于没有用户与上述请求相关联,因此将返回验证错误。现在,我们将curl与基本身份验证一起使用以rdeniro用户身份创建索引:
curl --user rdeniro:taxidriver -XPUT ‘localhost:9200/idx’

{
“acknowledged”: true}

通过HTTP的客户端库
有关如何将Shield与特定语言的客户端一起使用的更多信息,请参考?Ruby,?Python,?Perl,?PHP,?.NET,?Javascript
将Elasticsearch与Shield一起用于Apache Hadoop
当访问Elasticsearch集群时,Elasticsearch for Apache Hadoop(“ ES-Hadoop”)能够使用HTTP基本和PKI身份验证和/或TLS / SSL。有关完整的详细信息,请参阅ES-Hadoop文档,尤其是本Security部分。
为了进行身份验证,请为您的ES-Hadoop客户端选择用户(出于维护目的,最好创建一个专用用户)。然后,将该用户分配给具有Hadoop / Spark / Storm作业所需权限的角色。通过es.net.http.auth.user和es.net.http.auth.pass属性将ES-Hadoop配置为使用用户名和密码。如果启用了PKI身份验证,请设置相应的,keystore然后truststore通过es.net.ssl.keystore.location和设置es.net.truststore.location(以及它们各自的.pass属性以指定密码)。
对于安全传输,通过将es.net.ssl属性设置为启用S??SL / TLS?true。根据您的SSL配置(密钥库,信任库等),您可能还需要设置其他参数-请参考ES-Hadoop文档,尤其是Configurationand?Security章节。

将Logstash与Shield结合使用
注意:Shield 1.0+与Logstash 1.5及更高版本兼容。

Logstash提供Elasticsearch?输出,输入和过滤器插件,用于通过HTTP,传输或客户端节点协议为文档建立索引和检索。所有插件都支持通过HTTP进行身份验证和加密,而输出插件还通过传输协议支持这些功能。

注意:
使用elasticsearch输出时,仅支持transport和http协议(即node不支持协议)

创建一个用户
默认情况下,Shield插件安装一个专用的用户角色,该角色允许创建名称与logstash-*正则表达式匹配的索引,以及读取,索引,更新和删除这些索引中文档的权限:
logstash:
cluster:

  • manage_index_templates
    indices:
    • names: ‘logstash-*’
      privileges:
      • write
      • read
      • create_index

有关修改角色的信息,请参见“?角色定义文件”部分。
logstash使用以下esusers工具在Elasticsearch集群上创建与该角色相关联的用户:

esusers useradd -p -r logstash

注意:使用传输协议时,logstash用户transport_client除了logstash上面显示的角色以外还需要预定义的角色-r logstash,transport_client。

创建用户后,就可以配置Logstash。

使用HTTP / HTTPS连接
将protocol选项设置http为时,Logstash通过REST API通过HTTP与Elasticsearch集群通信。
HTTP协议认证
HTTP协议通过使用公钥基础结构(PKI)支持基本身份验证和客户端证书身份验证。
基本认证
输入,过滤器和输出插件均支持HTTP基本身份验证。要在使用Shield连接到Elasticsearch实例时使用基本身份验证,请配置插件以在每个请求中包括用户名和密码凭据。例如,以下代码段配置输出插件的凭据。对于每种插件类型,都以相同的方式配置凭据。

input { … }
output {
elasticsearch {

user => … # string
password => … # string
}}

HTTPS的SSL / TLS配置
要为HTTPS启用SSL / TLS加密,请使用以下配置块:
input { … }
output {
elasticsearch {

ssl => true
cacert => ‘/path/to/cert.pem’ ①
}}

1.pem文件系统中包含证书颁发机构的证书的文件的路径。

使用传输协议连接
将protocol选项设置transport为时,Logstash通过彼此之间使用的相同协议节点与Elasticsearch集群通信。这避免了JSON取消/编组,因此效率更高。
为了解锁此选项,有必要使用以下命令在Logstash中安装其他插件,以使Shield在Shield中兼容transport?protocol:
bin/plugin install logstash-output-elasticsearch_java
bin/plugin install logstash-output-elasticsearch_java_shield

仅在要transport在Logstash中使用协议时才需要这样做。但是,建议使用默认http协议,这意味着您不需要安装任何插件,也不需要使用elasticsearch_java输出。
传输协议认证
传输协议通过使用公钥基础结构(PKI)支持基本身份验证和客户端证书身份验证。
基本认证
要使用基本身份验证通过Shield连接到Shield的Elasticsearch实例,请使用以下配置参数设置用户名和密码凭据:
input { … }
output {
elasticsearch {
protocol => “transport”

user => … # string
password => … # string
}}

PKI认证
要使用客户端证书身份验证通过Shield连接到Shield的Elasticsearch实例,您需要设置密钥库路径,该路径包含配置中的客户端证书和密钥库密码:
input { … }
output {
elasticsearch {
protocol => “transport”

ssl => true
keystore => … # string
keystore_password => … # string
}}

传输或节点协议的SSL配置
.jks使用以下配置参数指定密钥库和信任库文件的路径:
input { … }
output {
elasticsearch {
protocol => “transport”
host => … # string (optional)
cluster => … # string (optional)

ssl => true
keystore => … # string
keystore_password => … # string
truststore => … # string
truststore_password => … # string
}}

有关加密和证书的更多信息,请参见“?保护节点”部分:
失败的
当服务器的证书未通过本节中讨论的任何协议的SSL验证时,Logstash会引发异常,从而中断处理管道。对于无效的用户凭据也是如此

将Kibana与Shield一起使用
当您的集群上安装了Shield时,Kibana用户必须登录。您可以为Kibana用户配置Shield角色,以控制这些用户可以访问哪些数据。您还需要为Kibana服务器配置凭据,以便可以验证它代表用户提交给Elasticsearch的请求。

为了防止明文发送用户密码,必须将Kibana配置为加密浏览器和Kibana服务器之间的通信。如果要加密往返于Elasticsearch集群中节点的流量,则还必须将Kibana配置为通过HTTPS连接到Elasticsearch。

安装Shield后,如果您加载了Kibana仪表板来访问未经授权查看的索引中的数据,则会出现错误,指示该索引不存在。Kibana和Shield当前不提供控制哪些用户可以加载哪些仪表板的方法。
要将Kibana与Shield结合使用:
1.配置Kibana服务器的凭据。Kibana服务器需要访问集群监视API和.kibana索引。该服务器并没有?需要访问用户索引。?在默认的Shield?文件中提供的kibana4_server角色中指定了所需的特权?roles.yml。
a.为Kibana服务器创建一个用户帐户并为其分配kibana4_server?角色。例如,提交以下请求以创建本地?kibana-server用户:
curl -u es_admin -XPOST ‘http://localhost:9200/_shield/user/kibana-server’-d ‘{“password” : “changeme”, “roles” : [ “kibana4_server”]}’

如果使用的是LDAP或Active Directory领域,则需要为Kibana服务器创建一个用户,并将该用户的专有名称?映射kibana4_server到Shield?角色映射文件中的角色。默认情况下,角色映射存储在中config/shield/role_mapping.yml。例如,以下代码片段将kibana4_server角色分配给名为的LDAP或Active Directory用户kibana-server:

kibana_server: - “cn=kibana-server,cn=applications,dc=example,dc=com”
B.
在Kibana配置文件中为Kibana服务器用户指定凭证/config/kibana.yml。
elasticsearch.username: “kibana4-server”
elasticsearch.password: “changeme”

2.从示例my_kibana_user用户角色中派生Kibana用户角色并将其添加roles.yml以控制Kibana用户可以访问哪些索引。Kibana用户需要访问将要使用的.kibana索引以及存储所保存的搜索,可视化和仪表板的索引。用户还需要访问kibana-devnull索引。示例my_kibana_user角色授予对与logstash-*模式匹配的索引的读取访问权限,并且对索引具有完全访问权限?.kibana,这是必需的。
您可以根据需要为Kibana用户定义尽可能多的不同角色。

例如,以下my_kibana_user角色仅允许用户发现并可视化logstash-*索引中的数据。

my_kibana_user:
cluster:
- monitor
indices:

  • names: ‘logstash-*’
    privileges:
    • view_index_metadata
    • read
  • names: ‘.kibana*’ ①
    privileges:
    • manage
    • read
    • index

1.所有Kibana用户都需要访问.kibana和.kibana-devnull索引。

3.为您的Kibana用户或用户组分配适当的角色:
?如果您使用的是native领域,则可以使用User Management API分配角色?。例如,以下代码创建一个名为的用户jacknich并为其分配kibana_monitoring角色:
POST /_shield/user/jacknich{
“password” : “t0pS3cr3t”,
“roles” : [ “kibana_monitoring” ]}

?如果使用的是LDAP或Active Directory领域,则可以按每个用户分配角色,也可以将角色分配给用户组。默认情况下,角色映射存储在中config/shield/role_mapping.yml。例如,以下代码片段将kibana_monitoring角色分配给名为的组admins和名为Jack Nicholson的用户:
kibana_monitoring:

  • “ cn = admins,dc = example,dc = com” - “ cn = Jack Nicholson,dc = example,dc = com”

配置Kibana以加密浏览器和Kibana服务器之间的通信:

a.为Kibana生成服务器证书。您必须将证书?subjectAltName设置为Kibana服务器的主机名,标准域名(FQDN)或IP地址,或者将CN设置为Kibana服务器的主机名或FQDN。将服务器的IP地址用作CN无效。
b.在中设置server.ssl.key和server.ssl.cert属性kibana.yml:
server.ssl.key: /path/to/your/server.key
server.ssl.cert: /path/to/your/server.crt

在浏览器和Kibana服务器之间启用SSL加密后,即可通过HTTPS访问Kibana。例如,https://localhost:5601。

注意:
您必须在浏览器和Kibana服务器之间启用SSL加密,才能将Kibana与Shield配合使用。如果将Shield配置为加密与Elasticsearch的连接,则还必须将Kibana配置为通过HTTPS连接到Elasticsearch。

1.如果您在Shield中启用了SSL加密,请将Kibana配置为通过HTTPS连接到Elasticsearch:
a.elasticsearch.url在Kibana配置文件的设置中指定HTTPS协议kibana.yml:
elasticsearch.url: “https://<your_elasticsearch_host>.com:9200”

b.如果您使用自己的CA为Elasticsearch签名证书,请在中进行?elasticsearch.ssl.ca设置kibana.yml以指定PEM文件的位置。
elasticsearch.ssl.ca: /path/to/your/cacert.pem

2.将Shield插件安装到Kibana中。Shield插件可以保护用户会话并允许用户登录和注销Kibana。要安装Shield插件:
a.在您的Kibana安装目录中运行以下命令以安装Shield插件。
bin/kibana plugin --install kibana/shield/latest

注意:
执行离线安装,下载该插件?
http://download.elastic.co/kibana/shield/shield-2.4.5.tar.gz?(SHA1)和run?bin/kibana plugin --install shield --url file:///path/to/file/shield-2.4.1.tar.gz

b.shield.encryptionKey在kibana.yml配置文件中设置属性。您可以使用32个字符或更多的任何文本字符串作为加密密钥。
shield.encryptionKey: “something_at_least_32_characters”

C.要更改默认会话持续时间,请shield.sessionTimeout?在kibana.yml配置文件中设置属性。默认情况下,会话在30分钟后过期。超时以毫秒为单位。例如,将超时设置为600000以使会话在10分钟后过期:

shield.sessionTimeout: 600000

3.重新启动Kibana并确认您可以以用户身份登录。如果您在本地运行Kibana,请转到https://localhost:5601并输入已为Kibana用户角色分配的用户的凭据。例如,您可以以jacknich在步骤3中创建的用户身份登录?。

注意:
这必须是已分配了从示例my_kibana_user用户角色派生的角色的?用户。Kibana服务器凭据只能由Kibana服务器在内部使用。该kibana4_server角色不授予访问用户索引的权限。

Shield UI设置
shield.encryptionKey
包含32个字符或更多字符的任意字符串,用作加密密钥。需要。
shield.sessionTimeout
设置会话持续时间。默认值为1800000毫秒(30分钟)。
shield.skipSslCheck
高级设置。设置为true,以在server.ssl.cert?和server.ssl.key中未指定时使Kibana能够启动kibana.yml。仅当在Kibana之外配置SSL时才应使用此选项-例如,您正在通过负载均衡器或代理路由请求。使用Shield UI插件时,您仍然必须通过HTTPS连接到Kibana服务器。如果您尝试通过HTTP访问Kibana,则会无限期地停留在登录屏幕上。默认为false。

默认的Kibana服务器角色
Kibana服务器的默认角色在中提供roles.yml。
Kibana服务器角色。
kibana4_server:
cluster:

  • monitor
    indices:
  • names: ‘.kibana*’
    privileges:
    • all
    • names: ‘.reporting-*’
      privileges:
    • all

将报告与Shield结合使用
响应于Kibana中的用户交互,报告通过在Elasticsearch中创建和更新文档进行操作。

要在启用Shield的情况下使用报告功能,您需要设置Kibana以与Shield一起使用。您还需要创建一个角色,该角色授予对Reporting索引的读取访问权限,并将此角色分配给您要允许使用Reporting的所有用户。

重要:在2.4.6之前,报告角色需要具有写权限,并且没有?reporting.roles.allow设置。强烈建议升级到2.4.6并从报告角色中删除写特权。

设置报告角色
与您添加my_kibana_user用户角色以roles.yml允许用户使用Kibana的方式类似,您将需要为这些用户创建一个角色以使用报告。
注意:用户将需要两个权限才能使用Kibana中的“报告”界面

1.创建一个reporting_user为报告索引分配读取特权的角色:
reporting_user:
indices:
- names: ‘.reporting-*’
privileges:
- read

如果愿意,可以将报告索引权限添加到现有角色。但是,这需要您将角色添加到reporting.roles.allow?设置中,如下所述。

2.如果还使用角色名称reporting_user,请将角色添加到reporting.roles.allow?您的设置中kibana.yml
3.将reporting_user和您的Kibana用户角色分配?给您要允许使用报表的所有用户。
?如果使用的是默认file领域,则可以在添加用户时分配角色,或使用roles命令修改角色分配?。例如,以下命令创建一个名为的用户billmurr?并分配my_kibana_user和reporting_user角色:
esusers useradd billmurr -r my_kibana_user,reporting_user -p password

?如果使用的是LDAP或Active Directory领域,则可以按每个用户分配角色,也可以将角色分配给用户组。默认情况下,角色映射在中配置?config/shield/role_mapping.yml。例如,以下代码段将名为Bill Murray的用户分配给my_kibana_user和reporting_user角色:
my_kibana_user:

  • “cn=Bill Murray,dc=example,dc=com”
    reporting_user:
  • “cn=Bill Murray,dc=example,dc=com”

将Marvel与Shield结合使用
Marvel由两个组件组成:安装在群集中每个节点上的Marvel代理,以及安装在Kibana中的Marvel应用程序。Marvel代理从Elasticsearch收集指标并建立索引,您可以通过Kibana中的Marvel仪表板可视化数据。代理可以为同一群集上的数据建立索引,或将其发送到外部监视群集。
要在启用Shield的情况下使用Marvel,您需要设置Kibana与Shield配合使用,并至少为Marvel应用创建一个用户。如果使用的是外部监视群集,则还需要为Marvel代理配置用户,并配置代理在与监视群集通信时使用适当的凭据。
设置Marvel App用户
启用S??hield后,将在访问UI时提示Kibana用户登录。要使用Marvel应用程序,用户必须有权访问Kibana索引并具有从Marvel索引中读取的权限。
您可以在存储监视数据的群集上设置Marvel应用程序用户。要授予所有必要的特权,请为用户分配?marvel_user角色以及从示例用户角色派生的相应my_kibana_user角色

?如果使用的是默认file领域,则可以在添加用户时分配角色,或使用roles命令修改角色分配。例如,以下命令创建一个名为的用户jacknich并分配my_kibana_user和marvel_user?角色:
esusers useradd jacknich -r my_kibana_user,marvel_user -p password

?如果使用的是LDAP或Active Directory领域,则可以按每个用户分配角色,也可以将角色分配给用户组。默认情况下,角色映射在中配置?config/shield/role_mapping.yml。例如,以下代码片段将名为Jack Nicholson的用户分配给my_kibana_user和marvel_user角色:
my_kibana_user:

  • “ cn = Jack Nicholson,dc =示例,dc = com” marvel_user:
  • “ cn = Jack Nicholson,dc = example,dc = com”

注意:该marvel_user角色在默认roles.yml文件中定义。有关派生Kibana用户角色的更多信息,请参阅将Kibana与Shield一起使用。

配置Marvel代理与启用了Shield的监视群集进行通信
要将Marvel代理配置为与安全的监视群集通信,请执行以下操作:
1.在监视群集上配置具有remote_marvel_agent角色的用户,该角色在中定义?roles.yml。例如:
esusers useradd agent-user -r remote_marvel_agent -p password

远程奇迹代理角色。

remote_marvel_agent:
cluster: [ “manage_index_templates” ]
indices:

  • names: ‘.marvel-es-*’
    privileges: [ “all” ]

2.在要监视的群集中的每个节点上,在其中配置Marvel HTTP导出器elasticsearch.yml并重新设置Elasticsearch。在导出器配置中,您需要:

a.将设置type为http。
b.在设置中指定监视集群的位置host。
c.向代理用户凭据提供username和password设置。

例如:
marvel.agent.exporters: id1: type: http
host: [“http://es-mon1:9200”, “http://es-mon2:9200”]
auth: username: agent-user
password: password

如果在监视群集上启用了SSL / TLS:

a.设置监视服务器主机时,请指定HTTPS协议。
b.指定一个信任库,其中包含用于验证监视集群中节点身份的CA证书。您需要设置truststore.path和?truststore.password。

例如:
marvel.agent.exporters:
id1:
type: http
host: [“https://es-mon1:9200”, “https://es-mon2:9200”]

auth:
username: agent-user
password: password

ssl:
truststore.path: /path/to/file
truststore.password: password
id2:
type: local

管理许可证
https://www.elastic.co/guide/en/shield/2.4/license-management.html#license-management

Shield部署示例
本节中的示例演示了如何部署Shield来保护Elasticsearch集群。
https://www.elastic.co/guide/en/shield/2.4/example-deployments.html

局限性
https://www.elastic.co/guide/en/shield/2.4/limitations.html
故障排除
https://www.elastic.co/guide/en/shield/2.4/troubleshooting.html

x-pack
介绍
X-Pack是Elastic Stack扩展,它将安全性,警报,监视,报告和图形功能捆绑到一个易于安装的程序包中。X-Pack组件旨在无缝地协同工作,但您可以轻松地启用或禁用要使用的功能。

在Elasticsearch 5.0.0之前,您必须安装单独的Shield,Watcher和Marvel插件才能获得在X-Pack中捆绑在一起的功能。使用X-Pack,您不必再担心每个插件的版本是否正确,只需为您正在运行的Elasticsearch版本安装X-Pack,就可以了!

2019年5月21日,Elastic官方发布消息: Elastic Stack 新版本6.8.0 和7.1.0的核心安全功能现免费提供。
这意味着用户现在能够对网络流量进行加密、创建和管理用户、定义能够保护索引和集群级别访问权限的角色,并且使用 Spaces 为 Kibana
提供全面保护。 免费提供的核心安全功能如下:
1)TLS 功能。 可对通信进行加密;
2)文件和原生 Realm。 可用于创建和管理用户;
3)基于角色的访问控制。 可用于控制用户对集群 API 和索引的访问权限;
通过针对 Kibana Spaces 的安全功能,还可允许在Kibana 中实现多租户。

x-pack演变

5.X版本之前:没有x-pack,是独立的:security安全,watch查看,alert警告等独立单元。
5.X版本:对原本的安全,警告,监视,图形和报告做了一个封装,形成了x-pack。
6.3 版本之前:需要额外安装。
6.3版本及之后:已经集成在一起发布,无需额外安装,基础安全属于付费黄金版内容。 7 .1版本:基础安全免费。

开源!=免费
2018年2月28日X-Pack 特性的所有代码开源,主要包含:
Security、Monitoring、Alerting、Graph、Reporting、专门的 APM UI、Canvas、Elasticsearch SQL、Search Profiler、Grok Debugger、Elastic Maps Service zoom levels 以及 Machine Learning。

2019年5月21日免费开放了文章开头的基础安全功能,在这之前的版本都是仅有1个月的适用期限的。
如下功能点仍然是收费的。

付费黄金版&白金版提供功能:

审核日志
IP 筛选
LDAP、PKI*和活动目录身份验证
Elasticsearch 令牌服务
付费白金版提供安全功能:

单点登录身份验证(SAML、Kerberos*)
基于属性的权限控制
字段和文档级别安全性
第三方整合(自定义身份验证和授权 Realm)
授权 Realm
静态数据加密支持
FIPS 140-2 模式

官方地址:https://www.elastic.co/cn/subscriptions

安全入门
https://www.elastic.co/guide/en/x-pack/current/security-getting-started.html#security-getting-started
为了保护群集,必须在群集中的每个节点上安装X-Pack。默认情况下启用基本身份验证-要与集群通信,必须指定用户名和密码。除非您启用匿名访问,否则所有不包含用户名和密码的请求都将被拒绝。
X-Pack安全性提供了一个内置的elastic超级用户,您可以使用它来开始设置。该elastic用户对群集具有完全访问权限,包括所有索引和数据,因此该elastic用户默认情况下未设置密码。
要开始使用X-Pack安全性:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据学习僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值