solr入门之solr安全控制的研究和实践(二)

来源:互联网 发布:python界面编程 编辑:程序博客网 时间:2024/06/04 17:46
Permission Attributes(权限属性)

每个用户又一个或者几个权限组成,每个权限由几个定义过可以做哪些事的属性组成.
下面有一些不能被修改的预定义权限:
Pre-defined Permissions
有一些预定义的权限。这些固定的默认值,不能修改,无法添加新属性。要使用这些属性,只需定义一个角色,包括这个权限, 然后给一个用户分配角色。
security-edit:
该许可允许编辑安全配置,这意味着任何更新的操作修改security.json 通过api将被允许.
security-read:
该许可允许阅读安全配置,这意味着任何行动来读取security.json 通过api将被允许。
schema-edit:
该许可允许编辑集合的schema使用schema API .
请注意,这个 schema edit 权限 是适用于全部集合的.
如果要只能编辑指定的集合的schema,应该去创建一个自定义的权限.
schema-read:
该许可允许读取集合的schema使用schema API .
请注意,这个 schema edit 权限 是适用于全部集合的.
如果要只能读取指定的集合的schema,应该去创建一个自定义的权限.
config-edit:
该权限允许去编辑集合的配置信息使用 config API ,request Parameters API 
或者其他能够修改configoverlay.json的API.
注意,这个权限允许去修改全部的集合的配置信息.
如果要只能编辑指定的集合的配置信息,应该创建一个新的权限。
config-read:
该权限允许去查看集合的配置信息使用 config API ,request Parameters API 
或者其他能够修改configoverlay.json的API.
注意,这个权限允许去查看全部的集合的配置信息.
如果要只能查看指定的集合的配置信息,应该创建一个新的权限。
collection-admin-edit:
该许可允许使用 Collections API 来修改集合的配置.
注意,这个权限允许去编辑所有的集合.
如果要只能编辑指定的集合,应该创建一个自定义的权限.
具体来说,下列的Collection API 将被允许:
CREATE
RELOAD
SPLITSHARD
CREATESHARD
DELETESHARD
CREATEALIAS
DELETEALIAS
DELETE
DELETEREPLICA
ADDREPLICA
CLUSTERPROP
MIGRATE
ADDROLE
REMOVEROLE
ADDREPLICAPROP
DELETEREPLICAPROP
BALANCESHARDUNIQUE
REBALANCELEADERS

collection-admin-read:
该许可允许使用 Collections API 来查看集合的配置.
注意,这个权限允许去查看所有的集合.
如果要只能查看指定的集合,应该创建一个自定义的权限.
具体来说,下列的Collection API 将被允许:
LIST
OVERSEERSTATUS
CLUSTERSTATUS
REQUESTSTATUS

update:
这个权限允许去执行任何更新操作对于所有的集合.
包含发送文档索引(使用 一个 update request handler)

read:
这个权限允许执行任何读取操作对于所有集合 
包含使用搜索处理器的查询(使用 request handlers) 
像 /select, /get, /browse, /tvrh, /terms, /clustering, 
/elevate, /export, /spell, /clustering,  /sql.
all:
任何经过solr的请求


Authorization API(权限操作 API)

API Endpoint
/admin/authorization:
需要一组命令去创建权限,映射权限到角色,映射角色到用户 

Manage Permissions(权限管理)
三个命令来进行权限管理:
set-permission:
创建一个新的权限,覆盖现有的权限定义,或者分配一个预定义权限给角色
update-permission:
更新已有的权限定义的一些属性
delete-permission:
删除一个权限

=====
如果你不使用上面预定义的权限,那么需要去创建一个权限.
下面几个属性可以用于你自定义的权限.
name:
权限的名字。这个名字将被用于更新或删除权限。
collection:
这个权限将被应用于集合或者所有集合.
当这个路径是被允许的特定集合时,像当设置权限允许使用Schema API,省略集合的属性
将允许去定义 路径 and/or 方法 对于所有的集合.
然而,当路径是non-collection-specific,像这样 Collection API 这个集合的值必须为null

path:
请求处理器的名称,像 /update or /select  .支持通配符,去允许全部的路径(想 /update/*)


method:
这个参数用来控制HTTP的请求方法.
你可以只允许GET请求,或者有一个的角色,允许PUT和POST请求。
该方法允许这个属性的值GET、POST、PUT、DELETE和HEAD。

params:
请求参数的名称和值。
如果所有请求参数都被允许的,这个属性可以省略.
如果定义,只会限制访问提供的值。
例如,这个属性可以用来限制操作的作用是只允许执行Collection API。
如果这个角色应该只被允许执行LIST或CLUSTERSTATUS列表请求,您将定义如下

"params": {
"action": [LIST, CLUSTERSTATUS]
}


before:
此属性允许权限排序。此属性的值为
这个新的许可权限应放在security.json。

role:
角色(s)的名字给这个许可。
这个名字将被用于用户id映射到角色授予这些权限。
意思是可以通配符(*),这意味着任何用户都可用,但没有用户并不好。

下面将创建一个新的名为collection-mgr的权限,允许创建集合和 查看集合列表。
许可将被放置在"读的许可。还请注意,我们已经定义了“集合为空,
这是因为请求Collections API永远不会与特定集合有关。


curl --user solr:SolrRocks -H 'Content-type:application/json' -d '{
"set-permission": {"name":"collection-mgr",
"collection": null,
"path":"/admin/collections",
"params":{"action":[LIST, CREATE]},
"before": "read",
"role": "admin"}
}' http://localhost:8983/solr/admin/authorization




Map Roles to Users

A single command allows roles to be mapped to users
一行命令允许映射角色到用户 
set-user-role: 映射一个用户到一个权限
删除用户的权限,您应该将角色设置为null。没有命令来删除一个用户角色。
这个命令提供仅仅是用户ID和用户应该有一个或多个角色。
例如,下面将授予用户“solr”“admin”和“dev”的角色,
并删除所有的角色用户ID“harry”:

Enabling SSL(启用SSL)
SolrCloud和单节点Solr都可以加密通信对于连接,和SolrCloud的节点,使用SSL。
本节描述启用SSL Jetty服务器使用一个自签名证书的例子。

SSL证书和密钥的介绍,请参阅
 http://www.tldp.org/HOWTO/SSL-Certificates-HOWTO/.


主要包含以下及部分内容

基本的SSL设置
Generate a self-signed certificate and a key
  生成一个自签名证书和一个密钥
  证书和密钥转换为PEM格式使用cURL
 ● 设置通用SSL相关系统的属性
 ● 单节点运行Solr使用SSL
SolrCloud
●配置 Zookeeper
使用SSL运行SolrCloud
客户端操作的例子
创建一个SolrCloud Collection 使用bin / solr 
使用cURL查看 solrCloud集群状态
使用post.jar建立文档索引
使用cURL查询
使用CloudSolrClient索引一个文档


Basic SSL Setup
Generate a self-signed certificate and a key

生成一个自签名证书和一个key,进行身份验证,在服务器和连接之间,我们将使用JDK keytool命令和创建一个单独的密钥存储库。
这个密钥库也将用作下面一个信任存储库。
可以使用的密钥存储库的JDK的目的,和使用单独的信任存储库,但是这些选项不覆盖。

运行下面的命令在server/ etc /目录中的binary Solr分布。
假设您有JDK keytool工具在你的路径,openssl也在你的路径。
见https://www.openssl.org/related/binaries.



“-ext SAN=…“keytool选项允许您指定的所有DNS名称和/或IP地址允许在主机名验证(但见下文如何跳过主机名验证Solr节点之间,你不需要在这里指定所有主机)。
除了本地主机127.0.0.1,这个例子包括局域网IP地址192.168.1.3 Solr的机器节点上运行:

keytool -genkeypair -alias solr-ssl -keyalg RSA -keysize 2048 -keypass secret
-storepass secret -validity 9999 -keystore solr-ssl.keystore.jks -ext
SAN=DNS:localhost,IP:192.168.1.3,IP:127.0.0.1 -dname "CN=localhost,
OU=Organizational Unit, O=Organization, L=Location, ST=State, C=Country"


上面的命令将创建一个名为solr-ssl.keystore.jks 的keystore文件,在当前目录中。



Convert the certificate and key to PEM format for use with cURL


cURL不能够使用JKS格式化的密钥存储库,所以JKS密钥存储库需要转换成PEM格式,   使cURL能够理解。

首先将使用keytool JKS密钥存储库到PKCS12格式

keytool -importkeystore -srckeystore solr-ssl.keystore.jks -destkeystore
solr-ssl.keystore.p12 -srcstoretype jks -deststoretype pkcs12

keytool应用程序将提示您创建一个目的地keystore密码和密钥存储库  密码,设置创建密钥存储库时(“secret ”在上面的示例中)。

接下来将PKCS12格式密钥存储库,包括证书和密钥,使用openssl命令转为PEM格式

openssl pkcs12 -in solr-ssl.keystore.p12 -out solr-ssl.pem

如果你想使用cURL在OS X Yosemite(10.10),
您需要创建一个certificate-only版本的PEM 格式,如下:
openssl pkcs12 -nokeys -in solr-ssl.keystore.p12 -out solr-ssl.cacert.pem

Set common SSL related system properties


Solr开始脚本已经设置SSL-related Java系统属性传递给JVM。
为了激活SSL设置,取消和更新这组属性开始在bin / solr.in.sh SOLR_SSL_ *。
(或bin\solr.in.cmd在 windows中)。注意,如果你设置了solr作为服务在linux中使用
这个概述中 Taking Solr to Production,在 /var/solr/solr.in.sh中进行这些更改

bin/solr.in.sh example SOLR_SSL_* configuration

SOLR_SSL_KEY_STORE=etc/solr-ssl.keystore.jks
SOLR_SSL_KEY_STORE_PASSWORD=secret
SOLR_SSL_TRUST_STORE=etc/solr-ssl.keystore.jks
SOLR_SSL_TRUST_STORE_PASSWORD=secret
# Require clients to authenticate
SOLR_SSL_NEED_CLIENT_AUTH=false
# Enable clients to authenticate (but not require)
SOLR_SSL_WANT_CLIENT_AUTH=false

When you start Solr, the bin/solr script includes the settings in bin/solr.in.sh and will pass these SSL-related system properties to the JVM.

当你启动Solr,bin/Solr脚本包括在bin/solr.in.sh中的设置。
并将这些SSL-related系统属性传递给JVM。

注意连接设置:

使SOLR_SSL_NEED_CLIENT_AUTH或SOLR_SSL_WANT_CLIENT_AUTH
但并不在同一时间。他们是相互排斥的,jetty将选择其中一个,可能不是你希望的

同样的,当你启动Solr,bin/Solr.cmd脚本包括在bin/solr.in.sh.cmd中的设置。
并将这些SSL-related系统属性传递给JVM。

bin\solr.in.cmd example SOLR_SSL_* configuration

set SOLR_SSL_KEY_STORE=etc/solr-ssl.keystore.jks
set SOLR_SSL_KEY_STORE_PASSWORD=secret
set SOLR_SSL_TRUST_STORE=etc/solr-ssl.keystore.jks
set SOLR_SSL_TRUST_STORE_PASSWORD=secret
REM Require clients to authenticate
set SOLR_SSL_NEED_CLIENT_AUTH=false
REM Enable clients to authenticate (but not require)
set SOLR_SSL_WANT_CLIENT_AUTH=false



Run Single Node Solr using SSL

使用如下所示的命令启动Solr;默认情况下连接不需要身份验证

*nix command
bin/solr -p 8984

Windows command
bin\solr.cmd -p 8984


SolrCloud

本节描述如何运行一个两节点集群SolrCloud,没有初始化集合和一个单节点外的zookeeper。下面的命令假设您已经创建了密钥存储库。

Configure ZooKeeper

在你开始任何SolrCloud节点之前,您必须配置您的solr集群属性在zookeeper,
以便Solr节点知道通过SSL通信。

本节假设您已经创建了,开始单节点的外部zookeeper在本地主机端口2181上
see Setting Up an External ZooKeeper Ensemble

urlScheme整个集群范围的属性需要被设置为https,在任何Solr节点启动之前。
这个下面这个例子使用的zkcli工具 二进制Solr分布:

*nix command
server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:2181 -cmd clusterprop 
-name urlScheme -val https

Windows command
server\scripts\cloud-scripts\zkcli.bat -zkhost localhost:2181 -cmd clusterprop
 -name urlScheme -val https

如果你有设置集群zookeeper使用chroot Solr,确保您的zkcli使用正确的zkhost字符串,
例如-zkhost localhost:2181 / solr。


Run SolrCloud with SSL
Create Solr home directories for two nodes

创建两个副本的server/solr /目录将作为solr home 目录,对于两个SolrCloud节点:

*nix commands
mkdir cloud
cp -r server/solr cloud/node1
cp -r server/solr cloud/node2


Windows commands

mkdir cloud
xcopy /E server\solr cloud\node1\
xcopy /E server\solr cloud\node2\


Start the first Solr node

接下来,开始第一个Solr节点在端口8984上。
首先一定要停止单机服务如果你开始工作时通过一节在这个页面。

*nix command

bin/solr -cloud -s cloud/node1 -z localhost:2181 -p 8984

Windows command

bin\solr.cmd -cloud -s cloud\node1 -z localhost:2181 -p 8984

注意使用-s 选项设置为node1 的 Solr home目录的位置。

如果你创建SSL密钥没有DNS名称/ IP地址,在将运行Solr节点,你可以告诉Solr跳过
主机名称校验对于 inter-solr-node(节点间)通讯,设置 solr.ssl.checkPeerName 系统
属性为false;

*nix command

bin/solr -cloud -s cloud/node1 -z localhost:2181 -p 8984
-Dsolr.ssl.checkPeerName=false

Windows command

bin\solr.cmd -cloud -s cloud\node1 -z localhost:2181 -p 8984
-Dsolr.ssl.checkPeerName=false


Start the second Solr node

最后,在端口7574上启动第二个Solr节点——再一次,
跳过主机名验证,添加 -Dsolr.ssl.checkPeerName = false;


*nix command

bin/solr -cloud -s cloud/node2 -z localhost:2181 -p 7574

Windows command

bin\solr.cmd -cloud -s cloud\node2 -z localhost:2181 -p 7574


Example Client Actions

Create a SolrCloud collection using bin/solr

创建一个2-shard,replicationFactor = 1 名称为mycollection 使用默认的配置文件 
(data_driven_schema_configs):

*nix command

bin/solr create -c mycollection -shards 2

Windows command

bin\solr.cmd create -c mycollection -shards 2

创建操作将通过SOLR_SSL_ *  属性 开始你包含的文件去solrJ代码使用创建这个集合。


Retrieve SolrCloud cluster status using cURL

能获取的集群状态(如果你没有启用客户端身份验证,移除 -E solr-ssl.pem:secret 选项):

curl -E solr-ssl.pem:secret --cacert solr-ssl.pem
"https://localhost:8984/solr/admin/collections?action=CLUSTERSTATUS&wt=json&indent=on"
你应该得到这样的响应:
{
"responseHeader":{
"status":0,
"QTime":2041},
"cluster":{
"collections":{
"mycollection":{
"shards":{
"shard1":{
"range":"80000000-ffffffff",
"state":"active",
"replicas":{"core_node1":{
"state":"active",
"base_url":"https://127.0.0.1:8984/solr",
"core":"mycollection_shard1_replica1",
"node_name":"127.0.0.1:8984_solr",
"leader":"true"}}},
"shard2":{
"range":"0-7fffffff",
"state":"active",
"replicas":{"core_node2":{
"state":"active",
"base_url":"https://127.0.0.1:7574/solr",
"core":"mycollection_shard2_replica1",
"node_name":"127.0.0.1:7574_solr",
"leader":"true"}}}},
"maxShardsPerNode":"1",
"router":{"name":"compositeId"},
"replicationFactor":"1"}},
"properties":{"urlScheme":"https"}}}

Index documents using post.jar

使用post.jar去索引一些实例文档到上文创建的solrcloud collection中

cd example/exampledocs
java -Djavax.net.ssl.keyStorePassword=secret
-Djavax.net.ssl.keyStore=../../server/etc/solr-ssl.keystore.jks
-Djavax.net.ssl.trustStore=../../server/etc/solr-ssl.keystore.jks
-Djavax.net.ssl.trustStorePassword=secret
-Durl=https://localhost:8984/solr/mycollection/update -jar post.jar *.xml

Query using cURL


使用cURL来查询上面创建的SolrCloud collection,从一个目录包含PEM格式上面创建证书和密钥(如 example/etc/)——如果你没有启用客户端身份验证(系统参数-Djetty.ssl.clientAuth = true),那么您可以删除-E solr-ss.pem:secret 选项:

curl -E solr-ssl.pem:secret --cacert solr-ssl.pem
"https://localhost:8984/solr/mycollection/select?q=*:*&wt=json&indent=on"


Index a document using CloudSolrClient

对于使用solrJ来连接,创建文档索引.在下列的代码中,javax.net.ssl.* 系统参数是在程序中进行设置的.但是 你能使用java 命令行来代替他 向上文 post.jar 例子.

System.setProperty("javax.net.ssl.keyStore", "/path/to/solr-ssl.keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "secret");
System.setProperty("javax.net.ssl.trustStore", "/path/to/solr-ssl.keystore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "secret");
String zkHost = "127.0.0.1:2181";
CloudSolrClient server = new CloudSolrClient(zkHost);
server.setDefaultCollection("mycollection");
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "1234");
doc.addField("name", "A lovely summer holiday");
server.add(doc);
server.commit();



0 0