第五阶段 49 · 安全:TLS、API Key、RBAC

📅 2026/8/5 0:35:34
第五阶段 49 · 安全:TLS、API Key、RBAC
49 · 安全TLS、API Key、RBAC阶段第五阶段 / 运维进阶ES传输加密、身份认证、最小权限授权 | PostgreSQLSSL、用户与角色、权限控制1. 概念Elasticsearch 生产安全通常是三层TLS传输加密保护传输中数据避免明文被窃听或篡改。Authentication身份认证你是谁Basic、API Key、Token 等。Authorization权限授权 / RBAC你能做什么读哪些索引、写哪些索引、是否能管理集群。核心原则先认证再授权默认拒绝最小权限。2. PostgreSQL 对照ElasticsearchPostgreSQLHTTP/Transport TLSsslon 证书链API Key / Basic / Token用户名密码 连接参数Role PrivilegesRole GRANTDLS/FLS文档/字段级权限行级安全RLS/列权限审计日志log_statement/ 审计扩展3. 关键接口与命令Dev Tools / API3.1 查看安全基础状态GET /_security/_authenticate GET /_security/role GET /_security/user_authenticate可快速确认当前凭据身份与角色。线上排障时先确认“我是谁”再看“我能做什么”。3.2 创建最小权限角色示例PUT /_security/role/salesdata_reader { cluster: [monitor], indices: [ { names: [salesdata-*], privileges: [read, view_index_metadata] } ] }3.3 创建绑定角色的用户示例POST /_security/user/report_user { password: ReplaceWithStrongPassword!, roles: [salesdata_reader], full_name: Report Readonly User }3.4 创建 API Key推荐给服务到服务调用POST /_security/api_key { name: integration-prod-writer, role_descriptors: { writer_scope: { cluster: [monitor], index: [ { names: [salesdata-*], privileges: [create_index, write, create, index] } ] } } }返回会包含idapi_key只返回一次务必安全保存encoded可直接放Authorization: ApiKey encoded3.5 失效 API Key泄露时立即处理DELETE /_security/api_key { ids: [api_key_id] }4. TLS 实战要点4.1 两条链路都要加密节点间通信transport防止集群内部窃听或伪造节点。客户端到 EShttp防止应用调用链路明文泄露。4.2 证书与主机名校验证书SAN必须覆盖实际访问域名或 IP。客户端不要关闭主机名校验禁用校验仅限本地临时排错。证书需有轮换策略避免“到期即故障”。4.3 常见错误定位PKIX path building failed证书链不完整或客户端不信任 CA。hostname verification failed访问地址与证书 SAN 不匹配。received plaintext http traffic on an https channel客户端用了 HTTP 访问 HTTPS 端口。5. Spring BootElasticsearch Java Client调用示例下面示例体现两件事1使用 HTTPS2使用 API Key 认证优先于硬编码用户名密码。importco.elastic.clients.elasticsearch.ElasticsearchClient;importco.elastic.clients.json.jackson.JacksonJsonpMapper;importco.elastic.clients.transport.ElasticsearchTransport;importco.elastic.clients.transport.rest_client.RestClientTransport;importorg.apache.http.Header;importorg.apache.http.HttpHost;importorg.apache.http.message.BasicHeader;importorg.elasticsearch.client.RestClient;publicclassEsClientFactory{publicElasticsearchClientcreate(Stringhost,intport,StringencodedApiKey){Header[]defaultHeadersnewHeader[]{newBasicHeader(Authorization,ApiKey encodedApiKey)};RestClientlowLevelClientRestClient.builder(newHttpHost(host,port,https)).setDefaultHeaders(defaultHeaders).build();ElasticsearchTransporttransportnewRestClientTransport(lowLevelClient,newJacksonJsonpMapper());returnnewElasticsearchClient(transport);}}建议encodedApiKey放到安全配置中心或密钥管理服务不进 Git。按环境拆分 Keydev/test/prod并限制索引范围。6. RBAC 设计建议适合 SalesData 场景按职责拆角色reader、writer、ops不要一个超管角色到处复用。按索引前缀授权例如salesdata-*、salesdata-report-*分开。限制集群级权限普通业务账号通常只要monitor不给manage_security。临时权限要过期排障提权后必须回收。审计关键操作创建/删除 API Key、改角色、改用户要可追踪。7. 坑与最佳实践不要共享 API Key每个服务和环境独立 Key泄露影响可控。不要长久不轮换建立 Key 轮换与失效机制例如 30/90 天。不要把密钥写进日志脱敏Authorization头与配置输出。不要过度授权all权限最危险优先精确到 index privilege。不要忽略证书到期把证书有效期纳入监控告警。先验身份再验权限排障顺序固定_authenticate- role - index privilege。8. 最小化上线检查清单HTTP 与 transport 均开启 TLS客户端只走https业务服务改用 API Key非 superuserAPI Key 权限收敛到必须索引与动作安全凭据不落库、不入日志、不入 Git证书与 API Key 都有轮换与过期告警安全相关操作有审计与回溯能力