介绍
Elasticsearch 程序中提供elasticsearch-certutil命令来简化生成证书的过程。
该命令共有 3 种模式:
- CA 模式,用于生成一个新的证书颁发机构。
- CERT 模式,用于生成 X.509 证书和私钥。
- CSR 模式,用于生成证书签名请求,该请求指向受信任的证书颁发机构以获取签名的证书。签名证书必须为 PEM 或 PKCS#12 格式,才能与 Elasticsearch 安全功能一起使用。
生成证书
certutil官方文档
如果集群部署, 想为每个node都配置ssl, 就改instance.yml和extra_hosts
参考: https://www.elastic.co/cn/blog/configuring-ssl-tls-and-https-to-secure-elasticsearch-kibana-beats-and-logstash
证书位置必须写绝对路径
- 新建instance.yml以创建各容器的自签名证书
1 2 3 4 5 6 7 8 9
|
instances: - name: 'es-node1' dns: ['node1.elastic.com'] - name: 'logstash' dns: ['node1.logstash.com'] - name: 'kibana' dns: ['kibana.com']
|
1
| docker cp instance.yml elasticsearch:/usr/share/elasticsearch/
|
- 进入es容器, 执行如下命令
eg: 生成10年的证书
1
| bin/elasticsearch-certutil cert ca --days 3650 --pem --in instance.yml --out certs.zip
|
1
| docker cp elasticsearch:/usr/share/elasticsearch/certs.zip /opt/elk/ssl
|
1
| unzip certs.zip -d ./certs
|
- 会解压出四个文件夹, 将ca文件夹下的
ca.crt文件copy到另外四个目录下
1 2 3 4
| cd certs/ cp ca.crt es-node1/ cp ca.crt logstash/ cp ca.crt kibana/
|
docker-compose.yml调整
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| elasticsearch: ... privileged: true ... volumes: ... - /opt/elk/ssl/certs/es-node1:/usr/share/elasticsearch/config/certs ... extra_hosts: - "kibana.com:10.104.8.126" - "node1.logstash.com:10.104.8.126" - "node1.elastic.com:127.0.0.1" - "es-node1:127.0.0.1"
|
1 2 3 4 5 6 7 8 9 10 11 12
| kibana: ... volumes: - /opt/elk/ssl/certs/kibana:/usr/share/kibana/config/certs extra_hosts: - "kibana.com:127.0.0.1" - "node1.logstash.com:10.104.8.126" - "node1.elastic.com:10.104.8.126" - "es-node1:10.104.8.126"
|
1 2 3 4 5 6 7 8 9 10 11 12
| logstash: ... volumes: - /opt/elk/ssl/certs/logstash:/usr/share/logstash/config/certs extra_hosts: - "kibana.com:10.104.8.126" - "node1.logstash.com:127.0.0.1" - "node1.elastic.com:10.104.8.126" - "es-node1:10.104.8.126"
|
conf(conf配置文件)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| server.name: "kibana" server.host: "0.0.0.0" server.ssl.enabled: true
server.ssl.certificate: /usr/share/kibana/config/certs/kibana.crt
server.ssl.key: /usr/share/kibana/config/certs/kibana.key
elasticsearch.ssl.certificateAuthorities: ["/usr/share/kibana/config/certs/ca.crt"]
elasticsearch.hosts: ["https://node1.elastic.com:9200"] elasticsearch.username: kibana_system elasticsearch.password: xxx
xpack.reporting.encryptionKey: fd7c75cf-6abd-4704-a614-10a8679d64e7
monitoring.ui.enabled: true monitoring.ui.container.logstash.enabled: true
xpack.reporting.capture.browser.chromium.disableSandbox: false
server.publicBaseUrl: https://xxx:5601
xpack.encryptedSavedObjects.encryptionKey: 554d5cab-b336-eb0a-e128-6c5012dcc330
i18n.locale: "zh-CN"
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| cluster.name: elasticsearch-cluster
node.name: es-node1
network.host: 0.0.0.0
network.publish_host: node1.elastic.com
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*" discovery.type: single-node
node.master: true
node.data: true
discovery.seed_hosts: ["node1.elastic.com"]
discovery.zen.minimum_master_nodes: 1
http.cors.allow-headers: Authorization
bootstrap.memory_lock: true
xpack.security.enabled: true
xpack.security.http.ssl.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.http.ssl.key: /usr/share/elasticsearch/config/certs/es-node1.key xpack.security.http.ssl.certificate: /usr/share/elasticsearch/config/certs/es-node1.crt xpack.security.http.ssl.certificate_authorities: /usr/share/elasticsearch/config/certs/ca.crt xpack.security.transport.ssl.key: /usr/share/elasticsearch/config/certs/es-node1.key xpack.security.transport.ssl.certificate: /usr/share/elasticsearch/config/certs/es-node1.crt xpack.security.transport.ssl.certificate_authorities: /usr/share/elasticsearch/config/certs/ca.crt
|
/usr/share/logstash/pipeline/conf.d/*.conf针对 Beats 输入插件,需要将 logstash.key 转换为 PKCS8 格式
1
| openssl pkcs8 -in logstash.key -topk8 -nocrypt -out logstash.pkcs8.key
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| beats { port => 5044 ssl => true ssl_key => '/usr/share/logstash/config/certs/logstash.pkcs8.key' ssl_certificate => '/usr/share/logstash/config/certs/logstash.crt' } ...... output { elasticsearch { hosts => ["https://node1.elastic.com:9200"] index => "%{env}-xxx-%{indexDay}" cacert => '/usr/share/logstash/config/certs/ca.crt' user => "elastic" password => "xxx" } }
|
1 2 3 4 5 6 7 8 9
| node.name: logstash path.config: /usr/share/logstash/pipeline/conf.d/*.conf xpack.monitoring.enabled: true xpack.monitoring.elasticsearch.username: logstash_system xpack.monitoring.elasticsearch.password: xxx xpack.monitoring.elasticsearch.hosts: ["https://node1.elastic.com:9200"] xpack.monitoring.elasticsearch.ssl.certificate_authority: /usr/share/logstash/config/certs/ca.crt
|
- filebeat.yml
将ca.crt复制到filebeat所在服务器
1 2 3 4 5 6
| output.logstash:
hosts: ["经测试,这里写ip和dns都可"] ssl.certificate_authorities: - /etc/filebeat/ssl/ca.crt
|