Skip to content

NGRsoftlab/Astra-NGINX-scratch

Repository files navigation

NGRSOFTLAB logo

Nginx scratch

Dive efficiency Made with love Powered by Docker NGR Team

Nginx image

Ascii svg art by aasvg.

Description

Среда для сборки контейнера с NGINX на базе Astra Linux в режимах rootless и root. Образ соблюдает исключение ПО для проникновения в контейнер, т.к используется Scratch слой 1

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

NGR Social Telegram       NGR Social Media

Contents

OS Nginx Status
Astra 1.7 Nginx 1.22.1 ✅ Fully supported
Astra 1.8 Nginx 1.22.1 ✅ Fully supported
Таблица 1. Поставляемые версии для контейнерных сред.

Dockerfile для сборки NGINX в scratch слое

Для начала работы необходимо установить 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

Собрать образ Astra Linux based rootless

## Rootless build
export ASTRA_VERSION='1.8.2-slim'
export NGINX_VERSION="1.22.1-scratch-rootless-astra${ASTRA_VERSION}"

## Nginx scratch rootless image: 12.7MB
docker build \
    --progress=plain \
    --no-cache \
    -t nginx:"${NGINX_VERSION}" \
    .

Собрать образ Astra Linux based root

## Root support build
export ASTRA_VERSION='1.8.2-slim'
export NGINX_VERSION="1.22.1-scratch-astra${ASTRA_VERSION}"

## Nginx scratch image: 12.7MB
docker build \
    --progress=plain \
    --no-cache \
    -f Dockerfile.root \
    -t nginx:"${NGINX_VERSION}" \
    .
Имя Значение по умолчанию Тип Описание
gid 65536 integer Идентификатор группы.
group nginx string Группа пользователя.
image_name astra string Имя образа.
image_registry '' string Адрес до реестра образа. Например: --build-arg image_registry=my-container-registry:1111/
image_version 1.8.2-slim string Версия образа.
nginx_identity 1.22.1 string Ожидаемая версия NGINX2.
uid 100000 integer Идентификатор пользователя.
user nginx string Имя пользователя.
version 1.0.0 float Версия выпуска минимального контейнера.
Таблица 2. Переопределяемые аргументы для Dockerfile rootless.
Имя Значение по умолчанию Тип Описание
image_name astra string Имя образа.
image_registry '' string Адрес до реестра образа. Например: --build-arg image_registry=my-container-registry:1111/
image_version 1.8.2-slim string Версия образа.
nginx_identity 1.22.1 string Ожидаемая версия NGINX2.
version 1.0.0 float Версия выпуска минимального контейнера.
Таблица 3. Переопределяемые аргументы для Dockerfile root mode.

Tip

Проверка доступных версий приложения - apt show nginx, apt-cache policy nginx, apt-cache show nginx

Для того чтобы начать использовать данный образ, создайте Dockerfile с простыми настройками

FROM nginx:1.22.1-scratch-rootless-astra1.8.2-slim
COPY static-html-directory /usr/share/nginx/html

Затем соберите и запустите полученный образ

$ docker build -t some-content-nginx .
$ docker run --name some-nginx -d some-content-nginx

...run logic...

Простой тест:

$ docker run --rm -p 80:80 nginx:1.22.1-scratch-rootless-astra1.8.2-slim

$ curl -s -i -w "\nStatus code: %{http_code}\n" http://localhost

...
nginx header
nginx body
nginx status code

Хостинг простой статики:

docker run --rm -d --name some-nginx -v /some/content:/usr/share/nginx/html:ro nginx:1.22.1-scratch-rootless-astra1.8.2-slim
  • При возникновении ошибки с маппингом сертификатов, необходимо отредактировать выдачу прав
# Пример ошибки ошибки
2025/03/12 10:42:56 [emerg] 1#1: cannot load certificate key "/etc/ssl/keys/server.key": BIO_new_file() failed (SSL: error:8000000D:system library::Permission denied:calling fopen(/etc/ssl/keys/server.key, r) error:10080002:BIO routines::system lib)

# Пример решения
chmod 644 /etc/ssl/keys/server.key
  • При возникновения ошибок создания директорий (список ниже), необходимо воспользоваться обозначением, который продемонстрирован в примере. Объяснение такого решения 3
    • /var/lib/nginx/body
    • /var/lib/nginx/fastcgi
    • /var/lib/nginx/proxy
    • /var/lib/nginx/uwsgi
    • /var/lib/nginx/scgi
# Пример ошибки
2025/03/12 10:47:17 [emerg] 1#1: mkdir() "/var/lib/nginx/body" failed (2: No such file or directory)
  • При возникновении ошибки с указанием pid-а, необходимо изучить пример. Объяснение такого решения 4
# Пример ошибки
nginx: [emerg] open() "/var/run/nginx.pid" failed (2: No such file or directory)
  • При возникновении ошибки с маппингом директорий, необходимо предоставить корректные права или использовать полный доступ, например для типа директории log. Пользовательский UID и GID указаны тут
# Пример ошибки
2025/03/12 11:16:04 [emerg] 1#1: open() "/var/log/app-dir/error.log" failed (13: Permission denied)

# Пример решения ошибки
chown :65536 /var/log/app-dir
chmod 770 /var/log/app-dir

# Альтернативный пример решения ошибки
setfacl -m u:100000:rwx /var/log/app-dir

# Альтернативный пример решения ошибки
chmod 777 /var/log/app-dir

Лого для проекта создано при помощи aasvg проекта. Вы можете создать такое же и/или модифицировать имеющееся. Для этого воспользуйтесь сайтом или установите figlet. Если Вы используете способ с установкой figlet, то вдобавок необходимо сказать необходимый шрифт, например я использую Doom. Далее, необходимо воспользоваться aasvg и конвертировать ascii арт в svg. Обратите внимание - по умолчанию будет svg в красном цвете, чтобы изменить цвет, необходимо изменить его определение тут

$ curl 'http://www.figlet.org/fonts/doom.flf' -o /usr/share/figlet/doom.flf
$ curl 'http://www.figlet.org/fonts/larry3d.flf' -o /usr/share/figlet/larry3d.flf
$ figlet -f doom 'Nginx'

 _   _       _            _____                _       _
| \ | |     (_)          /  ___|              | |     | |
|  \| | __ _ _ _ __ __  _\ `--.  ___ _ __ __ _| |_ ___| |__
| . ` |/ _` | | '_ \\ \/  `--. \/ __| '__/ _` | __/ __| '_ \
| |\  | (_| | | | | |>  </\__/ | (__| | | (_| | || (__| | | |
\_| \_/\__, |_|_| |_/_/\_\____/ \___|_|  \__,_|\__\___|_| |_|
        __/ |
       |___/

$ aasvg --source --embed < ./docs/ascii.txt > docs/images/logo.svg

Lightweight Lemur mascot 1th April joke image

Lightweight Lemur mascot 1th April joke image.

Footnotes

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

  2. 🛠️ За счёт скрипта nginx-install-approximately.sh нас может не волновать полная версия NGINX, мы можем передавать лишь приблизительно желаемую версию, а скрипт позаботится чтобы была выбрана последняя и актуальная из списка 2

  3. 🛠️ Использование файловой системы, доступной только для чтения, затрудняет злоумышленнику возможность использовать ее в качестве области проникновения

  4. 🛠️ Временный путь /dev/shm вместо: /var/cache/nginx, /var/lib/nginx, /var/run, чтобы сделать возможным использование файловой системы только для чтения

About

Проект по сборке Nginx на базе Astra Linux в Scratch

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Contributors