Установка и настройка 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
со следующим содержимым
>
*/
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
На данном этапе мы должны иметь следующую информацию:
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
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.
Если у вас есть какие-то исправления и дополнения — жду в комментариях.