面试题答案
一键面试1. 网络隔离配置
- 子网规划:确定不同子网,每个子网分配特定用途,如一个子网用于数据节点,一个用于主节点等。
- Elasticsearch 配置:
- 在
elasticsearch.yml
配置文件中,设置network.host
参数。例如,如果数据节点在子网192.168.1.0/24
,主节点在子网192.168.2.0/24
,对于数据节点,设置network.host: 192.168.1.10
(假设数据节点IP为192.168.1.10),主节点设置network.host: 192.168.2.10
(假设主节点IP为192.168.2.10)。 - 设置
cluster.initial_master_nodes
参数,列出主节点的IP地址,例如cluster.initial_master_nodes: ["192.168.2.10"]
。这确保节点可以相互发现并组成集群,即使在不同子网。 - 配置防火墙规则,允许不同子网间节点的Elasticsearch通信端口(默认9200用于HTTP,9300用于节点间通信)相互访问。例如,在数据节点子网的防火墙配置允许192.168.2.0/24子网访问9200和9300端口,在主节点子网防火墙配置允许192.168.1.0/24子网访问相应端口。
- 在
2. 基于角色的访问控制(RBAC)配置
- 安装X - Pack:X - Pack是Elasticsearch的安全、监控、警报和报告功能的集成包,包含RBAC功能。在Elasticsearch的安装目录下运行
bin/elasticsearch-plugin install x - pack - security
安装X - Pack插件,安装完成后重启Elasticsearch服务。 - 启用安全认证:
- 在
elasticsearch.yml
文件中,设置xpack.security.enabled: true
启用安全功能。 - 生成证书和密钥,运行
bin/elasticsearch-certutil ca
生成CA证书,然后运行bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
为每个节点生成证书,将生成的证书文件复制到各节点的config/certs
目录下,并设置合适的权限(例如chown elasticsearch:elasticsearch config/certs/*
)。 - 重启Elasticsearch服务。
- 在
- 配置角色和权限:
- 使用Kibana的Dev Tools或者
curl
命令与Elasticsearch交互。首先创建角色,例如创建一个名为readonly
的角色,只能读取数据:
- 使用Kibana的Dev Tools或者
PUT _security/role/readonly
{
"cluster": ["monitor"],
"indices": [
{
"names": ["*"],
"privileges": ["read"]
}
]
}
- 创建一个名为
admin
的角色,拥有所有集群管理和数据操作权限:
PUT _security/role/admin
{
"cluster": ["all"],
"indices": [
{
"names": ["*"],
"privileges": ["all"]
}
]
}
- 创建用户并分配角色:
- 创建一个只读用户
readonly_user
,并分配readonly
角色:
- 创建一个只读用户
PUT _security/user/readonly_user
{
"password": "readonly_password",
"roles": ["readonly"]
}
- 创建一个管理员用户
admin_user
,并分配admin
角色:
PUT _security/user/admin_user
{
"password": "admin_password",
"roles": ["admin"]
}
- 验证访问控制:
- 使用
curl
命令测试。例如,使用只读用户readonly_user
尝试写入数据:
- 使用
curl -u readonly_user:readonly_password -XPUT "http://your - elasticsearch - host:9200/your - index/_doc/1" -H 'Content - Type: application/json' -d '{"field": "value"}'
预期会收到权限不足的错误。
- 使用管理员用户
admin_user
进行相同操作,应能成功写入数据:
curl -u admin_user:admin_password -XPUT "http://your - elasticsearch - host:9200/your - index/_doc/1" -H 'Content - Type: application/json' -d '{"field": "value"}'