我刚刚使用 Ansible 通过 Prometheus、Grafana 和 Node Exporter 来监控我的服务器。我有一台监控服务器(Prometheus)和一台网络服务器(Node Exporter)。
我按照教程进行了设置。问题是它不提供任何有关安全的信息。目前任何人都可以监听我的网络服务器的
node_exporter
端口。
我考虑过
iptable
来保护我的网络服务器免受 node_exporter
端口上的外部调用。然后我将只授予对我的 Promotheus 服务器的访问权限。
有办法吗?
可能主要有三种选择
sshified
),该代理将通过 SSH 加密到 node_exporter
节点的传出会话stunnel
),这样您只能进行加密会话,请参阅Prometheus 及其导出器的身份验证和加密选项 3 可以轻松添加到 Running
node_exporter
with Ansible 的解决方案中。
选项 2 也非常简单,可以通过 Ansible 轻松完成。
选项 1 可以通过可用于(本地)防火墙配置的 Ansible 模块来完成,例如
firewalld
。
可能还有更多可能的解决方案,例如ghostunnel,...
在学习了多个教程 [1] 后,这对我有用。
创建将在所有node_exporter节点中分发的自签名证书:
sudo openssl req -x509 -newkey rsa:1024 -keyout node.key -out node.crt -days 29220 -nodes -subj /commonName=node_exporter/ -addext "subjectAltName=DNS:node_exporter"
mv node.* /etc/prometheus/ssl/
sudo chown -R prometheus.prometheus /etc/prometheus/ssl
sudo chmod -R o-rwx /etc/prometheus/ssl
我不确定
commonName
和 DNS
值是否重要。当时我没有使用它们。
将证书文件发送到您的node_exporter节点:
scp /etc/prometheus/ssl/node.* [email protected]:/tmp
mv /tmp/node.* /etc/node_expoter/ssl # create the folder if it doesn't exist
sudo chown -R prometheus.prometheus /etc/node_expoter/ssl
sudo chmod -R o-rwx /etc/node_expoter/ssl
# /etc/node_exporter/config.yml
basic_auth_users:
admin: $2a$10$...
tls_server_config:
cert_file: /etc/node_exporter/ssl/node.crt
key_file: /etc/node_exporter/ssl/node.key
其中
$2a$10$...
是您的用户密码的哈希版本
配置node_exporter服务来加载
config.yml
# /etc/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
Documentation=https://prometheus.io/docs/introduction/overview/
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=prometheus
Group=prometheus
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/local/bin/node_exporter --web.config.file="/etc/node_exporter/config.yml"
SyslogIdentifier=prometheus_node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
重启服务:
systemctl daemon-reload
systemctl restart node_exporter
systemctl status node_exporter
# /etc/prometheus/prometheus.yml
#[...rest of the config]
- job_name: "node.domain.com"
static_configs:
- targets: ["node.domain.com:9100"]
scheme: https
tls_config:
ca_file: /etc/prometheus/ssl/node.crt # the same that in your node_exporter node
insecure_skip_verify: true
basic_auth:
username: "admin"
password: "PASSWORD" # the password in clear, you can export this to a file
重启prometheus服务:
systemctl daemon-reload
systemctl restart prometheus
systemctl status prometheus
[1] https://nsrc.org/workshops/2021/sanog37/nmm/netmgmt/en/prometheus/ex-security.htm
[1] https://itsmegaffoor.medium.com/authentication-cryption-in-prometheus-d13e6e6299ad
[1] https://www.dbi-services.com/blog/how-to-keep-your-prometheus-ecosystem-secure/