Среда для сборки контейнера с NGINX на базе Astra Linux в режимах rootless и root. Образ соблюдает исключение ПО для проникновения в контейнер, т.к используется Scratch слой 1
Присоединяйтесь к нашим социальным сетям:
| OS | Nginx | Status |
|---|---|---|
| ✅ Fully supported | ||
| ✅ Fully supported |
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-pushWarning
Чтобы проверить свои изменения, воспользуйтесь командой 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 | Версия выпуска минимального контейнера. |
| Имя | Значение по умолчанию | Тип | Описание |
|---|---|---|---|
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 | Версия выпуска минимального контейнера. |
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)# Пример ошибки
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.
|
Footnotes
-
🛠️ При использовании образа с нуля контейнер не должен включать GTFOBins, которые злоумышленники могут использовать в случае взлома контейнера ↩
-
🛠️ За счёт скрипта
nginx-install-approximately.shнас может не волновать полная версия NGINX, мы можем передавать лишь приблизительно желаемую версию, а скрипт позаботится чтобы была выбрана последняя и актуальная из списка ↩ ↩2 -
🛠️ Использование файловой системы, доступной только для чтения, затрудняет злоумышленнику возможность использовать ее в качестве области проникновения ↩
-
🛠️ Временный путь
/dev/shmвместо:/var/cache/nginx,/var/lib/nginx,/var/run, чтобы сделать возможным использование файловой системы только для чтения ↩
