简单说明 Solr 认证配置相关配置

Solr包含一些开箱即用的插件,通过这些插件能够完成Solr的认证、授权等功能。

默认情况下Solr中的所有认证、授权配置保存在security.json文件中。Standlone模式下,Security.json文件保存在$SOLR_HOME目录下,SolrCloud模式时该文件保存在ZK中。

security.json文件示例:

1
2
3
4
5
6
7
8
{
"authentication" : {
"class": "class.that.implements.authentication"
},
"authorization": {
"class": "class.that.implements.authorization"
}
}

使用CDH时以下命令可以将security.json文件upload到zk中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 上传或者覆盖配置信息
/opt/cloudera/parcels/CDH/lib/solr/bin/zkcli.sh -zkhost bdnode1:2181 -cmd putfile {znode_name} {src_path}

# 下载配置信息
/opt/cloudera/parcels/CDH/lib/solr/bin/zkcli.sh -zkhost bdnode1:2181 -cmd getfile {znode_name} {dest_path}

# 使用 ./bin/solr zk命令能够操作ZNODE
solr zk upconfig|downconfig -d <confdir> -n <configName> [-z zkHost]
solr zk cp [-r] <src> <dest> [-z zkHost]
solr zk rm [-r] <path> [-z zkHost]
solr zk mv <src> <dest> [-z zkHost]
solr zk ls [-r] <path> [-z zkHost]
solr zk mkroot <path> [-z zkHost]

认证插件

当前Solr提供了以下几种认证插件:

插件名称 官方参考
Kerberos 参考
Basic 参考
Hadoop 参考

Solr还支持PKIAuthenticationPlugin插件,该插件用来处理Solr内部请求的安全认证。需要注意的是PKIAuthenticationPlugin的加密原理对时间敏感,Solr节点间需要保证5s以内的时间同步。通过pkiauth.ttl参数可以控制密钥失效时间。

Basic 插件

Basic 插件基于用户名/密码进行认证。

下面的配置,同时启用了baseAuthPlugin和授权插件。

1
2
3
4
5
6
{
"authentication":{
"blockUnknown": true,
"class":"solr.BasicAuthPlugin",
"credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}
}

参数含义如下:

  • class:实现的插件类
  • credentials:定义了solr用户和该用户的密码(密码带盐值的sha256密文)

编辑插件的配置可以参考官方文档,Solr本身也有API可以进行用户管理。

Hadoop 插件

此插件将所有功能委派给Hadoop authentication library

由于Hadoop支持simple和Kerberos两种认证方式,所以使用这个插件实际上能够实现Kerberos认证。官方提供了Kerberos、Simple两种配置的security.json样例。

该插件有ConfigurableInternodeAuthHadoopPlugin和HadoopAuthPlugin两种实现类区别在于:前者同时处理内部认证和外部认证,后者只处理内部认证。

Kerberos 插件

Solr集成Kerberos插件后,Solr可以实现以下效果:

  • 使用principal和keytab在Zookeeper上完成认证;
  • Solr集群内部完成节点的相互认证;
  • Admin UI和其他客户端需要认证后访问solr;

官方文档比较详细的说明了该插件的配置方法,并且简要说明了如何进行Delegation Tokens配置,以及使用SolrJ完成Kerberos认证。

Znode节点添加ACLs

默认情况下,Solr启用认证后只对本身API生效。Solr存储在Zookeeper上配置依然是open-unsafe配置。

Solr在ZK上的权限管理,取决于以下两个配置:

  • zkCredentialsProvider:ZK的凭证管理类,用于获取在ZooKeeper中执行操作的权限。按照个人理解,这个配置当ZK使用digest认证时才有用,Kerberos认证时只需配置默认值即可。该配置的默认值是DefaultZkCredentialsProvider,另一个配置是VMParamsSingleSetCredentialsDigestZkCredentialsProvider。使用后者时,涉及到的配置项还有zkDigestPassword、zkDigestUsername。

  • zkACLProvider :这个配置控制solr在ZK上创建ZNode时,Znode的权限。

zkACLProvider包括以下配置(org.apache.solr.common.cloud.xxx):

  • DefaultZkACLProvider: 默认配置创建的ZNode是所有人都可以访问的。
  • VMParamsAllAndReadonlyDigestZkACLProvider:ZK使用Digest认证时使用这个配置。
  • SaslZkACLProvider:ZK使用Kerberos认证时使用这个配置。

通常情况下,需要在将上面提及的配置添加到环境变量SOLR_ZK_CREDS_AND_ACLS,并在solr.in.sh和zkcli.sh中引入这两个配置。

Cloudera中配置Solr认证

自定义security.json

CDH默认使用 Hadoop 插件作为Solr的认证工具,在parcels包的solr/clusterconfig/目录下有security.json的模板文件。

每次Cloudera启动Solr都会加载security.json模板文件,并覆盖Zookeeper上的配置文件。如果要自定义solr授权、认证方案,需要修改/opt/cloudera/cm-agent/service/solr/solr.sh文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
379   if [ $CDH_VERSION -ge 6 ]; then
380 export SOLR_SEC_CONFIG_FILE="${SOLR_HOME}/clusterconfig/hadoop_multi_scheme_config.json"
381
382 # if $SOLR_HOME/bin/zksynctool.sh; then
383 # echo "Successfully configured security for Solr cluster in Zookeeper"
384 # else
385 # echo "ERROR: Failed to configure security for Solr cluster in Zookeeper"
386 # exit 1
387 # fi
388
389 # set this very high to keep Solr's forced shutdown from interfering with CM's forced shutdown (value in seconds)
390 export SOLR_STOP_WAIT=${SOLR_STOP_WAIT:-2592000}
391 fi

使用下面的命令可以上传security.json到ZK(前提是配置好zkcli.sh中的Kerberos认证信息),需要注意是每次修改security.json之后需要重启Solr。

1
/opt/cloudera/parcels/CDH/lib/solr/bin/zkcli.sh -cmd putfile /solr/security.json ./security.json -z bdnode1:2181,bdnode2:2181,bdnode3:2181

Znode启用ACLs

当在已有CDH中开启Kerberos时,Cloudera不会将原有Znode配置ACLs。用户需要修改zkcli.sh文件,执行以下命令将之前创建的ZNode修改ACLs配置:

1
2
3

# 执行以下命令更新ZNode的ACL配置
cd /opt/cloudera/cm-agent/service/solr/ && ./bin/zkcli.sh -zkhost bdnode1:2181,bdnode2:2181,bdnode3:2181 -cmd updateacls /solr

参考以下方式修改zkcli.sh中的SOLR_ZK_CREDS_AND_ACLS变量:

1
2
3
# Settings for ZK ACL
SOLR_ZK_CREDS_AND_ACLS="-DzkACLProvider=org.apache.solr.common.cloud.SaslZkACLProvider \
-Djava.security.auth.login.config=/etc/zookeeper/conf/jaas.conf"

参考

官方安全文档

认证 & 授权插件

ZooKeeper Access Control