Setup SSL/TLS + Autentikasi Prometheus Server dan Node Exporter

Mengapa kita perlu enkripsi?

Enkripsi dibutuhkan agar komunikasi antara prometheus server dan node exporter terenkripsi, karena default protokol yang digunakan HTTP maka data yang diambil ke prometheus server akan berbentuk plaintext sehingga tidak aman maka kita perlu enkripsi dengan TLS

Mengapa kita perlu autentikasi?

Autentikasi diperlukan untuk keamanan, secara default metrics yang di ekspose oleh node_exporter bisa diakses oleh semua orang sehingga tidak aman, siapapun bisa mengambil metrics dari server kita. Sebelum autentikasi kita bisa mengamankannya dengan firewall, caranya dengan membuat rule metrics server hanya boleh di akses oleh prometheus server kita. Untuk autentikasi nantinya kita gunakan auth basic

Setup SSL/TLS

Lakukan di server node_exporter, buat sertifikat ssl dengan openssl(self-signed) atau jika server kita publik bisa menggunakan let’s encrypt

Buat Certificate Authority sendiri

cd /etc/ssl
openssl req -new -x509 -nodes -days 365 -out cacert.pem -keyout cakey.pem -extensions v3_ca  -subj “/C=ID/ST=Madiun/L=East Java /O=ARYA /OU=IT/CN=ARYA CA

Buat Certificate Signing Request

openssl req -new -nodes -out certs/nodes.csr -keyout private/nodes.key -subj “/C=ID/ST=Madiun/L=East Java/O=ARYA/OU=IT/CN=IP/Domain”

Membuat SAN (Subjectl Alternative Names)

Buat file san.cnf

vim san.cnf
.....
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = nodes
IP.1 = 10.23.2.110
.....

Tanda Tangan sertifikat

openssl x509 -req -in certs/nodes.csr -out certs/nodes.crt -CA cacert.pem -CAkey cakey.pem -days 3650 -extfile san.cnf -CAcreateserial

Sertifikat berhasil dibuat!

Selanjutnya kita pasang di node_exporter

Bagaimana caranya? pertama kita buat dulu folder konfigurasi node_exporter

mkdir /etc/node_exporter

Salin sertifikat yang tadi dibuat ke direktori /etc/node_exporter

cp /etc/ssl/certs/nodes.crt /etc/node_exporter
cp /etc/ssl/private/nodes.key /etc/node_exporter

Lalu buat file config.yml yang berisi konfigurasi SSL untuk node_exporter

vim /etc/node_exporter/config.yml
.....
tls_server_config:
  cert_file: nodes.crt
  key_file: nodes.key
.....

Ubah kepemilikan folder /etc/node_exporter menjadi user node_exporter

chown -R node_exporter:node_exporter /etc/node_exporter

Selanjutnya ubah ExecStart pada service systemd node_exporter

vim /etc/systemd/system/node_exporter.service
.....
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter --web.config.file=/etc/exporter/config.yml
[Install]
WantedBy=multi-user.target
.....

Arahkan –web.config.file ke file config.yml yang tadi dibuat

Lakukan daemon-reload

systemctl daemon-reload

Restart service node_exporter

systemctl restart node_exporter

Cek service node_exporter pastikan sudah running (tidak ada error,dll)

Lanjut setelah itu kita ubah konfigurasi di prometheus servernya, di bagian jobs

vim /etc/prometheus/prometheus.yml
.....
  - job_name: "node-jenkins"
    scheme: https
    tls_config:
      ca_file: /etc/prometheus/cacert.pem
      insecure_skip_verify: true
.....

Yang kita tambahkan yaitu CA file yang tadi dibuat di server node_exporter, lalu jika kita menggunakan SSL yang dibuat sendiri (self-signed) parameter insecure_skip_verify kita isi dengan true

Sebelum melakukan restart kita transfer dulu file CA tadi dari server node_exporter ke server prometheus

scp /etc/ca/cacert.pem root@serverprometheus:/etc/prometheus/

Lalu lakukan restart service prometheus

systemctl restart prometheus

Cek dari Prometheus Web dibagian Status > Targets , pastikan tidak ada warning/error

Setup SSL/TLS berhasil dilakukan!!

Setup Autentikasi dengan Basic Auth

Install paket httpd-tools(Red Hat Based) atau apache2-utils(Debian Based) untuk membuat password yang terenkripsi dengan tools htpasswd

apt install apache2-utils -y

Generate password, sebagai contoh disini password yang kita buat yaitu prometheus

echo "prometheus" | htpasswd -inBC 10 "" | tr -d ':\n'

perintah tr -d untuk menghilangkan karakter whitespace

Salin hasilnya, lalu edit file config.yml di direktori /etc/node_exporter

vim /etc/node_exporter/config.yml
.....
tls_server_config:
  cert_file: exporter.crt
  key_file: exporter.key
basic_auth_users:
  prometheus: $2y$10$s.3UPXqxZOVCy5mNEdRnG.25pTxYyspFP6Ho2cTeaDljdNQ0WTBD6
.....

Tambahkan konfigurasi basic_auth_users dengan format username:password

Untuk username bebas disini saya menggunakan prometheus dan masukkan password yang dibuat tadi

Lakukan restart service node_exporter

systemctl restart node_exporter

Cek di Prometheus Web dibagian Status > Targets, ketika kita menambahkan autentikasi di node_exporter, prometheus server kita tidak bisa langsung terkoneksi

Selanjutnya kita tambahkan username dan password di prometheus server

Edit file konfigurasi prometheus

vim /etc/prometheus/prometheus.yml
.....
  - job_name: "node-jenkins"
    scheme: https
    tls_config:
      ca_file: /etc/prometheus/cacert.pem
      insecure_skip_verify: true
    basic_auth:
      username: prometheus
      password: prometheus
.....

Setelah menambahkan username dan pasword, lalu kita restart service prometheusnya

systemctl restart prometheus

Cek lagi di Prometheus Web

Setup Autentikasi berhasil!

Selanjutnya apa lagi?? stay tune terus

Leave a Comment