📜  在 docker 中启用基本安全性的单节点弹性搜索 - Javascript (1)

📅  最后修改于: 2023-12-03 15:07:38.957000             🧑  作者: Mango

在 Docker 中启用基本安全性的单节点弹性搜索 - Javascript

简介

本文将介绍如何在 Docker 中启用基本安全性的单节点弹性搜索,以保护 Elasticsearch 的安全性。我们将主要使用 Docker Compose 来部署 Elastic Stack,并使用 X-Pack 来提供基本的安全性功能。同时,本文将提供相关的 Javascript 代码片段,以方便程序员一步步搭建起弹性搜索的基本安全防御机制。

Elastic Stack 介绍

Elastic Stack 是一个组合解决方案,包括 Elasticsearch,Logstash 和 Kibana。Elasticsearch 是一个分布式搜索引擎,Logstash 是一个日志收集、分析和传输工具,Kibana 是一个 Elasticsearch 数据可视化工具。在 Elastic Stack 中,这三个组件共同协作以实现一个完整的搜索和分析系统。

Elastic Stack 安全性介绍

由于 Elasticsearch 存储了大量敏感信息,因此安全性问题在 Elastic Stack 中十分重要。X-Pack 是 Elastic Stack 的一种收费插件,它为 Elasticsearch 提供了许多基本安全保护功能,包括身份验证、授权、安全审计、加密和支持 SSL/TLS 安全通信等功能。

Docker Compose 部署 Elastic Stack

以下是部署 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 安全功能

为了启用 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
启用 SSL/TLS 安全通信

在 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 的安全性。