Авторизация в Prometheus и Alertmanager через OAuth2 Proxy и Keycloak
OAuth2 Proxy — это обратный прокси-сервер, который находится перед вашим приложением и обеспечивает аутентификацию OpenID Connect / OAuth 2.0 с использованием провайдеров идентификации (Google, GitHub, Keycloak и других).
- Установка Keycloak была рассмотрена в одной из предыдущей статей
Установку Prometheus, Alertmanager и OAuth2 Proxy произвожу на одной ВМ под управлением Rocky Linux 9, по этому для начала либо настраиваем SELinux, либо отключаем его (выбрал второй вариант)
1
2
$ sudo grubby --update-kernel ALL --args selinux=0
$ sudo setenforce 0
Установка Prometheus
Создаем пользователя и необходимые каталоги
1
2
$ sudo useradd -M -s /bin/false prometheus
$ sudo mkdir /opt/prometheus /var/lib/prometheus
Скачиваем финальную версию Prometheus, распаковываем её и переходим в каталог
1
2
3
$ 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
Перемещаем исполняемые файлы, меняем владельца на каталоги и файлы
1
2
3
4
$ 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}
Создаем Systemd Unit для Prometheus
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ 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
Перечитываем Systemd Unit, добавляем сервис а автозагрузку и запускаем его
1
2
3
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now prometheus
$ sudo systemctl status prometheus
Открываем порт 9090/tcp
1
2
$ sudo firewall-cmd --permanent --zone=public --add-port=9090/tcp
$ sudo firewall-cmd --reload
Чуть дальше Prometheus запустим в режиме Reverse proxy
, это правило удалим
Установка Alertmanager
Создаем пользователя и необходимые каталоги
1
2
$ sudo useradd -M -s /bin/false alertmanager
$ sudo mkdir /opt/alertmanager /var/lib/alertmanager
Скачиваем финальную версию Alertmanager, распаковываем её и переходим в каталог
1
2
3
$ 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
Перемещаем исполняемые файлы, меняем владельца на каталоги и файлы
1
2
3
4
$ 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}
Создаем Systemd Unit для Alertmanager
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ 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
Перечитываем Systemd Unit, добавляем сервис а автозагрузку и запускаем его
1
2
3
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now alertmanager
$ sudo systemctl status alertmanager
Открываем порт 9093/tcp
1
2
$ sudo firewall-cmd --permanent --zone=public --add-port=9093/tcp
$ sudo firewall-cmd --reload
Чуть дальше Alertmanager запустим в режиме Reverse proxy, это правило удалим
Настройка Keycloak
Версия Keycloak: 21.0.0
Переходим в нужную область (realm
). Создаем клиента для OAuth2 Proxy
1
2
3
General Settings:
Client type: OpenID Connector
Client ID: oauth2proxy # Понадобится при настройке OAuth2 Proxy
1
2
3
Capability config:
Client authentication: On
Authentication flow: Standard flow, Direct access grants, OAuth 2.0 Device Authorization Grant, OIDC CIBA Grant
1
2
3
4
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
1
Client scopes > oauth2proxy-dedicated
1
Add mapper > By Configuration > Audience
1
2
3
4
5
Mapper type: Audience
Name: static audience
Included Client Audience: oauth2proxy
Included Custom Audience: oauth2proxy
Add to access token: On
Настройка клиента Keycloak завершена
Установка OAuth2 Proxy и настройка в режиме Reverse Proxy
Создаем пользователя и необходимые каталоги
1
2
$ sudo useradd -M -s /bin/false oauth2proxy
$ sudo mkdir -p /opt/oauth2-proxy
Скачиваем финальную версию OAuth2 Proxy, распаковываем её и переходим в каталог
1
2
3
$ 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
Перемещаем исполняемый файл, меняем владельца файла
1
2
$ sudo cp oauth2-proxy /usr/local/bin/
$ sudo chown oauth2proxy. /usr/local/bin/oauth2-proxy
Генерим ключ, который затем пропишем в конфигурационном файле
1
2
$ openssl rand -base64 32 | tr -- '+/' '-_'
YL8TS48lmrepWgfLERXmFp1TXXzUyXrB9FxoCqnBPfk=
Создаем конфигурационный файл oauth2-proxy.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ 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
Меняем владельца файла
1
$ sudo chown oauth2proxy. /opt/oauth2-proxy/oauth2-proxy.cfg
Создаем Systemd Unit для OAuth2 Proxy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ 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
Перечитываем Systemd Unit, добавляем сервис а автозагрузку и запускаем его
1
2
3
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now oauth2-proxy
$ sudo systemctl status oauth2-proxy
Установка и настройка Nginx
Добавляем репозиторий Nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ 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 и отключаем дефолтный конфиг
1
2
3
$ sudo dnf -y install nginx
$ cd /etc/nginx/conf.d/
$ sudo mv default.conf default.conf.disable
Создаем конфиг prometheus.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$ 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 в автозагрузку, запускаем его
1
2
$ sudo systemctl enable --now nginx
$ sudo systemctl status nginx
Открываем порт 80/tcp
1
2
$ sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
$ sudo firewall-cmd --reload
Настройка Prometheus в режиме Reverse Proxy
Редактируем Systemd Unit Prometheus
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ 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
Перечитываем Systemd Unit, перезапускаем сервис
1
2
$ sudo systemctl daemon-reload
$ sudo systemctl restart prometheus
Закрываем в Firewall порт 9090/tcp
1
2
$ sudo firewall-cmd --permanent --zone=public --remove-port=9090/tcp
$ sudo firewall-cmd --reload
Настройка Alertmanager в режиме Reverse Proxy
Редактируем Systemd Unit Alertmanager
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ 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
Перечитываем Systemd Unit, перезапускаем сервис
1
2
$ sudo systemctl daemon-reload
$ sudo systemctl restart alertmanager
Закрываем в Firewall порт 9093/tcp
1
2
$ sudo firewall-cmd --permanent --zone=public --remove-port=9093/tcp
$ sudo firewall-cmd --reload
Настройка завершена. Переходим на наш сайт, авторизуемся, получаем доступ