Так как я не нашел в сети полную инструкцию по настройке авторизации в 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
На данном этапе мы должны иметь следующую информацию:
LibreNMS client id
LibreNMS client secret
Keycloak server address
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)
selivanov_pavel
11.07.2024 19:28+1Чем это лучше/хуже Zabbix, который тоже умеет автодискавери и работу с сетевым оборудованием?
ugenk
11.07.2024 19:28+2Обсервиум и деривативы удобнее наличием готовых скриптов и шаблонов для типового оборудования. Но если куда-то за пределы готового - то или патчить librenms как автор, или покупать платный обсервиум.
Заббикс классный, если есть время на него, и ресурсы (обсервиум и деривативы умещаются в 1 cpu 512 ram для инсталляции на 40 девайсов. Заббикс таким минимализмом похвастать не сможет имхо.
Kil1J0y
11.07.2024 19:28Почему keycloak а не authentik, как написал товарищ выше librenms php/sql base monitoring, так чем это лучше или хуже связки с grafana? Если zabbix это сложный и тяжёлый продукт подходящий не для всех.
geolaz Автор
11.07.2024 19:28+1Почему keycloak а не authentik
По двум причинам
Keycloak уже используется в компании и переход на другого провайдера не планируется
инструкция по настройке Authentik в сети уже есть, частично оттуда я и брал информацию и адаптировал под Keycloak
чем это лучше или хуже связки с grafana
Это лишь туториал по настройке в конкретных условиях, а не обзорная статья или сравнение разных систем мониторинга
Olegun
Почему автор скрывает, что - LibreNMS is an autodiscovering PHP/MySQL-based network monitoring system?