Практическое применение сервера FreeACS для обслуживания устройств Mikrotik по протоколу TR-069 (часть 1)

от автора

Данная статья является логическим продолжением экспериментов с тестовым сервером FreeACS. Тогда я влюбился в этот инструмент, и обещал немногочисленным комментаторам довести дело до продакшн. Так что, сегодня мы установим сервер, настроим до рабочего состояния и прикрутим ssl-сертификат. А во второй части — разберем настройки и режимы, прогоним основные рабочие сценарии обслуживания устройств Mikrotik и слегка коснемся автоконфигурации IP-телефонов.

Перед стартом, хочу кратко напомнить основные постулаты:

1. Протокол TR-069 используется десятками миллионов устройств, и, де факто, является стандартом для обновления ПО, диагностики и конфигурации сетевого оборудования. В документации FreeACS, необходимые системные требования к серверу начинаются с 50 тыс. обслуживаемых устройств, и заканчиваются на 2 млн. Это могучий специализированный инструмент.

2. Системы управления конфигурациями (SCM), такие как Ansible, могут быть использованы, в том числе, для удаленного выполнения команд и скриптов в RouterOS, но не являются альтернативой ACS.

3. Проблемы безопасности TR-069 кратко описаны здесь, и состоят в том, что протокол предполагает использование шифрования, но не обязывает. Поэтому 80% устройств передают данные открыто, а часть использует самоподписанные сертификаты. Не надо так.

Часть1. Установка FreeACS + SSL

0. Подготовка

Ресурсы: Минимум 4 GB RAM, 10 GB HDD, Centos 7/8

Домен: Сервер будет доступен из Интернет, поэтому необходимо купить домен или добавить DNS-запись поддомена, указывающую на внешний ip-адрес FreeACS. И соответственно настроить FQDN имя хоста.

Сертификат: Если у вас уже есть рабочий домен и доступен какой-то из способов проверки подлинности сертификата — можно сразу выпустить сертификат. Я использовал самый дешевый Sectigo Positive SSL, доступный повсеместно за 500-1000 руб./год
Если рабочего домена нет — выпустим сертификат после установки сервера, с проверкой по Хэш-файлу. Идеи с Letsencrypt и иже с ним — «экономия на спичках».

1. Установка FreeACS

Как и в предыдущей статье, проще всего это сделать скриптом.

wget https://raw.githubusercontent.com/freeacs/freeacs/master/scripts/install_centos.sh chmod +x install_centos.sh ./ install_centos.sh

Скрипт установит все необходимое. Останется лишь немного доработать.

# Установить часовой пояс  timedatectl set-timezone Asia/Novosibirsk # Установить Xorg-fonts. Без этого, в веб-интерфейсе не будет графиков yum -y install xorg-x11-fonts-misc # MySQL часовой пояс и лимиты. Без этого в веб-интерфейсе будет UTC и файлы не загрузятся # /etc/my.cnf default-time-zone='+07:00' max_allowed_packet=32M innodb_buffer_pool_size=1024M

Проверьте работу веб-интерфейса по http://<серый адрес хоста>, смените дефолтный пароль и можно ехать дальше

2. Nginx

Пора настроить Nginx. Если вы еще не получили сертификат — давайте его получать и подтверждать.

Например, вы купили домен mydomain.ru, настроили DNS запись acs и заказали сертификат для acs.mydomain.ru с подтверждением владения по Хэш-файлу.

Поставщик предоставит информацию, типа:

Хеш файл должен быть доступен по адресу: http://mydomain.ru/.well-known/pki-validation/5C7E984684D01FAF787171DB395A6F4A.txt Содержимое файла: 75D5AB94B09B408A2A7DD93696BA69B736CA8A5E0DFD80DBB45186EF70AB1A77 comodoca.com

Т.е. проверка сертификата поддомена acs проходит через подтверждение владением доменом 2-го уровня, и если на нем у вас уже есть какой-то веб-ресурс, то файл надо разместить там.
Если такого нет, то Хэш-файл можно разместить на сервере с FreeACS, предварительно изменив DNS-запись mydomain.ru. Надо создать директорию с данным файлом:

mkdir -p /var/www/.well-known/pki-validation vi /var/www/.well-known/pki-validation/5C7E984684D01FAF787171DB395A6F4A.txt #сюда аккуратно скопировать содержимое 

И добавить дополнительную секцию server в конфиге Nginx. Удобно сделать нестандартный порт, чтобы потом открыть наружу по http только нужное

 # /etc/nginx.conf ...  server {     listen       8044;     server_name  mydomain.ru;      location /.well-known/pki-validation/ {     root /var/www/;      } ... 

После рестарта Nginx и проброса 80 внешнего порта на порт 8044 хоста FreeACS, файл .http://mydomain.ru/.well-known/pki-validation/5C7E984684D01FAF787171DB395A6F4A.txt должен быть виден из интернета. А значит, как только пройдет проверка, поставщик выдаст вам сертификат, цепочку промежуточных сертификатов и закрытый ключ. Будет что-то типа acs_mydomain_ru.crt, acs_mydomain_ru.ca-bundle и 11005566.key

Для Nginx сертификаты надо слепить, ключ переименовать, и оба файла положить в /etc/pki

cat acs_mydomain_ru.crt acs_mydomain_ru.ca-bundle > acs_mydomain_ru.chained.crt mv 11005566.key acs_mydomain_ru.key cp acs_mydomain_ru.chained.crt /etc/pki cp acs_mydomain_ru.key /etc/pki

Теперь добавим ssl в конфиг Nginx. Порт для проксирования TR-069 будет тоже нестандартным 8099.

На данном этапе, весь конфиг будет выглядеть как-то так:

events {   worker_connections  19000; }  http {  client_max_body_size 32m;    server {     listen       8099 ssl;     server_name  acs.mydomain.ru;          # SSL         ssl_certificate /etc/pki/acs_mydomain_ru.chained.crt ;         ssl_certificate_key /etc/pki/acs_mydomain_ru.key;         ssl_session_cache shared:SSL:10m;         ssl_session_timeout 10m;         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;         ssl_ciphers HIGH:!aNULL:!MD5;         ssl_prefer_server_ciphers on;          #ssl connections for CPE        location /tr069/ {               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;       proxy_set_header HTTPS YES;       proxy_headers_hash_max_size 512;       proxy_headers_hash_bucket_size 128;       proxy_pass http://localhost:8085/tr069/;    }  }   server {     #SSL hash check     listen       8044;     server_name  mydomain.ru;          location /.well-known/pki-validation/ {       root /var/www/;      } }    server {     listen       80;     server_name  10.110.0.117;      location = / {       return 301 /web/index;       proxy_headers_hash_max_size 512;       proxy_headers_hash_bucket_size 128;     }     location /tr069/ {       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;       proxy_headers_hash_max_size 512;       proxy_headers_hash_bucket_size 128;       proxy_pass http://localhost:8085/tr069/;     }     location /web/ {       proxy_pass http://localhost:8081/web/;       proxy_headers_hash_max_size 512;       proxy_headers_hash_bucket_size 128;     }     location /monitor/ {       proxy_pass http://localhost:8090/monitor/;     }     location /webservice/ {       proxy_pass http://localhost:8088/webservice/;     }     location /syslog/ {       proxy_pass http://localhost:8086/syslog/;     }     location /core/ {       proxy_pass http://localhost:8083/core/;     }     location /stun/ {       proxy_pass http://localhost:8087/stun/;     }   } } 

Перезапускаем Nginx. Пробрасываем 8099 на хост с FreeACS. Теперь у нас есть сервер, который может обслуживать клиентов TR-069 по адресу: .https://acs.mydomain.ru:8099/tr069/prov
Откройте этот адрес в браузере из Интернет. Если в ответ выдается 404 с валидным сертификатом, то пора пробовать подключать устройства.

Для начала надо включить автоопределение моделей устройств.

#/opt/freeacs-tr069/config/application-config.conf  # Discovery Mode can be set to true if you want to automatically add a new # unittype and unit. This mode is violating the security of the system, # because it allows unknown units to connect and then changes will be performed # in the database. So use this option with caution, preferably when you want to # add a new unittype to the system. Default is false. #discovery.mode = false discovery.mode = true 

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

На вашем пробном Mikrotik надо импортировать сертификат, который мы делали для Nginx — acs_mydomain_ru.chained.crt в System/Certificates/Import.
Затем поставить пакет tr069-client и указать ACS URL: .https://acs.mydomain.ru:8099/tr069/prov Username:<серийный номер>. И готово.

По нажатию Apply, устройство соединится с сервером по https, в окошке изменится Periodic inform interval, а на сервере появится новый Unit type и, соответственно, Unit

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

Спасибо всем, кто читал. Буду рад любым комментариям и поправкам.


ссылка на оригинал статьи https://habr.com/ru/articles/584894/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *