ElasticSearch的安全配置

作者: 饿虎嗷呜 | 来源:发表于2020-02-19 16:37 被阅读0次

    ElasticSearch的安全配置

    安全需求

    根据安全的3A要求,ES的安全需求分为以下几点:

    • 认证

      一个账号是否合法账号

    • 鉴权

      每个账号能够做哪些操作,能够访问哪些索引。

    • 审计

      日志审计

    此外ES是一款在网络上提供服务的产品,其通讯流量同样需要进行加密。

    账号认证

    ES的x-pack套件提供了基础的账号认证功能,其功能称为Realm。根据付费情况不同,Realm模块提供不同的认证能力。

    • 免费

      只提供本地的账号服务,可通过在elasticsearch.yml进行本地配置。也可以通过ES的security api进行设置。

    • 收费

      提供基于LDAP/kerbors/SAML/AD等认证方式。

    此外还有一些开源的解决方案,此处不做赘述。

    Realm的开启方式:

    在ES启动或者配置文件中进行配置:

    bin/elasticsearch -E xxx -E xpack.security.enabled=true

    设置默认的用户和组:

    bin/elasticsearch-password interactice

    为kibana设置用户和密码,修改kibana.yml:

    elasticsearch.username: "kibana"
    elasticsearch.password: "xxxxxx"
    

    ES会提供一些默认账号供使用,使用者也可以自己创建账号,并为其赋予相应的权限。

    https://www.elastic.co/guide/en/elasticsearch/reference/7.x/built-in-users.html

    账号鉴权

    ES的鉴权能力采用的是基于角色的访问控制的方法(RBAC)。下图是ES官方文档上的一张图,可以说明这种关系:

    authorization.png

    ES 提供了两种类型级别的权限,在这两种类别下又有更加细粒度的权限划分:

    • 集群操作权限

      提供了各种集群管理能力

    • 索引/字段操作

      提供到某个字段级别的访问控制,以及索引级别的操作。

    具体提供的权限列表可以从官方文档获取:

    https://www.elastic.co/guide/en/elasticsearch/reference/7.x/security-privileges.html

    在ES中,用户可以创建角色,并将各种类型的权限赋予角色。

    定义角色的官方文档在:

    https://www.elastic.co/guide/en/elasticsearch/reference/7.x/defining-roles.html

    {
      "run_as": [ ... ], 
      "cluster": [ ... ], 
      "global": { ... }, 
      "indices": [ ... ], 
      "applications": [ ... ] 
    }
    

    需要定义的内容分为5个部分:

    • run_as

      可作为该角色可以以之名义运行的用户名列表。

      只有本地、文件、LDAP、AD支持这种功能。

    • cluster

      该角色支持的集群级别的权限列表,如果不进行设置,则默认该角色不具备集群级别的权限。

    • global

      同样是集群级别的权限,与标准的集群权限的区别在于,标准的集群权限判断只单独基于某一个集群动作是否被执行,而global还需要考虑这个动作的参数。该对象目前只限于application

    • indices

      提供索引/文档/字段级别的权限

      {
        "names": [ ... ], 
        "privileges": [ ... ], 
        "field_security" : { ... }, 
        "query": "..." 
        "allow_restricted_indices": false 
      }
      

      可以指定:

      name:索引的名称

      privilegesname中指定的索引索引级别的权限

      field_security

      • 字段级别权限

        比如,可以设置一个文档中某些字段的可访问性,需要注意的是,有一些字段默认是可访问的。(_id_type_parent_routing_timestamp_ttl_size 以及 _index

        POST /_security/role/test_role1
        {
          "indices": [
            {
              "names": [ "events-*" ],
              "privileges": [ "read" ],
              "field_security" : {
                "grant" : [ "category", "@timestamp", "message" ]
              }
            }
          ]
        }
        

        参考文档 https://www.elastic.co/guide/en/elasticsearch/reference/7.x/field-level-security.html

      query

      文档级别权限

      参考文档 https://www.elastic.co/guide/en/elasticsearch/reference/7.x/document-level-security.html

      allow_restricted_indices:默认不建议开启,因为这样会导致该角色获取到内部限制级索引的权限进而获得一些superuser权限。

    • application

      提供自定义APP的相关权限。具体见https://www.elastic.co/guide/en/elasticsearch/reference/7.x/defining-roles.html#roles-application-priv

    通讯加密

    通讯流量加密包括集群内部的通讯流量加密以及集群与集群外的通讯流量加密。

    集群内部通讯

    集群内部通讯的流量加密需要通过对ES进行配置来完成。通过配置证书,使用ssl进行加密。

    主要的目的是:1. 防止非法的ES节点加入集群,2. 防止通讯流量被监听。

    首先需要制作一个证书:

    bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
    

    然后需要对ElasticSearch进行设置,修改elasticsearch.yml文件

    xpack.security.transport.ssl.enabled: true
    xpack.security.transport.ssl.verification_mode: certificate 
    xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12 
    xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12 
    

    其中verification_mode会有3种模式:

    certificate: 需要使用同样的证书才能加入集群

    full: 除了验证证书以外,还需要检测hostname和ip

    none: 不需要验证证书即可加入集群,一般在调试情况下使用。

    参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/configuring-tls.html#node-certificates

    集群对外通讯

    ES本身对外提供基于http的rest接口,需要对这个接口的通信进行加密,需要在elasticsearch.yml中配置

    xpack.security.http.ssl.enabled: true
    xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12 
    xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12 
    

    使用kibana和ES进行通讯,需要修改kibana的配置文件kibana.yml

    elasticsearch.username: "kibana"
    elasticsearch.password: "kibanapassword"
    

    同时kibana也需要设置自己的http服务为https:

    server.ssl.enabled: true
    server.ssl.certificate: "/path/to/kibana-server.crt"
    server.ssl.key: "/path/to/kibana-server.key"
    

    参考文档:

    https://www.elastic.co/guide/en/elasticsearch/reference/7.x/configuring-tls.html#tls-http

    https://www.elastic.co/guide/en/kibana/7.x/using-kibana-with-security.html

    https://www.elastic.co/guide/en/kibana/7.x/configuring-tls.html

    相关文章

      网友评论

        本文标题:ElasticSearch的安全配置

        本文链接:https://www.haomeiwen.com/subject/suiafhtx.html