面试题答案
一键面试配置审查
- 基础配置审查
- 节点角色配置:检查
node.master
、node.data
、node.ingest
等参数配置是否合理。确保仅有预期可成为主节点的节点设置node.master: true
,避免过多节点参与选主,减轻选主压力。例如,在生产环境的配置文件elasticsearch.yml
中:
- 节点角色配置:检查
node.name: master - 1
node.master: true
node.data: false
node.ingest: false
- **集群名称配置**:确认 `cluster.name` 在所有节点上是否一致。不一致的集群名称会导致节点无法正确加入预期集群,影响选主过程。
cluster.name: my - elastic - cluster
- 选主相关配置审查
- 选举发现配置:对于不同版本,审查
discovery.seed_hosts
(7.x 及以上)或discovery.zen.ping.unicast.hosts
(6.x 及以下)配置。确保配置的种子节点地址准确且可达,防止选主过程因无法发现节点而失败。例如在 7.x 版本:
- 选举发现配置:对于不同版本,审查
discovery.seed_hosts: ["master - 1:9300", "master - 2:9300", "master - 3:9300"]
- **选举策略配置**:检查 `discovery.zen.minimum_master_nodes`(6.x 及以下)或 `cluster.initial_master_nodes`(7.x 及以上)参数。在 7.x 及以上版本,`cluster.initial_master_nodes` 应准确配置初始参与选主的节点名称,如:
cluster.initial_master_nodes: ["master - 1", "master - 2", "master - 3"]
在 6.x 及以下版本,discovery.zen.minimum_master_nodes
应设置为 (候选主节点数 / 2) + 1,以避免脑裂问题。
风险分析
- 恶意节点加入风险
- 风险描述:恶意节点可能伪装成正常节点加入选主过程,干扰选主决策,甚至控制集群。例如,恶意节点可能在选主时发送虚假信息,导致选出非预期的主节点。
- 风险影响:可能导致集群不稳定,数据丢失或泄露,服务中断等严重后果。
- 选主通信安全风险
- 风险描述:选主过程中的通信如果未加密,可能被中间人窃听或篡改。攻击者可以获取敏感信息,如节点状态、选举投票等,进而干扰选主。
- 风险影响:破坏选主公正性,影响集群正常运行。
安全加固措施
- 应对恶意节点加入
- 节点身份认证:
- 使用 X - Pack 安全插件:从 Elasticsearch 5.5.0 版本开始,X - Pack 集成在 Elasticsearch 中。开启 X - Pack 安全功能,配置用户名和密码进行节点间身份验证。在
elasticsearch.yml
中配置:
- 使用 X - Pack 安全插件:从 Elasticsearch 5.5.0 版本开始,X - Pack 集成在 Elasticsearch 中。开启 X - Pack 安全功能,配置用户名和密码进行节点间身份验证。在
- 节点身份认证:
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elasticsearch.keystore
xpack.security.transport.ssl.truststore.path: elasticsearch.keystore
然后通过 bin/elasticsearch - keystore
工具管理密钥库,添加用户名和密码。
- 自定义认证:对于不使用 X - Pack 的情况,可以开发自定义插件实现节点身份认证。在节点启动时,通过预共享密钥或证书等方式进行身份验证。
- 节点准入控制:
- 基于 IP 白名单:在服务器端配置防火墙,只允许授权的 IP 地址访问 Elasticsearch 节点的选主端口(默认为 9300)。例如在 Linux 系统使用 iptables
命令:
iptables - A INPUT - p tcp --dport 9300 - s 192.168.1.0/24 - j ACCEPT
iptables - A INPUT - p tcp --dport 9300 - j DROP
- **基于证书的准入**:使用 SSL/TLS 证书对节点进行身份验证,只有持有合法证书的节点才能加入集群。在配置文件中配置证书相关参数,如:
transport.ssl.enabled: true
transport.ssl.verification_mode: full
transport.ssl.keystore.path: /path/to/keystore
transport.ssl.truststore.path: /path/to/truststore
- 选主通信加密
- 使用 SSL/TLS 加密:从 Elasticsearch 5.0 版本开始支持传输层 SSL/TLS 加密。在
elasticsearch.yml
中配置:
- 使用 SSL/TLS 加密:从 Elasticsearch 5.0 版本开始支持传输层 SSL/TLS 加密。在
transport.ssl.enabled: true
transport.ssl.verification_mode: full
transport.ssl.keystore.path: /path/to/keystore
transport.ssl.truststore.path: /path/to/truststore
生成密钥库和信任库,并将其路径配置到上述参数中。不同版本配置基本一致,但注意密钥库格式在不同版本可能有细微差别,例如早期版本可能使用 JKS 格式,后期更推荐 PKCS12 格式。
兼容性考虑
- 低版本兼容性
- 6.x 及以下版本:在配置
discovery.zen.minimum_master_nodes
时,严格按照公式 (候选主节点数 / 2) + 1 计算并设置。在通信加密方面,虽然配置参数和高版本类似,但可能在证书格式、默认加密算法等方面存在差异。例如,6.x 及以下版本默认可能更倾向于使用 JKS 格式的密钥库。
- 6.x 及以下版本:在配置
- 高版本兼容性
- 7.x 及以上版本:使用
cluster.initial_master_nodes
配置初始选主节点,注意参数名称变化。在身份认证和通信加密方面,配置与低版本有延续性,但对新的安全特性支持更好,如对更高级的 SSL/TLS 协议版本的支持。在升级过程中,确保密钥库和配置参数的平滑过渡,如将低版本的 JKS 密钥库转换为高版本推荐的 PKCS12 格式。
- 7.x 及以上版本:使用