Создание и обслуживание локального RPM/DEB-репозитория для изолированных сетей

Проблема

В защищённых средах, на режимных объектах и в изолированных лабораториях серверы и рабочие станции не имеют доступа к интернету. Установка и обновление пакетов стандартными средствами (aptdnf) становятся невозможными. Администратору приходится вручную скачивать .deb или .rpm пакеты на внешнем носителе, переносить их на целевую машину и устанавливать с помощью dpkg -i или rpm -i, разрешая зависимости по цепочке. При количестве машин больше двух это превращается в хаос: версии расходятся, зависимости теряются, а контроль целостности отсутствует. Локальный репозиторий linux  это стандартное решение, позволяющее централизованно публиковать пакеты, подписывать их GPG-ключом и обслуживать парк машин любой величины без единого внешнего подключения.

Решение

Построим два типа репозиториев: DEB-репозиторий для Debian, Ubuntu, Astra Linux Common Edition и РЕД ОС на базе Debian, а также RPM-репозиторий для Astra Linux Special Edition, РЕД ОС на базе RPM, CentOS и Rocky Linux. Для DEB-репозитория используем утилиту Aptly, которая автоматизирует добавление пакетов, снапшоты и публикацию. Для RPM-репозитория применим классический createrepo_c. Оба репозитория подпишем GPG-ключом, чтобы клиенты могли проверять подлинность пакетов. Все инструменты входят в репозитории Debian/Ubuntu и Astra Linux. Официальная документация по Aptly: aptly.info, по createrepo: createrepo_c, руководство по управлению ключами: GNU Privacy Guard Manual.

Пошаговая инструкция

Шаг 1. Подготовка сервера-репозитория

Сервер должен иметь достаточно дискового пространства (от 50 ГБ) и находиться в той же сети, что и клиентские машины. Установите необходимые пакеты:

bash

sudo apt update
sudo apt install aptly createrepo-c dpkg-dev gpg -y   # для DEB и RPM

Создайте структуру каталогов:

bash

sudo mkdir -p /srv/repo/{deb,rpm,incoming}

Шаг 2. Создание DEB-репозитория с помощью Aptly

Aptly работает с локальной базой .aptly в домашней директории пользователя. Для серверного использования создадим отдельного пользователя aptly:

bash

sudo useradd -m -s /bin/bash aptly
sudo -u aptly mkdir -p /home/aptly/.aptly/public
sudo -u aptly mkdir -p /home/aptly/incoming

Загрузите несколько тестовых .deb пакетов в директорию incoming. В изолированной сети пакеты предварительно скачиваются на машине с доступом в интернет с помощью apt-get download <package> или выгружаются из кеша apt.

bash

# На машине с интернетом
apt-get download nginx htop vim
# Перенесите файлы в /home/aptly/incoming/

Теперь создайте репозиторий и добавьте пакеты:

bash

sudo -u aptly aptly repo create -distribution=stable -component=main local-repo
sudo -u aptly aptly repo add local-repo /home/aptly/incoming/

Для публикации репозитория по HTTP потребуется веб-сервер. Установите nginx:

bash

sudo apt install nginx -y

Настройте виртуальный хост /etc/nginx/sites-available/repo:

nginx

server {
    listen 80;
    server_name repo.local;
    root /home/aptly/.aptly/public;

    location / {
        autoindex on;
    }
}

Включите сайт и перезапустите nginx:

bash

sudo ln -s /etc/nginx/sites-available/repo /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo systemctl restart nginx

Опубликуйте репозиторий:

bash

sudo -u aptly aptly publish repo -architectures=amd64 local-repo

Теперь репозиторий доступен по адресу http://repo.local/. На клиентских машинах пропишите его в /etc/apt/sources.list.d/local.list:

deb http://repo.local/ stable main

Шаг 3. Подпись DEB-репозитория GPG-ключом

Создайте ключевую пару для подписи:

bash

gpg --full-generate-key --batch --passphrase '' <<EOF
%echo Generating key
Key-Type: RSA
Key-Length: 4096
Name-Real: Local Repository Admin
Name-Email: admin@repo.local
Expire-Date: 0
%commit
%echo Done
EOF

Экспортируйте открытый ключ для клиентов:

bash

gpg --export --armor admin@repo.local > /srv/repo/public.gpg

Настройте Aptly на использование этого ключа. В конфигурации /home/aptly/.aptly.conf укажите:

json
{
    "gpgProvider": "gpg",
    "gpgSignKey": "admin@repo.local"
}

Переопубликуйте репозиторий с подписью:

bash

sudo -u aptly aptly publish update stable

На клиенте добавьте ключ:

bash

sudo curl -fsSL http://repo.local/public.gpg | sudo apt-key add -
# Или: sudo apt-key add public.gpg

После обновления apt update будет проверять подпись пакетов.

Официальное руководство Aptly по подписи: Aptly GPG signing.

Шаг 4. Создание RPM-репозитория с помощью createrepo_c

Создайте каталог для RPM-пакетов и поместите туда файлы .rpm:

bash

sudo mkdir -p /srv/repo/rpm/Packages
# Скопируйте .rpm-файлы в Packages

Создайте индекс репозитория:

bash

sudo createrepo_c /srv/repo/rpm/

Настройте nginx на раздачу RPM-репозитория, добавив в конфигурацию:

nginx

server {
    listen 80;
    server_name repo.local;
    root /srv/repo;

    location /deb {
        alias /home/aptly/.aptly/public;
    }

    location /rpm {
        autoindex on;
    }
}

Перезагрузите nginx.

Для подписи RPM-репозитория используется тот же GPG-ключ. Подпишите метаданные:

bash

sudo createrepo_c --update /srv/repo/rpm/
sudo gpg --detach-sign --armor /srv/repo/rpm/repodata/repomd.xml

На клиенте создайте файл /etc/yum.repos.d/local.repo:

[local]
name=Local RPM Repository
baseurl=http://repo.local/rpm/
enabled=1
gpgcheck=1
gpgkey=http://repo.local/public.gpg

Импортируйте ключ:

bash

sudo rpm --import http://repo.local/public.gpg

Теперь dnf update или yum install будут использовать локальный репозиторий с проверкой подписи.

Документация по createrepo: createrepo_c Manual.

Шаг 5. Пополнение и обслуживание репозитория

Для добавления новых пакетов:

DEB:

bash

sudo -u aptly aptly repo add local-repo /path/to/new.deb
sudo -u aptly aptly publish update stable

RPM:

bash

sudo cp new.rpm /srv/repo/rpm/Packages/
sudo createrepo_c --update /srv/repo/rpm/

Регулярно проверяйте целостность метаданных. Для Aptly можно делать снапшоты перед изменениями:

bash

sudo -u aptly aptly snapshot create backup-$(date +%Y%m%d) from repo local-repo

В случае ошибки всегда можно откатиться к предыдущему снапшоту.

Устранение распространённых проблем

СимптомВероятная причинаРешение
Клиент получает «Hash Sum mismatch» при apt updateМетаданные повреждены или не синхронизированыПереопубликуйте репозиторий: aptly publish update stable. Очистите кеш клиента: sudo rm -rf /var/lib/apt/lists/*.
Пакеты не находятся, хотя файл .deb добавленНеверная архитектура (i386 vs amd64) или не указан компонентПроверьте aptly repo show local-repo. При добавлении указывайте -force-replace для обновления существующих пакетов.
Ошибка GPG-подписи «NO_PUBKEY»Открытый ключ не импортирован на клиентеВыполните sudo apt-key add public.gpg для DEB или rpm --import для RPM.
createrepo_c не обновляет индексУтилита не перезаписывает существующие метаданныеИспользуйте ключ --update (createrepo_c --update /srv/repo/rpm/).
Веб-сервер не отдаёт файлы из репозиторияНеправильные права доступа или путь в конфигурации nginxУбедитесь, что nginx имеет права на чтение /home/aptly/.aptly/public или /srv/repo. Проверьте конфигурацию nginx -t.

Локальный репозиторий linux на базе Aptly и createrepo это фундамент для управления пакетами в изолированной среде. Он позволяет централизованно распространять обновления и новый софт, гарантируя целостность пакетов через GPG-подпись. Сервер-репозиторий, развёрнутый по этой инструкции, способен обслуживать смешанный парк из DEB- и RPM-систем, и легко пополняется новыми пакетами без изменения конфигурации клиентов. Включение автоматического создания снапшотов и регулярного обновления пакетов с внешнего носителя делает инфраструктуру полностью автономной и контролируемой.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu