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

ac6c130b17ba8d06ba06ed4c56050a0a.png

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

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

>
     */
    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:

  • Client authentication: On

  • Root URL:

  • Home URL:

  • Valid redirect URIs: /*

  • Valid post logout redirect URIs: /*

  • Web origins:

    И нажимаем 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 
docker compose -f compose.yml exec librenms lnms config:set auth.socialite.configs.keycloak.client_secret 
docker compose -f compose.yml exec librenms lnms config:set auth.socialite.configs.keycloak.base_url 
docker compose -f compose.yml exec librenms lnms config:set auth.socialite.configs.keycloak.realms 
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.

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

© Habrahabr.ru