Данная статья применима к:
- Astra Linux Special Edition РУСБ.10015-01 и РУСБ.10015-01 (очередное обновление 1.7)
- Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)
Введение
В статье приводится пример создания инфраструктуры сетевой службы RabbitMQ (далее - служба), обрабатывающей потоки данных с разными классификационными метками с соблюдением изоляции потоков данных. При этом:
- Обработка каждого потока выполняется отдельным экземпляром службы в непривилегированном docker-контейнере (см. Установка и администрирование Docker в Astra Linux 1.7) с меткой безопасности, равной метке безопасности потока. Для примера предполагается, что используются метки безопасности 0:0:0:0, 1:0:0:0 и 2:0:0:0 (см. Работа docker в непривилегированном режиме с ненулевыми метками безопасности).
- Служба внутри каждого контейнера работает с нулевой меткой безопасности используя стандартные настройки сетевых портов.
- Со стороны операционной системы для каждого контейнера назначается свой отдельный набор физических сетевых портов, средствами гипервизора docker перенаправляемых в стандартные сетевые порты службы в контейнере.
- Приложения, работая с собственными классификационными метками, направляют сетевые пакеты в стандартные порты службы. Сетевые пакеты при этом помечены классификационными метками, с которыми работают приложения.
- Сетевые пакеты, поступающие на стандартные порты, средствами сетевого фильтра iptables на основании классификационных меток сетевых пакетов перенаправляются на физические порта контейнеров с соответствующими метками.
- Сетевые пакеты, поступающие на физические порты контейнера, средствами гипервизора docker перенаправляются на стандартные порты службы в контейнере.
Таблица перенаправления портов:
Стандартный сетевой порт для прикладного ПО | Метка безопасности сетевого пакета | Физический сетевой порт | Сетевой порт контейнера |
---|---|---|---|
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-контейнера
Установка и настройка пакетов для подготовки docker-контейнеров
В примере в качестве исходного образа используется готовый образ Astra Linux Special Edition 1.7, доступный в docker-репозитории Astra Linux. Для его развертывания нужен только один пакет — docker.io:
Далее предполагается, что текущий пользователь включен в группу docker и все действия выполняются от его имени без использования sudo (см. Установка и администрирование Docker в Astra Linux 1.7). Включить текущего пользователя в группу можно командой:
Загрузка исходного образа
Загрузить базовый образ из репозитория:
REPOSITORY TAG IMAGE ID CREATED SIZE registry.astralinux.ru/library/alse 1.7.3 83d2946f21f2 4 weeks ago 94.3MB
Создание контейнера службы
Контейнер службы создается из загруженного на предыдущем шаге исходного образа registry.astralinux.ru/library/alse:1.7.3. В исходный образ вносятся следующие изменения:
- Устанавливается пакет rabbitmq-server.
- Включается плагин rabbit-management.
- Создается пустой файл /etc/rabbitmq/rabbitmq.conf. Используемый минимальный docker-образ Astra Linux Special Edition не поддерживает МРД и МКЦ, и файл /etc/rabbitmq/rabbitmq.conf создается для устранения предупреждений;
- Изменяются принятые по умолчанию имя и пароль администратора службы rabbitmq (guest и guest). Для примера используются имя и пароль astra и astra. Изменения записываются в файл /etc/rabbitmq/rabbitmq.conf. Побочным эффектом изменения имени является разрешение доступа через web-интерфейс, что далее упрощает администрирование службы в docker-контейнере.
- Разрешается доступ к сетевым портами, используемым службой (опция EXPOSE). Полный список портов см. по ссылке https://www.rabbitmq.com/networking.html. Доступ открывается ко всем перечисленным в списке портам.
- Добавляется команда, выполняемая при запуске контейнера (опция ENTRYPOINT /usr/sbin/rabbitmq-server) – запуск службы.
Для создания контейнера службы:
Создать файл dockerfile со следующим содержимым:
FROM registry.astralinux.ru/library/alse:1.7.3 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.3 83d2946f21f2 4 weeks ago 94.3MB
Запуск и проверка docker-контейнера
Запустить из созданного образа docker-контейнер службы командой:
Опции команды:
- -d — выполнение контейнера в фоновом режиме;
- -p — перенаправление сетевых портов. Указанные сетевые порты физического компьютера перенаправляются на порты docker-контейнера. Для упрощения примера используется минимальный набор портов, достаточный для первичной проверки работы;
- --n astra-rabbitmq — имя контейнера (astra-rabbitmq);
- astra-rabbitmq:latest — имя образа из которого запускается контейнер.
Для простейших проверок работоспособности контейнера можно выполнить следующие действия:
Убедиться, что сетевые порты перенаправлены:
sudo netstat -putln | grep docker-proxyДля проверки непривилегированного контейнера использовать команду:
tcp 0 0 0.0.0.0:5672 0.0.0.0:* LISTEN 8135/docker-proxy
tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 8107/docker-proxy
tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 8121/docker-proxysudo netstat -putln | grep rootlesskitУбедиться, что контейнер запущен:
docker container ls
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-контейнерах
Установка пакетов
Для запуска службы в привилегированном пакете достаточно установить пакет docker.io. Для запуска в непривилегированных контейнерах дополнительно требуется пакет rootless-helper-astra. Для управления трафиком с разными классификационными метками требуются пакеты iptables-astralabel-common iptables-astralabel-*. Команда для установки всех пакетов (пакет iptables-astralabel устанавливается для загруженного ядра):
Отдельная служба в непривилегированном контейнере с нулевой классификационной меткой
Созданный и экспортированный ранее образ может быть импортирован в непривилегированное пользовательское окружения и запущен в этом окружении. Далее для примера все действия выполняются от имени текущего пользователя ($USER).
Запустить пользовательскую службу docker:
sudo systemctl start rootless-docker@$(systemd-escape $USER)Импортировать ранее выгруженный образ:
rootlessenv docker load -i astra-rabbitmq.tarПроверить список образов:
rootlessenv docker image lsЗапустить контейнер из импортированного образа:
rootlessenv docker run -d -p 5672:5672 -p 15672:15672 -p 25672:25672 --name astra-rabbitmq astra-rabbitmq:latest
Для проверки работы запущенного контейнера можно использовать указанные выше команды: Запуск и проверка docker-контейнера.