# TLS 与鉴权机制

URL: https://caijiao.org/elasticsearch/05.admin/06.security-tls
Source: docs/elasticsearch/05.admin/06.security-tls.md
Description: 本章介绍如何为 Elasticsearch 集群启用 TLS 加密通信，并配置基本认证、API Key、LDAP、SAML 等多种身份验证机制，提升系统安全性。

为了确保 Elasticsearch 集群通信的安全性，启用 **TLS 加密** 和 **身份认证机制** 是生产环境的必备步骤。Elasticsearch 提供灵活的方式来保护集群、用户和数据的安全。

## 1. TLS 加密通信（HTTPS）

启用加密通信可防止中间人攻击与数据泄露。

### a. 为节点间通信启用 TLS（transport 层）

在 `elasticsearch.yml` 添加：

```yaml
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.key: certs/node.key
xpack.security.transport.ssl.certificate: certs/node.crt
xpack.security.transport.ssl.certificate_authorities: [ "certs/ca.crt" ]
````

> 所有节点需信任相同 CA。

### b. 启用 REST API 的 TLS（HTTP 层）

```yaml
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: certs/node.key
xpack.security.http.ssl.certificate: certs/node.crt
xpack.security.http.ssl.certificate_authorities: [ "certs/ca.crt" ]
```

启用后，必须通过 HTTPS 请求 Elasticsearch。

## 2. 生成 TLS 证书

使用 Elastic 官方工具一键生成：

```bash
elasticsearch-certutil ca
elasticsearch-certutil cert --ca elastic-stack-ca.p12
```

或使用 `openssl` 自签证书，或部署企业颁发的证书。

## 3. 鉴权机制类型

Elasticsearch 支持多种身份认证机制，满足不同安全策略：

| 鉴权类型        | 描述                    | 授权级别   |
| ----------- | --------------------- | ------ |
| Basic Auth  | 默认内置用户名/密码认证          | 所有版本支持 |
| API Key     | 创建一次性访问凭证，用于系统间通信     | 所有版本支持 |
| LDAP / AD   | 企业目录集成，支持用户组继承        | 商业功能   |
| SAML / OIDC | 单点登录（SSO）方案，如连接企业登录系统 | 商业功能   |
| PKI 证书认证    | 基于客户端证书身份验证           | 商业功能   |


## 4. API Key 示例（系统对接推荐）

生成 API Key：

```bash
POST /_security/api_key
{
  "name": "my-service-key",
  "role_descriptors": {
    "limited_access": {
      "cluster": ["monitor"],
      "index": [
        {
          "names": ["logs-*"],
          "privileges": ["read"]
        }
      ]
    }
  }
}
```

请求时使用：

```http
Authorization: ApiKey <Base64(api_key_id:api_key)>
```

## 5. 示例：配置 Basic 认证用户访问

1. 创建用户：

```bash
POST /_security/user/devuser
{
  "password": "devpass",
  "roles": ["read_logs"],
  "full_name": "Dev User"
}
```

2. 访问集群：

```bash
curl -u devuser:devpass https://localhost:9200
```

## 6. 安全建议

* 禁止默认 elastic 用户外部访问，或使用强密码
* 所有生产环境必须启用 TLS
* 推荐服务间通信使用 API Key 或 PKI
* 使用 Kibana 的 Stack Management 管理证书和身份认证更便捷

---

通过启用 TLS 与多重身份认证机制，Elasticsearch 可有效防止未经授权访问和数据泄露，构建一个更安全的搜索平台。
