Информация |
---|
Актуальную статью см. по ссылке: 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).
При этом:
- Служба работает на одном и только одном уровне конфиденциальности, и работа одного экземпляра службы одновременно на нескольких уровнях конфиденциальности невозможна, так как это противоречит требованиям мандатного разграничения доступа.
- Служба использует для своей работы базу данных Mnesia, также не поддерживающую работу с метками безопасности.
При необходимости работать с данными, имеющими разные уровни мандатного доступа, необходимо запустить несколько экземпляров службы, каждый из которых будет работать на своём изолированном уровне.
В целом для запуска любой службы для работы с ненулевой классификационной меткой необходимо выполнить следующие типовые операции:
- Установить службу и выполнить её базовые настройки.
- Исправить системный юнит (файл запуска) службы, внеся в него параметр с необходимой меткой безопасности.
- Установить на файловые объекты, в которые службой производится запись (журналы, базы данных и пр.), необходимые мандатные уровни.
Далее рассматривается выполнение этих операций применительно к службе RabbitMQ.
Установка службы 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
...