solr安全认证

2018-03-13  本文已影响944人  明翼

前言

本文是根据solr官方文档翻译和改编来的,所以你也在官方文档中看到过,不要惊讶。

安全认证种类

solr带有安全框架,支持用户认证和限制solr资源的使用。solr插件支持三种认证:
1)基础认证(Basic authentication)
仅仅支持solrCloud模式。
2)Kerberos认证
solrCloud认证和独立模式。
3)基础规则认证(rule-based authorization)
仅仅支持solrCloud模式。
在solrCloud模式下,采用在zk中的/security.json文件来支持,在独立模式下,通过 -DauthenticationPlugin=<pluginClassName> 定义插件来支持。

security.json内容如下,包含两段。

{
"authentication" : {
"class": "class.that.implements.authentication"
},
"authorization": {
"class": "class.that.implements.authorization"
}
}

根据配置使用的插件信息,添加其他诸如用户或规则信息,这些信息传递给插件。
下面是更详细的security.json的例子。 在下面的例子中基本认证和规则认证插件被启用,展示如下:

{
"authentication":{
"class":"solr.BasicAuthPlugin",
"credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0=
Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}
},
"authorization":{
"class":"solr.RuleBasedAuthorizationPlugin",
"permissions":[{"name":"security-edit","role":"admin"}]
"user-role":{"solr":"admin"}
}}

上传到Zookeeper

如果要启用solr的认证,需要先传security.json 到zookeeper中,实例如下:

> server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:2181 -cmd put
/security.json 
'{"authentication": {"class": "org.apache.solr.security.KerberosPlugin"}}'

注意:因为solr的认证信息是传到zookeepr上的,所以zookeeper最好也要是认证的。

认证组成

认证插件在solr的请求点做安全认证,一个定制插件通过扩展AuthenticationPlugin类来实现。
一个认证插件由两个部分组成:
1)服务器组件,使用插件里面定义的kerberos、基础规则或其他的认证机制来解释和认证solr的请求。
2)客户端组建,比如一个HttpClientConfigurer,它让solrJ客户端可以以一种服务器端可以理解的安全认证方式去访问solr实例。

启用一个认证

通过前面的security.json来指定认证:

{
"authentication": {
"class": "class.that.implements.authentication",
"other_data" : "..."}
}

基础认证插件

solr可以通过使用基础认证插件来支持基础的认证。

启用基础认证

为使用基础认证,你首先创建个security.json文件,然后保存到zookeeper上。
认证类为基础认证类,用户名和密码也同样需要添加,用户名和密码为sha256的hash。认证授权部分不是基本认证相关的,但是是一个单独的授权插件设计

支持细粒度用户访问控制。例子如下:

{
"authentication":{
"blockUnknown": true,
"class":"solr.BasicAuthPlugin",
"credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0=
Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}
},
"authorization":{
"class":"solr.RuleBasedAuthorizationPlugin",
"permissions":[{"name":"security-edit",
"role":"admin"}],
"user-role":{"solr":"admin"}
}}

通过如下命令上传到zookeeper上去,如下:

server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:9983 -cmd putfile
/security.json security.json

在文件中几件事情:
1、基础认证和规则认证都启用了。
2、一个用户叫solr、密码为SolrRocks已经被定义了。
3、“blockUnknown:true”标示未认证的请求不能通过。
4、admin这个角色被定义,它有权编辑认证方式。
5、solr永远被定义为admin角色。

注意事项

使用基本身份验证插件时需要记住以下几点。默认情况下,以纯文本形式发送凭据。建议在基本时使用SSL进行通信。
启用了身份验证,如启用SSL的部分所描述的那样。用户访问到security.json写权限可以修改所有权限以及如何分配用户权限。应特别注意只允许获得将安全性编辑给合适的用户。

当然,你的网络应该是安全的。即使启用了基本身份验证,也不应该
不必要暴露Solr外面的世界。

权限属性

每个角色由一个或多个权限组成,这些权限定义了用户被允许执行的操作。 每个权限
由几个定义允许的活动的属性组成。 有一些预定义的权限
不能修改。
这些权限会在security.json中显示。 第一个匹配的权限是
适用于每个用户,因此最严格的权限应该位于列表的顶部。 权限顺序可以
使用授权API的参数进行控制,如下所述。

预定义的权限

有几个预先定义的权限。这些具有固定的默认值,不能修改,
并且不能添加新的属性。要使用这些属性,只需定义一个包含此权限的角色,
然后将用户分配给该角色。
预定义的权限是:

编辑认证插件的配置

一个认证API准许更改用户ID和密码。API提供了设置用户信息和删除用户的方方法。

API访问点

admin/authentication
这个访问点没有指定集合,所以对整个集群都起作用,如果需要限制特定的集合,可以通过认证规则来做。

添加用户或编辑密码

set-user命令可以让你添加用户或更改他们的密码。举个例子,下面的命令定义了两个用户两个密码

curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H
'Content-type:application/json' -d '{
"set-user": {"tom" : "TomIsCool" ,
"harry":"HarrysSecret"}}'

删除用户

删除用户命令准许你删除一个用户,用户密码在删除的时候不用发过去。在下面的例子中,我们删除一个ID为tom和harry的。

curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H
'Content-type:application/json' -d '{
"delete-user": ["tom","harry"]}'

设置属性

更改安全文件里面的属性定义如:

curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H
'Content-type:application/json' -d '{
"set-property": {"blockUnknown":false}}'

solrJ中支持基础认证

SolrRequest req ;//create a new request object 
req.setBasicAuthCredentials(userName, password); 
solrClient.request(req);

solr内部认证

有很多来自Solr节点本身的要求。例如:要求监督节点、恢复线程等。这些要求不携带任何级别身份验证凭证因为没有用户发起这些请求。
这意味着solr本身,使用一种特殊的认证机制,各节点间solr节点是一个超级用户由其他solr节点完全信任。

kerberos认证插件

如果在你的网络环境中有kerberos认证,kerberos插件可以用来认证solr集群。这准许solr使用kerberos principal 和keytab文件来认证zookeeper和solr集群。
管理UI和所有客户端(solrJ)将需要一个合法的ticket来使用UI和对solr发送请求。
kerberos认证插件仅仅在solrCloud模式下有用。

带有kerberos认证的solr如何工作

当设置solr使用kerberos时候,一个在KDC中注册认证的服务principal 或者kerberos 用户名的配置是需要的。这个配置定义了服务主体的名称和keytab文件的位置。solr的认证模式是用/security.json这个文件,如果更改这个文件,需要重启整个solr集群。此外认证插件可以通过系统启动参数制定:
-DauthenticationPlugin=org.apache.solr.security.KerberosPlugin.
这个参数可以用在solrClound 或单独模式下,在单独模式下这是唯一的方式。

服务主体和keytab文件

kerberos认证说明:


转自:http://blog.csdn.net/wangyangzhizhou/article/details/51163782 SPNego认证

流程:
①客户端浏览器向web服务器发送http请求。

②服务器返回401状态码,响应头部加上 WWW-Authenticate:Negotiate。

③用户通过浏览器输入用户名向AS请求TGS票证。

④AS生成TGS票证,然后查询用户密码并用此密码加密TGS票证,返回浏览器。

⑤浏览器使用用户密码解密出TGS票证,并向TGS服务发起请求。

⑥TGS服务生成服务票证响应给浏览器。

⑦浏览器将服务票证封装到SPNEGO token中,并发送给web服务器。

⑧服务器解密出用户名及服务票证,将票证发往TGS服务验证。

⑨通过验证,开始通信。

每个solr节点必须在KDC(Key Distribution Center)中注册有一个服务主体。
kerberos插件利用SPNego 进行认证,Spnego模式是一种由微软提出的使用GSS-API接口的认证模式,它扩展了Kerberos协议。
以“HTTP/host1@YOUR_DOMAIN.ORG”为一个服务主体例子:

kerberized Zookeeper

设置Kerberos SolrCloud集群时,建议为ZooKeeper启用Kerberos安全性。

在这种设置中,用于通过ZooKeeper验证请求的客户端主体也可以用于节点间通信。 由于Solr使用的Zookeeper客户端负责完成这项工作,因此无需分别续订票证授予票证(TGT)。 为此,可以将单个JAAS配置(应用程序名称为Client)用于Kerberos插件以及Zookeeper客户端。

有关在Kerberos模式下启动ZooKeeper的示例,请参阅下面的ZooKeeper配置部分。

浏览器配置

为了让您的浏览器在启用Kerberos身份验证后访问Solr管理界面,它必须能够与Kerberos身份验证器服务协商以允许您访问。 每种浏览器都支持这种方式,有些(如Chrome)完全不支持。 如果在启用Kerberos身份验证后尝试访问Solr Admin UI时看到401错误,则可能是浏览器未正确配置,无法知道如何或在何处协商身份验证请求。

有关如何设置浏览器的详细信息超出了本文档的范围; 请咨询您的系统管理员以获取有关如何配置浏览器的详细信息。

插件配置

咨询您的Kerberos管理员!
在尝试配置Solr以使用Kerberos身份验证之前,请查看下面概述的每个步骤,并咨询您的本地Kerberos管理员,以确保您知道每个参数的正确值。 小错误可能会导致Solr无法启动或无法正常工作,并且非常难以诊断。

Kerberos插件的配置有几个部分:

1 创建服务主体和密钥表文件

2 ZooKeeper配置

3 创建或更新/security.json

4 定义jaas-client.conf

5 Solr启动参数
我们将通过下面的每个步骤。
使用主机名
要使用主机名而不是IP地址,请在bin / solr.in.sh中使用SOLR_HOST配置,或在Solr启动过程中传递-Dhost = <主机名>系统参数。 本指南使用IP地址。 如果您指定主机名,请根据需要将指南中的所有IP地址替换为Solr主机名。

获取服务主体和密钥文件

在配置Solr之前,请确保您拥有适用于KDC服务器中每个Solr主机和ZooKeeper(如果尚未配置ZooKeeper)的Kerberos服务主体,并生成keytab文件,如下所示。

这个例子假定主机名是192.168.0.107,你的主目录是/ home / foo /。这个例子应该针对你自己的环境进行修改。

root@kdc:/# kadmin.local
Authenticating as principal foo/admin@EXAMPLE.COM with password.
kadmin.local: addprinc HTTP/192.168.0.107
WARNING: no policy specified for HTTP/192.168.0.107@EXAMPLE.COM; defaulting to no policy
Enter password for principal "HTTP/192.168.0.107@EXAMPLE.COM":
Re-enter password for principal "HTTP/192.168.0.107@EXAMPLE.COM":
Principal "HTTP/192.168.0.107@EXAMPLE.COM" created.
kadmin.local: ktadd -k /tmp/107.keytab HTTP/192.168.0.107
Entry for principal HTTP/192.168.0.107 with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/tmp/107.keytab.
Entry for principal HTTP/192.168.0.107 with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/tmp/107.keytab.
Entry for principal HTTP/192.168.0.107 with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/tmp/108.keytab.
Entry for principal HTTP/192.168.0.107 with kvno 2, encryption type des-cbc-crc added to keytab WRFILE:/tmp/107.keytab.
kadmin.local: quit

将keytab文件从KDC服务器的/tmp/107.keytab位置复制到/keytabs/107.keytab处的Solr主机。对每个Solr节点重复此步骤。

您可能需要采取类似的步骤来创建ZooKeeper服务主体和密钥表(如果尚未设置)。在这种情况下,下面的示例显示了ZooKeeper的一个不同的服务主体,因此可以使用zookeeper / host1作为其中一个节点的服务主体来重复上述操作.

ZooKeeper配置

如果您正在使用已配置为使用Kerberos的ZooKeeper,则可以跳过此处显示的与ZooKeeper相关的步骤。
由于ZooKeeper管理SolrCloud集群中节点之间的通信,因此它还必须能够与集群中的每个节点进行身份验证。 配置需要为ZooKeeper设置一个服务主体,定义一个JAAS配置文件并指示ZooKeeper使用这两个项目。
第一步是在ZooKeeper的conf目录下创建一个文件java.env并添加以下内容,如下例所示:
导出JVMFLAGS =“ - Djava.security.auth.login.config = / etc / zookeeper / conf / jaas-client.conf”
JAAS配置文件应该包含以下参数。 确保根据需要更改主体和keyTab路径。 该文件必须位于上述步骤中定义的路径中,并指定文件名。

Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/keytabs/zkhost1.keytab"
storeKey=true
doNotPrompt=true
useTicketCache=false
debug=true
principal="zookeeper/host1@EXAMPLE.COM";
};

最后,将以下行添加到ZooKeeper配置文件zoo.cfg中:

authProvider.1= org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000

一旦所有部分都到位,使用以下指向JAAS配置文件的参数启动ZooKeeper:

bin / zkServer.sh start -Djava.security.auth.login.config = / etc / zookeeper / conf / jaas-client.conf

创建 security.json

创建security.json文件。
在SolrCloud模式下,您可以将Solr设置为使用Kerberos插件,方法是在创建ZooKeeper时将security.json上载到ZooKeeper,如下所示:
server / scripts / cloud-scripts / zkcli.sh -zkhost localhost:2181 -cmd put /security.json'{“authentication”:{“class”:“org.apache.solr.security.KerberosPlugin”}}'
如果您在独立模式下使用Solr,则需要创建security.json文件并将其放入您的$ SOLR_HOME目录中。
有关如何在Solr中使用/security.json文件的更多详细信息,请参见身份验证和授权插件。
如果您已经在ZooKeeper中拥有/security.json文件,请下载该文件,添加或修改身份验证部分并使用Solr中提供的命令行实用程序将其上载回ZooKeeper。

定义JAAS配置文件

JAAS配置文件定义用于身份验证的属性,例如服务主体和keytab文件的位置。还可以设置其他属性以确保票证缓存和其他功能。

以下示例可以针对您的环境稍微复制和修改。文件的位置可以位于服务器上的任何位置,但启动Solr时会引用该文件,因此它必须在文件系统上可读。 JAAS文件可能包含不同用户的多个部分,但每个部分都必须具有唯一的名称,以便在每个应用程序中可以唯一地引用它。

在下面的例子中,我们创建了一个JAAS配置文件,其名称和路径为/home/foo/jaas-client.conf。我们将在下一节定义Solr开始参数时使用这个名称和路径。请注意,这里的客户主体与服务主体相同。这将用于验证节点间请求和请求到ZooKeeper。确保使用正确的主体主机名和keyTab文件路径。

Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/keytabs/107.keytab"
storeKey=true
useTicketCache=true
debug=true
principal="HTTP/192.168.0.107@EXAMPLE.COM";
};

该文件的第一行定义了部分名称,它将与下面定义的solr.kerberos.jaas.appname参数一起使用。
我们所关心的主要属性是keyTab和主要属性,但还有其他可能需要用于您的环境的属性。
Krb5LoginModule的javadoc(正在使用的类在上面的第二行中被调用)提供了可用属性的一个很好的轮廓,但为了参考,上面例子中使用的那些将在这里解释:
useKeyTab:这个布尔属性定义了我们是否应该使用keytab文件(在这种情况下为true)。
keyTab:JAAS配置文件的此部分用于主体的keytab文件的位置和名称。路径应该用双引号括起来。
storeKey:这个布尔属性允许密钥存储在用户的私人凭证中。
useTicketCache:该布尔属性允许从票证缓存中获取票证。
调试:此布尔属性将输出调试消息以帮助进行故障排除。
principal:要使用的服务主体的名称。

Solr启动参数

在启动Solr时,需要传递以下特定于主机的参数。 这些参数可以通过bin / solr start命令在命令行中传递(请参阅Solr控制脚本参考以了解有关如何传递系统参数的详细信息),或在bin / solr.in.sh或bin / solr.in.cmd中定义为 适合您的操作系统。

solr参数

这是一个可以添加到bin / solr.in.sh的例子。 确保将此示例更改为使用正确的主机名和密钥表文件路径。

SOLR_AUTH_TYPE="kerberos"
SOLR_AUTHENTICATION_OPTS="-Djava.security.auth.login.config=/home/foo/jaas-client.conf -Dsolr.kerberos.cookie.domain=192.168.0.107 -Dsolr.kerberos.cookie.portaware=true -Dsolr.kerberos.principal=HTTP/192.168.0.107@EXAMPLE.COM -Dsolr.kerberos.keytab=/keytabs/107.keytab"

使用委托令牌

Kerberos插件可以配置为使用委托令牌,允许应用程序重复使用最终用户或其他应用程序的身份验证。
Solr有几个用例可能会有所帮助:
使用分布式客户端(例如MapReduce),其中每个客户端可能无法访问用户的凭证。
在Kerberos服务器上加载时很高。 委托令牌可以减轻负载,因为它们在第一次请求后不访问服务器。
如果请求或权限需要委托给另一个用户。
要启用授权令牌,必须定义几个参数。 这些参数可以通过bin / solr start命令在命令行中传递(请参阅Solr控制脚本参考以了解有关如何传递系统参数的详细信息),或在bin / solr.in.sh或bin / solr.in.cmd中定义为 适合您的操作系统。


委托令牌

启动Solr

配置完成后,您可以使用bin / solr脚本启动Solr,如下面的示例所示,仅适用于SolrCloud模式的用户。 这个例子假设你修改了bin / solr.in.sh或者bin / solr.in.cmd,并带有正确的值,但是如果你没有修改,你可以将系统参数和start命令一起传递。 请注意,您还需要根据您的ZooKeeper节点的位置自定义-z属性。

bin/solr -c -z server1:2181,server2:2181,server3:2181/solr

测试配置

1、用你的用户名做一个kinit。 例如,kinit user@EXAMPLE.COM
2、尝试使用curl访问Solr。 你应该得到一个成功的回应。
curl --negotiate -u:“http://192.168.0.107:8983/solr/

使用SolrJ和Kerberized Solr

要在SolrJ应用程序中使用Kerberos身份验证,在创建SolrClient之前,需要以下两行:

System.setProperty(“java.security.auth.login.config”,“/home/foo/jaas-client.conf”);
HttpClientUtil.setConfigurer(new Krb5HttpClientConfigurer());

您需要为客户端指定Kerberos服务主体,并在上面的JAAS客户端配置文件中指定相应的keytab。 该principal应与我们为Solr创建的service principal 不同。
下面是一个例子:

SolrJClient {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/keytabs/foo.keytab"
  storeKey=true
  useTicketCache=true
  debug=true
  principal="solrclient@EXAMPLE.COM";
};

SolrJ委托令牌

SolrJ也支持授权令牌,方法如下:
可以使用DelegationTokenRequest和DelegationTokenResponse来获取,取消和更新授权令牌。
HttpSolrClient.Builder包含一个withDelegationToken函数,用于创建一个使用委托令牌进行验证的HttpSolrClient。
获取授权令牌的示例代码:

private String getDelegationToken(final String renewer, final String user, HttpSolrClient solrClient) throws Exception {
    DelegationTokenRequest.Get get = new DelegationTokenRequest.Get(renewer) {
      @Override
      public SolrParams getParams() {
        ModifiableSolrParams params = new ModifiableSolrParams(super.getParams());
        params.set("user", user);
        return params;
      }
    };
    DelegationTokenResponse.Get getResponse = get.process(solrClient);
    return getResponse.getDelegationToken();
  }

创建使用委托令牌的HttpSolrClient:

HttpSolrClient client = new HttpSolrClient.Builder("http://localhost:8983/solr").withDelegationToken(token).build();

创建使用委托令牌的CloudSolrClient:

CloudSolrClient client = new CloudSolrClient.Builder()
                .withZkHost("http://localhost:2181")
                .withLBHttpSolrClientBuilder(new LBHttpSolrClient.Builder()
                    .withResponseParser(client.getParser())
                    .withHttpSolrClientBuilder(
                        new HttpSolrClient.Builder()
                            .withKerberosDelegationToken(token)
                    ))
                        .build();
上一篇下一篇

猜你喜欢

热点阅读