Алерты Grafana в Telegram через прокси

В моём случае Grafana работает на CentOs7.
На данный момент в Grafana (v6.1.4) не реализовано подключение прокси-сервера для отправки оповещений в telegram. При поиске в Google можно найти ряд статей (раз,два,три) в которых утверждается что она станет ходить через прокси, если его добавить переменные окружения с указанием прокси сервера:

export http_proxy="http://myproxy:3128"
export https_proxy="http://myproxy:3128"

но по какой-то причине этот способ у меня так и не заработал, графана игнорирует прокси и пытается отправить уведомление напрямую на api.telegram.org

Если способ выше вам так же не помог, предлагаю ознакомиться с «костылём» описанным ниже.
Суть кратко: будем отправлять все запросы в сторону https://api.telegram.org на свой сервер с Apache и на нём делать proxy_pass на реальный api.telegram.org.
Можно, конечно, просто на уровне IPTABLES редиректить все обращения на 443 порт на реальную API, но при таком раскладе мы займём 443 порт на нашей VPS, что не очень кошерно, сайтики с HTTPS уже не похостишь..

Разумеется, для подобной реализации потребуется сервер, с которого доступен URL https://api.telegram.org (например, VPS).

1. Подготовка сертификата для проксирующего хоста

Да, для подписи самого проксирующего узла нам необходимо создать SSL сертификат, которому машина с grafana должна доверять.
Для дальнейших действий потребуется openssl, при необходимости установите командой yum install openssl
Сделать это можно на любой из машин.
Чтобы было доверие, придётся создать CA. Если у вас уже есть свой собственный CA — сгенерируйте запрос на сертификат (пункт 2 и 3) и подпишите его своим CA.

  1. Создаём CA:
    # Создаём корневой ключ
    openssl genrsa -out rootCA.key 2048
    
    # Создаём корнекой сертификат, отвечаем на вопросы при создании любым образом
    openssl req -x509 -new -key rootCA.key -days 10000 -out rootCA.crt
    

    ВАЖНО: Полученный корневой сертификат скопируйте на машину с Grafana — он понадобится для установления доверия

  2. Подготовим кофиг для запроса сертификата, создаём файл openssl.cnf как ниже — в нём мы запрашиваем сертификат на имя api.telegram.org. Можно ничего в нём не менять:
    [req]
    distinguished_name = req_distinguished_name
    req_extensions = v3_req
    
    [req_distinguished_name]
    countryName = RU
    countryName_default = RU
    stateOrProvinceName = Moscow
    stateOrProvinceName_default = Moscow
    localityName = Moscow
    localityName_default = Moscow
    organizationalUnitName = IT
    organizationalUnitName_default = MYCORP
    commonName = api.telegram.org
    commonName_default = api.telegram.org
    commonName_max = 64
    
    [v3_req]
    # Extensions to add to a certificate request
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = api.telegram.org
    
  3. Генерируем ключ для подписи хоста и формируем запрос на основе конфига:
    # Генерим ключ
    openssl genrsa -out fakeapi.key 2048
    
    # Генерим запрос
    openssl req -new -out fakeapi.csr -key my.key -config openssl.cnf
    
  4. Подписываем запрос созданным в п.1 ключом и сертификатом:
    openssl x509 -req -in fakeapi.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out fakeapi.crt -days 5000
    

    ВАЖНО: Полученные fakeapi.key и fakeapi.crt копируем на удалённый сервер с Apache (на котором будем проксировать запросы)


2. Конфигурация сервера с Apache

  1. На удалённом сервера так же стоит CentOs7. Ставим Apache и подключаем модуль, отвечающий за проксирование запросов:
    # Установка Apache
    yum install httpd
    
    # Открываем конфиг Apache 
    nano /etc/httpd/conf/httpd.conf
    
    # и добавляем в конец файла строку
    LoadModule proxy_http_module modules/mod_proxy_http.so
    
    # перезапускаем службу, ошибок быть не должно
    systemctl restart httpd
    
  2. В конфиг /etc/httpd/conf/httpd.conf Добавляем VirtualHost вида:
    <VirtualHost *:443>
      DocumentRoot /var/www/html
      ServerName api.telegram.org
      SSLEngine on
      SSLCertificateFile /etc/ssl/certs/fakeapi.crt
      SSLCertificateKeyFile /etc/ssl/certs/fakeapi.key
      SSLProxyEngine on
      SSLProxyVerify none
      SSLProxyCheckPeerCN off
      SSLProxyCheckPeerName off
      ProxyRequests On
      ProxyPreserveHost On
      ProxyVia full
      <proxy *>
        Order deny,allow
        Allow from all
      </proxy>
      ProxyPass        /  https://api.telegram.org/
      ProxyPassReverse /  https://api.telegram.org/
    </VirtualHost>
    

    ВАЖНО: Скорректируйте путь до сертификата и ключа, полученных ранее
    После добавления конфига перезапустите службу командой systemctl restart httpd

  3. Разрешаем HTTPS траффик в firewalld:
    firewall-cmd --zone=public --permanent --add-service=https
    

3. Конфигурация сервера с Grafana

  1. Добавляем запись в hosts для подмены адреса api.telegram.org . В качестве IP указываем адрес сервера с Apache:
    echo 1.1.1.1 api.telegram.org >> /etc/hosts
    
  2. Добавляем ранее скопированный корневой сертификат в список доверенных на уровне системы:
    # Копируем корневой сертификат в директорию
    cp rootCA.crt /etc/pki/ca-trust/source/anchors/rootCA.crt
    
    # Обновляем доверенные CA
    update-ca-trust
    

На этом всё, теперь все запросы от графаны в сторону api.telegram.org будут проксироваться через наш сервер.
Дебажить можно читая лог /var/log/grafana/grafana.log в момент отправки тестового уведомления.
Может быть полезно:
Памятка по командам openssl

0

Добавить комментарий

Ваш e-mail не будет опубликован.