浏览文章

文章信息

Elasticsearch基础 12090

    

当前直接使用ElasticSearch以及通过Kibana访问时,没有做任何限制,没有做用户和权限的控制,安全性上有一定风险,因此通过ES提供的X-PACK来实现这一需求。同样是基于ES5.5版本。官网简介如下:X-Pack是一种Elastic Stack扩展,可将安全性,警报,监控,报告和图形功能捆绑到一个易于安装的软件包中。 虽然X-Pack组件可以无缝协同工作,但您可以轻松地启用或禁用要使用的功能。可见,本文所述的相关功能只是这个扩展包的一小部分功能。

  1. ElasticSearch安装X-Pack,通过执行ES_HOME下的bin/elasticsearch-plugin install 命令安装,注意要使用启动es的用户,不要用root用户,集群中的每一个节点都需要执行: 
    bin/elasticsearch-plugin install x-pack

    官网还介绍了其他的安装方式,点这里。安装完成后,重启ES,启动日志中能看到x-pack:

    通过浏览器,再次访问时,会弹出提示输入用户名密码,输入默认的用户名/密码:elastic/changeme,即可。

  2. Kibanna安装X-Pack,和es安装类似,通过执行KIBANA_HOME下的bin/kibana-plugin install 命令安装,也有其他安装方式
  3. 用户管理
    x-pack提供了标准的rest api用于个用户、角色、权限等管理。详见
    (1)查看所有用户:curl -XGET -u elastic 'localhost:9200/_xpack/security/user',结果如下:
    {	"elastic": {		"username": "elastic",		"roles": ["superuser"],		"full_name": null,		"email": null,		"metadata": {			"_reserved": true
    		},		"enabled": true
    	},	"kibana": {		"username": "kibana",		"roles": ["kibana_system"],		"full_name": null,		"email": null,		"metadata": {			"_reserved": true
    		},		"enabled": true
    	},	"logstash_system": {		"username": "logstash_system",		"roles": ["logstash_system"],		"full_name": null,		"email": null,		"metadata": {			"_reserved": true
    		},		"enabled": true
    	}
    }

    可见,有三个默认用户,分别对应elastic,kibana,logstash三个系统,用户拥有不同的角色组。
    (2)查看某一用户:curl -XGET -u elastic 'localhost:9200/_xpack/security/user/elastic'
    (3)删除某一用户:curl -XDELETE -u elastic 'localhost:9200/_xpack/security/user/userName'
    (4)创建用户:见5

  4. 角色管理
    (1)查看所有角色:curl -XGET -u elastic 'localhost:9200/_xpack/security/role'
    (2)查看某一角色:curl -XGET -u elastic 'localhost:9200/_xpack/security/role/superuser'
    (3)删除某一角色:curl -XDELETE -u elastic 'localhost:9200/_xpack/security/role/roleName'
    (4)创建角色:见5
  5. 添加自己的用户
    创建用户需要指定其拥有的权限,可以使用系统默认的角色,也可以自己创建角色,如下:
    curl -XPOST -u elastic 'localhost:9200/_xpack/security/role/testRole' -H "Content-Type: application/json" -d '{"cluster":["all"],"indices":[{"names":["*"],"privileges":["all"]}]}'

    然后:

    curl -XPOST -u elastic 'localhost:9200/_xpack/security/user/testUser' -H "Content-Type: application/json" -d '{  "password" : "test",  "full_name" : "test user",  "email" : "test@test",  "roles" : [ "testRole" ],  "metadata" : {    "intelligence" : 7
      }
    }'

    testUser是创建的用户名。用户名必须至少为1个字符且不得超过30个字符。 第一个字符必须是字母(a-z或A-Z)或下划线(_)。 后续字符可以是字母,下划线(_),数字(0-9)或以下任何符号@, - ,。 或$。

    其中password和roles是必填字段,其余三个可选。

    创建结果如下,如果用户已存在,则会更新,结果中的created为false。

    {  "user": {    "created" : true 
      }
    }


    注意:上文提到的三个默认用户,是系统保留用户,不允许创建或修改,它们默认的角色亦是如此。
     

  6. 在代码中使用es用户管理
    如果对es开启了用户管理,而代码服务没有使用用户,会报如下错:
    Invocation of init method failed; nested exception is NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{dBISQCNcS4qAzYgKerYURA}{localhost}{localhost:9300}]]
    需要在代码中指定用户。
    首先引入依赖包:
    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>x-pack-transport</artifactId>
            <version>5.5.0</version>
        </dependency></dependencies>

    代码示例如下:
    import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
    ...
    
    TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
            .put("cluster.name", "myClusterName")
            .put("xpack.security.user", "userName:password")
            ...
            .build())
        .addTransportAddress(new InetSocketTransportAddress("localhost", 9300))
        .addTransportAddress(new InetSocketTransportAddress("localhost", 9301));

    详见官网

    本文只列了一些基础的功能,具体参见官网。


原创