📅  最后修改于: 2023-12-03 15:07:38.957000             🧑  作者: Mango
本文将介绍如何在 Docker 中启用基本安全性的单节点弹性搜索,以保护 Elasticsearch 的安全性。我们将主要使用 Docker Compose 来部署 Elastic Stack,并使用 X-Pack 来提供基本的安全性功能。同时,本文将提供相关的 Javascript 代码片段,以方便程序员一步步搭建起弹性搜索的基本安全防御机制。
Elastic Stack 是一个组合解决方案,包括 Elasticsearch,Logstash 和 Kibana。Elasticsearch 是一个分布式搜索引擎,Logstash 是一个日志收集、分析和传输工具,Kibana 是一个 Elasticsearch 数据可视化工具。在 Elastic Stack 中,这三个组件共同协作以实现一个完整的搜索和分析系统。
由于 Elasticsearch 存储了大量敏感信息,因此安全性问题在 Elastic Stack 中十分重要。X-Pack 是 Elastic Stack 的一种收费插件,它为 Elasticsearch 提供了许多基本安全保护功能,包括身份验证、授权、安全审计、加密和支持 SSL/TLS 安全通信等功能。
以下是部署 Elastic Stack 的 Docker Compose 文件:
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
container_name: elasticsearch
environment:
- discovery.type=single-node
ports:
- 9200:9200
- 9300:9300
networks:
- elastic
kibana:
image: docker.elastic.co/kibana/kibana:7.12.1
container_name: kibana
environment:
ELASTICSEARCH_URL: http://elasticsearch:9200
ELASTICSEARCH_HOSTS: http://elasticsearch:9200
ports:
- 5601:5601
networks:
- elastic
logstash:
image: docker.elastic.co/logstash/logstash:7.12.1
container_name: logstash
command: logstash -f /usr/share/logstash/pipeline/logstash.conf
volumes:
- ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
- ./logstash/pipeline:/usr/share/logstash/pipeline
environment:
ELASTICSEARCH_HOST: "http://elasticsearch:9200"
networks:
- elastic
networks:
elastic:
该 Docker Compose 文件包含三个服务:Elasticsearch、Kibana 和 Logstash。其中,Elasticsearch 服务监听在 9200 和 9300 端口上,Kibana 服务监听在 5601 端口上,Logstash 服务使用 Logstash 配置文件 /usr/share/logstash/pipeline/logstash.conf 处理数据。
为了启用 X-Pack 安全功能,我们需要将以下内容添加到 Elasticsearch 和 Kibana 服务的 environment 中:
environment:
- xpack.security.enabled=true
然后,我们需要在 Elasticsearch 和 Kibana 中创建初始密码。在这里我们使用如下 Javascript 代码:
const { Client } = require('@elastic/elasticsearch');
const client = new Client({ node: 'http://localhost:9200' });
const { ApiResponse } = require('@elastic/elasticsearch');
const createPassword = async (password) => {
try {
const { body } = await client.security.putUser({
username: 'elastic',
password,
body: {
full_name: 'Elasticsearch Admin',
email: 'admin@example.com',
roles: ['superuser']
}
});
if (body.hasOwnProperty('error')) {
throw new Error(body.error.reason);
}
console.log(`Initial password for 'elastic' user: ${password}`);
} catch (err) {
console.error(`Error creating password: ${err.message}`);
}
}
createPassword('changeme');
此代码将在 Elasticsearch 中创建一个名为 'elastic' 的用户,并为其设置初始密码。在此示例中,初始密码为 'changeme'。请注意,此密码用于作初次登录 Elasticsearch 和 Kibana。
创建完成后,我们需要在 Docker Compose 文件中的 Elasticsearch 服务添加以下内容以运行 Elasticsearch 安全性插件:
command: elasticsearch -Enode.name=es-node -Ecluster.initial_master_nodes=es-node -Ebootstrap.memory_lock=true -E xpack.security.http.ssl.enabled=false -E xpack.security.authc.api_key.enabled=true -E xpack.security.authc.token.enabled=true
在 Elasticsearch 和 Kibana 中使用 SSL/TLS 安全通信非常重要。为此,我们可以使用如下 Javascript 代码:
const { Client } = require('@elastic/elasticsearch');
const { readFile } = require('fs/promises');
const { join } = require('path');
const createCert = async () => {
try {
const [{ privateKey }, { certificate }] = await Promise.all([
readFile(join(__dirname, 'certs', 'elasticsearch.key'), 'utf8'),
readFile(join(__dirname, 'certs', 'elasticsearch.crt'), 'utf8')
]);
const ca = await readFile(join(__dirname, 'certs', 'ca.crt'), 'utf8');
const client = new Client({
node: 'https://localhost:9200',
ssl: {
ca,
key: privateKey,
cert: certificate
}
});
const { body } = await client.info();
console.log(`Elasticsearch version: ${body.version.number}`);
} catch (err) {
console.error(err.message);
}
}
createCert();
该代码将在 Elasticsearch 中配置 SSL/TLS 并测试通信。我们需要将相应的 SSL/TLS 证书文件存放在项目的 certs 目录中。
本文介绍了如何在 Docker 中启用基本安全性的单节点弹性搜索,并提供了相关的 Javascript 代码片段。当然,除了本文提供的基本安全性防御机制以外,我们还可以使用更多的 X-Pack 插件和其他安全性方案以保障 Elasticsearch 的安全性。