Установка и настройка LibreNMS в Docker с авторизацией через Keycloak

от автора

Так как я не нашел в сети полную инструкцию по настройке авторизации в LibreNMS через Keycloak, я решил написать её сам. И себе на память и страждущим на радость.

Установка Docker

Я не буду описывать установку Docker, она весьма доходчиво и лаконично описана на официальном сайте, просто выберите свою систему. Все дальнейшие пункты не будут зависеть от вашей хостовой ОС.

Установка LibreNMS

Скачиваем и распаковываем необходимые файлы

mkdir -p /opt/librenms cd /opt/librenms wget https://github.com/librenms/docker/archive/refs/heads/master.zip unzip master.zip cd docker-master/examples/composeс

Задаем пароль базы данных (не забудьте ввести настоящий пароль)

sed -i "s|MYSQL_PASSWORD=asupersecretpassword|MYSQL_PASSWORD=<тут_ваш_настоящий_пароль>|" .env

Пока не запускаем, сначала нужно внести кое-какие правки

Настройка LibreNMS

Создаем директорию для кастомного Dockerfile и сам файл

mkdir -p docker nano docker/Dockerfile

Содержимое Dockerfile должно быть таким

FROM librenms/librenms:latest RUN apk --update --no-cache add -t build-dependencies php-xmlwriter 2>&1 | tee -a keycloak.log \  && cd /opt/librenms/ \  && chmod 777 /opt/librenms/composer.* \               /opt/librenms/logs/librenms.log \               /opt/librenms/scripts/composer_wrapper.php \  && chmod 777 /opt/librenms/scripts \               /opt/librenms \               /opt/librenms/vendor/socialiteproviders \               /opt/librenms/vendor/composer \               /opt/librenms/vendor/composer/* \               /opt/librenms/bootstrap/* \  && lnms plugin:add socialiteproviders/keycloak COPY EventServiceProvider.php /opt/librenms/app/Providers/EventServiceProvider.php

затем в той же директории создаем файл EventServiceProvider.php

nano docker/EventServiceProvider.php

со следующим содержимым

<?php  namespace App\Providers;  use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;  class EventServiceProvider extends ServiceProvider {     /**      * The event listener mappings for the application.      *      * @var array<string, array<int, string>>      */     protected $listen = [         \Illuminate\Auth\Events\Login::class => ['App\Listeners\AuthEventListener@login'],         \Illuminate\Auth\Events\Logout::class => ['App\Listeners\AuthEventListener@logout'],         \App\Events\UserCreated::class => [             \App\Listeners\MarkNotificationsRead::class,         ],         \App\Events\PollingDevice::class => [         ],         \App\Events\DevicePolled::class => [             \App\Listeners\CheckAlerts::class,             \App\Listeners\UpdateDeviceGroups::class,         ],         \Illuminate\Database\Events\QueryExecuted::class => [             \App\Listeners\QueryDebugListener::class,             \App\Listeners\QueryMetricListener::class,         ],         \Illuminate\Database\Events\StatementPrepared::class => [             \App\Listeners\LegacyQueryListener::class,         ],         \SocialiteProviders\Manager\SocialiteWasCalled::class => [             \SocialiteProviders\Keycloak\KeycloakExtendSocialite::class.'@handle',             \App\Listeners\SocialiteWasCalledListener::class,         ],     ];      /**      * Register any events for your application.      *      * @return void      */     public function boot(): void     {         //     }      /**      * Determine if events and listeners should be automatically discovered.      *      * @return bool      */     public function shouldDiscoverEvents(): bool     {         return false;     } }

Наконец вносим правку в файл compose.yml

находим строчки

  librenms:     image: librenms/librenms:latest

и меняем на

  librenms:     build:       context: ./docker

после этого можно запустить контейнеры

docker compose -f compose.yml up -d

Заходим в веб-интерфейс. Ваш инстанс будет доступен по адресу вашего хоста на порту 8000

При первом входе потребуется создать локального админа. Там ничего сложного, так что подробно останавливаться не буду, но прежде чем переходить к настройке Keycloak, пара слов о настройке Nginx

Настройка Nginx

В целом здесь ничего сложного, достаточно установить Nginx и добавить вот такой конфиг:

server {     listen              80;     server_name         librenms.example.com;     location / {         proxy_pass http://localhost:8000/;         proxy_set_header Host $host;         proxy_set_header X-Real-IP $remote_addr;         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;         proxy_set_header X-Forwarded-Proto $scheme;     } }

По желанию можно так же настроить SSL-сертификаты.

Настройка клиента в Keycloak

Предполагается, что Keycloak у вас уже установлен и настроен. Если нет — в официальной документации полно информации об этом.

Заходим в веб-интерфейс Keycloak, выбираем нужный рилм, переходим в Clients и нажимаем Create client

Заполняем все необходимые поля, а именно:

  • Client type: OpenID Connect

  • Client ID: <librenms_client_id>

  • Client authentication: On

  • Root URL: <libre_nms_url>

  • Home URL: <libre_nms_url>

  • Valid redirect URIs: <libre_nms_url>/*

  • Valid post logout redirect URIs: <libre_nms_url>/*

  • Web origins: <libre_nms_url>

    И нажимаем Save

После этого открываем созданного клиента, переходим на вкладку Credentials и копируем Client secret

Так же можно создать пользователей и группы, например lnms_access_user и lnms_access_admin, впоследствии по этим группам будет определяться уровень доступа в самом LibreNMS

На данном этапе мы должны иметь следующую информацию:

  1. LibreNMS client id

  2. LibreNMS client secret

  3. Keycloak server address

  4. Keycloak realm name

Настройка провайдера в LibreNMS

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

docker compose -f compose.yml exec librenms lnms plugin:add socialiteproviders/keycloak docker compose -f compose.yml exec librenms lnms config:set auth.socialite.configs.keycloak.client_id <librenms_client_id> docker compose -f compose.yml exec librenms lnms config:set auth.socialite.configs.keycloak.client_secret <librenms_client_secret> docker compose -f compose.yml exec librenms lnms config:set auth.socialite.configs.keycloak.base_url <keycloak_server_address> docker compose -f compose.yml exec librenms lnms config:set auth.socialite.configs.keycloak.realms <keycloak_realm> docker compose -f compose.yml exec librenms lnms config:set auth.socialite.configs.keycloak.listener "\SocialiteProviders\Keycloak\KeycloakExtendSocialite"

После этого авторизация уже будет работать, но остается ещё пара штрихов. С помощью созданной нами локальной учётки нужно зайти в веб интерфейс LibreNMS -> Global settings -> Authentication -> Socialite Settings и сделать следующие настройки

Разрешаем регистрацию пользователей через провайдера

Разрешаем регистрацию пользователей через провайдера
Вводим какие поля нам необходимы и задаем соответствие групп

Вводим какие поля нам необходимы и задаем соответствие групп

Это нужно для того, чтобы соответствующие права присваивались пользователю автоматически.

На этом всё. Можно логиниться через Keycloak.

Если у вас есть какие-то исправления и дополнения — жду в комментариях.


ссылка на оригинал статьи https://habr.com/ru/articles/828308/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *