0


浅谈Elasticsearch安全和权限管理

Elasticsearch 安全和权限管理

Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎,它使得用户可以快速地存储、搜索和分析大量数据。在企业级应用中,保证数据的安全性和权限管理是至关重要的。本文将详细讲解 Elasticsearch 的安全和权限管理功能,包括身份验证、授权、加密和审计。

1. 身份验证

Elasticsearch 支持多种身份验证方式,包括基本身份验证、LDAP 身份验证、Active Directory 身份验证和 SAML 身份验证等。

1.1 基本身份验证

基本身份验证是最简单的身份验证方式,用户需要提供用户名和密码来访问 Elasticsearch。在 Elasticsearch 中,可以通过以下步骤配置基本身份验证:

  1. elasticsearch.yml 配置文件中启用基本身份验证:xpack.security.enabled: truexpack.security.transport.ssl.enabled: true
  2. 使用内置的 elastic 用户创建其他用户和角色。例如,创建一个名为 my_admin 的用户,并为其分配 superuser 角色:POST /_security/user/my_admin{ "password" : "mypassword", "roles" : [ "superuser" ], "full_name" : "My Admin"}
  3. 使用创建的用户和密码访问 Elasticsearch:curl -u my_admin:mypassword http://localhost:9200/_cluster/health

1.2 基于令牌的身份验证

基于令牌的身份验证允许用户使用访问令牌(access token)来访问 Elasticsearch。访问令牌是一个短期有效的字符串,可以通过用户名和密码获取。在 Elasticsearch 中,可以通过以下步骤配置基于令牌的身份验证:

  1. 获取访问令牌:POST /_security/oauth2/token{ "grant_type" : "password", "username" : "my_admin", "password" : "mypassword"}返回的响应中包含访问令牌:{ "access_token": "AAEAAWVsYXN0aWNzZWFyY2gtdG9rZW4tZm9yLWV4YW1wbGU", "type": "Bearer", "expires_in": 1200}
  2. 使用访问令牌访问 Elasticsearch:curl -H "Authorization: Bearer AAEAAWVsYXN0aWNzZWFyY2gtdG9rZW4tZm9yLWV4YW1wbGU" http://localhost:9200/_cluster/health

1.3 基于证书的身份验证

基于证书的身份验证允许用户使用客户端证书来访问 Elasticsearch。在 Elasticsearch 中,可以通过以下步骤配置基于证书的身份验证:

  1. elasticsearch.yml 配置文件中启用基于证书的身份验证:xpack.security.http.ssl.enabled: truexpack.security.http.ssl.client_authentication: required
  2. 配置客户端证书和私钥:xpack.security.http.ssl.keystore.path: "http.p12"xpack.security.http.ssl.truststore.path: "http.p12"
  3. 使用客户端证书访问 Elasticsearch:curl --cert client.crt --key client.key https://localhost:9200/_cluster/health

1.4 LDAP 身份验证

LDAP 身份验证是一种常见的身份验证方式,它使用 LDAP 目录来存储用户信息和密码。在 Elasticsearch 中,可以通过配置

  1. elasticsearch.yml

文件来启用 LDAP 身份验证,例如:

  1. xpack.security.authc:
  2. realms:
  3. ldap:
  4. type: ldap
  5. order: 1
  6. url: "ldap://ldap.example.com:389"
  7. bind_dn: "cn=admin,dc=example,dc=com"
  8. bind_password: "password"
  9. user_search:
  10. base_dn: "ou=people,dc=example,dc=com"
  11. filter: "(uid={0})"

这里的

  1. ldap

表示使用 LDAP 进行身份验证,

  1. url

表示 LDAP 服务器的地址和端口号,

  1. bind_dn

  1. bind_password

表示 LDAP 管理员的用户名和密码,

  1. user_search

表示用户信息的搜索条件。

1.5 Active Directory 身份验证

Active Directory 身份验证是一种常见的身份验证方式,它使用 Active Directory 目录来存储用户信息和密码。在 Elasticsearch 中,可以通过配置

  1. elasticsearch.yml

文件来启用 Active Directory 身份验证,例如:

  1. xpack.security.authc:
  2. realms:
  3. ad:
  4. type: active_directory
  5. order: 2
  6. url: "ldap://ad.example.com:389"
  7. bind_dn: "cn=admin,dc=example,dc=com"
  8. bind_password: "password"
  9. user_search:
  10. base_dn: "ou=people,dc=example,dc=com"
  11. filter: "(sAMAccountName={0})"

这里的

  1. ad

表示使用 Active Directory 进行身份验证,其他配置项与 LDAP 身份验证类似。

1.6 SAML 身份验证

SAML 身份验证是一种基于标准的身份验证方式,它使用 SAML 协议来实现身份验证。在 Elasticsearch 中,可以通过配置

  1. elasticsearch.yml

文件来启用 SAML 身份验证,例如:

  1. xpack.security.authc:
  2. realms:
  3. saml:
  4. type: saml
  5. order: 3
  6. idp:
  7. metadata_path: "/path/to/idp-metadata.xml"
  8. sp:
  9. entity_id: "https://elasticsearch.example.com"
  10. acs: "https://elasticsearch.example.com/api/security/v1/saml"

这里的

  1. saml

表示使用 SAML 进行身份验证,

  1. idp

表示身份提供者的元数据路径,

  1. sp

表示服务提供者的实体 ID 和断言消费服务的 URL。

1.7 结合 LDAP 或 Active Directory 进行身份验证

Elasticsearch 还支持与 LDAP(轻量级目录访问协议)或 Active Directory(AD)集成,以便在企业环境中进行集中式身份验证。要配置 LDAP 或 AD 集成,请按照以下步骤操作:

  1. elasticsearch.yml 配置文件中启用 LDAP 或 AD 集成:xpack.security.authc.realms: ldap1: type: ldap order: 0 url: "ldaps://ldap.example.com:636" bind_dn: "cn=admin,dc=example,dc=com" bind_password: "password" user_search: base_dn: "ou=users,dc=example,dc=com" filter: "(uid={0})" group_search: base_dn: "ou=groups,dc=example,dc=com" files: role_mapping: "role_mapping.yml" unmapped_groups_as_roles: false对于 Active Directory,配置如下:xpack.security.authc.realms: active_directory: type: active_directory order: 0 domain_name: "example.com" url: "ldaps://ad.example.com:636" bind_dn: "cn=admin,dc=example,dc=com" bind_password: "password" files: role_mapping: "role_mapping.yml" unmapped_groups_as_roles: false
  2. role_mapping.yml 文件中配置用户和角色的映射关系。例如,将 LDAP 中的 cn=admins,ou=groups,dc=example,dc=com 组映射到 Elasticsearch 的 superuser 角色:superuser: - "cn=admins,ou=groups,dc=example,dc=com"
  3. 重启 Elasticsearch 以应用更改。

现在,Elasticsearch 将使用 LDAP 或 Active Directory 进行身份验证。用户可以使用其 LDAP 或 AD 凭据访问 Elasticsearch。

总之,Elasticsearch 提供了多种身份验证方式,包括基于用户名和密码的基本身份验证、基于令牌的身份验证、基于证书的身份验证以及与 LDAP 或 Active Directory 的集成。通过正确配置这些功能,可以确保 Elasticsearch 系统的安全性和满足企业级应用的需求。

2. 授权

授权是确定用户可以访问哪些资源和执行哪些操作的过程。在 Elasticsearch 中,可以通过角色和权限来实现授权。

2.1 角色和权限

在 Elasticsearch 中,角色是一组权限的集合,权限是一组允许或拒绝执行特定操作的规则。角色可以分配给用户,以便控制用户可以访问的资源和执行的操作。

Elasticsearch 提供了一些预定义的角色,例如:

  • superuser:具有所有权限的用户,可以执行任何操作。
  • kibana_admin:具有管理 Kibana 的权限,可以创建和管理仪表板、可视化等。
  • monitoring_user:具有访问监控数据的权限,可以查看 Elasticsearch 集群的性能和状态。

2.2 创建自定义角色

除了预定义的角色外,还可以创建自定义角色。例如,创建一个名为

  1. read_only

的角色,只允许用户读取索引中的数据:

  1. PUT /_security/role/read_only
  2. {
  3. "indices": [
  4. {
  5. "names": [ "*" ],
  6. "privileges": [ "read" ]
  7. }
  8. ]
  9. }

创建一个名为

  1. index_manager

的角色,允许用户创建和删除索引,但不能对数据进行读写操作:

  1. PUT /_security/role/index_manager
  2. {
  3. "indices": [
  4. {
  5. "names": [ "*" ],
  6. "privileges": [ "create_index", "delete_index" ]
  7. }
  8. ]
  9. }

2.3 分配角色给用户

创建角色后,可以将其分配给用户。例如,将

  1. read_only

角色分配给名为

  1. my_user

的用户:

  1. POST /_security/user/my_user
  2. {
  3. "password" : "mypassword",
  4. "roles" : [ "read_only" ],
  5. "full_name" : "My User"
  6. }

现在,

  1. my_user

只能读取索引中的数据,无法执行其他操作,如创建或删除索引。

2.4 使用角色模板

角色模板是一种动态生成角色的方法,可以根据用户的属性来生成角色。例如,创建一个名为

  1. user_specific_index

的角色模板,允许用户访问其用户名作为前缀的索引:

  1. PUT /_security/role/user_specific_index
  2. {
  3. "indices": [
  4. {
  5. "names": [ "{user.name}_*" ],
  6. "privileges": [ "read", "write" ]
  7. }
  8. ]
  9. }

现在,名为

  1. john

的用户可以访问

  1. john_*

索引,而名为

  1. jane

的用户可以访问

  1. jane_*

索引。

2.5 使用 API 键进行授权

API 键是一种用于授权的机制,允许用户使用 API 键来访问 Elasticsearch,而无需提供用户名和密码。API 键可以具有与用户相同或更少的权限。要创建 API 键,请执行以下操作:

  1. POST /_security/api_key
  2. {
  3. "name": "my_api_key",
  4. "role_descriptors": {
  5. "read_only": {
  6. "indices": [
  7. {
  8. "names": [ "*" ],
  9. "privileges": [ "read" ]
  10. }
  11. ]
  12. }
  13. }
  14. }

返回的响应中包含 API 键:

  1. {
  2. "id" : "VuaCfGcBCdbkQmijuKPS",
  3. "name" : "my_api_key",
  4. "api_key" : "ui2lp2axTNmsyakw9tvNnw"
  5. }

使用 API 键访问 Elasticsearch:

  1. curl -H "Authorization: ApiKey VuaCfGcBCdbkQmijuKPS:ui2lp2axTNmsyakw9tvNnw" http://localhost:9200/_cluster/health

现在,用户可以使用 API 键来访问 Elasticsearch,而无需提供用户名和密码。请注意,API 键具有与创建它的用户相同或更少的权限。

2.6 集成第三方身份提供商进行授权

Elasticsearch 还支持与第三方身份提供商(如 SAML、OpenID Connect 等)集成,以便在企业环境中进行集中式授权。要配置第三方身份提供商集成,请按照以下步骤操作:

  1. elasticsearch.yml 配置文件中启用第三方身份提供商集成。以 SAML 为例:xpack.security.authc.token.enabled: truexpack.security.authc.realms.saml1: type: saml order: 2 idp.metadata.path: "https://idp.example.com/metadata" idp.entity_id: "https://idp.example.com/metadata" sp.entity_id: "https://sp.example.com/metadata" sp.acs: "https://sp.example.com/acs" sp.logout: "https://sp.example.com/logout" attributes.principal: "nameid:persistent" attributes.groups: "groups"
  2. 在 Kibana 中配置 SAML 集成:xpack.security.authc.providers: saml.saml1: order: 0 realm: "saml1"
  3. 重启 Elasticsearch 和 Kibana 以应用更改。

现在,Elasticsearch 将使用第三方身份提供商进行授权。用户可以使用其 SAML 凭据访问 Elasticsearch。

2.7 访问控制

基于角色的访问控制(RBAC)是一种授权策略,通过将权限分配给角色,然后将角色分配给用户来实现。在 Elasticsearch 中,可以使用 RBAC 来控制用户对索引、文档和字段的访问权限。

2.7.1 索引级别的访问控制

在 Elasticsearch 中,可以为角色分配特定索引的访问权限。例如,创建一个名为

  1. logs_read

的角色,只允许用户读取名为

  1. logs-*

的索引:

  1. PUT/_security/role/logs_read
  2. {"indices":[{"names":["logs-*"],"privileges":["read"]}]}

  1. logs_read

角色分配给名为

  1. log_viewer

的用户:

  1. POST/_security/user/log_viewer
  2. {"password":"mypassword","roles":["logs_read"],"full_name":"Log Viewer"}

现在,

  1. log_viewer

用户只能读取

  1. logs-*

索引,无法访问其他索引。

配置

  1. elasticsearch.yml

文件方式:

  1. xpack.security.authz:
  2. roles:
  3. admin:
  4. cluster:
  5. - all
  6. indices:
  7. - names: '*'
  8. privileges:
  9. - all
  10. user:
  11. cluster:
  12. - monitor
  13. indices:
  14. - names: 'logs-*'
  15. privileges:
  16. - read

这里的

  1. admin

  1. user

表示角色名称,

  1. cluster

表示集群级别的权限,

  1. indices

表示索引级别的权限。在定义完角色和权限后,可以将用户分配到不同的角色,例如:

  1. POST /_security/user/john/_roles
  2. {
  3. "roles": ["admin"]
  4. }

这里的

  1. john

表示用户名,

  1. admin

表示要分配的角色名称。

2.7.2 字段级别的访问控制 (Field-Level Security, FLS)

字段级别的访问控制(FLS)允许您限制用户访问文档中特定字段的权限。例如,创建一个名为

  1. logs_read_sensitive

的角色,只允许用户读取

  1. logs-*

索引中的

  1. timestamp

  1. message

字段:

  1. PUT/_security/role/logs_read_sensitive
  2. {"indices":[{"names":["logs-*"],"privileges":["read"],"field_security":{"grant":["timestamp","message"]}}]}

  1. logs_read_sensitive

角色分配给名为

  1. sensitive_log_viewer

的用户:

  1. POST/_security/user/sensitive_log_viewer
  2. {"password":"mypassword","roles":["logs_read_sensitive"],"full_name":"Sensitive Log Viewer"}

现在,

  1. sensitive_log_viewer

用户只能访问

  1. logs-*

索引中的

  1. timestamp

  1. message

字段,无法访问其他字段。

配置

  1. elasticsearch.yml

文件方式:

  1. xpack.security.field_level_security:
  2. enabled: true
  3. grant:
  4. - field: "user"
  5. value: "john"
  6. except: ["password"]

这里的

  1. enabled

表示是否启用字段级别的访问控制,

  1. grant

表示允许访问的字段和值。在定义完字段级别的访问控制后,可以将其应用到索引中,例如:

  1. PUT /logs
  2. {
  3. "mappings": {
  4. "properties": {
  5. "user": {
  6. "type": "text",
  7. "fielddata": true,
  8. "fields": {
  9. "keyword": {
  10. "type": "keyword"
  11. }
  12. }
  13. },
  14. "password": {
  15. "type": "text",
  16. "fielddata": true,
  17. "fields": {
  18. "keyword": {
  19. "type": "keyword"
  20. }
  21. }
  22. }
  23. }
  24. },
  25. "settings": {
  26. "index": {
  27. "query": {
  28. "default_field": "user"
  29. },
  30. "security": {
  31. "field_level_security": {
  32. "grant": [
  33. {
  34. "field": "user",
  35. "value": "john",
  36. "except": ["password"]
  37. }
  38. ]
  39. }
  40. }
  41. }
  42. }
  43. }

这里的

  1. logs

表示索引名称,

  1. user

  1. password

表示字段名称。在定义完索引后,可以使用查询 DSL 来访问索引中的数据,例如:

  1. GET /logs/_search
  2. {
  3. "query": {
  4. "match": {
  5. "user": "john"
  6. }
  7. }
  8. }
2.7.3 文档级别的访问控制 (Document-Level Security, DLS)

文档级别的访问控制(DLS)允许您限制用户访问特定文档的权限。例如,创建一个名为

  1. logs_read_team1

的角色,只允许用户读取

  1. logs-*

索引中

  1. team

字段值为

  1. team1

的文档:

  1. PUT/_security/role/logs_read_team1
  2. {"indices":[{"names":["logs-*"],"privileges":["read"],"query":{"term":{"team":"team1"}}}]}

  1. logs_read_team1

角色分配给名为

  1. team1_log_viewer

的用户:

  1. POST/_security/user/team1_log_viewer
  2. {"password":"mypassword","roles":["logs_read_team1"],"full_name":"Team1 Log Viewer"}

现在,

  1. team1_log_viewer

用户只能访问

  1. logs-*

索引中

  1. team

字段值为

  1. team1

的文档,无法访问其他文档。

2.7.4 IP 白名单

您可以通过配置 Elasticsearch 的网络层来限制哪些 IP 地址可以访问 Elasticsearch。这可以通过在

  1. elasticsearch.yml

配置文件中设置

  1. http.host

  1. http.publish_host

参数来实现。

例如,只允许来自 IP 地址

  1. 192.168.1.100

的请求访问 Elasticsearch:

  1. http.host: 192.168.1.100
  2. http.publish_host: 192.168.1.100

请注意,这种方法只限制了哪些 IP 地址可以访问 Elasticsearch,而不限制用户可以执行的操作。因此,建议将 IP 白名单与其他访问控制方法(如基于角色的访问控制)结合使用。

2.7.5 匿名访问

Elasticsearch 支持配置匿名访问,允许未经身份验证的用户访问 Elasticsearch。匿名用户将被分配一个或多个预定义的角色,以限制其访问权限。

要启用匿名访问,请在

  1. elasticsearch.yml

配置文件中添加以下配置:

  1. xpack.security.authc:anonymous:username: _anonymous
  2. roles: read_only
  3. authz_exception:true

在此示例中,匿名用户将被分配

  1. read_only

角色,只能读取索引中的数据。请注意,启用匿名访问可能会导致安全风险,因此请谨慎使用。

2.7.6 跨集群复制 (Cross-Cluster Replication, CCR)

跨集群复制(CCR)是一种在多个 Elasticsearch 集群之间同步数据的方法。通过 CCR,您可以将数据从一个集群(称为领导者集群)复制到另一个集群(称为追随者集群)。这可以用于实现地理冗余、负载均衡和数据访问控制。

在 CCR 中,您可以为追随者集群中的用户分配不同的角色和权限,以限制其对领导者集群中的数据的访问。例如,您可以允许追随者集群中的用户只读取特定索引,而不允许他们修改数据或访问其他索引。

要配置 CCR,请按照以下步骤操作:

  1. 在领导者集群和追随者集群中启用 CCR:xpack.security.enabled:truexpack.ccr.enabled:true
  2. 在追随者集群中创建一个远程集群连接,指向领导者集群:cluster.remote.leader_cluster:seeds:["leader_cluster_ip:9300"]
  3. 在追随者集群中创建一个跟随索引,以复制领导者集群中的数据:PUT/follower_index/_ccr/follow{"remote_cluster":"leader_cluster","leader_index":"leader_index"}
  4. 为追随者集群中的用户分配角色和权限,以限制其对领导者集群中的数据的访问。

总之,Elasticsearch 提供了多种访问控制功能,包括基于角色的访问控制、字段级别的访问控制和文档级别的访问控制。通过正确配置这些功能,可以确保 Elasticsearch 系统的安全性和满足企业级应用的需求。

3. 加密

为了保护数据的安全和隐私,Elasticsearch 提供了多种加密功能,包括传输层安全(TLS)和数据加密。

3.1 传输层安全(TLS)

传输层安全(TLS)是一种加密协议,用于在网络上保护数据的传输。在 Elasticsearch 中,可以通过以下步骤启用 TLS:

  1. 生成证书和私钥,可以使用 Elasticsearch 的 elasticsearch-certutil 工具生成自签名证书。
  2. elasticsearch.yml 配置文件中启用 TLS:xpack.security.transport.ssl.enabled: truexpack.security.transport.ssl.verification_mode: certificatexpack.security.transport.ssl.keystore.path: "elastic-certificates.p12"xpack.security.transport.ssl.truststore.path: "elastic-certificates.p12"
  3. 重启 Elasticsearch 以应用更改。

3.2 数据加密

3.2.1 磁盘加密

Elasticsearch 本身不提供数据加密功能。但是,你可以使用文件系统级别的加密来保护 Elasticsearch 存储的数据。以下是一些建议:

  1. 使用文件系统级别的加密,如 dm-crypt(Linux)、BitLocker(Windows)或 FileVault(macOS)。这些工具可以对 Elasticsearch 数据存储的文件进行加密,从而保护数据的安全。
  2. 使用硬件加密,如自加密硬盘(Self-Encrypting Drives,SEDs)。这些硬盘具有内置的加密功能,可以在硬件级别对数据进行加密,提供更高的安全性和性能。
3.2.2 快照加密

Elasticsearch 支持创建快照以备份数据。为了保护快照中的数据,可以使用以下方法对快照进行加密:

  1. 使用加密的存储服务,如 Amazon S3 或 Google Cloud Storage。这些服务提供了服务器端加密(Server-Side Encryption,SSE)功能,可以自动对存储的数据进行加密。
  2. 使用客户端加密库,如 Amazon S3 Encryption Client 或 Google Cloud Storage Client Libraries。这些库提供了客户端加密(Client-Side Encryption,CSE)功能,可以在上传数据到存储服务之前对数据进行加密。
3.2.3 数据脱敏

数据脱敏是一种数据保护技术,通过对敏感数据进行处理,使其无法识别特定个人,同时保留数据的可用性。在 Elasticsearch 中,可以使用以下方法对数据进行脱敏:

  1. 使用 Ingest Node 处理数据。Ingest Node 是 Elasticsearch 的一个功能,可以在数据索引之前对数据进行预处理。你可以使用 Ingest Pipelines 和 Processors 对敏感数据进行脱敏处理,如删除、替换或哈希。
  2. 使用 Logstash 处理数据。Logstash 是一个数据处理管道,可以从多种来源获取数据,对数据进行处理,然后将数据发送到 Elasticsearch。你可以使用 Logstash 的 Filters 对敏感数据进行脱敏处理,如删除、替换或哈希。

4. 审计

审计是记录和分析用户活动的过程,以确保系统的安全和合规性。Elasticsearch 提供了审计日志功能,可以记录用户执行的操作和产生的事件。

要启用审计日志,需要在

  1. elasticsearch.yml

配置文件中添加以下配置:

  1. xpack.security.audit.enabled: true

启用审计日志后,Elasticsearch 将记录用户执行的操作和产生的事件,并将其存储在日志文件中。可以通过 Kibana 或其他日志分析工具查看和分析审计日志。

总之,Elasticsearch 提供了一系列安全和权限管理功能,包括身份验证、授权、加密和审计。通过正确配置这些功能,可以确保 Elasticsearch 系统的安全和合规性。


本文转载自: https://blog.csdn.net/weixin_59801183/article/details/134449715
版权归原作者 ~奔跑的简默~ 所有, 如有侵权,请联系我们删除。

“浅谈Elasticsearch安全和权限管理”的评论:

还没有评论