Дерево страниц

Вы просматриваете старую версию данной страницы. Смотрите текущую версию.

Сравнить с текущим просмотр истории страницы

« Предыдущий Версия 6 Следующий »

Данная статья применима к:

  • Astra Linux Special Edition РУСБ.10015-01 и РУСБ.10015-01 (очередное обновление 1.7)
  • Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)

Введение

В статье приводится пример создания инфраструктуры сетевой службы RabbitMQ (далее - служба), обрабатывающей потоки данных с разными классификационными метками с соблюдением изоляции потоков данных. В создаваемой инфраструктуре:

  1. Astra Linux работает с отключенным МКЦ (это ограничение требуется для запуска непривилегированных контейнеров с ненулевыми классификационными метками).
  2. Передаваемые по сети прикладные данные (сетевые пакеты, далее - данные) маркируются классификационными метками. Для примера предполагается, что используются метки безопасности 0:0:0:0, 1:0:0:0 и 2:0:0:0 (см. Работа docker в непривилегированном режиме с ненулевыми метками безопасности).
  3. Обработка данных для каждого значения классификационной метки выполняется отдельным экземпляром службы, работающим в непривилегированном docker-контейнере (см. Установка и администрирование Docker в Astra Linux 1.7). Docker-контейнер при этом имеет классификационную метку, равную классификационной метке обрабатываемых данных. 
  4. Служба внутри каждого контейнера работает с нулевой меткой безопасности и использует стандартные настройки сетевых портов.
  5. Со стороны операционной системы для каждого контейнера назначается отдельный набор физических сетевых портов. Данные поступающие в эти порты средствами гипервизора docker перенаправляются в стандартные сетевые порты службы в контейнере.
  6. Приложения, работая с собственными метками безопасности, направляют данные в стандартные порты службы. Данные при этом помечены классификационными метками, с которыми работают приложения.
  7. Данные, поступающие на стандартные порты, средствами сетевого фильтра iptables на основании классификационных меток сетевых пакетов перенаправляются на физические порта контейнеров с соответствующими метками безопасности.
  8. Данные, поступающие на физические порты ОС, средствами гипервизора docker перенаправляются  на стандартные порты службы в контейнере.


Таблица перенаправления портов:

Стандартный сетевой порт
для прикладного ПО
Метка безопасности
сетевого пакета
Физический сетевой портСетевой порт контейнера
56720:0:0:056000Контейнер 0:0:0:0, порт 5672
1:0:0:056010Контейнер 1:0:0:0, порт 5672
2:0:0:056020Контейнер 2:0:0:0, порт 5672
156720:0:0:056001Контейнер 0:0:0:0, порт 15672
1:0:0:056011Контейнер 1:0:0:0, порт 15672
2:0:0:056021Контейнер 2:0:0:0, порт 15672
256720:0:0:056002Контейнер 0:0:0:0, порт 25672
1:0:0:056012Контейнер 1:0:0:0, порт 25672
2:0:0:056022Контейнер 2:0:0:0, порт 25672

Поясняющая схема (на примере порта 5672):

Подготовка docker-контейнера

Установка и настройка пакетов для подготовки docker-контейнеров

В примере в качестве исходного образа используется готовый образ Astra Linux Special Edition 1.7, доступный в docker-репозитории Astra Linux. Для его развертывания нужен только один пакет — docker.io:

sudo apt install -y docker.io
Можно также использовать собственные образы, см. Создание Docker-образов Astra Linux.

Далее предполагается, что текущий пользователь включен в группу docker и все действия выполняются от его имени без использования sudo (см. Установка и администрирование Docker в Astra Linux 1.7). 

Загрузка исходного образа

Загрузить базовый образ из репозитория:

docker pull registry.astralinux.ru/library/alse:1.7.3
Проверить загруженный образ:
docker image ls

Пример вывода команды:
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. В исходный образ вносятся следующие изменения:

  1. Устанавливается пакет rabbitmq-server.
  2. Включается плагин rabbit-management, обеспечивающий управление службой через web-интерфейс.
  3. Создается пустой файл /etc/rabbitmq/rabbitmq.conf. Используемый минимальный docker-образ Astra Linux Special Edition не поддерживает МРД и МКЦ, и файл /etc/rabbitmq/rabbitmq.conf создается для устранения предупреждений;
  4. Изменяются принятые по умолчанию имя и пароль администратора службы rabbitmq (имя guest и пароль guest). Для примера используются имя astra и пароль astra. Изменения записываются в файл /etc/rabbitmq/rabbitmq.conf. Побочным эффектом изменения имени администратора является разрешение доступа через web-интерфейс, что далее упрощает администрирование службы в docker-контейнере.
  5. Разрешается доступ к сетевым портами, используемым службой (опция EXPOSE). Полный список портов см. по ссылке https://www.rabbitmq.com/networking.html. Доступ открывается ко всем перечисленным в списке портам, далее в примере используется минимально необходимый набор.
  6. Добавляется команда, выполняемая при запуске контейнера (опция ENTRYPOINT /usr/sbin/rabbitmq-server) – запуск службы.

Для создания контейнера службы:

  1. Создать файл 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
  2. Выполнить команду:

    docker build -t astra-rabbitmq:latest -f dockerfile .
    В результате выполнения команды будет создан контейнер с именем astra-rabbitmq:latest.

  3. Проверить список образов можно командой:

    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-контейнер службы командой:

docker run -d -p 5672:5672 -p 15672:15672 -p 25672:25672 --name astra-rabbitmq astra-rabbitmq:latest

Опции команды:

  • -d — выполнение контейнера в фоновом режиме;
  • -p — перенаправление сетевых портов. Указанные сетевые порты физического компьютера перенаправляются на порты docker-контейнера. Для упрощения примера используется минимальный набор портов, достаточный для первичной проверки работы;
  • --n astra-rabbitmq — имя контейнера (astra-rabbitmq);
  •  astra-rabbitmq:latest — имя образа из которого запускается контейнер.

Для простейших проверок работоспособности контейнера можно выполнить следующие действия:

  1. Убедиться, что сетевые порты перенаправлены:

    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-proxy   
    Для проверки непривилегированного контейнера использовать команду:
    sudo netstat -putln | grep rootlesskit

  2. Убедиться, что контейнер запущен:

    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

  3. Подключиться к web-интерфейсу службы в контейнере (для входа использовать заданные ранее имя astra и пароль astra:

    firefox http://127.0.0.1:15672/
    или, если пользовательская сессия не перезапускалась и переменным окружения не были присвоены значения:
    DISPLAY=:0 firefox http://127.0.0.1:15672/

  4. Выполнить в контейнере команду проверки текущего статуса службы:

    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-контейнерах

Отключение МКЦ

Если ОС, на которой будет эксплуатироваться служба, работает в режиме защиты с использованием мандатного контроля целостности (МКЦ), то отключить МКЦ и перезагрузить ОС:

sudo astra-mic-control disable
sudo reboot
Далее предполагается, что МКЦ отключен.

Установка пакетов

Для запуска службы в привилегированном контейнере достаточно установить пакет docker.io. Для запуска в непривилегированных контейнерах дополнительно требуется пакет rootless-helper-astra и пакет dbus-user-session. Для управления трафиком с разными классификационными метками требуются пакет iptables-astralabel-common и пакеты iptables-astralabel-*, соответствующие используемому ядру. Команда для установки всех пакетов:

sudo apt install -y docker.io rootless-helper-astra iptables-astralabel-common iptables-astralabel-`uname -r` dbus-user-session

В примере команды пакет iptables-astralabel- устанавливается для загруженного в момент установки ядра.

Отдельная служба в непривилегированном контейнере с нулевой классификационной меткой

Созданный и экспортированный ранее образ может быть импортирован в непривилегированное пользовательское окружения и запущен в этом окружении. Далее для примера все действия выполняются от имени текущего пользователя ($USER).

  1. Запустить пользовательскую службу docker:

    sudo systemctl start rootless-docker@$(systemd-escape $USER)

  2. Импортировать ранее выгруженный образ:

    rootlessenv docker load -i astra-rabbitmq.tar

  3. Проверить список образов:

    rootlessenv docker image ls

  4. Запустить контейнер из импортированного образа:

    rootlessenv docker run --restart always -d -p 5672:5672 -p 15672:15672 -p 25672:25672 --name astra-rabbitmq astra-rabbitmq:latest

Для проверки работы запущенного контейнера можно использовать указанные выше рекомендации, выполняя docker-команды в непривилегированном окружении: Запуск и проверка docker-контейнера.

Комплект служб, работающих с разными метками безопасности

Развертывание комплекта служб, работающих с разными метками безопасности, повторяет действия, описанные в предыдущем разделе. Отличия в том, что службы запускаются с разными метками безопасности и с разными наборами внешних сетевых портов. Предполагается, что службы запускаются от имени специально пользователя. Этот пользователь должен иметь разрешенный диапазон меток безопасности, включающий все метки безопасности запускаемых от его имени непривилегированных контейнеров. Для примера используется имя пользователя macuser с разрешенным диапазоном иерархических уровней конфиденциальности от нуля до трех . Создать такого пользователя можно следующим образом:

  1. Создать пользователя:

    sudo useradd macuser

  2. Назначить созданному пользователю диапазон допустимых иерархических уровней конфиденциальности:

    sudo pdpl-user -l 0:3 macuser

  3. Создать для пользователя системные службы непривилегированного docker, разрешить их автоматический запуск после перезагрузки. Для каждой метки безопасности создается отдельная служба:

    sudo systemctl enable rootless-docker@$(systemd-escape macuser@0:0:0:0)
    sudo systemctl enable rootless-docker@$(systemd-escape macuser@1:0:0:0)
    sudo systemctl enable rootless-docker@$(systemd-escape macuser@2:0:0:0)
    sudo systemctl start rootless-docker@$(systemd-escape macuser@0:0:0:0)
    sudo systemctl start rootless-docker@$(systemd-escape macuser@1:0:0:0)
    sudo systemctl start rootless-docker@$(systemd-escape macuser@2:0:0:0)

Порядок действий по настройке и запуску комплекта служб:

  1. Импортировать ранее экспортированный образ для каждой метки безопасности:

    sudo pdp-exec -u macuser -l 0:0:0:0 -- rootlessenv docker load -i astra-rabbitmq.tar
    sudo pdp-exec -u macuser -l 1:0:0:0 -- rootlessenv docker load -i astra-rabbitmq.tar
    sudo pdp-exec -u macuser -l 2:0:0:0 -- rootlessenv docker load -i astra-rabbitmq.tar

  2. Запустить из импортированных образов контейнеры. Для каждого контейнера задается индивидуальный набор внешних портов:

    sudo pdp-exec -u macuser -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
    sudo pdp-exec -u macuser -l "1:0:0:0" -- rootlessenv docker run --restart always -d -p 56010:5672 -p 56011:15672 -p 56012:25672 --name astra-rabbitmq astra-rabbitmq:latest
    sudo pdp-exec -u macuser -l "2:0:0:0" -- rootlessenv docker run --restart always -d -p 56020:5672 -p 56021:15672 -p 56022:25672 --name astra-rabbitmq astra-rabbitmq:latest

  3. Настроить правила 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 OUTPUT -s 127.0.0.1 -p tcp --dport 5672  -m astralabel --maclev 0 -j REDIRECT --to-port 56000
    sudo iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 15672 -m astralabel --maclev 0 -j REDIRECT --to-port 56001
    sudo iptables -t nat -A OUTPUT -s 127.0.0.1 -p tcp --dport 15672 -m astralabel --maclev 0 -j REDIRECT --to-port 56001
    sudo iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 25672 -m astralabel --maclev 0 -j REDIRECT --to-port 56002
    sudo iptables -t nat -A OUTPUT -s 127.0.0.1 -p tcp --dport 25672 -m astralabel --maclev 0 -j REDIRECT --to-port 56002

    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 OUTPUT -s 127.0.0.1 -p tcp --dport 5672  -m astralabel --maclev 1 -j REDIRECT --to-port 56010
    sudo iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 15672 -m astralabel --maclev 1 -j REDIRECT --to-port 56011
    sudo iptables -t nat -A OUTPUT -s 127.0.0.1 -p tcp --dport 15672 -m astralabel --maclev 1 -j REDIRECT --to-port 56011
    sudo iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 25672 -m astralabel --maclev 1 -j REDIRECT --to-port 56012
    sudo iptables -t nat -A OUTPUT -s 127.0.0.1 -p tcp --dport 25672 -m astralabel --maclev 1 -j REDIRECT --to-port 56012

    sudo iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 5672  -m astralabel --maclev 2 -j REDIRECT --to-port 56020
    sudo iptables -t nat -A OUTPUT -s 127.0.0.1 -p tcp --dport 5672  -m astralabel --maclev 2 -j REDIRECT --to-port 56020
    sudo iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 15672 -m astralabel --maclev 2 -j REDIRECT --to-port 56021
    sudo iptables -t nat -A OUTPUT -s 127.0.0.1 -p tcp --dport 15672 -m astralabel --maclev 2 -j REDIRECT --to-port 56021
    sudo iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 25672 -m astralabel --maclev 2 -j REDIRECT --to-port 56022
    sudo iptables -t nat -A OUTPUT -s 127.0.0.1 -p tcp --dport 25672 -m astralabel --maclev 2 -j REDIRECT --to-port 56022

    Для постоянного сохранения правил после перезагрузки см. Сохранение и восстановление правил iptables.

Тестирование структуры приложений RabbitMQ в  docker-контейнерах

Кластер RabbitMQ в docker-контейнерах

Кластер, работающий с нулевой классификационной меткой

Комплект служб, работающих с разными классификационными метками

  • Нет меток