On Thursday, 19 March 2020 11:04:56 UTC, Jack Chew wrote:
>
> When i use node_exporter web-config.yml for TLS setting will arsie the 
> screenshot error. I try to different node_exporter server also same 
> promble, but i cancel web-config is no promblem.
>

node_exporter 1.0.0 rc1?  TLS with client cert authentication works for me.

But if you're doing full TLS with client certs, you need authentication in 
both directions:

- The server (node_exporter) needs a certificate signed by a CA
- The name in the certificate (CN or SAN) needs to match either the 
hostname that prometheus is connecting to, or the "server_name" setting in 
tls_config 
<https://prometheus.io/docs/prometheus/latest/configuration/configuration/#tls_config>
 if 
that is specified
- The client (prometheus) needs a certificate signed by a CA [not 
necessarily the same one]
- The server (node_exporter) doesn't care about the identity in the 
certificate, but it does need the CA cert of the certificate which signed 
prometheus' cert.

Here's how I make this work with two keys and certs: one for prometheus, 
and one shared by all the node_exporters.

I am going to assume you do the following on the prometheus server, and 
node_exporter is also running on this node (reachable as 127.0.0.1:9100), 
and show how to build it up in stages.

1. create a key and certificate for node_exporter to use:

mkdir /etc/prometheus/ssl
cd /etc/prometheus/ssl
openssl req -x509 -newkey rsa:1024 -keyout prom_node_key.pem -out 
prom_node_cert.pem -days 29220 -nodes -subj /commonName=prom_node/

Type `ls` and you should see two files: `prom_node_cert.pem` and 
`prom_node_key.pem`.  This is how the node_exporter identifies itself to 
prometheus.

2. create a file `/etc/prometheus/node_tls.yml` with the following contents:

tlsConfig:
  tlsCertPath: /etc/prometheus/ssl/prom_node_cert.pem
  tlsKeyPath: /etc/prometheus/ssl/prom_node_key.pem

3. Change your node_exporter config to add

--web.config=/etc/prometheus/node_tls.yml

to the command-line options it runs with (e.g. edit your systemd unit file, 
or /etc/default/node_exporter, or whatever).  Restart it and check for 
errors.

4. Now we can do a test scrape using curl and https:

curl --cacert /etc/prometheus/ssl/prom_node_cert.pem --resolve 
prom_node:9100:127.0.0.1 -v https://prom_node:9100/metrics

The scrape should be successful.  We've done it over https.  We've used the 
fake hostname "prom_node" to match the certificate, and told curl to use 
address 127.0.0.1 for this hostname, and to verify the certificate in 
prom_node_cert.pem.

If it doesn't work at this point, fix the problem before proceeding.

However, still anyone is authorized to scrape.  So now we need to make a 
new key and cert for the prometheus server to use when scraping, and 
configure node_exporter so that it only accepts scrapes from someone with 
this key.

5. Create the new key and cert for prometheus:

cd /etc/prometheus/ssl
openssl req -x509 -newkey rsa:1024 -keyout prometheus_key.pem -out 
prometheus_cert.pem -days 29220 -nodes -subj /commonName=prometheus/

6. Edit `/etc/prometheus/node_tls.yml` so it looks like this:

tlsConfig:
  tlsCertPath: /etc/prometheus/ssl/prom_node_cert.pem
  tlsKeyPath: /etc/prometheus/ssl/prom_node_key.pem

  clientAuth: RequireAndVerifyClientCert
  clientCAs: /etc/prometheus/ssl/prometheus_cert.pem

Restart node_exporter.

7. Now re-run the *exact* same curl command as you did before:

curl --cacert /etc/prometheus/ssl/prom_node_cert.pem --resolve 
prom_node:9100:127.0.0.1 -v https://prom_node:9100/metrics

This time you should see an error:

curl: (35) gnutls_handshake() failed: Certificate is bad

This is because the client isn't presenting a certificate to the server to 
identify itself.

We now need to give a longer curl line (split for clarity):

curl --cert /etc/prometheus/ssl/prometheus_cert.pem \
     --key /etc/prometheus/ssl/prometheus_key.pem \
     --cacert /etc/prometheus/ssl/prom_node_cert.pem \
     --resolve prom_node:9100:127.0.0.1 \
     -v https://prom_node:9100/metrics

This should now work.  We've proved our identity to node_exporter using the 
prometheus private key, and node_exporter will now talk to us.

8. Now you just need to change the prometheus config to scrape using tls.

Edit your prometheus.yml and find the section which scrapes node_exporter.  
Edit it so that it includes scheme: https and a tls_config section as below.

  - job_name: 'node'
    file_sd_configs:
      - files:
          - /etc/prometheus/targets.d/node.yml
    scheme: https
    tls_config:
      # Verifying remote identity
      ca_file: /etc/prometheus/ssl/prom_node_cert.pem
      server_name: prom_node
      # Asserting our identity
      cert_file: /etc/prometheus/ssl/prometheus_cert.pem
      key_file: /etc/prometheus/ssl/prometheus_key.pem


Signal prometheus to re-read its configuration, and check for errors:

killall -HUP prometheus
journalctl -eu prometheus   # e.g. if you are running prometheus under 
systemd

9. Deployment to other nodes

To deploy this to remote nodes with node_exporter, you would copy the 
following files to them:

* `/etc/default/node_exporter` (or however you set the command line options 
on node_exporter)
* `/etc/prometheus/node_tls.yml`
* `/etc/prometheus/ssl/prom_node_cert.pem`
* `/etc/prometheus/ssl/prom_node_key.pem`
* `/etc/prometheus/ssl/prometheus_cert.pem`

but *NOT* `prometheus_key.pem`.  That file is private to the prometheus 
server only; it's ownership of this key which proves the prometheus 
server's identity.

-- 
You received this message because you are subscribed to the Google Groups 
"Prometheus Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/prometheus-users/7ef89b3f-0ccd-4f6b-9988-db029e0f8855%40googlegroups.com.

Reply via email to