介绍
elasticsearch 权限控制的插件还是有几个的,如官网提供的shield, http-basic 插件,本文将要使用的search-guard-2插件等。除此之外,也可以通过应用自行控制,当然相应的功夫就得下得多了。
本文介绍使用 search-guard, 相比shield来说,该插件大部分功能都是免费使用的,当然功能上还是能很好的满足需求的。
安装
要使用search-guard-2插件,同时还需要安装 search-guard-ssh 插件,具体安装步骤如下:
1. 安装 search-guard-ssh 插件
bin/plugin install -b com.floragunn/search-guard-ssl/2.3.4.15
2. 下载 search-guard-ssl 源码(https://github.com/floragunncom/search-guard-ssl), 执行example-pki-scripts/example.sh(如果是windows环境,可以考虑使用Cygwin运行)生成密钥库文件。
生成密钥库需要用到openssl,如果未安装,请先进行安装()
如果要使用其它的参数来生成密钥库文件,请按自己的需要修改各个sh文件中的内容。
3. 成功生成密钥文件后,拷贝truststore.jks文件到elasticsearch-home/config/ 目录下,同时将 node-*-keystore.jks 分别拷贝到各个es节点上,放于config目录下
4. 接着在config/elasticsearch.yml文件中 配置 search-guard-ssl 相关内容(注意修改其中不同的数据)
searchguard.ssl.transport.keystore_filepath: node-0-keystore.jks searchguard.ssl.transport.keystore_password: changeit searchguard.ssl.transport.truststore_filepath: truststore.jks searchguard.ssl.transport.truststore_password: changeit searchguard.ssl.transport.enforce_hostname_verification: false
5. 如果需要使用https进行访问,继续添加如下配置
searchguard.ssl.http.enabled: true searchguard.ssl.http.keystore_filepath: node-0-keystore.jks searchguard.ssl.http.keystore_password: changeit searchguard.ssl.http.truststore_filepath: truststore.jks searchguard.ssl.http.truststore_password: changeit
6. 添加 example-pki-scripts/ca/root-ca.crt 证书到系统中,此时启动elasticsearch, 便只能通过https://localhost:9200/访问成功了。下面即可开始安装配置search-guard-2了。
7. 安装插件 search-guard-2
bin/plugin.bat install -b com.floragunn/search-guard-2/2.3.4.5
8. 配置config/elasticsearch.yml ,在其中添加
searchguard.authcz.admin_dn: - "CN=kirk, OU=client, O=client, L=Test, C=DE" searchguard.audit.type: internal_elasticsearch
其中,admin_dn的值需要根据前面密钥库文件生成的时候使用的相关信息进行相应修改。同时拷贝kirk-keystore.jks到config目录(为了方便,与其它的jks放到一起)
9. 启动elasticsearch , 然后在 linux上执行下面的命令( 默认密码 changeit, 默认集群名 elasticsearch,所以如果未进行修改,下面命令中相应参数可以去掉)
$ plugins/search-guard-2/tools/sgadmin.sh \ -cd plugins/search-guard-2/sgconfig/ \ -ks config/kirk-keystore.jks \ -ts config/truststore.jks \ -kspass changeit \ -tspass changeit \ -cn crimson-search-cluster \ -nhnv
若是在windows上,则首先在 plugins/search-guard-2/tools/sgadmin.sh所在目录生成创建 sgadmin.bat文件,在其中添加如下内容:
@echo off setlocal set DIR=%~dp0 java %JAVA_OPTS% -cp "%DIR%..\..\search-guard-ssl\*;%DIR%..\*;%DIR%..\..\..\lib\*" com.floragunn.searchguard.tools.SearchGuardAdmin %* endlocal
然后执行指令:
plugins\search-guard-2\tools\sgadmin.bat -cd plugins\search-guard-2\sgconfig\ -ks config\kirk-keystore.jks -ts config\truststore.jks -kspass changeit -tspass changeit -cn crimson-search-cluster -nhnv
通过上述操作会将权限信息添加到集群索引中。此时访问https://localhost:9200/ 将会要求输入用户名密码,此处是[kirk(pwd: kirk)], 输入并确认,即可获取到当前信息。
登录成功后 可以尝试访问 https://localhost:9200/_search 将会提示无权限。这里需要到 sgconfig\目录下相应文件中添加权限才行,
这里就不赘述了,可以到官网了解(https://github.com/floragunncom/search-guard/tree/v2.3.4.5)
安装过程中的问题
1. 安装了search-guard-ssl 和 search-guard-2后,并更新了相应的elasticsearch.yml配置,当访问的时候,提示:Search Guard not initialized (SG11)
解决办法:这是因为未初始化search guard 权限配置信息的原因,执行上述步骤9即可。
2. 在执行步骤9的时候,提示
FAIL: Expected 5 config types for node nYEdPSM4Tj2xR2XTbtPk9A but got only [] Done with failures
解决办法:此问题在windows上,LZ没有遇到,但是在linux环境上遇到了,具体什么原因没有找到,解读源码的时候,发现主要是在执行com.floragunn.searchguard.tools.SearchGuardAdmin类中的下面的代码的时候,遇到 请求超时的原因
ConfigUpdateResponse cur = tc.execute(ConfigUpdateAction.INSTANCE, new ConfigUpdateRequest(new String[]{"config","roles","rolesmapping","internalusers","actiongroups"})).actionGet();
至于如何解决该问题,暂时还没有找到办法。如果有谁知道的话,还请不吝赐教!
更新:
2016-09-03:
可以考虑在windows环境上部署一个与linux上的elasticsearch一样的服务,然后通过windows上的服务执行步骤9的操作,相应的数据会写入到集群中的。
2016-09-06:
经过5天的反复调试(真是浪费时间了),最终确认到问题所在:应该是系统资源不足的原因。因为用的虚拟机,开始分配的是1个cpu+2G内存,每次调试到 类 ...TransportService 中
private void sendLocalRequest(long requestId, final String action, final TransportRequest request) 方法内,将任务添加到线程池中后
final String executor = reg.getExecutor(); if (ThreadPool.Names.SAME.equals(executor)) { //noinspection unchecked reg.processMessageReceived(request, channel); } else { threadPool.executor(executor).execute(new AbstractRunnable() { @Override protected void doRun() throws Exception { //noinspection unchecked reg.processMessageReceived(request, channel); }@Override public boolean isForceExecution() { return reg.isForceExecution(); } @Override public void onFailure(Throwable e) { try { channel.sendResponse(e); } catch (Throwable e1) { logger.warn("failed to notify channel of error message for action [" + action + "]", e1); logger.warn("actual exception", e); } } });</pre>
即上面else块内,然后任务就卡着不被调用了,但windows上是可以正常调用的。
所以猜想可能是资源不足的问题,于是尝试添加了一个核心,再调试,发现就可以正常处理了。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于