Elastic:爲Elastic Docker部署設置安全

在之前的教程“Elastic:用Docker部署Elastic棧”裏,我有詳細講述如何使用docker來部署我們的Elastic Stack。細心的讀者可能已經看出來了它裏面沒有配置安全。那麼針對Docker的部署,我們如何爲我們的Elastic Stach設置安全呢?

在今天的教程中,我們分幾步走。我將詳細地來描述如何爲docker創建安全的配置。

 

創建docker-compose.yml

在之前的教程中,那裏使用的docker-compose.yml文件沒有配置安全。我們需要重新修改:

docker-compose.yml

version: '3.0'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:${ELASTIC_STACK_VERSION}
    container_name: es01
    environment:
      - node.name=es01
      - discovery.seed_hosts=es02
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=true
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.keystore.type=PKCS12
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.keystore.path=elastic-stack-ca.p12
      - xpack.security.transport.ssl.truststore.path=elastic-stack-ca.p12
      - xpack.security.transport.ssl.truststore.type=PKCS12      
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./elastic-stack-ca.p12:/usr/share/elasticsearch/config/elastic-stack-ca.p12
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:${ELASTIC_STACK_VERSION}
    container_name: es02
    environment:
      - node.name=es02
      - xpack.security.enabled=true
      - discovery.seed_hosts=es01
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata02:/usr/share/elasticsearch/data
    networks:
      - esnet
 
  kibana:
    image: docker.elastic.co/kibana/kibana:${ELASTIC_STACK_VERSION}
    container_name: kibana
    ports: ['5601:5601']    
    networks: ['esnet']
    environment:
      - SERVER_NAME=kibana.localhost
      - ELASTICSEARCH_HOSTS=http://es01:9200
      - I18N_LOCALE=zh-CN
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD="123456"
    depends_on: ['es01']
 
volumes:
  esdata01:
    driver: local
  esdata02:
    driver: local
 
networks:
  esnet:

爲了能使得我們的docker-compose.yml適用更多的版本,我在上面添加一個ELASTIC_STACK_VERSION變量。我們需要在docker-compose.yml文件所處的文件目錄下創建一個文件.env,並且它的內容是:

ELASTIC_STACK_VERSION=7.6.2

我們可以根據自己所需要的版本進行選擇。另外一個重要的變化是在es01中,我加入瞭如下的部分:

      - xpack.security.enabled=true
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.keystore.type=PKCS12
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.keystore.path=elastic-stack-ca.p12
      - xpack.security.transport.ssl.truststore.path=elastic-stack-ca.p12
      - xpack.security.transport.ssl.truststore.type=PKCS12    

按照Elasticsearch的要求,如果我們在docker的環境中啓動xpack.security.enabled,我們必須也啓動xpack.security.transport.ssl.enabled。否則,我們將會看到如下的錯誤信息:

[1]: Transport SSL must be enabled if security is enabled on a [basic] license. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false]

因爲需要有證書的原因,我同時也添加了如下的部分:

    volumes:
      - ./elastic-stack-ca.p12:/usr/share/elasticsearch/config/elastic-stack-ca.p12

在上面,我們把docker-compose.yml文件所在目錄下的文件elastic-stack-ca.p12掛載到docker所在的目錄中去。這個證書,我們將在如下的部分生成。

針對Kibana的部分,我修改瞭如下的部分:

      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD="123456"

在這裏,我們使用了一個賬號叫做elastic/123456。這個賬號需要我們在如下的步驟中來生成。

 

創建證書

就是上面所顯示的那樣,我們需要爲TLS生成一個證書來進行配置。那麼我們該如何生產這個證書呢?我們首先來啓動一個Elasticsearch的實例。這個實例可以是按照我之前的“Elastic:菜鳥上手指南”中介紹的那樣,我們創建一個Elasticsearch。

在今天的教程中,我們將使用docker來創建一個Elasticsearch的實例:

docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.6.2

我們使用如下的命令:

docker ps

我們可以看到一個正在運行的Elasticsearch實例。請注意上面的container的名字爲vigorous_goldstine。

我們可以通過如下的命令進入到docker的容器中:

docker exec -it vigorous_goldstine bash
$ docker exec -it vigorous_goldstine bash
[root@2b7a12d54c14 elasticsearch]# ls
LICENSE.txt  README.asciidoc  config  jdk  logs     plugins
NOTICE.txt   bin              data    lib  modules

我們接着使用如下的命令:

./bin/elasticsearch-certutil ca

我們接受默認的文件名elastic-stack-ca.p12:

ls
LICENSE.txt  README.asciidoc  config  elastic-stack-ca.p12  lib   modules
NOTICE.txt   bin              data    jdk                   logs  plugins

這樣我們就生成了一個叫做elastic-stack-ca.p12的證書文件。我們接着輸入命令exit退出container環境。

接着我們進入到docker-compose.yml文件所處的目錄:

$ pwd
/Users/liuxg/elastic/docker
liuxg:docker liuxg$ ls
docker-compose.yml

我們打入如下的命令:

docker cp vigorous_goldstine:/usr/share/elasticsearch/elastic-stack-ca.p12 .

經過這樣的拷貝後,我們可以看到當前目錄下所有的文件:

$ pwd
/Users/liuxg/elastic/docker
liuxg:docker liuxg$ ls
docker-compose.yml   elastic-stack-ca.p12

我們已經使用完這個docker,我們可以把這個docker進行銷燬:

$ docker stop vigorous_goldstine
$ docker rm vigorous_goldstine

現在我們的準備工作已經完成,我們接下來的工作就是來爲我們的Elasticsearch生成用戶名及密碼。

 

生產安全賬號

如果目前,我們一下子啓動Elasticsearch和Kibana的話,我們是沒有任何的賬號的。我們可以分部啓動Elasticsearch及Kibana。

啓動Elasticsearch

在我們的termninal中,進入到docker-compose.yml所處的目錄中:

docker-compose up -d es01

顯示結果爲:

$ docker-compose up -d es01
Starting es01 ... done

我們可以通過命令來檢查這個被啓動的container:

$ docker ps
CONTAINER ID        IMAGE                                                 COMMAND                  CREATED             STATUS              PORTS                              NAMES
0f764e16c163        docker.elastic.co/elasticsearch/elasticsearch:7.6.2   "/usr/local/bin/dock…"   5 minutes ago       Up About a minute   0.0.0.0:9200->9200/tcp, 9300/tcp   es01

從上面我們可以看出來:Elasticsearch綁定的地址爲0.0.0.0,也就是說它綁定於所有的網絡接口的地址上。它同時可以被localhost:9200訪問,也可以被自己的私有地址 PrivateIP:9200所訪問。我們打開一個瀏覽器,並輸入localhost:9200:

我們可以看到:當我們試圖去訪問的時候,它讓我們輸入用戶名及密碼。而這個用戶名及密碼,我們還沒創建呢。

接下來我們來登錄到我們的Elasticsearch的容器中:

docker-compose exec es01 bash
$ docker-compose exec es01 bash
[root@496d9f848178 elasticsearch]# ls
LICENSE.txt  README.asciidoc  config  jdk  logs     plugins
NOTICE.txt   bin              data    lib  modules

我們在該目錄下打入如下的命令:

./bin/elasticsearch-setup-passwords interactive

然後,我們按照提示把密碼都設置爲123456。

設置完畢後,我們退出來。再次在localhost:9200上輸入elastic/123456這個賬號:

這樣我們的Elasticsearch的安全就設置好了。

 

啓動Kibana

同樣的方法,我們使用如下的命令:

$ docker-compose up -d kibana
$ docker-compose up -d kibana
es01 is up-to-date
Creating kibana ... done
liuxg:docker liuxg$ docker ps
CONTAINER ID        IMAGE                                                 COMMAND                  CREATED             STATUS              PORTS                              NAMES
17c2273346bd        docker.elastic.co/kibana/kibana:7.6.2                 "/usr/local/bin/dumb…"   18 seconds ago      Up 18 seconds       0.0.0.0:5601->5601/tcp             kibana
496d9f848178        docker.elastic.co/elasticsearch/elasticsearch:7.6.2   "/usr/local/bin/dock…"   2 hours ago         Up 2 hours          0.0.0.0:9200->9200/tcp, 9300/tcp   es01

我們可以通過如下的命令來監測Kibana的運行log:

$ docker-compose logs -f kibana
$ docker-compose logs -f kibana
Attaching to kibana
kibana    | {"type":"log","@timestamp":"2020-04-23T11:19:36Z","tags":["info","plugins-service"],"pid":6,"message":"Plugin \"case\" is disabled."}
kibana    | {"type":"log","@timestamp":"2020-04-23T11:19:51Z","tags":["warning","config","deprecation"],"pid":6,"message":"Setting [elasticsearch.username] to \"elastic\" is deprecated. You should use the \"kibana\" user instead."}
kibana    | {"type":"log","@timestamp":"2020-04-23T11:19:51Z","tags":["warning","config","deprecation"],"pid":6,"message":"Setting [xpack.monitoring.elasticsearch.username] to \"elastic\" is deprecated. You should use the \"kibana\" user instead."}
kibana    | {"type":"log","@timestamp":"2020-04-23T11:19:51Z","tags":["info","plugins-system"],"pid":6,"message":"Setting up [37] plugins: [taskManager,siem,licensing,infra,encryptedSavedObjects,code,usageCollection,metrics,canvas,timelion,features,security,apm_oss,translations,reporting,uiActions,data,navigation,status_page,share,newsfeed,inspector,expressions,visualizations,embeddable,advancedUiActions,dashboard_embeddable_container,kibana_legacy,management,dev_tools,home,spaces,cloud,apm,graph,eui_utils,bfetch]"}
...

稍等片刻,在我們的瀏覽器中輸入地址localhost:5601:

在啓動的畫面,它提示我們輸入用戶名及密碼。我們把賬號信息elastic/123456。這樣就可以登錄了:

這樣我們的配置就完成了。如果你想把整個Elastic Stack關掉,你可以通過如下的命令:

docker-compose down
$ docker-compose down
Stopping kibana ... done
Stopping es01   ... done
Removing kibana ... done
Removing es01   ... done
Removing network docker_esnet

如果你下次想再用你這個集羣,你只需要打入如下的命令:

docker-compose up
$ docker-compose up
Creating network "docker_esnet" with the default driver
Creating es01 ... done
Creating es02 ... done
Creating kibana ... done
Attaching to es02, es01, kibana
es01      | OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
es02      | OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
es01      | {"type": "server", "timestamp": "2020-04-23T11:27:10,816Z", "level": "INFO", "component": "o.e.e.NodeEnvironment", "cluster.name": "docker-cluster", "node.name": "es01", "message": "using [1] data paths, mounts [[/usr/share/elasticsearch/data (/dev/sda1)]], net usable_space [40gb], net total_space [58.4gb], types [ext4]" }
...

那麼整個Elastic Stack (Elasticsearc及Kibana)就會一鍵啓動。

 

Beats 訪問Elasticsearch

當我們部署完Elasticsearch集羣后,在以後,我們可能需要把數據導入到Elasticsearch中。上面我們一直在使用localhost:9200地址。但是這個是針對在本地的機器而言的。如果你的beats是在另外一個機器上 (在同一個局域網上),那麼你需要使用 PrivateIP:9200地址來進行寫入。這裏的private IP可以通過如下的命令來獲得:

ifconfig | grep 192

針對我的情況:

 ifconfig | grep 192
	inet 192.168.0.100 netmask 0xffffff00 broadcast 192.168.0.255

也就是我可以通過192.168.0.100:9200的端口進行訪問:

好了今天就講到這裏。在今天的文章中,我們詳細地介紹瞭如何爲docker創建的Elasticsearch集羣配置安全。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章