Скрипт по сборке образов Astra Linux. Взяты за основу статья по сборке на докера на Astra, minideb от Bitnami, проекта Tianon Gravi и скрипты от команды NGRSoftlab
Аффикс, для переменных, был выбран как SCF_ - акроним от Script that Creates a Form - скрипт создающий форму. Игра слов, связанная с тем, что данный скрипт создаёт из минимального наборка компонентов базовый образ для контейнерных сред
Присоединяйтесь к нашим социальным сетям:
- 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...
Так как AstraLinux это детище 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-pushWarning
Чтобы проверить свои изменения, воспользуйтесь командой 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, то нужно предварительно очистить полностью данную директорию
Примеры работы со скриптом:
-
Вызов справки
$ ./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.
-
Посмотреть версию
$ ./build-astra-image.sh -v build-astra-image.sh (NGRSoftlab) v2.0.0
-
Собрать образ с минимальными параметрами для 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..
-
Собрать образ с отладкой(дебагом) для 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..
-
Собрать образ с минимальными параметрами для 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..
-
Протестировать образ без сборки. Может быть полезен в тех случаях, когда необходимо произвести синтетические тесты в уже подготовленном образе
$ ./build-astra-image.sh -t 1.7.7 -s ..test process..
-
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 | Тег задаваемого образа. |
Есть возможность сборки более компактной версии образа, можно сказать, что это аналог 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. |
| Категория | Преимущества | Недостатки |
|---|---|---|
| Размер | Уменьшение размера на 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 |
Пояснение удаления системных компонентов:
| Бинарный файл | Назначение | Причина удаления |
|---|---|---|
blkid |
Определение UUID и типов файловых систем | Доступ к блочным устройствам обычно запрещён |
partx |
Работа с таблицей разделов | Только для хостовой системы |
addpart |
Добавление разделов на диске | Контейнеры не управляют физическими дисками |
delpart |
Удаление разделов | Аналогично |
losetup |
Настройка loop-устройств | Редко используется в контейнерах |
blockdev |
Управление параметрами блочных устройств | Избыточно для контейнеров |
blkdiscard |
Очистка блоков на устройстве (SSD/HDD) | Не требуется в контейнере |
| Бинарный файл | Назначение | Причина удаления |
|---|---|---|
e2fsck |
Проверка ext2/ext3/ext4 ФС |
Контейнеры используют volumes, проверка ФС - задача хоста |
fstrim |
Оптимизация SSD (TRIM) | Обычно выполняется на хосте |
mkfs.* |
Создание файловых систем (ext4, xfs и др.) |
Контейнеры монтируют готовые ФС |
tune2fs |
Настройка параметров ext-ФС | Не требуется |
resize2fs |
Изменение размера ext-разделов | Неприменимо |
fsck, fsck.* |
Проверка и ремонт ФС | Избыточно |
| Бинарный файл | Назначение | Причина удаления |
|---|---|---|
cron |
Планировщик задач | Альтернатива: внешний планировщик (Kubernetes CronJobs) |
pam-* |
Модули PAM для аутентификации | Контейнеры редко используют PAM |
agetty |
Управление TTY-терминалами | Контейнеры используют stdout/stderr |
hwclock |
Управление аппаратными часами | Контейнеры используют время хоста |
rtcwake |
Пробуждение системы по таймеру | Бессмысленно в контейнере |
| Бинарный файл | Назначение | Причина удаления |
|---|---|---|
chpasswd |
Изменение паролей пользователей | Stateless-контейнеры не хранят пользователей |
gpasswd |
Управление группами | Избыточно |
newusers |
Пакетное создание пользователей | Пользователи обычно задаются при запуске (via docker run --user) |
vipw, vigr |
Редактирование /etc/passwd и /etc/group |
Контейнеры используют read-only корневую ФС |
| Бинарный файл | Назначение | Причина удаления |
|---|---|---|
mesg |
Управление доступом к TTY | Неактуально |
wall |
Отправка сообщений всем пользователям | Контейнеры изолированы |
ldattach |
Настройка line discipline для TTY | Устарело, не используется в контейнерах |
| Бинарный файл | Назначение | Причина удаления |
|---|---|---|
sulogin |
Single-user mode login | Неприменимо |
zramctl |
Управление zram-устройствами |
Обычно настраивается на хосте |
bsd-write |
Отправка сообщений между пользователями | Устарело, потенциальная уязвимость |
ctrlaltdel |
Настройка реакции на Ctrl+Alt+Del | Бессмысленно в контейнере |
| Бинарный файл | Назначение | Причина удаления |
|---|---|---|
dmesg |
Чтение ядерных логов | Контейнеры не имеют доступа к логам ядра |
lsblk |
Просмотр блочных устройств | Избыточно |
wdctl |
Мониторинг watchdog-таймера | Не требуется |
last, lastb |
История входа пользователей | Неактуально для ephemeral-контейнеров |
Ключевые принципы удаления:
- Изоляция контейнера: Удалено всё, что взаимодействует с железом (
hwclock,blkid) - Минимизация атакующей поверхности: Убраны утилиты с потенциальными уязвимостями (
chpasswd,wall) - Stateless-принцип: Удалены компоненты, хранящие состояние (
cron,utmpdump) - Ограничение 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 версия. |
Более подробно почитать про 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 in the forge of Skyrim.
|
Footnotes
-
🛠️ Подробнее об релизе Astra Linux ↩
-
🛠️ В качестве проверки можно использовать эту команду
awk -F'=' '$1=="VERSION_CODENAME" { print $2 ;}' /etc/os-release↩ -
🛠️ По умолчанию выключено включение, если необходимо включить, то перед запуском скрипта передайте как значение
1. Пример:export SCF_INCLUDE_DEV=1↩
