Хочу помочь коллеге развернуть сервисы исключительно на самом последнем LTS релизе дистрибутива Ubuntu, а именно на момент написания заметки это Ubuntu 22.04 Server. И в качестве первого из них выступит сервис зеркала обновлений ESET NOD32. Обязательно нужно иметь действующий аккаунт лицензионного ключа nod32. Я придерживаюсь правила, что для рабочих станций можно использовать дистрибутив ESET Endpoint Antivirus версии 5.0.2271.3 (обновления скачиваются с развернутого зеркала, настройки следят за работой системы, дистрибутив не нагружает систему).

Сперва проработаю развертывание как связку OS (Ubuntu 22.04 Server + сервис), а потом отдельно как контейнер docker.

Шаг №1: Устанавливаю в систему необходимые пакеты для зеркала обновлений nod32:

ekzorchik@srv-us2204a:~$ sudo apt-get -y install nginx unrar curl unzip mc mercurial net-tools

ekzorchik@srv-us2204a:~$ sudo rm -f /var/www/html/index.nginx-debian.html

Шаг №2: Скачиваю либо из интернета, либо из своего локального хранилища пакет nod32mirror

ekzorchik@srv-us2204a:~$ wget https://lin.ekzorchik.ru/wp-content/uploads/2021/11/master18012020.zip

Шаг №3: Распаковываю и копирую нужные каталоги в место где есть корневой каталог Webсервиса nginx:

ekzorchik@srv-us2204a:~$ unzip master18012020.zip

ekzorchik@srv-us2204a:~$ mv nod32-update-mirror-master/ nod32

ekzorchik@srv-us2204a:~$ sudo mkdir /var/www/html/nod32

ekzorchik@srv-us2204a:~$ sudo cp -r nod32/nginx/html/* /var/www/html/nod32/

ekzorchik@srv-us2204a:~$ sudo chown -R www-data:www-data /var/www/html/

Шаг №4: Производим настройку файлов зеркала обновлений nod32:

ekzorchik@srv-us2204a:~$ sudo mkdir /etc/nod32

ekzorchik@srv-us2204a:~$ sudo cp nod32/src/nod32-mirror.sh /etc/nod32/

ekzorchik@srv-us2204a:~$ sudo cp -r nod32/src/include/ /etc/nod32/

ekzorchik@srv-us2204a:~$ sudo cp nod32/src/settings.conf /etc/nod32/

ekzorchik@srv-us2204a:~$ sudo chmod +x /etc/nod32/nod32-mirror.sh

ekzorchik@srv-us2204a:~$ sudo mv /etc/nod32/settings.conf /etc/nod32/settings.conf.backup

ekzorchik@srv-us2204a:~$ sudo nano /etc/nod32/settings.conf

export NOD32MIRROR_DEBUG_MODE=0;

export NOD32MIRROR_USE_FREE_KEY=0;

export NOD32MIRROR_MIRROR_DIR="/var/www/html/nod32";

export NOD32MIRROR_SERVER_0='http://update.eset.com:80/eset_upd/ EAV-логин EAV-пароль';

export NOD32MIRROR_LANGUAGES='1033 1049';

export NOD32MIRROR_VERSIONS='pcu 5';

export NOD32MIRROR_LOG_PATH="/var/log/nod32/nod32mirror.log";

export NOD32MIRROR_CURL_BIN='false';

export NOD32MIRROR_TEST_URI='http://update.eset.com:80/v8-rel-sta/mod_010_smon_1036/em010_32_l0.nup';

export NOD32MIRROR_TIMESTAMP_FILE_NAME='lastevent.txt';

export NOD32MIRROR_VERSION_FILE_NAME='version.txt';

Шаг №5: Наполняем свое зеркало обновления для используемой версии антивируса на рабочем месте:

ekzorchik@srv-us2204a:~$ sudo /etc/nod32/nod32-mirror.sh -u

[09:31:06] Checking server (http://update.eset.com:80/eset_upd/ [EAV-0293046026:**********]).. Available

[09:31:07] Starting mirroring "http://update.eset.com:80/eset_upd/" -> "/var/www/html/nod32"

[09:31:07] Download versions file (http://update.eset.com:80/eset_upd/update.ver).. Success

[09:31:07] Parsing & writing new (/var/www/html/nod32/update.ver) versions file

ожидаю закачки файлов обновления….

[09:37:05] Download file "http://update.eset.com:80/ep5-rel-sta/mod_045_ssl_1070/em045_32_l1.nup" (83 of 83).. Success

[09:37:06] Mirroring "http://update.eset.com:80/eset_upd/v5/" -> "/var/www/html/nod32/v5" complete!

[09:37:06] Successfully downloaded files: 83, skipped: 0, with errors: 0

[09:37:06] Timestamp file created (lastevent.txt)

[09:37:06] Total updates (*.nup) files count: 152 file(s)

[09:37:06] Total updates (*.nup) files size: 291.3M

[09:37:06] Mirror directory size is 292M

ekzorchik@srv-us2204a:~$

Шаг №6: Прописываю в планировщик проверку обновлений каждые 6 часов:

ekzorchik@srv-us2204a:~$ sudo crontab -e

0 6 * * * sudo /etc/nod/nod32-mirror.sh -u > /dev/null 2>&1

0 6 * * * sudo chown -R www-data:www-data /var/www/html/nod > /dev/null 2>&1

Шаг №7: Размер каталога /var/www/html/nod32 после скачивания обновлений:

ekzorchik@srv-us2204a:~$ sudo du -sh /var/www/html/nod32/

292M    /var/www/html/nod32/

Шаг №8: Создаю аутентификационную связку на доступ к зеркалу обновлений по http дабы только авторизованные клиенты могли стягивать с него обновления:

ekzorchik@srv-us2204a:~$ sudo sh -c "echo -n 'ekzorchik:' >> /var/www/html/.htpasswd"

ekzorchik@srv-us2204a:~$ sudo sh -c "openssl passwd -apr1 >> /var/www/html/.htpasswd"

Password: Aa1234567

Verifying - Password: Aa1234567

ekzorchik@srv-us2204a:~$

ekzorchik@srv-us2204a:~$ cat /var/www/html/.htpasswd

ekzorchik:$apr1$l9nqN4Ny$viDHeu2Jn0YX32atyPzle.

ekzorchik@srv-us2204a:~$

Шаг №9: Если нужно добавить еще одну связку логин и пароль в .htpasswd, то:

Создаем пароль:

ekzorchik@srv-us2204a:~$ openssl passwd -apr1

Password: указываю пароль, к примеру Aa1234567

Verifying - Password: повторяю пароль, Aa1234567

$apr1$.eoo1S8D$dhPKKpimFxzhoKaNWLOpz.

ekzorchik@srv-us2204a:~$

Указываю произвольный логин и копирую через двоеточие после него сгенерированный выше пароль, получается вот так:

ekzorchik@srv-us2204a:~$ sudo nano /var/www/html/.htpasswd

ekzorchik:$apr1$l9nqN4Ny$viDHeu2Jn0YX32atyPzle.

alektest1:$apr1$.eoo1S8D$dhPKKpimFxzhoKaNWLOpz.

ekzorchik@srv-us2204a:~$ sudo chown -R www-data:www-data /var/www/html/.htpasswd

и после прописываем логин и пароль на доступ к обновлению на клиенте с такого-то сервера + порт.

Шаг №10: Создаю конфигурацию работы зеркала обновлений через http:

ekzorchik@srv-us2204a:~$ sudo unlink /etc/nginx/sites-enabled/default
ekzorchik@srv-us2204a:~$ sudo unlink /etc/nginx/sites-available/default
ekzorchik@srv-us2204a:~$ sudo nano /etc/nginx/sites-available/nod32

server {
        listen 38000;
        server_name 172.33.33.127;
        root /var/www/html/nod32;
        charset utf-8;
        index index.html;

         if ($http_user_agent ~* ^(Wget|aria2|NOD32view|perl|php|curl|Google|Yandex|Yahoo)|(Mirror|spider|bot|Parser|RSS|grab)) {
                        return 403;
         }

         location ~* ^.+.(htaccess|htpasswd|pl|cqi|sh|sql|conf|tmp)$ {
                        return 403;
         }


        location / {
              autoindex  on;
                auth_basic "Restricted Content";
                auth_basic_user_file /var/www/html/.htpasswd;
         }

}

ekzorchik@srv-us2204a:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ekzorchik@srv-us2204a:~$ sudo ln -s /etc/nginx/sites-available/nod32 /etc/nginx/sites-enabled/nod32
ekzorchik@srv-us2204a:~$ sudo systemctl restart nginx && sudo systemctl status nginx | head -n5
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-05-12 08:59:40 MSK; 10min ago
       Docs: man:nginx(8)
    Process: 1635 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
ekzorchik@srv-us2204a:~$
ekzorchik@srv-us2204a:~$ sudo netstat -tulpn | grep nginx
tcp        0      0 0.0.0.0:38000           0.0.0.0:*               LISTEN      34838/nginx: master

Шаг №11: Проверяю, что при обращении на зеркало обновлений через консоль командной строки с аутентификацией сервис откликнется:

ekzorchik@srv-us2204a:~$ curl -u ekzorchik:Aa1234567 http://172.33.33.127:38000/index.html

<html>

<head><title>403 Forbidden</title></head>

<body>

<center><h1>403 Forbidden</h1></center>

<hr><center>nginx/1.18.0 (Ubuntu)</center>

</body>

</html>

ekzorchik@srv-us2204a:~$

ответ 403 Forbidden потому что я в описании сайта запретил обращение к своему зеркалу обновлений утилитой curl, если ее убрать из параметра $http_user_agent, перезапустить nginx и заново произвести подключение, то я успешно подключаюсь:

ekzorchik@srv-us2204a:~$ sudo nano /etc/nginx/sites-available/nod32
server {
        listen 38000;
        server_name 172.33.33.127;
        root /var/www/html/nod32;
        charset utf-8;
        index index.html;

        # if ($http_user_agent ~* ^(Wget|aria2|NOD32view|perl|curl|php|Google|Yandex|Yahoo)|(Mirror|spider|bot|Parser|RSS|grab)) {
        if ($http_user_agent ~* ^(Wget|aria2|NOD32view|perl|php|Google|Yandex|Yahoo)|(Mirror|spider|bot|Parser|RSS|grab)) {

               return 403;
         }

         location ~* ^.+.(htaccess|htpasswd|pl|cqi|sh|sql|conf|tmp)$ {
                        return 403;
         }


        location / {
              autoindex  on;
                auth_basic "Restricted Content";
                auth_basic_user_file /var/www/html/.htpasswd;
         }

}
ekzorchik@srv-us2204a:~$ sudo systemctl reload nginx

ekzorchik@srv-us2204a:~$ curl -u ekzorchik:Aa1234567 http://172.33.33.127:38000/index.html | head -n6
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19901  100 19901    0     0  12.5M      0 --:--:-- --:--:-- --:--:-- 18.9M
<!DOCTYPE html>
<html><head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta name="robots" content="noindex, nofollow" />
  <title>ESET NOD32 Updates Mirror</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
ekzorchik@srv-us2204a:~$

Возвращаюсь настройки блокировки обращения через утилиту curl к своему сервису зеркала обновлений nod32.

Шаг №:12 Прописываю настройки обновления на компьютере под управлением Windows 10 Pro x64

Настройка - Перейти к дополнительным настройкам... - Обновление - Общие - (Сервер обновлений) Изменить — указываю (Сервер обновлений): http://172.33.33.127:38000 и нажимаю "Добавить", затем указываю "Имя пользователя" и "Пароль" и нажимаю "OK".

Настройки сервера обновлений Nod32 на клиенте

После перехожу в главное меню "Обновление" - "Обновить базу данных сигнатур вирусов" и обновления успешно выкачивается с выше развернутого сервера обновлений.

Итого заметка работоспособна. И я могу ее смело передать своему коллеге чтобы он повторил ее сам у себя или это сделаю я и все будет работать.

На этом у меня всё, с уважением автор блога Олло Александр aka ekzorchik.