Так как я не нашел в сети полную инструкцию по настройке авторизации в 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.

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

Комментарии (5)


  1. Olegun
    11.07.2024 19:28
    +4

    Почему автор скрывает, что - LibreNMS is an autodiscovering PHP/MySQL-based network monitoring system?


  1. selivanov_pavel
    11.07.2024 19:28
    +1

    Чем это лучше/хуже Zabbix, который тоже умеет автодискавери и работу с сетевым оборудованием?


    1. ugenk
      11.07.2024 19:28
      +2

      Обсервиум и деривативы удобнее наличием готовых скриптов и шаблонов для типового оборудования. Но если куда-то за пределы готового - то или патчить librenms как автор, или покупать платный обсервиум.

      Заббикс классный, если есть время на него, и ресурсы (обсервиум и деривативы умещаются в 1 cpu 512 ram для инсталляции на 40 девайсов. Заббикс таким минимализмом похвастать не сможет имхо.


  1. Kil1J0y
    11.07.2024 19:28

    Почему keycloak а не authentik, как написал товарищ выше librenms php/sql base monitoring, так чем это лучше или хуже связки с grafana? Если zabbix это сложный и тяжёлый продукт подходящий не для всех.


    1. geolaz Автор
      11.07.2024 19:28
      +1

      Почему keycloak а не authentik

      По двум причинам

      1. Keycloak уже используется в компании и переход на другого провайдера не планируется

      2. инструкция по настройке Authentik в сети уже есть, частично оттуда я и брал информацию и адаптировал под Keycloak

      чем это лучше или хуже связки с grafana

      Это лишь туториал по настройке в конкретных условиях, а не обзорная статья или сравнение разных систем мониторинга