Устанавливаем и настраиваем систему управления конфигурациями сетевого оборудования Oxidized

О важности регулярного копирования конфигурации сетевого оборудования мы говорить не будем, это очевидно. При этом резервное копирование должно быть системным и централизованным, с единой точкой контроля и управления. Также немаловажно не только делать резервные копии конфигурации сетевых устройств, но и иметь возможность контролировать изменения в них. Это способно сильно помочь при поиске неисправностей или при расследовании инцидентов. Мы предлагаем установить и использовать для этой цели Oxidized - простую систему управления конфигурациями с открытым исходным кодом.

Онлайн-курс по MikroTik
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

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

В нашем примере мы будем рассматривать работу Oxidized совместно с сетевым оборудованием Mikrotik, для установки мы использовали Ubuntu 22.04 LTS, однако данная инструкция подойдет для Debian 10 и новее, а также Ubuntu 18.04 LTS и новее.

Установка и настройка Oxidized

Oxidized написан на Ruby и поэтому его установка будет несколько отличаться от привычной пользователям DEB-систем. Начнем с установки необходимых зависимостей:

1apt install ruby ruby-dev libsqlite3-dev libssl-dev pkg-config cmake libssh2-1-dev libicu-dev zlib1g-dev g++ libyaml-dev

Также установим Git для хранения конфигураций и контроля изменений в них:

1apt install git

А теперь приступим к установке, собственно, Oxidized и необходимых зависимостей, для этого будет использоваться RubyGems - система управления пакетов для языка Ruby:

1gem install oxidized
2gem install oxidized-script oxidized-web
3gem install psych

Установка пакетов через RubyGems может занять некоторое время, поэтому наберитесь терпения.

Затем создадим пользователя oxidized:

1useradd -s /bin/bash -m oxidized

Затем перейдем в эту учетную запись и разово запустим oxydized, чтобы он сформировал необходимую структуру директорий и шаблон конфигурационного файла:

1su oxidized
2oxidized
3exit

Разработчики предлагают хранить конфигурационные файлы и данные в домашней директории пользователя oxidized и мы будем придерживаться этих рекомендаций. Откроем шаблон файла конфигурации ~oxidized/.config/oxidized/config и внесем в него некоторые изменения, параметры перечислены нами в порядке их следования в файле.

Также обращаем ваше внимание, что oxidized использует для конфигурационного файла формат YAML, а следовательно все отступы в нем следует делать только пробелами, допускается два или четыре пробела на отступ.

Прежде всего зададим имя и пароль по умолчанию с которыми oxidized будет соединяться с сетевыми устройствами. Рекомендуем использовать для этого отдельного пользователя с нестандартным именем, которого потом следует завести на всех сетевых устройствах.

1username: 0xidiZed
2password: Pa$$word

Затем укажем тип устройства по умолчанию, у нас это Mikrotik, поэтому:

1model: routeros

Остальные типы поддерживаемых устройств можно посмотреть в официальной документации:

Рекомендуем к прочтению

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

1interval: 86400

Таймаут по умолчанию имеет смысл увеличить, особенно если у вас много слабых устройств и медленные каналы, мы устанавливаем таймаут в 60 секунд и три повторных попытки:

1timeout: 60
2retries: 3

Если вы не хотите, чтобы резервные копии включали чувствительные данные, такие как ключи, пароли и т.п., то добавьте ниже опцию:

1remove_secret: true

Теперь опускаемся к секции input, которая отвечает за связь с устройствами. По умолчанию используются протоколы ssh и telnet, но последний устарел и небезопасен, поэтому приводим секцию к виду:

1input:
2  default: ssh

Секция output отвечает за хранение собранных с устройств информации, для этих целей мы будем использовать Git, поэтому она будет выглядеть следующим образом:

1output:
2   default: git
3   git:
4     user: oxidized
5     email: 1c@zaliv31.ru
6     repo: "/home/oxidized/.config/oxidized/devices.git"

Пользователя и адрес почты можете указать произвольно, последняя опция указывает на расположение Git-репозитория с данными, как было сказано выше, он будет также располагаться в домашней директории пользователя oxidized.

И, наконец, секция source определяет базу данных устройств, мы будем использовать CSV-файл с двоеточием в качестве разделителя:

 1source:
 2   default: csv
 3   csv:
 4     file: "/home/oxidized/.config/oxidized/router.db"
 5     delimiter: !ruby/regexp /:/
 6     map:
 7       name: 0
 8       ip: 1
 9       username: 2
10       password: 3
11       model: 4
12       port: 5

Здесь к важным параметрам относится опция file - путь к файлу с базой устройств и подсекция map, которая определяет в каком порядке в строке CSV файла перечисляются параметры подключения к устройству. Если какой-то параметр мы не задали, то он берется из глобальной конфигурации. В связи с этим мы используем собственную карту, но это не догма, можете делать как удобно вам.

Мы исходили из того, что имя и адрес устройства мы указываем всегда, поэтому они идут первыми. Следующая по частоте использовании опция - это отличные от дефолтных имя пользователя и пароль, затем уже тип устройства и нестандартный порт.

Сохраним файл конфигурации и займемся созданием базы устройств, создадим указанный в конфигурации файл и сразу откроем его на редактирование в nano, если вам больше нравится редактор MC, то замените nano на mcedit:

1nano ~oxidized/.config/oxidized/router.db

Внутри этого файла задаем указанные в подсекции map параметры, разделяя двоеточием. В самом простом варианте запись будет выглядеть так:

1Router_Office:192.168.150.1

Мы указали только имя и адрес, остальные параметры будут использованы из глобальной конфигурации.

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

1Router_Office:192.168.150.1:username:password

А если нужно указать другой тип устройства, но с теми же учетными данными. то просто ставим нужное количество двоеточий:

1Router_Sklad:192.168.150.1:::dlink

Каждое двоеточие отделяет параметры, если между ними ничего нет, то будет подставлен параметр по умолчанию.

Сохраняем файл базы данных устройств.

Следующим шагом создадим юнит Systemd для работы в качестве службы, для этого скопируем готовый шаблон:

1cp /var/lib/gems/3.0.0/gems/oxidized-0.29.1/extra/oxidized.service /etc/systemd/system

Обратите внимание, что путь содержит номер версии продукта, поэтому, возможно, его придется уточнить.

Перечитаем содержимое юнитов Systemd:

1systemctl daemon-reload

Создадим директорию в /run:

1mkdir /run/oxidized

И сделаем oxidized ее владельцем:

1chown oxidized:oxidized /run/oxidized

Теперь добавим службу в автозагрузку:

1systemctl enable oxidized

И запустим ее:

1systemctl start oxidized

Проверить работу службы можно командой:

1systemctl status oxidized

А также убедимся, что она работает на порту 8888 локального узла.

1ss -tpln

Если вы получили аналогичный результат, то oxidized был успешно установлен и работает.

Настройка NGINX как обратного прокси

Ну вот, oxidized запущен и работает, а как получить к нему доступ? Дело в том, что разработчики сосредоточились только на системе управления конфигурациями и не реализовали никаких механизмов контроля доступа, поэтому будет лучше, если oxidized будет работать только на локальном узле, а во внешний мир будет смотреть через NGINX, прежде всего установим его:

1apt install nginx

Так как других веб-служб здесь не предполагается, то просто перезапишем конфигурацию NGINX по умолчанию из шаблона oxidized:

1cat /var/lib/gems/3.0.0/gems/oxidized-0.29.1/extra/oxidized.nginx > /etc/nginx/sites-available/default

Перезапустим NGINX:

1nginx -s reload

Теперь можем набрать в браузере адрес узла с oxidized и попадем в его веб-интерфейс.

Он довольно прост, но понятен и все необходимое в нем есть. Отсюда же можно скачать файл конфигурации, просмотреть изменения или принудительно выполнить резервное копирование - за это отвечают три кнопки в колонке Actions. Давайте посмотрим, как это работает, внесем какие-нибудь изменения в конфиг и заново прочитаем его. Теперь нам доступен просмотр изменений.

При этом сравнить выбранную версию конфигурации можно не только с предыдущей, но и с любой другой. Для этого выбираем нужную версию в выпадающем списке и нажимаем Get Diffs! Это очень удобно если вам нужно выяснить кем и когда были внесены некоторые изменения.

Настройка TLS-защиты

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

Так как наш сервис внутренний, то можно обойтись самоподписанным сертификатом:

1openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/oxidized-selfsigned.key -out /etc/ssl/certs/oxidized-selfsigned.crt

Указанная выше команда выпустит самоподписанный сертификат на 10 лет. При выпуске сертификата желательно указать в поле CN реальное FQDN имя сервера, даже локальное, скажем oxi.it-31.lab.

Также сразу создадим файл параметров Диффи-Хеллмана:

1openssl dhparam -out /etc/ssl/private/dhparam.pem 2048

Теперь откроем файл /etc/nginx/sites-available/default и изменим существующую секцию следующим образом:

1server {
2   listen 80;
3   server_name oxi.it-31.lab;
4   return 301 https://$host$request_uri;
5}

Ниже добавим секцию:

 1server {
 2   listen 443 ssl http2;
 3   server_name oxi.it-31.lab;
 4
 5   ssl_certificate /etc/ssl/certs/oxidized-selfsigned.crt;
 6   ssl_certificate_key /etc/ssl/private/oxidized-selfsigned.key;
 7   ssl_session_timeout 1d;
 8   ssl_session_cache shared:SSL:50m;
 9   ssl_session_tickets off;
10   ssl_dhparam /etc/ssl/private/dhparam.pem;
11
12   ssl_protocols TLSv1.2 TLSv1.3;
13   ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
14   ssl_prefer_server_ciphers off;
15
16   location / {
17       proxy_pass http://127.0.0.1:8888/;
18    }
19
20   access_log /var/log/nginx/access_oxidized.log;
21   error_log /var/log/nginx/error_oxidized.log;
22}

Проверяем конфигурацию NGINX и перезапускаем его:

1nginx -t
2nginx -s reload

Теперь снова открываем веб-интерфейс и убеждаемся, что соединение зашифровано:

Предупреждения красным можем проигнорировать, это издержки самоподписанного сертификата, главное - два пункта внизу, страница шифруется при помощи TLS 1.3 шифром AES-128 и включена совершенная прямая секретность на основе эллиптической кривой Curve25519.

Настраиваем аутентификацию доступа

И завершающая часть - настройка аутентификации доступа. Для этого установим пакетap apache2-utils:

1apt install apache2-utils

Теперь создадим базу пользователей, первого пользователя заводим с использованием ключа , в этом случае будет создан новый файл паролей, а существующий перезаписан:

1htpasswd -c /etc/nginx/.htpasswd user1

Для следующих пользователей используйте команду:

1htpasswd /etc/nginx/.htpasswd user2

Теперь снова откроем /etc/nginx/sites-available/default и приведем секцию location / к следующему виду:

1location / {
2    auth_basic "Administrator's Area";
3    auth_basic_user_file /etc/nginx/.htpasswd;
4    proxy_pass http://127.0.0.1:8888/;
5 }

Перезапустим NGINX:

1nginx -s reload

И снова попробуем зайти в веб-интерфейс, теперь у нас это не получится без ввода логина и пароля.

Для удаления пользователя из базы используйте:

1htpasswd -D /etc/nginx/.htpasswd user2

Перезапуск веб-сервера после манипуляций с базой пользователей не требуется.

Надеемся данный материал окажется вам полезен и поможет быстро установить, настроить и начать использовать Oxidized.

Онлайн-курс по MikroTik
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал