9.1 安全特性介绍 (Security Features)


文档摘要

9.1 安全特性介绍 (Security Features) Elasticsearch 安全特性介绍 (Security Features) 9.1 安全特性概览 Elasticsearch 的安全特性主要围绕以下几个方面展开: 身份验证 (Authentication): 验证用户的身份,确认其是否允许访问集群。 授权 (Authorization): 确定经过身份验证的用户可以执行哪些操作以及访问哪些资源。 传输层加密 (Transport Layer Security, TLS): 加密节点之间的通信,防止数据在传输过程中被窃听或篡改。 审计日志 (Audit Logging): 记录集群中的安全相关事件,以便进行安全分析和合规性审计。

9.1 安全特性介绍 (Security Features)

Elasticsearch 安全特性介绍 (Security Features)

9.1 安全特性概览

Elasticsearch 的安全特性主要围绕以下几个方面展开:

  • 身份验证 (Authentication): 验证用户的身份,确认其是否允许访问集群。

  • 授权 (Authorization): 确定经过身份验证的用户可以执行哪些操作以及访问哪些资源。

  • 传输层加密 (Transport Layer Security, TLS): 加密节点之间的通信,防止数据在传输过程中被窃听或篡改。

  • 审计日志 (Audit Logging): 记录集群中的安全相关事件,以便进行安全分析和合规性审计。

  • IP 过滤 (IP Filtering): 限制允许连接到集群的 IP 地址,防止未经授权的访问。

  • 字段和文档级别安全 (Field and Document Level Security): 控制用户可以访问的字段和文档,实现更细粒度的权限控制。

  • 角色映射 (Role Mapping): 将用户映射到特定的角色,简化权限管理。

  • 密钥库 (Keystore): 安全地存储敏感信息,如密码和证书。

下面我们将逐一介绍这些安全特性,并提供相应的代码实践。

9.1.1 身份验证 (Authentication)

Elasticsearch 提供了多种身份验证方式,包括:

  • 内置用户身份验证 (Native Realm): 使用 Elasticsearch 内部存储的用户信息进行身份验证。

  • LDAP 身份验证 (LDAP Realm): 使用 LDAP 服务器进行身份验证。

  • Active Directory 身份验证 (Active Directory Realm): 使用 Active Directory 服务器进行身份验证。

  • PKI 身份验证 (PKI Realm): 使用客户端证书进行身份验证。

  • 第三方身份验证 (Third-Party Authentication): 使用 Kerberos, SAML, OpenID Connect等协议进行身份验证。

代码实践 (Native Realm):

  1. 创建用户:

    使用 elasticsearch-users 工具创建用户。

    ./bin/elasticsearch-users useradd elastic -p your_password -r superuser ./bin/elasticsearch-users useradd kibana_system -p your_kibana_password -r kibana_system
    • elastic: 拥有 superuser 角色的管理员用户。

    • kibana_system: 用于 Kibana 内部操作的系统用户,拥有 kibana_system 角色。

  2. 配置 Elasticsearch:

    elasticsearch.yml 配置文件中启用安全特性。

    xpack.security.enabled: true
  3. 重启 Elasticsearch:

    重启 Elasticsearch 服务使配置生效。

  4. 使用用户名和密码访问 Elasticsearch:

    在 curl 命令中指定用户名和密码:

    curl -u elastic:your_password -XGET "http://localhost:9200/_cat/indices?v"

Mermaid 图示:

9.1.2 授权 (Authorization)

授权决定了经过身份验证的用户可以执行哪些操作。Elasticsearch 使用角色 (Roles) 来定义权限。角色是一组权限的集合。

代码实践:

  1. 创建角色:

    可以使用 API 创建角色。

    curl -u elastic:your_password -X POST "http://localhost:9200/_security/role/my_read_only_role" -H 'Content-Type: application/json' -d' { "cluster": ["monitor"], "indices": [ { "names": ["my_index*"], "privileges": ["read"] } ] } '

    这个例子创建了一个名为 my_read_only_role 的角色,该角色拥有 monitor 集群权限,以及对 my_index* 索引的 read 权限。

  2. 将用户映射到角色:

    curl -u elastic:your_password -X POST "http://localhost:9200/_security/role_mapping/my_read_only_mapping" -H 'Content-Type: application/json' -d' { "roles": ["my_read_only_role"], "rules": { "field": { "username": "john" } } } '

    这个例子创建了一个名为 my_read_only_mapping 的角色映射,将用户 john 映射到 my_read_only_role 角色。

Mermaid 图示:

9.1.3 传输层加密 (TLS)

TLS 加密节点之间的通信,防止数据在传输过程中被窃听或篡改。

代码实践:

  1. 生成证书:

    可以使用 elasticsearch-certutil 工具生成证书。

    ./bin/elasticsearch-certutil cert -out config/certs/elastic-certificates.p12 -pass your_password ./bin/elasticsearch-certutil ca -out config/certs/ca.zip -pass your_password unzip config/certs/ca.zip -d config/certs
  2. 配置 Elasticsearch:

    elasticsearch.yml 配置文件中配置 TLS。

    xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: full xpack.security.transport.ssl.keystore.path: config/certs/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: config/certs/elastic-certificates.p12 xpack.security.transport.ssl.keystore.secure_password: your_password xpack.security.transport.ssl.truststore.secure_password: your_password xpack.security.http.ssl.enabled: true xpack.security.http.ssl.keystore.path: config/certs/elastic-certificates.p12 xpack.security.http.ssl.truststore.path: config/certs/elastic-certificates.p12 xpack.security.http.ssl.keystore.secure_password: your_password xpack.security.http.ssl.truststore.secure_password: your_password
  3. 重启 Elasticsearch:

    重启 Elasticsearch 服务使配置生效。

  4. 使用 HTTPS 访问 Elasticsearch:

    curl -u elastic:your_password -XGET "https://localhost:9200/_cat/indices?v" --cacert config/certs/ca/ca.crt

Mermaid 图示:

9.1.4 审计日志 (Audit Logging)

审计日志记录集群中的安全相关事件,以便进行安全分析和合规性审计。

代码实践:

  1. 配置 Elasticsearch:

    elasticsearch.yml 配置文件中启用审计日志。

    xpack.security.audit.enabled: true xpack.security.audit.outputs: [logfile]
  2. 查看审计日志:

    审计日志默认存储在 Elasticsearch 的日志目录中。

Mermaid 图示:

9.1.5 IP 过滤 (IP Filtering)

IP 过滤限制允许连接到集群的 IP 地址,防止未经授权的访问。

代码实践:

  1. 配置 Elasticsearch:

    elasticsearch.yml 配置文件中配置 IP 过滤。

    network.host: 0.0.0.0 discovery.seed_hosts: ["127.0.0.1", "[::1]"] cluster.initial_master_nodes: ["node-1"]
  2. 使用防火墙:

    可以使用防火墙(如 iptablesfirewalld)限制允许访问 Elasticsearch 端口的 IP 地址。

Mermaid 图示:

9.1.6 字段和文档级别安全 (Field and Document Level Security)

字段和文档级别安全控制用户可以访问的字段和文档,实现更细粒度的权限控制。

代码实践 (Document Level Security):

  1. 创建包含文档级别安全信息的索引:

    curl -u elastic:your_password -X PUT "http://localhost:9200/my_index" -H 'Content-Type: application/json' -d' { "mappings": { "properties": { "title": { "type": "text" }, "body": { "type": "text" }, "owner": { "type": "keyword" } } } } '
  2. 创建包含文档级别安全信息的文档:

    curl -u elastic:your_password -X POST "http://localhost:9200/my_index/_doc?refresh" -H 'Content-Type: application/json' -d' { "title": "My Secret Document", "body": "This is a very secret document.", "owner": "john" } '
  3. 创建角色:

    curl -u elastic:your_password -X POST "http://localhost:9200/_security/role/my_limited_role" -H 'Content-Type: application/json' -d' { "indices": [ { "names": ["my_index"], "privileges": ["read"], "query": { "term": { "owner": "${es.user.username}" } } } ] } '

    这个例子创建了一个名为 my_limited_role 的角色,该角色只能访问 owner 字段与当前用户相同的文档。

  4. 将用户映射到角色:

    curl -u elastic:your_password -X POST "http://localhost:9200/_security/role_mapping/my_limited_mapping" -H 'Content-Type: application/json' -d' { "roles": ["my_limited_role"], "rules": { "field": { "username": "john" } } } '

    这个例子创建了一个名为 my_limited_mapping 的角色映射,将用户 john 映射到 my_limited_role 角色。

代码实践 (Field Level Security):

  1. 创建角色:

    curl -u elastic:your_password -X POST "http://localhost:9200/_security/role/my_field_limited_role" -H 'Content-Type: application/json' -d' { "indices": [ { "names": ["my_index"], "privileges": ["read"], "field_security": { "grant": ["title"] } } ] } '

    这个例子创建了一个名为 my_field_limited_role 的角色,该角色只能访问 title 字段。

  2. 将用户映射到角色:

    curl -u elastic:your_password -X POST "http://localhost:9200/_security/role_mapping/my_field_limited_mapping" -H 'Content-Type: application/json' -d' { "roles": ["my_field_limited_role"], "rules": { "field": { "username": "john" } } } '

    这个例子创建了一个名为 my_field_limited_mapping 的角色映射,将用户 john 映射到 my_field_limited_role 角色。

Mermaid 图示:

9.1.7 角色映射 (Role Mapping)

角色映射将用户映射到特定的角色,简化权限管理。 前面授权部分已经详细描述了角色映射,这里不再赘述。

9.1.8 密钥库 (Keystore)

密钥库安全地存储敏感信息,如密码和证书。

代码实践:

  1. 创建密钥库:

    ./bin/elasticsearch-keystore create
  2. 添加密钥:

    ./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password ./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password ./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password ./bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password
  3. 配置 Elasticsearch:

    elasticsearch.yml 配置文件中引用密钥。

    xpack.security.transport.ssl.keystore.path: config/certs/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: config/certs/elastic-certificates.p12 xpack.security.http.ssl.keystore.path: config/certs/elastic-certificates.p12 xpack.security.http.ssl.truststore.path: config/certs/elastic-certificates.p12

Mermaid 图示:

总结

Elasticsearch 提供了丰富的安全特性,可以有效地保护集群和数据的安全。 通过身份验证、授权、传输层加密、审计日志、IP 过滤、字段和文档级别安全、角色映射和密钥库等特性,可以构建一个安全可靠的 Elasticsearch 集群。 在实际应用中,需要根据具体的安全需求选择合适的安全特性,并进行合理的配置和管理。 希望本文能帮助你更好地理解和应用 Elasticsearch 的安全特性。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U