Prometheus Security - TLS 및 ID/PW 인증 적용

Hansu Kim·2022년 5월 6일
0

프로메테우스를 사용하기 위해선 Security 기능을 적용해야한다.
본 포스트에서는 아래 항목들에 대해 다룬다.

  • Web server의 basic authentication
  • HTTP TLS 적용

두 방식 모두 --web.config.file 플래그를 통해 서비스 시작시 YAML 포맷의 Config 파일을 지정해 적용시킬 수 있다.

HTTPS TLS 적용

1. Openssl을 통한 자체서명 인증서, 개인키 생성

openssl req \
-x509 -newkey rsa:4096 \
-nodes \
-keyout private.key -out certificate.crt 

2. config 파일 생성

cat web.yml
tls_server_config:
        cert_file: /certs/certificate.crt
        key_file: /certs/private.key

3. 서비스에 실행플래그 지정

  • prometheus.service 파일
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
User=prometheus
Restart=on-failure
ExecStart=/home/prometheus/prometheus-2.35.0.linux-amd64/prometheus \
  --config.file=/home/prometheus/prometheus-2.35.0.linux-amd64/prometheus.yml \
  --storage.tsdb.path=/home/prometheus/prometheus-2.35.0.linux-amd64 \
  --web.enable-lifecycle \
  --web.config.file=/home/prometheus/prometheus-2.35.0.linux-amd64/config/web.yml

[Install]
WantedBy=multi-user.target

위 과정을 통해 웹서버의 모든 액세스는 tls로 변경된다.
다만, job별 scrape시의 TLS 통신은 job마다 별도로 지정해주어야 한다.
insecure_skip_verify 파라미터를 false로 지정하여 scrape시 TLS를 비활성화할 수 있다.

- job_name: 'kubernetes-apiservers'
      kubernetes_sd_configs:
        - role: endpoints
          namespaces:
            names:
              - default
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true

Web server의 basic authentication (ID/PW)

bcrypt를 통해 해싱된 패스워드를 웹 컨피그 파일에 지정하여 동작시킨다.

해싱된 패스워드 생성법

1. bcrypt 패키지 설치

apt install python3-bcrypt

2. Python 파일 작성

import getpass
import bcrypt

password = getpass.getpass("password: ")
hashed_password = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())
print(hashed_password.decode())

3. 비밀번호 해싱값 얻기

$ python3 gen-pass.py
password:
$2b$12$92Do/EILnpDym2W2Cum1rO1tW.ze9U2aH1a9LEN.BmOUlk0v/w4vK

4. yaml 파일 작성 및 서비스 실행

  • web.yml
basic_auth_users:
        dbaas: $2b$12$zlmXDDcIe6LejFjmijZHI.C0E5BgHZAggbwhJBrvau48i90POf0K6
  • 작성된 config validation
$ ./promtool check web-config ./config/web.yml
./config/web.yml SUCCESS
  • 서비스 실행
systemctl restart prometheus.service

5. 테스트

$ curl http://localhost:9090/metrics
Unauthorized
$ curl -u dbaas http://localhost:9090/metrics
Enter host password for user 'dbaas':
# HELP go_gc_cycles_automatic_gc_cycles_total Count of completed GC cycles generated by the Go runtime.
# TYPE go_gc_cycles_automatic_gc_cycles_total counter
go_gc_cycles_automatic_gc_cycles_total 6
# HELP go_gc_cycles_forced_gc_cycles_total Count of completed GC cycles forced by the application.
# TYPE go_gc_cycles_forced_gc_cycles_total counter


0개의 댓글