|
В статье приводится пример создания инфраструктуры сетевой службы RabbitMQ (далее - служба), обрабатывающей потоки данных с разными классификационными метками с соблюдением изоляции потоков данных. В создаваемой инфраструктуре:
В примере в качестве исходного образа используется готовый образ Astra Linux Special Edition 1.7, доступный в docker-репозитории Astra Linux. Можно также использовать собственные образы, см. Создание Docker-образов Astra Linux.
Создание и запуск образов выполняется на одной машине.
Таблица перенаправления портов:
| Стандартный сетевой порт для прикладного ПО | Метка безопасности сетевого пакета | Физический сетевой порт | Сетевой порт контейнера |
|---|---|---|---|
| 5672 | 0:0:0:0 | 56000 | Контейнер 0:0:0:0, порт 5672 |
| 1:0:0:0 | 56010 | Контейнер 1:0:0:0, порт 5672 | |
| 2:0:0:0 | 56020 | Контейнер 2:0:0:0, порт 5672 | |
| 15672 | 0:0:0:0 | 56001 | Контейнер 0:0:0:0, порт 15672 |
| 1:0:0:0 | 56011 | Контейнер 1:0:0:0, порт 15672 | |
| 2:0:0:0 | 56021 | Контейнер 2:0:0:0, порт 15672 | |
| 25672 | 0:0:0:0 | 56002 | Контейнер 0:0:0:0, порт 25672 |
| 1:0:0:0 | 56012 | Контейнер 1:0:0:0, порт 25672 | |
| 2:0:0:0 | 56022 | Контейнер 2:0:0:0, порт 25672 |
Поясняющая схема (на примере порта 5672):

Дальнейшие действия выполняются от имени пользователя с правами администратора (при включенном МРД - от имени пользователя с правами администратора и высоким уровнем целостности).
Для подготовки образов достаточно установить пакет docker.io:
sudo apt install -y docker.io |
Комплект пакетов для запуска контейнеров см. далее: Установка пакетов для развертывания службы.
Дальнейшие действия выполняются от имени пользователя с правами администратора (при включенном МРД - от имени пользователя с правами администратора и высоким уровнем целостности).
Создать служебного пользователя, от имени которого будут запускаться контейнеры:
| sudo useradd -s /usr/sbin/nologin <имя_пользователя> |
Присвоить созданному пользователю диапазон классификационных меток, например:
| sudo pdpl-user -l 0:3 -c 0:0 -i 0 <имя_пользователя> |
Разрешить запускать службы без входа в систему:
| sudo loginctl enable-linger <имя_пользователя> |
Включить автоматический запуск служб rootless docker для используемых классификационных меток:
| sudo systemctl enable rootless-docker@$(systemd-escape <имя_пользователя>@0:0:0:0) sudo systemctl enable rootless-docker@$(systemd-escape <имя_пользователя>@1:0:0:0) sudo systemctl enable rootless-docker@$(systemd-escape <имя_пользователя>@2:0:0:0) |
Перезагрузить систему:
| sudo reboot |
После перезагрузки убедиться, что службы активны:
| sudo systemctl is-active rootless-docker@$(systemd-escape <имя_пользователя>@0:0:0:0) sudo systemctl is-active rootless-docker@$(systemd-escape <имя_пользователя>@1:0:0:0) sudo systemctl is-active rootless-docker@$(systemd-escape <имя_пользователя>@2:0:0:0) |
Далее предполагается, что текущий пользователь включен в группу docker и, где это возможно, действия выполняются имени пользователя без использования sudo (см. Установка и администрирование Docker в Astra Linux 1.7).
Загрузить базовый образ из репозитория:
| docker pull registry.astralinux.ru/library/alse:1.7.5 |
Проверить загруженный образ:
| docker image ls |
Пример вывода команды:
REPOSITORY TAG IMAGE ID CREATED SIZE registry.astralinux.ru/library/alse 1.7.5 83d2946f21f2 4 weeks ago 94.3MB |
Образ службы создается из загруженного на предыдущем шаге исходного образа. В исходный образ вносятся следующие изменения:
Для создания образа службы:
Создать файл Dockerfile с указанием исходного образа и описанием вносимых в него изменений. Пример файла:
FROM registry.astralinux.ru/library/alse:1.7.5 RUN apt update && apt install -y rabbitmq-server && rabbitmq-plugins enable rabbitmq_management RUN mkdir -p /etc/parsec/ RUN touch /etc/parsec/privsock.conf RUN echo "default_user = astra" >> /etc/rabbitmq/rabbitmq.conf RUN echo "default_pass = astra" >> /etc/rabbitmq/rabbitmq.conf RUN cat /etc/rabbitmq/rabbitmq.conf # https://www.rabbitmq.com/networking.html EXPOSE 1883 EXPOSE 4369 EXPOSE 5551-5552 EXPOSE 5671-5672 EXPOSE 6000-6500 EXPOSE 8883 EXPOSE 15671-15672 EXPOSE 15674-15675 EXPOSE 15692 EXPOSE 25672 EXPOSE 35672-35682 EXPOSE 61613-61614 ENTRYPOINT /usr/sbin/rabbitmq-server |
Выполнить команду:
| docker build -t astra-rabbitmq:latest -f Dockerfile . |
В результате выполнения команды будет создан образ с именем astra-rabbitmq:latest.
Проверить список образов можно командой:
| docker image ls |
Примерный вывод команды:
REPOSITORY TAG IMAGE ID CREATED SIZE astra-rabbitmq latest bd6b882259b0 10 seconds ago 455MB registry.astralinux.ru/library/alse 1.7.5 83d2946f21f2 4 weeks ago 94.3MB |
Запустить из созданного образа docker-контейнер службы командой:
| docker run -d -p 5672:5672 -p 15672:15672 -p 25672:25672 --name astra-rabbitmq astra-rabbitmq:latest |
Опции команды:
Для простейших проверок работоспособности контейнера можно выполнить следующие действия:
Убедиться, что сетевые порты перенаправлены:
tcp 0 0 0.0.0.0:5672 0.0.0.0:* LISTEN 8135/docker-proxy |
Для проверки непривилегированного контейнера использовать команду:
sudo netstat -putln | grep rootlesskit |
Убедиться, что контейнер запущен:
| CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8bf47e60863a astra-rabbitmq:latest "/bin/sh -c /usr/sbi…" About a minute ago Up About a minute 1883/tcp, 4369/tcp, 5551-5552/tcp, 5671/tcp, 6000-6500/tcp, 8883/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 15674-15675/tcp, 0.0.0.0:15672->15672/tcp, 15692/tcp, 35672-35682/tcp, 61613-61614/tcp, 0.0.0.0:25672->25672/tcp astra-rabbitmq |
Подключиться к web-интерфейсу службы в контейнере (для входа использовать заданные ранее имя astra и пароль astra:
| firefox http://127.0.0.1:15672/ |
или, если пользовательская сессия не перезапускалась и переменным окружения не были присвоены значения:
| DISPLAY=:0 firefox http://127.0.0.1:15672/ |
Выполнить в контейнере команду проверки текущего статуса службы:
docker exec astra-rabbitmq rabbitmqctl status |
Экспортировать образ для последующего развертывания:
| docker save astra-rabbitmq:latest -o astra-rabbitmq.tar |
Если предполагается далее загружать экспортированный образ от имени других пользователей, то предоставить доступ на чтение к созданному файлу и содержащему его каталогу. Предоставить доступ на чтение к файлу можно командой:
| chmod +r astra-rabbitmq.tar |
Предоставить доступ на чтение к текущему каталогу можно командой:
| chmod +x `pwd` |
Для предоставления доступа отдельным пользователям также можно использовать ACL (см. Списки управления доступом к файловым объектам (ACL) в Astra Linux).
Дальнейшие действия выполняются от имени пользователя с правами администратора (при включенном МРД - от имени пользователя с правами администратора и высоким уровнем целостности).
Для запуска службы в привилегированном контейнере достаточно установить пакет docker.io. Для запуска службы в непривилегированных контейнерах дополнительно требуется пакет rootless-helper-astra и пакет dbus-user-session. Для управления трафиком с разными классификационными метками требуются пакет iptables-astralabel-common и пакеты iptables-astralabel-*, соответствующие используемому ядру. Для тестирования можно использовать пакет netcat-openbsd. Команда для установки всех пакетов:
sudo apt install -y docker.io rootless-helper-astra iptables-astralabel-common iptables-astralabel-`uname -r` dbus-user-session netcat-openbsd |
Созданный и экспортированный ранее образ может быть импортирован в непривилегированное пользовательское окружение и запущен в этом окружении. Далее для примера действия выполняются от имени текущего пользователя ($USER).
Запустить пользовательскую службу docker:
| sudo systemctl start rootless-docker@$(systemd-escape $USER) |
Импортировать ранее выгруженный образ:
| rootlessenv docker load -i astra-rabbitmq.tar |
Проверить список образов:
| rootlessenv docker image ls |
Запустить контейнер из импортированного образа:
| rootlessenv docker run --restart always -d -p 5672:5672 -p 15672:15672 -p 25672:25672 --name astra-rabbitmq astra-rabbitmq:latest |
Для проверки работы запущенного контейнера можно использовать указанные выше рекомендации, выполняя docker-команды в непривилегированном окружении: Запуск и проверка docker-контейнера.
Развертывание комплекта служб, работающих с разными метками безопасности, повторяет действия, описанные в предыдущем разделе. Отличия в том, что службы запускаются с разными метками безопасности и с разными наборами внешних сетевых портов. Предполагается, что службы запускаются от имени специально пользователя, созданного ранее и имеющего диапазон меток безопасности, включающий все метки безопасности запускаемых от его имени непривилегированных контейнеров.
Порядок действий по настройке и запуску комплекта служб:
Импортировать ранее экспортированный образ для каждой используемой метки безопасности:
sudo pdp-exec -u <имя_пользователя> -l 0:0:0:0 -- rootlessenv docker load -i astra-rabbitmq.tar |
Запустить из импортированных образов контейнеры. Для каждого контейнера задается индивидуальный набор внешних портов:
sudo pdp-exec -u <имя_пользователя> -l "0:0:0:0" -- rootlessenv docker run --restart always -d -p 56000:5672 -p 56001:15672 -p 56002:25672 --name astra-rabbitmq astra-rabbitmq:latest |
Настроить правила iptables для маршрутизации данных в зависимости от их классификационных меток. Правила настраиваются для каждой используемой классификационной метки (для каждого иерархического уровня конфиденциальности — 0, 1 и 2), а также отдельно для внешних интерфейсов (в примере - интерфейс eth0) для интерфейса локальной петли (127.0.0.1):
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 5672 -m astralabel --maclev 0 -j REDIRECT --to-port 56000 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 5672 -m astralabel --maclev 1 -j REDIRECT --to-port 56010 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 5672 -m astralabel --maclev 2 -j REDIRECT --to-port 56020 |
Для постоянного сохранения правил после перезагрузки см. Сохранение и восстановление правил iptables.
Для первичной проверки работоспособности контейнеров:
Для тестирования на локальном компьютере:
| nc 127.0.0.1 5672 |
Для тестирования с удаленного компьютера:
nc <IP-адрес_сервера_Rabbit_MQ> 5672 |
Ввести текст:
HELO |
Если служба доступна и активна, то должен быть получен ответ:
AMQP |