我有一台服务器 A,我按照说明安装了 ELK :
可以从我的服务器的 IP 地址访问 ELK,并且我已经创建了 Let's Encrypt 证书来保护我在 Nginx 上的域。
server {
listen 80;
listen [::]:80;
server_name monitoring.example.com;
location / {
return 301 https://monitoring.example.com$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name monitoring.example.com;
auth_basic "Restricted Access";
auth_basic_user_file /var/www/monitoring-example-com/web/.htpasswd;
ssl_certificate /etc/letsencrypt/live/monitoring.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/monitoring.example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
我有一台要监控的服务器 B,并在其上安装了 Filebeat。
如何保证 ELK 和 Filebeat 之间的交换安全?
我需要创建 OpenSSL 证书还是使用 Let's Encrypt for Nginx 生成的证书?
您在管道中使用logstash还是filebeat将数据直接输出到elasticsearch中?根据这一点,答案会略有变化。集群设置的其他方面也很重要。
我假设您将数据直接输出到elasticsearch中。
您所描述的将nginx放在elasticsearch前面并进行基本身份验证的方法对于使用一个节点集群设置开发/测试环境来说是可以的。我怀疑这就是您想要的,因为您只监视一台服务器。如果这就是您所需要的,您可以停止阅读。
但是,您永远不应该在生产中使用一个节点设置。 Elasticsearch 是分布式存储,在生产环境中应始终使用至少三个节点。
为什么这对于安全而言很重要?在多节点集群中,您必须保护 REST API(默认端口 9200)和传输层(节点间流量默认端口 9300-9400)上的通信。您可能还想确保只有受信任的节点连接到集群。 Nginx 对此还不够。一种解决方案是将节点间流量放入在集群节点之间设置的全网状 VPN 中。我建议使用 tinc 为此。第二种是使用多个可用安全插件之一设置 TLS。
最好是同时使用两者,因为您可能不仅需要加密,还需要用户管理、角色分离、审核日志记录等。
您可以使用多个插件。最明显的是设置 X-Pack Security。在这种情况下,请参阅X-Pack文档。那里描述了整个过程。
X-Pack 相当昂贵。幸运的是,有几个替代方案,其中最著名的是 searchguard。社区版缺少一些功能,例如 LDAP 或字段级安全性,但对于大多数常见用例来说应该足够了。文档并不总是直接的,所以我建议进行一些测试部署。
其他替代方案包括ReadonlyREST,它有企业版和免费版。或者最新的 Open Distro 此版本仅与 Elasticsearch 的 OSS 版本保持兼容性(它可能会破坏基本许可证功能)。
编辑:2019年11月18日 基本许可证下的 X-Pack 现在提供免费的基本安全功能。与 searchguard 社区几乎相同,此外您还可以从 Kibana GUI 管理角色和用户。我个人的观点是,现在 searchguard 社区已经过时了,因为 X-Pack 提供了更好的功能,并且您在集群中的依赖性减少了,这使得更新和管理变得更加容易。对于商业用例,searchguard 可能仍然是更明智的选择,特别是对于大型集群。
查看以下页面,其中描述了如何配置 TLS 以保持 Filebeat -> Logstash -> Elasticsearch -> Kibana -> 您的 Web 浏览器中的所有数据私有:
基本上在 Elasticsearch 上启用传输 SSL(在
elasticsearch.yml
中),如下所示:
# Enables security.
xpack.security.enabled: True
# Enables transport SSL.
xpack.security.transport.ssl.enabled: True
xpack.security.transport.ssl.keystore.path: "certs/elastic-certificates.p12"
xpack.security.transport.ssl.truststore.path: "certs/elastic-certificates.p12"
xpack.security.transport.ssl.verification_mode: certificate
# Enables SSL via HTTP.
xpack.security.http.ssl.client_authentication: optional
xpack.security.http.ssl.enabled: false
xpack.security.http.ssl.keystore.path: "certs/elastic-certificates.p12"
xpack.security.http.ssl.truststore.path: "certs/elastic-certificates.p12"
有关更多详细信息,请阅读:在 Elasticsearch 中加密通信。
并在 Filebeat 主机上启用 TLS。示例
filebeat.yml
:
filebeat.prospectors:
- type: log
paths:
- logstash-tutorial-dataset
output.logstash:
hosts: ["logstash.local:5044"]
ssl.certificate_authorities:
- certs/ca.crt
了解更多:
然后您需要在Logstash中启用TLS(如果使用),例如
logstash.yml
:
node.name: logstash.local
xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: 'CHANGEME'
xpack.monitoring.elasticsearch.url: https://node1.local:9200
xpack.monitoring.elasticsearch.ssl.ca: config/certs/ca.crt
了解更多:与 Logstash 进行安全通信。
这是我在elasticsearch.yml中的配置
xpack.security.enabled: true
xpack.security.http.ssl.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.key: certs/node-1.key
xpack.security.http.ssl.certificate: certs/node-1.crt
xpack.security.http.ssl.certificate_authorities: certs/ca.crt
xpack.security.transport.ssl.key: certs/node-1.key
xpack.security.transport.ssl.certificate: certs/node-1.crt
xpack.security.transport.ssl.certificate_authorities: certs/ca.crt
xpack.security.http.ssl.supported_protocols: TLSv1.2
这是我的 filebeat.yml
setup.kibana:
host: "https://kibana:5601"
ssl.certificate_authorities: ["/etc/filebeat/config/certs/ca.crt"]
--------- Elasticsearch Output ------
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["elastic:9200"]
# Protocol - either `http` (default) or `https`.
protocol: "https"
ssl.certificate_authorities: ["/etc/filebeat/config/certs/ca.crt"]
ssl.certificate: "/etc/filebeat/config/certs/filebeat.crt"
ssl.key: "/etc/filebeat/config/certs/filebeat.key"
#api_key: "id:api_key"
是的,您需要使用OpenSSL并为filebeat创建证书。这是我用来为 filebeat 创建证书的命令:
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout filebeat.key -out filebeat.crt -CA ca.crt -CAkey ca.key
注意此命令需要OpenSSL 3.您可以在互联网上搜索更新它。