
Prometheus, Alertmanager + OAuth2 Proxy, Keycloak
OAuth2 Proxy — это обратный прокси-сервер, который находится перед вашим приложением и обеспечивает аутентификацию OpenID Connect / OAuth 2.0 с использованием провайдеров идентификации (Google, GitHub, Keycloak и других).
- Установка Keycloak была рассмотрена в одной из предыдущей статей
Установку Prometheus, Alertmanager и OAuth2 Proxy произвожу на одной ВМ под управлением Rocky Linux 9, по этому для начала либо настраиваем SELinux, либо отключаем его (выбрал второй вариант)
$ sudo grubby --update-kernel ALL --args selinux=0 $ sudo setenforce 0
Установка Prometheus
Создаем пользователя и необходимые каталоги
$ sudo useradd -M -s /bin/false prometheus $ sudo mkdir /opt/prometheus /var/lib/prometheus
Скачиваем финальную верcию Prometheus, распаковываем её и переходим в каталог
$ wget https://github.com/prometheus/prometheus/releases/download/v2.42.0/prometheus-2.42.0.linux-amd64.tar.gz $ tar xzf prometheus-2.42.0.linux-amd64.tar.gz $ cd prometheus-2.42.0.linux-amd64
Перемещаем исполняемые файлы, меняем владельца на каталоги и файлы
$ sudo mv prometheus promtool /usr/local/bin/ $ sudo mv prometheus.yml /opt/prometheus/ $ sudo chown -R prometheus. /opt/prometheus /var/lib/prometheus $ sudo chown prometheus. /usr/local/bin/{prometheus,promtool}
Создаем системный юнит для Prometheus
$ sudo nano /etc/systemd/system/prometheus.service [Unit] Description=Prometheus Time Series Collection and Processing Server Wants=network-online.target After=network-online.target [Service] User=prometheus Group=prometheus Type=simple ExecStart=/usr/local/bin/prometheus \ --config.file /opt/prometheus/prometheus.yml \ --storage.tsdb.path /var/lib/prometheus/ \ --web.console.templates=/opt/prometheus/consoles \ --web.console.libraries=/opt/prometheus/console_libraries [Install] WantedBy=multi-user.target
Перечитываем юниты, добавляем сервис а автозагрузку и запускаем его
$ sudo systemctl daemon-reload $ sudo systemctl enable --now prometheus $ sudo systemctl status prometheus
Открываем порт 9090/tcp
$ sudo firewall-cmd --permanent --zone=public --add-port=9090/tcp $ sudo firewall-cmd --reload
Чуть дальше Prometheus запустим в режиме Reverce proxy, это правило удалим
Установка Alertmanager
Создаем пользователя и необходимые каталоги
$ sudo useradd -M -s /bin/false alertmanager $ sudo mkdir /opt/alertmanager /var/lib/alertmanager
Скачиваем финальную верcию Alertmanager, распаковываем её и переходим в каталог
$ wget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz $ tar xzf alertmanager-0.25.0.linux-amd64.tar.gz $ cd alertmanager-0.25.0.linux-amd64
Перемещаем исполняемые файлы, меняем владельца на каталоги и файлы
$ sudo mv alertmanager amtool /usr/local/bin/ $ sudo mv alertmanager.yml /opt/alertmanager/ $ sudo chown -R alertmanager. /opt/alertmanager /var/lib/alertmanager $ sudo chown alertmanager. /usr/local/bin/{alertmanager,amtool}
Создаем системный юнит для Alertmanager
$ sudo nano /etc/systemd/system/alertmanager.service [Unit] Description=Alertmanager Service After=network.target prometheus.service [Service] EnvironmentFile=-/etc/default/alertmanager User=alertmanager Group=alertmanager Type=simple ExecStart=/usr/local/bin/alertmanager \ --config.file=/opt/alertmanager/alertmanager.yml \ --storage.path=/var/lib/alertmanager \ $ALERTMANAGER_OPTS ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure [Install] WantedBy=multi-user.target
Перечитываем юниты, добавляем сервис а автозагрузку и запускаем его
$ sudo systemctl daemon-reload $ sudo systemctl enable --now alertmanager $ sudo systemctl status alertmanager
Открываем порт 9093/tcp
$ sudo firewall-cmd --permanent --zone=public --add-port=9093/tcp $ sudo firewall-cmd --reload
Чуть дальше Alertmanager запустим в режиме Reverce proxy, это правило удалим
Настройка Keycloak
Версия Keycloak: 21.0.0
Переходим в нужную область (realm). Создаем клиента для OAuth2 Proxy
General Settings:
Client type: OpenID Connector
Client ID: oauth2proxy # Понадобится при настройке OAuth2 Proxy
Capability config:
Client authentication: On
Authentication flow: Standard flow, Direct access grants, OAuth 2.0 Device Authorization Grant, OIDC CIBA Grant
Login settins:
Root URL: http://prometheus.itdraft.ru/
Home URL: http://prometheus.itdraft.ru/
Valid redirect URIs: http://prometheus.itdraft.ru/oauth2/callback
Сохраняемся, переходим в настройки созданного клиента
Копируем Client secret, он нам понадобится при настройке OAuth2 Proxy
Создаем Mapper
Client scopes > oauth2proxy-dedicated
Add mapper > By Configuration > Audience
Mapper type: Audience
Name: static audience
Included Client Audience: oauth2proxy
Included Custom Audience: oauth2proxy
Add to access token: On
Настройка клиента Keycloak завершена
Установка OAuth2 Proxy и настройка в режиме Reverce Proxy
Создаем пользователя и необходимые каталоги
$ sudo useradd -M -s /bin/false oauth2proxy $ sudo mkdir -p /opt/oauth2-proxy
Скачиваем финальную верcию OAuth2 Proxy, распаковываем её и переходим в каталог
$ wget https://github.com/oauth2-proxy/oauth2-proxy/releases/download/v7.4.0/oauth2-proxy-v7.4.0.linux-amd64.tar.gz $ tar xfz oauth2-proxy-v7.4.0.linux-amd64.tar.gz $ cd oauth2-proxy-v7.4.0.linux-amd64
Перемещаем исполняемый файл, меняем владельца файла
$ sudo cp oauth2-proxy /usr/local/bin/ $ sudo chown oauth2proxy. /usr/local/bin/oauth2-proxy
Генерим ключ, который затем пропишем в конфигурационном файле
$ openssl rand -base64 32 | tr -- '+/' '-_' YL8TS48lmrepWgfLERXmFp1TXXzUyXrB9FxoCqnBPfk=
Создаем конфигурационный файл oauth2-proxy.cfg
$ sudo nano /opt/oauth2-proxy/oauth2-proxy.cfg provider="keycloak-oidc" provider_display_name="Keycloak" client_id="oauth2proxy" # из настроек keycloak client_secret="AJZGOuYcLoFxrd5sgFDsScmrrhyS69s0" # из настроек keycloak redirect_url="http://prometheus.itdraft.ru/oauth2/callback" oidc_issuer_url="https://keycloak.itdraft.ru:8443/realms/myrealm" cookie_secure="false" cookie_secret="YL8TS48lmrepWgfLERXmFp1TXXzUyXrB9FxoCqnBPfk=" cookie_domains=[".itdraft.ru"] #upstreams=["http://127.0.0.1:9090/"] # My website server email_domains=["*"] http_address="127.0.0.1:4180" reverse_proxy="true" ssl_insecure_skip_verify="true" # пропускаем проверку ssl cookie_expire="30m" session_cookie_minimal="true" scope="openid" whitelist_domains=[".itdraft.ru"] insecure_oidc_allow_unverified_email="true" # Пропустить проверку валидности email
Меняем владельца файла
$ sudo chown oauth2proxy. /opt/oauth2-proxy/oauth2-proxy.cfg
Создаем системный юнит для OAuth2 Proxy
$ sudo nano /etc/systemd/system/oauth2-proxy.service [Unit] Description=oauth2-proxy daemon service After=syslog.target network.target [Service] # www-data group and user need to be created before using these lines User=oauth2proxy Group=oauth2proxy ExecStart=/usr/local/bin/oauth2-proxy --config=/opt/oauth2-proxy/oauth2-proxy.cfg ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=always [Install] WantedBy=multi-user.target
Перечитываем юниты, добавляем сервис а автозагрузку и запускаем его
$ sudo systemctl daemon-reload $ sudo systemctl enable --now oauth2-proxy $ sudo systemctl status oauth2-proxy
Установка и настройка Nginx
Добавляем репозиторий Nginx
$ sudo nano /etc/yum.repos.d/nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
Устанавливаем Nginx и отключаем дефолтный конфиг
$ sudo dnf -y install nginx $ cd /etc/nginx/conf.d/ $ sudo mv default.conf default.conf.disable
Создаем конфиг prometheus.conf
$ sudo nano /etc/nginx/conf.d/prometheus.conf server { listen 80; server_name _; location /oauth2/ { proxy_pass http://127.0.0.1:4180; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header X-Auth-Request-Redirect $request_uri; } location = /oauth2/auth { proxy_pass http://127.0.0.1:4180; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header Content-Length ""; proxy_pass_request_body off; } location ^~ /alertmanager/ { auth_request /oauth2/auth; error_page 401 = /oauth2/sign_in; auth_request_set $user $upstream_http_x_auth_request_user; auth_request_set $email $upstream_http_x_auth_request_email; proxy_set_header X-User $user; proxy_set_header X-Email $email; auth_request_set $auth_cookie $upstream_http_set_cookie; add_header Set-Cookie $auth_cookie; proxy_pass http://127.0.0.1:9093/; } location ^~ /prometheus/ { auth_request /oauth2/auth; error_page 401 = /oauth2/sign_in; auth_request_set $user $upstream_http_x_auth_request_user; auth_request_set $email $upstream_http_x_auth_request_email; proxy_set_header X-User $user; proxy_set_header X-Email $email; auth_request_set $auth_cookie $upstream_http_set_cookie; add_header Set-Cookie $auth_cookie; proxy_pass http://127.0.0.1:9090/; } }
Добавляем сервис Nginx в автозагрузку, запускаем его
$ sudo systemctl enable --now nginx $ sudo systemctl status nginx
Открываем порт 80/tcp
$ sudo firewall-cmd --permanent --zone=public --add-port=80/tcp $ sudo firewall-cmd --reload
Настройка Prometheus в режиме Reverce Proxy
Редактируем системный юнит
$ sudo nano /etc/systemd/system/prometheus.service [Unit] Description=Prometheus Time Series Collection and Processing Server Wants=network-online.target After=network-online.target [Service] User=prometheus Group=prometheus Type=simple ExecStart=/usr/local/bin/prometheus \ --config.file /opt/prometheus/prometheus.yml \ --storage.tsdb.path /var/lib/prometheus/ \ --web.console.templates=/opt/prometheus/consoles \ --web.console.libraries=/opt/prometheus/console_libraries \ --web.listen-address="127.0.0.1:9090" \ --web.external-url="http://prometheus.itdraft.ru/prometheus/" \ --web.route-prefix="/" [Install] WantedBy=multi-user.target
Перечитываем юниты, перезапускаем сервис
$ sudo systemctl daemon-reload $ sudo systemctl restart prometheus
Закрываем в файрволле порт 9090/tcp
$ sudo firewall-cmd --permanent --zone=public --remove-port=9090/tcp $ sudo firewall-cmd --reload
Настройка Alertmanager в режиме Reverce Proxy
Редактируем системный юнит
$ sudo nano /etc/systemd/system/alertmanager.service [Unit] Description=Alertmanager Service After=network.target prometheus.service [Service] EnvironmentFile=-/etc/default/alertmanager User=alertmanager Group=alertmanager Type=simple ExecStart=/usr/local/bin/alertmanager \ --config.file=/opt/alertmanager/alertmanager.yml \ --storage.path=/var/lib/alertmanager \ --web.listen-address="127.0.0.1:9093" \ --web.external-url="http://prometheus.itdraft.ru/alertmanager/" \ --web.route-prefix="/" $ALERTMANAGER_OPTS ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure [Install] WantedBy=multi-user.target
Перечитываем юниты, перезапускаем сервис
$ sudo systemctl daemon-reload $ sudo systemctl restart alertmanager
Закрываем в файрволле порт 9093/tcp
$ sudo firewall-cmd --permanent --zone=public --remove-port=9093/tcp $ sudo firewall-cmd --reload
Настройка завершена. Переходим на наш сайт, авторизуемся, получаем доступ



