让Elasticsearch和Kibana通过Let’s Encrypt实现TLS支持
我想做的事情
我在运行Docker时启用了Elasticsearch 7.6和Kibana 7.6的Security,但由于TLS方面的限制,无法将其作为Fastly的日志记录目标。因此,我决定使用Let’s Encrypt来获取证书。实际上,这种方式更简单,我将把操作记录作为工作历史备忘录保存下来。
前提 tí) – prerule
-
- Dockerが使える
-
- ホスト側がRAM 4GB以上で、Elasticsearchに2GB、Kibanaに1GBを割当てられる(Amazon Lightsail あるいは MacBook Pro)
-
- ドメインを持っていてDNSがいじれる(仮に example.com とする)
-
- Let’s Encrypt はDNS認証でワイルドカード証明書を発行する
-
- Elasticsearchを elasticsearch.example.com で運用するようDNSが構成済み
- Kibanaを kibana.example.com で運用するようDNSが構成済み
几乎全套剪贴板可行
创建一个地方用于保存Elasticsearch数据和证书文件。
- Elasticsearchのコンテナにボリュームを割当てるときにパーミッションエラーが出たら要調整
mkdir -p ~/Development/Docker/Elasticsearch/data ~/Development/Docker/Elasticsearch/cert
2. 让我们使用Let’s Encrypt来安排证书
-
- certbotのDockerイメージを使うことでAmazon Linux上で、ホストを汚さずに作業する
- 途中、認証用にDNSへTXTレコードを追加するように指示があるので、DNSにレコードを追加してしばらくしてから継続する
docker run -it \
--name certbot \
-v ~/Development/Docker/Elasticsearch/cert:/etc/letsencrypt \
certbot/certbot certonly \
--manual \
-d *.example.com \
-m info@example.com \
--agree-tos \
--manual-public-ip-logging-ok \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory
准备一个包含证书的Dockerfile以在Elasticsearch和Kibana中使用。
- 作業しやすい場所に移動
cd ~/Development/Docker/Elasticsearch
dockerfile-es というファイル名でElasticsearch用Dockerfileを作る
FROM docker.elastic.co/elasticsearch/elasticsearch:7.6.0
RUN \
elasticsearch-plugin install --batch analysis-icu && \
elasticsearch-plugin install --batch analysis-kuromoji
RUN mkdir /usr/share/elasticsearch/config/cert
ADD "./cert/archive/example.com" /usr/share/elasticsearch/config/cert
RUN chown -R root:elasticsearch /usr/share/elasticsearch/config/cert
dockerfile-kibana というファイル名でKibana用Dockerfileを作る
FROM docker.elastic.co/kibana/kibana:7.6.0
ADD "./cert/archive/example" /etc/kibana/cert
构建Docker镜像
docker build -f dockerfile-es -t elasticsearch-tls .
docker build -f dockerfile-kibana -t kibana-tls .
5. 启动Elasticsearch
docker run --name Elasticsearch -d \
--restart=always \
-m 2048m \
-p 9200:9200 \
-p 9300:9300 \
-e cluster.name=ES \
-e discovery.type=single-node \
-e network.host=0.0.0.0 \
-e xpack.security.enabled=true \
-e xpack.monitoring.collection.enabled=true \
-e "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" \
-e "ELASTIC_PASSWORD=iY69DxipKifV7utYA4t6jgxT" \
-e xpack.security.transport.ssl.enabled=true \
-e xpack.security.transport.ssl.key=/usr/share/elasticsearch/config/cert/privkey1.pem \
-e xpack.security.transport.ssl.certificate=/usr/share/elasticsearch/config/cert/fullchain1.pem \
-e xpack.security.http.ssl.enabled=true \
-e xpack.security.http.ssl.key=/usr/share/elasticsearch/config/cert/privkey1.pem \
-e xpack.security.http.ssl.certificate=/usr/share/elasticsearch/config/cert/fullchain1.pem \
-v ~/Development/Docker/Elasticsearch/data:/usr/share/elasticsearch/data \
--ulimit nproc=4096:4096 \
--ulimit memlock=256000:256000 \
--ulimit nofile=65536:65536 \
elasticsearch-tls
设定Kibana用户的密码。
- 前提にある通り、この時点で elasticsearch.example.com でElasticsearchにアクセスできることが必要
curl -XPUT --user elastic:iY69DxipKifV7utYA4t6jgxT 'https://elasticsearch.example.com:9200/_xpack/security/user/kibana/_password' -H "Content-Type: application/json" -d '{
"password" : "6ezji8D5jvceXUsTsvg8mAY4"
}'
7. 启动Kibana。
- Elasticsearchとの通信はDocker内で es-internal.example.com で行うように構成する。ドメインを合わせないと証明書が機能しないため。
docker run --name Kibana -d \
--restart=always \
--link Elasticsearch:es-internal.example.com \
-m 1280m \
-p 443:5601 \
-e "ELASTICSEARCH_HOSTS=https://es-internal.example.com:9200" \
-e "ELASTICSEARCH_USERNAME=kibana" \
-e "ELASTICSEARCH_PASSWORD=6ezji8D5jvceXUsTsvg8mAY4" \
-e "SERVER_SSL_ENABLED=true" \
-e "SERVER_SSL_CERTIFICATE=/etc/kibana/cert/fullchain1.pem" \
-e "SERVER_SSL_KEY=/etc/kibana/cert/privkey1.pem" \
--ulimit nproc=4096:4096 \
--ulimit memlock=256000:256000 \
--ulimit nofile=65536:65536 \
kibana-tls
8. 进行必要的设置
https://kibana.example.com/ にアクセスして elastic ユーザーとしてログイン