Контроль доступа для шлюза Prometheus Pushgateway

У нас работает шлюз Prometheus Pushgateway, который прослушивает данные о показателях от нашей функции AWS Lambda. Однако URL-адрес Pushgateway доступен для всех, что может вызвать некоторые проблемы с безопасностью. Нам было интересно, можно ли как-нибудь добавить уровень защиты к Pushgateway, чтобы он не был общедоступным?

Я нашел эту ветку Github, которая может ответить на этот вопрос:https://github.com/prometheus/pushgateway/issues/281

Было предложено установить обратный прокси перед шлюзом. Однако я все еще не понимаю, как это может работать? В настоящее время мы используем Kubernetes для развертывания Prometheus.

3 ответа

Решение

Вы можете включить аутентификацию в свой контроллер входящего трафика, используя секрет TLS в качестве правила входа. Вот пример, который показывает, как сгенерировать базовую аутентификацию для вашего входа:

https://kubernetes.github.io/ingress-nginx/examples/auth/basic/

Кроме того, не забудьте включить функцию обработчика Python в свой клиент, чтобы установить заголовок auth, как указано здесь:

https://github.com/prometheus/client_python

Вы правы, здесь нужен обратный прокси. Я также столкнулся с той же проблемой, поэтому вам нужен nginx перед вашим prometheus/pushgateway.

Сначала установите nginx по этой статье (можно начать с Шага 8 — Защита Prometheus, если вы уже настроили prometheus):

Моя конфигурация nginx:

      events { }
http {
upstream prometheus {
      server 127.0.0.1:9090;
      keepalive 64;
}

upstream pushgateway {
      server 127.0.0.1:9091;
      keepalive 64;
}

server {
      root /var/www/example;
      listen 0.0.0.0:80;
      server_name __;      
      location / {
            auth_basic "Prometheus server authentication2";
            auth_basic_user_file /etc/nginx/.htpasswd;
            proxy_pass http://prometheus;
      }  
}


server {
      root /var/www/example;
      listen 0.0.0.0:3001;
      server_name __;      
      location / {
            auth_basic "Pushgateway server authentication";
            auth_basic_user_file /etc/nginx/.htpasswd;
            proxy_pass http://pushgateway;
      } 
}
}

мой файл pushgateway.service:

      [Unit]
Description=Pushgateway
Wants=network-online.target
After=network-online.target

[Service]
User=pushgateway
Group=pushgateway
Type=simple
ExecStart=/usr/local/bin/pushgateway --web.listen-address="127.0.0.1:9091" --web.telemetry-path="/metrics"  --persistence.file="/tmp/metric.store"  --persistence.interval=5m --log.level="info" --log.format="logger:stdout?json=true"

[Install]
WantedBy=multi-user.target

Важно установить: --web.listen-address="127.0.0.1:9091", а не ":9091", чтобы он был виден только локальному хосту.

Через nginx pushgateway будет доступен по порту 3001, порт 9091 будет непубличным. Базовая аутентификация потребуется для доступа или отправки метрик.

О том, как протестировать его с помощью Postman, вы можете узнать здесь

Здесь предлагается сделать URL-адрес Pushgateway Internal с помощью AWS Internal Load Balancer, создать частную размещенную зону AWS, присоединить ваш VPC к этой зоне, после чего следующим шагом будет развертывание лямбда-выражения в том же VPC.

Это должно решить проблему безопасности.

Другие вопросы по тегам