Информация |
---|
Актуальную статью см. по ссылке: RabbitMQ в непривилегированных docker-контейнерах с ненулевой классификационной меткой. |
Оглавление |
---|
Информация |
---|
RabbitMQ — программный брокер сообщений на основе стандарта AMQP — тиражируемое связующее программное обеспечение, ориентированное на обработку сообщений. Создан на основе системы Open Telecom Platform, написан на языке Erlang, в качестве движка базы данных для хранения сообщений использует Mnesia. Состоит из сервера, библиотек поддержки протоколов HTTP, XMPP и STOMP, клиентских библиотек AMQP для Java и .NET Framework и различных плагинов (таких как плагины для мониторинга и управления через HTTP или веб-интерфейс или плагин «Shovel» для передачи сообщений между брокерами). Имеется реализация клиентов для доступа к RabbitMQ для целого ряда языков программирования, в том числе для Perl, Python, Ruby, PHP. Поддерживается горизонтальное масштабирование для построения кластерных решений. |
Информация | ||
---|---|---|
| ||
|
Информация |
---|
Статья разработана на основе материалов, предоставленных коллегами из АО "РТИ" |
Предисловие
В данной статье рассматривается запуск сервиса RabbitMQ с ненулевой меткой безопасности (для примера используется метка безопасности с уровнем конфиденциальности 3, категориями доступа 0 и уровнем целостности 0, т.е. 3:0:0).
При этом сервис работает на одном и только одном уровне конфиденциальности, работа одного экземпляра сервиса одновременно на нескольких уровнях конфиденциальности невозможна, так как это противоречит требованиям мандатного разграничения доступа.
При этом RabbitMQ использует для своей работы базу данных Mnesia, также не поддерживающую работу с метками безопасности.
При необходимости работать с данными, имеющими разные уровни мандатного доступа, необходимо запустить несколько экземпляров сервиса, каждый из которых будет работать на своём изолированном уровне.
В целом для запуска любого сервиса для работы с ненулевой меткой безопасности нужно выполнить следующие типовые операции:
- Установить сервис и выполнить его базовые настройки;
- Исправить системный юнит (файл запуска) сервиса, внеся в него параметр с необходимой меткой безопасности.
- Установить на файловые объекты, в которые сервисом производится запись, необходимые мандатные уровни.
Далее рассматривается выполнение этих операций применительно к сервису RabbitMQ.
Установка сервиса
Пакет rabbitmq-server, устанавливающий службу RabbitMQ, не входит в состав стандартного дистрибутива ОС Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6), поэтому для установки службы нужно подключить репозиторий Debian.
После подключения репозитория пакет rabbitmq-server может быть установлен с помощью графического менеджера пакетов (см. Графический менеджер пакетов synaptic) или из командной строки командами
Command |
---|
sudo apt update sudo apt install rabbitmq-server |
При установке сервис будет запущен, и будет настроен автозапуск сервиса при запуске ОС.
Настройка сервиса
Базовая настройка
Настройка плагинов:
Command |
---|
sudo rabbitmq-plugins enable rabbitmq_management |
Пример вывода команды:
Раскрыть |
---|
The following plugins have been enabled: |
Добавление пользователя для RabbitMQ, задание пароля, назначение прав
Command |
---|
sudo rabbitmqctl add_user user password && \ sudo rabbitmqctl set_user_tags user administrator && \ sudo rabbitmqctl set_permissions -p / user ".*" ".*" ".*" |
...
Command |
---|
sudo systemctl stop rabbitmq-server |
Информация |
---|
Остановка службы занимает около 90 секунд, это нормально. |
...
Command |
---|
sudo mkdir -p /opt/rabbitmq/{etc,log,run} && chown -R rabbitmq:rabbitmq /opt/rabbitmq/ |
Переместить файлы настроек в ранее созданный каталог:
Command |
---|
sudo mv /etc/rabbitmq/* /opt/rabbitmq/etc/ |
Предупреждение |
---|
В реальности редактируемые далее файлы представляют собой ссылки на внутренние файлы RabbitMQ, поэтому для их редактирования рекомендуется использовать какой-нибудь простой текстовый редактор (например, nano). Использование продвинутых редакторов (например, kate) может привести к тому, что ссылки будут заменены на копии файлов, после чего служба полностью потеряет работоспособность. |
Отредактировать конфигурационный файл /opt/rabbitmq/etc/rabbitmq-env.conf, добавив или изменив следующие строки (в параметре NODE_IP_ADDRESS указать ip-адрес сервера):
Информация |
---|
NODENAME=example-rabbit NODE_IP_ADDRESS=<IP-address> NODE_PORT=5672 LOG_BASE=/opt/rabbitmq/log HOME=/opt/rabbitmq MNESIA_BASE=/var/lib/rabbitmq/mnesia |
Настройка запуска с ненулевой меткой безопасности
Отредактировать юнит (файл запуска) службы в /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service, добавив в него параметр с нужной меткой безопасности:
Информация |
---|
[Unit] Description=RabbitMQ Messaging Server After=network.target [Service] PDPLabel=3:0:0 Type=simple User=rabbitmq SyslogIdentifier=rabbitmq LimitNOFILE=65536 ExecStart=/usr/sbin/rabbitmq-server ExecStartPost=/usr/lib/rabbitmq/bin/rabbitmq-server-wait ExecStop=/usr/sbin/rabbitmqctl stop [Install] WantedBy=multi-user.target |
...
Command |
---|
sudo systemctl daemon-reload |
Создание файловых объектов с нужной меткой безопасности
Отредактировать файл запуска службы в /etc/init.d/rabbitmq-server, исправив пути к файлам:
Информация |
---|
.... |
Отредактировать запускающий файл /usr/lib/rabbitmq/bin/rabbitmq-script-wrapper, исправив пути к файлам журналов:
Информация |
---|
if [ `id -u` = `id -u rabbitmq` -a "$SCRIPT" = "rabbitmq-server" ] ; then /usr/lib/rabbitmq/bin/rabbitmq-server "$@" > "/opt/rabbitmq/log/startup_log" 2> "/opt/rabbitmq/log/startup_err" |
...
Информация |
---|
... |
...
Информация |
---|
sudo pdpl-file 3:0:0:ccnr /opt/ sudo pdpl-file -R 3:0:0:ccnr /opt/rabbitmq sudo pdpl-file 3:0:0:ccnr /var/lib sudo pdpl-file -R 3:0:0:ccnr /var/lib/rabbitmq |
Запуск службы
Запустить службу:
Информация |
---|
sudo systemctl start rabbitmq-server |
Сценарий для ленивых
...
#!/bin/bash
set -eux
apt update && apt install -y rabbitmq-server
rabbitmq-plugins enable rabbitmq_management
( export U=user ; rabbitmqctl add_user $U password && rabbitmqctl set_user_tags $U administrator && rabbitmqctl set_permissions -p / $U ".*" ".*" ".*" )
time systemctl stop rabbitmq-server
( export R=/opt/rabbitmq ; mkdir -p $R/{etc,log,run} && mv /etc/rabbitmq/* $R/etc/ && chown -R rabbitmq:rabbitmq $R )
( export F=/opt/rabbitmq/etc/rabbitmq-env.conf
cat << EOF >> $F
NODENAME=example-rabbit
NODE_IP_ADDRESS=$(ip a s eth0 2>/dev/null | grep "inet " | cut -d "/" -f 1 | cut -c 10-)
NODE_PORT=5672
LOG_BASE=/opt/rabbitmq/log
HOME=/opt/rabbitmq
MNESIA_BASE=/var/lib/rabbitmq/mnesia
EOF
)
( export F=/etc/systemd/system/multi-user.target.wants/rabbitmq-server.service
sed -i --follow-symlinks "s~^\[Service\].*$~\[Service\]\nPDPLabel=3:0:0~" $F
systemctl daemon-reload
)
( export F=/etc/init.d/rabbitmq-server
sed -i --follow-symlinks 's~^#!/bin/sh~#!/bin/sh -x~' $F
sed -i --follow-symlinks 's~^\([[:space:]]*INIT_LOG_DIR=.*\)~#\1\nINIT_LOG_DIR=/opt/rabbitmq/log~' $F
sed -i --follow-symlinks 's~^\([[:space:]]*PID_FILE=.*\)~#\1\nPID_FILE=/opt/rabbitmq/run/pid~' $F
)
( export F=/usr/lib/rabbitmq/bin/rabbitmq-script-wrapper
sed -i --follow-symlinks 's~^#!/bin/sh~#!/bin/sh -x~' $F
sed -i --follow-symlinks 's~\([[:space:]]*/usr/lib/rabbitmq/bin/rabbitmq-server.*\)~ /usr/lib/rabbitmq/bin/rabbitmq-server "$@" > "/opt/rabbitmq/log/startup_log" 2> "/opt/rabbitmq/log/startup_err"\n# \1"~' $F
)
( export F=/usr/lib/rabbitmq/bin/rabbitmq-defaults
sed -i --follow-symlinks 's~^\([[:space:]]*ENABLED_PLUGINS_FILE=.*\)~#\1\nENABLED_PLUGINS_FILE=${SYS_PREFIX}/opt/rabbitmq/etc/enabled_plugins~' $F
sed -i --follow-symlinks 's~^\([[:space:]]*CONF_ENV_FILE=.*\)~#\1\nCONF_ENV_FILE=${SYS_PREFIX}/opt/rabbitmq/etc/rabbitmq-env.conf~' $F
)
pdpl-file 3:0:0:ccnr /opt/ && pdpl-file -R 3:0:0:ccnr /opt/rabbitmq
pdpl-file 3:0:0:ccnr /var/lib && pdpl-file -R 3:0:0:ccnr /var/lib/rabbitmq
...