9.1 安全特性介绍 (Security Features) Elasticsearch 安全特性介绍 (Security Features) 9.1 安全特性概览 Elasticsearch 的安全特性主要围绕以下几个方面展开: 身份验证 (Authentication): 验证用户的身份,确认其是否允许访问集群。 授权 (Authorization): 确定经过身份验证的用户可以执行哪些操作以及访问哪些资源。 传输层加密 (Transport Layer Security, TLS): 加密节点之间的通信,防止数据在传输过程中被窃听或篡改。 审计日志 (Audit Logging): 记录集群中的安全相关事件,以便进行安全分析和合规性审计。
Elasticsearch 的安全特性主要围绕以下几个方面展开:
身份验证 (Authentication): 验证用户的身份,确认其是否允许访问集群。
授权 (Authorization): 确定经过身份验证的用户可以执行哪些操作以及访问哪些资源。
传输层加密 (Transport Layer Security, TLS): 加密节点之间的通信,防止数据在传输过程中被窃听或篡改。
审计日志 (Audit Logging): 记录集群中的安全相关事件,以便进行安全分析和合规性审计。
IP 过滤 (IP Filtering): 限制允许连接到集群的 IP 地址,防止未经授权的访问。
字段和文档级别安全 (Field and Document Level Security): 控制用户可以访问的字段和文档,实现更细粒度的权限控制。
角色映射 (Role Mapping): 将用户映射到特定的角色,简化权限管理。
密钥库 (Keystore): 安全地存储敏感信息,如密码和证书。
下面我们将逐一介绍这些安全特性,并提供相应的代码实践。
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):
创建用户:
使用 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 角色。
配置 Elasticsearch:
在 elasticsearch.yml 配置文件中启用安全特性。
xpack.security.enabled: true
重启 Elasticsearch:
重启 Elasticsearch 服务使配置生效。
使用用户名和密码访问 Elasticsearch:
在 curl 命令中指定用户名和密码:
curl -u elastic:your_password -XGET "http://localhost:9200/_cat/indices?v"
Mermaid 图示:
授权决定了经过身份验证的用户可以执行哪些操作。Elasticsearch 使用角色 (Roles) 来定义权限。角色是一组权限的集合。
代码实践:
创建角色:
可以使用 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 权限。
将用户映射到角色:
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 图示:
TLS 加密节点之间的通信,防止数据在传输过程中被窃听或篡改。
代码实践:
生成证书:
可以使用 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
配置 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
重启 Elasticsearch:
重启 Elasticsearch 服务使配置生效。
使用 HTTPS 访问 Elasticsearch:
curl -u elastic:your_password -XGET "https://localhost:9200/_cat/indices?v" --cacert config/certs/ca/ca.crt
Mermaid 图示:
审计日志记录集群中的安全相关事件,以便进行安全分析和合规性审计。
代码实践:
配置 Elasticsearch:
在 elasticsearch.yml 配置文件中启用审计日志。
xpack.security.audit.enabled: true xpack.security.audit.outputs: [logfile]
查看审计日志:
审计日志默认存储在 Elasticsearch 的日志目录中。
Mermaid 图示:
IP 过滤限制允许连接到集群的 IP 地址,防止未经授权的访问。
代码实践:
配置 Elasticsearch:
在 elasticsearch.yml 配置文件中配置 IP 过滤。
network.host: 0.0.0.0 discovery.seed_hosts: ["127.0.0.1", "[::1]"] cluster.initial_master_nodes: ["node-1"]
使用防火墙:
可以使用防火墙(如 iptables 或 firewalld)限制允许访问 Elasticsearch 端口的 IP 地址。
Mermaid 图示:
字段和文档级别安全控制用户可以访问的字段和文档,实现更细粒度的权限控制。
代码实践 (Document Level Security):
创建包含文档级别安全信息的索引:
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" } } } } '
创建包含文档级别安全信息的文档:
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" } '
创建角色:
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 字段与当前用户相同的文档。
将用户映射到角色:
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):
创建角色:
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 字段。
将用户映射到角色:
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 图示:
角色映射将用户映射到特定的角色,简化权限管理。 前面授权部分已经详细描述了角色映射,这里不再赘述。
密钥库安全地存储敏感信息,如密码和证书。
代码实践:
创建密钥库:
./bin/elasticsearch-keystore create
添加密钥:
./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
配置 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 的安全特性。