Skip to content

Проект посвящён сборке образов для контейнерных сред с нуля

License

Notifications You must be signed in to change notification settings

NGRsoftlab/Image-builder

Repository files navigation

NGRSOFTLAB logo

Image builder

Image builder Dive efficiency Made with love

Forge image

Blacksmith anvil hammer под авторством Midnightcomm.

Description

Скрипт по сборке образов Astra Linux. Взяты за основу статья по сборке на докера на Astra, minideb от Bitnami, проекта Tianon Gravi и скрипты от команды NGRSoftlab

Аффикс, для переменных, был выбран как SCF_ - акроним от Script that Creates a Form - скрипт создающий форму. Игра слов, связанная с тем, что данный скрипт создаёт из минимального наборка компонентов базовый образ для контейнерных сред

Присоединяйтесь к нашим социальным сетям:

NGR Social Telegram       NGR Social Media

Contents

  • Astra Linux
  • bash >= 5.0.3(1)-release;
  • Docker.io ~= 25.0.5.astra2
  • debootstrap ~= 1.0.132
  • coreutils ~= 9.1-1

Скрипт по сборке образов на основе Astra Linux. Что умеет:

  • Собирать образы на основе 1.7.2 - 1.7.x (latest updated version), 1.8.1 - 1.8.x (latest updated version)
  • Собирать образы на основе архитектуры
  • Собирать образы на основе прокси и вшивать прокси внутрь образа (аля Nexus)
  • Собирать образы с произвольным тегом + именем
  • Проводить синтетические тесты
  • Этот образ призван обеспечить хороший баланс между небольшими образами и наличием множества базовых пакетов для легкой интеграции
  • Образ основан на glibc для широкой совместимости и подходит для доступа к большому количеству пакетов. Чтобы уменьшить размер образа, удалены некоторые вещи, которые не требуются в контейнерах:
    • Пакеты, которые не часто используются в контейнерах (аппаратные, системы инициализации и т.д.)
    • Некоторые файлы, которые обычно не требуются (документы, страницы руководства, локали, кэши)
  • Эти образы также включают команду install_packages, которую можно использовать вместо apt. Скрипт позаботится о некоторых вещах:
    • Установит названные пакеты, пропуская подсказки и т.д.
    • После этого очистит метаданные apt, чтобы образ оставался маленьким
    • Повторная попытка установка пакета в случае сбоя apt. Иногда пакет не удается загрузить из-за проблем с сетью, и это может исправить ситуацию, что особенно полезно в автоматизированном конвейере сборки

Пример:

$ install_packages apache2 memcached

...install process...
Кодовое имя Версия Status
Astra 1.7_x86-64 1.7.x - 1.7.8 ✅ Fully supported
Astra 1.7_x86-64 1.8.x - 1.8.3 ✅ Fully supported
Таблица 1. Поддерживаемые версии Astra Linux.

 

Так как AstraLinux это детище Debian необходимо знать о их соотношении версий, чтобы понимать на чём основана база

Версия Astra Версия Debian
Astra 1.6 Debian (Stretch)
Astra 1.7 Debian (Buster)
Astra 1.8 Debian (Bookworm)
Таблица 2. Соотношений Astra Linux и Debian.

 

Для начала работы необходимо установить pre-commit и хуки

$ pip install pre-commit
$ pre-commit --version

pre-commit 4.2.0

$ pre-commit install

pre-commit installed at .git/hooks/pre-commit
pre-commit installed at .git/hooks/commit-msg
pre-commit installed at .git/hooks/pre-push

Warning

Чтобы проверить свои изменения, воспользуйтесь командой pre-commit run --all-files. Чтобы проверить конкретную задачу, воспользуетесь командой pre-commit run <target> --all-files. Если Вы понимаете что творите и хотите пропустить проверку pre-commit-ом воспользуйтесь --no-verify, пример git commit -m "Добавил изменения и не хочу проверки" --no-verify

При работе с хуками, есть некоторые моменты:

Note

Подготовка среды для работы с vale берёт из StylesPath в .vale.ini конфигурационном файле. Если необходимо пересоздать настройку окружения для vale, то нужно предварительно очистить полностью данную директорию

Примеры работы со скриптом:

  1. Вызов справки

    $ ./build-astra-image.sh -h
    
    NAME:
      build-astra-image.sh - Create Docker image IMAGE_NAME based on REPOSITORY with CODENAME.
    
    SYNOPSIS:
      build-astra-image.sh {-t TAG NAME} {-r REPOSITORY} [-i IMAGE NAME] [-c CODENAME] [-p PLATFORM] [-v] [-h] [-d] [-s]
    
    DESCRIPTION:
      Script can create astra docker image v1.7.x and v1.8.x.
    
    ARGUMENTS LIST:
      -h             help menu
      -v             print version
      -d             set debug, to enable pass '-d'
      -s             call only synthetic test for image
      -t TAG NAME    image tag, such as 1.8.1 and etc.
      -c CODENAME    codename (specified in '/etc/os-release' VERSION_CODENAME variable. For this OS it is: 1.8_x86-64)
      -r REPOSITORY  address of the repository
      -i IMAGE NAME  name of the image being created
      -p PLATFORM    platform (based on dpkg --print-architecture command)
    
    AUTHOR:
      Written by NGRSoftlab.
  2. Посмотреть версию

    $ ./build-astra-image.sh -v
    
    build-astra-image.sh (NGRSoftlab) v2.0.0
  3. Собрать образ с минимальными параметрами для 1.7.5

    $ ./build-astra-image.sh -t 1.7.5 \
                          -c 1.7_x86-64 \
                          -r https://download.astralinux.ru/astra/frozen/1.7_x86-64/1.7.5/repository
    
    ..build process..
  4. Собрать образ с отладкой(дебагом) для 1.8.1

    $ ./build-astra-image.sh -t 1.8.1 \
                          -c 1.8_x86-64 \
                          -r https://dl.astralinux.ru/astra/frozen/1.8_x86-64/1.8.1/repository \
                          -d
    
    ..build process..
  5. Собрать образ с минимальными параметрами для 1.8.1 rolling release и переопределенным методом импорта на 'load'

    $ SCF_DOCKER_SAVE_ACTION=load ./build-astra-image.sh -t 1.8.1 \
                          -c 1.8_x86-64 \
                          -r https://download.astralinux.ru/astra/stable/1.8_x86-64/repository
    
    ..build process..
  6. Протестировать образ без сборки. Может быть полезен в тех случаях, когда необходимо произвести синтетические тесты в уже подготовленном образе

    $ ./build-astra-image.sh -t 1.7.7 -s
    
    ..test process..
  7. md5sum проверка контрольных сумм

    cat MD5SUM | md5sum -c -
Имя Значение по умолчанию Тип Описание
SCF_CODENAME stable string Кодовое имя дистрибутива1(для астры: 1.7_x86-64 или 1.8_x86-64)2.
SCF_DEBUG OFF string Параметр включения/отключения отладки.
SCF_DOCKER_SAVE_ACTION import string Тип загрузки образа(может быть load/import).
SCF_IMAGE_NAME astra string Имя образа.
SCF_INCLUDE_DEV 0 integer Включить в образ содержимое /dev3.
SCF_PLATFORM $(dpkg --print-architecture) stringspec Архитектура системы.
SCF_REPO_URL "" string Путь до прокси реестра/репозитория с которым будет работать образ.
SCF_TAG_NAME "" string Тег задаваемого образа.
Таблица 3. Переопределяемые аргументы для скрипта сборки.

 

Есть возможность сборки более компактной версии образа, можно сказать, что это аналог slim версии. Для этого необходимо использовать Dockerfile-astra-slim. Для сборки необходим пакет docker-buildx

$ DOCKER_BUILDKIT=1 docker build \
    --progress=plain \
    -f Dockerfile-astra-slim \
    -t astra:1.8.1-slim \
    .
Имя Значение по умолчанию Тип Описание
image_name astra string Имя образа.
image_registry '' string Адрес до реестра образа. Например: --build-arg image_registry=my-container-registry:1111/.
image_version 1.8.1 string Версия образа.
version 1.0.0 float Версия выпуска минимального контейнера.
install_additional_tools '' string Дополнительные компоненты ОС, которые необходимо установить. Разделителем между компонентами должен быть строчный пробел: ldap-utils slapd.
remove_additional_binary '' string Дополнительные компоненты ОС, которые необходимо удалить из итогового образа. Разделителем между компонентами должен быть строчный пробел: sh numfmt.
locale_list_enable '' string Дополнительная локаль, которую необходимо установить в ОС. Разделителем между компонентами должен быть строчный пробел: en_US.UTF-8 ru_RU.UTF-8.
Таблица 4. Переопределяемые аргументы для сборки образа.

 

Категория Преимущества Недостатки
Размер Уменьшение размера на 10-15% за счёт удаления ненужных компонентов Возможна потеря совместимости с пакетами, требующими удалённых компонентов
Отладка Отсутствует отладочные пакеты, для оптимизации образа Для анализа проблем потребуется добавление утилит вручную (например, busybox)
PAM-модули Контейнеры редко используют PAM Ошибки при работе с пакетами, использующими PAM (например, sshd, sudo)
Безопасность Удаление потенциально опасных утилит (например, agetty, su, mount) Ограниченная отладка из-за отсутствия диагностических утилит (fsck, dmesg)
Локализация Сохранение только базовых локалей (en_US, ru_RU) Проблемы с приложениями, требующими специфичных локалей
Упрощение образа Удаление 200+ утилит снижает поверхность атаки (CVE) -
Производительность Оптимизация памяти через MALLOC_ARENA_MAX=2 и дедупликацию с jdupes -
Динамические бинарники Большинство сохраняет работоспособность Некоторые пакеты могут требовать PAM или glibc-модули, отсутствующие в образе
Совместимость с Docker Использование dumb-init корректно обрабатывает сигналы (SIGTERM, SIGKILL) -
Управление процессами Блокировка сервисных команд через перенаправление на /bin/true Невозможность запуска systemd и зависимых от него сервисов
Устаревшие компоненты Удалены expect, tcl8.6, bsd-write Не используются в современных workloads
Таблица 5. Сравнение преимуществ и недостатков в модернизации образа.

 

Пояснение удаления системных компонентов:

Бинарный файл Назначение Причина удаления
blkid Определение UUID и типов файловых систем Доступ к блочным устройствам обычно запрещён
partx Работа с таблицей разделов Только для хостовой системы
addpart Добавление разделов на диске Контейнеры не управляют физическими дисками
delpart Удаление разделов Аналогично
losetup Настройка loop-устройств Редко используется в контейнерах
blockdev Управление параметрами блочных устройств Избыточно для контейнеров
blkdiscard Очистка блоков на устройстве (SSD/HDD) Не требуется в контейнере
Таблица 6. Компоненты управления дисками и разделами.

 

Бинарный файл Назначение Причина удаления
e2fsck Проверка ext2/ext3/ext4 ФС Контейнеры используют volumes, проверка ФС - задача хоста
fstrim Оптимизация SSD (TRIM) Обычно выполняется на хосте
mkfs.* Создание файловых систем (ext4, xfs и др.) Контейнеры монтируют готовые ФС
tune2fs Настройка параметров ext-ФС Не требуется
resize2fs Изменение размера ext-разделов Неприменимо
fsck, fsck.* Проверка и ремонт ФС Избыточно
Таблица 7. Компоненты файловой системы.

 

Бинарный файл Назначение Причина удаления
cron Планировщик задач Альтернатива: внешний планировщик (Kubernetes CronJobs)
pam-* Модули PAM для аутентификации Контейнеры редко используют PAM
agetty Управление TTY-терминалами Контейнеры используют stdout/stderr
hwclock Управление аппаратными часами Контейнеры используют время хоста
rtcwake Пробуждение системы по таймеру Бессмысленно в контейнере
Таблица 8. Компоненты системных сервисов и демонов.

 

Бинарный файл Назначение Причина удаления
chpasswd Изменение паролей пользователей Stateless-контейнеры не хранят пользователей
gpasswd Управление группами Избыточно
newusers Пакетное создание пользователей Пользователи обычно задаются при запуске (via docker run --user)
vipw, vigr Редактирование /etc/passwd и /etc/group Контейнеры используют read-only корневую ФС
Таблица 9. Компоненты аутентификации и пользователей.

 

Бинарный файл Назначение Причина удаления
mesg Управление доступом к TTY Неактуально
wall Отправка сообщений всем пользователям Контейнеры изолированы
ldattach Настройка line discipline для TTY Устарело, не используется в контейнерах
Таблица 10. Сетевые и низкоуровневые утилиты.

 

Бинарный файл Назначение Причина удаления
sulogin Single-user mode login Неприменимо
zramctl Управление zram-устройствами Обычно настраивается на хосте
bsd-write Отправка сообщений между пользователями Устарело, потенциальная уязвимость
ctrlaltdel Настройка реакции на Ctrl+Alt+Del Бессмысленно в контейнере
Таблица 11. Устаревшие и опасные утилиты.

 

Бинарный файл Назначение Причина удаления
dmesg Чтение ядерных логов Контейнеры не имеют доступа к логам ядра
lsblk Просмотр блочных устройств Избыточно
wdctl Мониторинг watchdog-таймера Не требуется
last, lastb История входа пользователей Неактуально для ephemeral-контейнеров
Таблица 12. Отладочные и диагностические утилиты.

 

Ключевые принципы удаления:

  1. Изоляция контейнера: Удалено всё, что взаимодействует с железом (hwclock, blkid)
  2. Минимизация атакующей поверхности: Убраны утилиты с потенциальными уязвимостями (chpasswd, wall)
  3. Stateless-принцип: Удалены компоненты, хранящие состояние (cron, utmpdump)
  4. Ограничение debug-возможностей: Диагностика должна проводиться на хосте или через логи

Рекомендации:

## Для отладки можно добавить временный слой
FROM optimized-image AS debug
RUN apt-install.sh strace procps

Сравнительный размер образов:

$ docker images

REPOSITORY                                   TAG                 IMAGE ID       CREATED              SIZE
astra                                        1.7.5-slim          cccccccccccc   5 minutes ago        88.1MB
astra                                        1.7.5               cccccccccccc   5 minutes ago        89.4MB
astra                                        1.7.6-slim          cccccccccccc   5 minutes ago        88.4MB
astra                                        1.7.6               cccccccccccc   5 minutes ago        89.8MB
astra                                        1.7.7-slim          cccccccccccc   5 minutes ago        88.5MB
astra                                        1.7.7               cccccccccccc   5 minutes ago        90.4MB
astra                                        1.8.1-slim          cccccccccccc   5 minutes ago        96.5MB
astra                                        1.8.1               cccccccccccc   5 minutes ago        99.0MB
astra                                        1.8.2-slim          cccccccccccc   5 minutes ago        97.9MB
astra                                        1.8.2               cccccccccccc   5 minutes ago        100MB

Можно воспользоваться шаблоном при помощи которого реализуется сборка в CI/CD конвейере. Далее необходимо установить на хост-систему GitLab-runner. В качестве хост-системы необходимо использовать Astra Linux последней, из доступных, версий

Имя Значение по умолчанию Описание
SHELL /bin/bash Стартовая оболочка для Makefile.
MAKEFILE_LOCATION тут Определение точного местоположения запускаемого Makefile.
BUILD_TAG переопределяемое значение на основе переменной CONTAINER_BUILD_TAG Указывает на версию Astra Linux.
REGISTRY переопределяемое значение на основе переменной CONTAINER_PUBLISH_REGISTRY Пользовательский реестр образов, куда будет отправлен образ с Astra Linux.
REPOSITORY_BASE переопределяемое значение на основе переменной CONTAINER_BASE_REPOSITORY Пользовательский кеширующий/хостирующий репозиторий, откуда будет брать пакеты Astra Linux.
IMAGE_TAG_SUFFIX переопределяемое значение на основе переменной IMAGE_TAG_SUFFIX, иначе slim Переопределение тега для slim версии Astra Linux.
SCRIPT_FILE переопределяемое значение на основе переменной SCRIPT_FILE_EXEC, иначе ./build-astra-image.sh Имя пользовательского скрипта для создания базового образа.
SCRIPT_ARGS переопределяемое значение на основе переменной SCRIPT_ADDITIONAL_ARGS Дополнительные аргументы для скрипта build-astra-image.sh.
DOCKER_BIN переопределяемое значение на основе переменной CONTAINER_BIN, иначе docker Обозначение бинарного файла, который отвечает за запуск CLI способа сборки образа.
IMAGE_ARGS переопределяемое значение на основе переменной CONTAINER_ADDITIONAL_ARGS Дополнительные аргументы для slim версии. Используются как подстановочные аргументы сборки образа.
IMAGE_NAME переопределяемое значение на основе переменной CONTAINER_IMAGE_NAME, иначе astra Обозначение имени образа.
IMAGE_BUILDER_FILE переопределяемое значение на основе переменной CONTAINER_IMAGE_BUILDER_FILE, иначе Dockerfile-astra-slim Обозначение имени Dockerfile для сборки slim образа.
CONTAINER_SKIP_SLIM '' При значении TRUE будет дополнительно собрана slim версия.
Таблица 13. Переопределяемые аргументы для сборки в управлении Makefile.

 

Более подробно почитать про Makefile, переменные Makefile

# Download gitlab-runner
$ curl -LJO "https://s3.dualstack.us-east-1.amazonaws.com/gitlab-runner-downloads/latest/deb/gitlab-runner-helper-images.deb"
$ curl -LJO "https://s3.dualstack.us-east-1.amazonaws.com/gitlab-runner-downloads/latest/deb/gitlab-runner_$(dpkg --print-architecture).deb"

...download process...

После последовательной установки deb пакетов необходимо отредактировать daemon unit файл

$ nano /etc/systemd/system/gitlab-runner.service

[Unit]
Description=GitLab Runner
ConditionFileIsExecutable=/usr/bin/gitlab-runner

After=network.target

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/bin/gitlab-runner "run" "--config" "/etc/gitlab-runner/config.toml" "--working-directory" "/root" "--service" "gitlab-runner" "--user" "root"

User=root
Group=root


Restart=always

RestartSec=120
EnvironmentFile=-/etc/sysconfig/gitlab-runner

[Install]
WantedBy=multi-user.target

$ systemctl daemon-reload
$ systemctl restart gitlab-runner

После, при помощи GitLab веб-интерфейса настройте сопряжение между Astra Linux и сервером GitLab. После всех проделанных манипуляций можно использовать конвейер для выполнения сборки образа Astra Linux

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

Error response from daemon: directory '/var/lib/docker/overlay2/84dd6d8ea4091978616b1c933aaeb9e45ff729207a0028030a595e3ce69a6238/diff' contains vulnerabilities!
{oval:ru.altx-soft.nix:def:188464 true Astra Linux -- уязвимость в expat, ia32-libs (2022-0819SE17) }
{oval:ru.altx-soft.nix:def:188228 true Astra Linux -- уязвимость в python2.7, python3.7 (2022-0819SE17) }
{oval:ru.altx-soft.nix:def:188192 true Astra Linux -- уязвимость в glibc (2022-0819SE17) }
{oval:ru.altx-soft.nix:def:188121 true Astra Linux -- уязвимость в python3.7 (2022-0819SE17) }
...

Отключить встроенную проверку уязвимостей (не рекомендуется) можно следующим образом:

Порядок проверки уязвимостей в образах определяется значением параметра astra-sec-level службы dockerd. Значением параметра может быть от 1 до 6 включительно, определяющее класс защиты:

  • Классы защиты 1 - 5: при обнаружении уязвимости в контейнере его запуск блокируется
  • Класс защиты 6: отладочный режим, при обнаружении уязвимости в контейнере выводится соответствующее предупреждение, при этом запуск контейнера не блокируется

Задать значение параметра можно:

  • С помощью конфигурационного файла
  • С помощью параметров запуска службы

Конфигурационный файл:

## Установить jq для удобства работы
apt update && apt install -y jq

## Создать конфигурационный файл /etc/docker/daemon.json если он не был создан ранее и указать в нем параметры
DOCKER_DAEMON_FILE='/etc/docker/daemon.json'
[[ ! -f ${DOCKER_DAEMON_FILE} ]] || echo "$(jq '. += {"debug" : true, "astra-sec-level" : 6}' ${DOCKER_DAEMON_FILE})" >"${DOCKER_DAEMON_FILE}"
[[ -f ${DOCKER_DAEMON_FILE} ]] || {
  mkdir -p "${DOCKER_DAEMON_FILE%/*}"
  echo "{}" >"${DOCKER_DAEMON_FILE}"
  echo "$(jq '. += {"debug" : true, "astra-sec-level" : 6}' ${DOCKER_DAEMON_FILE})" >"${DOCKER_DAEMON_FILE}"
}

Параметры запуска службы:

## Выполнить команду
systemctl edit docker

## Ввести и сохранить данные
[Service]
Environment="DOCKER_OPTS=--astra-sec-level 6"

Warning

Независимо от использованного способа перезапустить службу Docker: systemctl restart docker

По всем вопросам о сотрудничестве - сюда

Billy Herrington gif
Billy Herrington in the forge of Skyrim.

Footnotes

  1. 🛠️ Подробнее об релизе Astra Linux

  2. 🛠️ В качестве проверки можно использовать эту команду awk -F'=' '$1=="VERSION_CODENAME" { print $2 ;}' /etc/os-release

  3. 🛠️ По умолчанию выключено включение, если необходимо включить, то перед запуском скрипта передайте как значение 1. Пример: export SCF_INCLUDE_DEV=1

About

Проект посвящён сборке образов для контейнерных сред с нуля

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published