Вопрос или проблема
Не удается использовать мой собственный файл конфигурации с mosquitto, передача файла конфигурации по умолчанию работает нормально:
localhost:/etc/mosquitto # sudo mosquitto -c /etc/mosquitto/mosquitto.conf
1706606342: mosquitto версия 2.0.15 запускается
1706606342: Конфигурация загружена из /etc/mosquitto/mosquitto.conf.
1706606342: Запуск в локальном режиме. Подключения будут возможны только от клиентов, работающих на этом устройстве.
1706606342: Создайте файл конфигурации, который определяет слушателя для разрешения удаленного доступа.
1706606342: Подробнее см. https://mosquitto.org/documentation/authentication-methods/
1706606342: Открытие ipv4 сокета прослушивания на порту 1883.
1706606342: Открытие ipv6 сокета прослушивания на порту 1883.
1706606342: mosquitto версия 2.0.15 работает
^C1706606343: mosquitto версия 2.0.15 завершает работу
Затем, когда я пытаюсь использовать мой собственный файл конфигурации myconf.conf
:
localhost:/etc/mosquitto # sudo mosquitto -c /etc/mosquitto/myconf.conf
1706606346: Ошибка: Не удается открыть файл конфигурации /etc/mosquitto/myconf.conf.
Хотя эти файлы абсолютно одинаковые, все разрешения совпадают, это буквальная копия.
localhost:/etc/mosquitto # ll
total 92
-rw-r----- 1 root mosquitto 230 16 aug 2022 aclfile.example
drwxr-xr-x 1 root mosquitto 12 25 okt 09:41 ca_certificates
drwxr-xr-x 1 root mosquitto 12 25 okt 09:41 certs
drwxr-xr-x 1 root mosquitto 12 25 okt 09:41 conf.d
-rw-r----- 1 root mosquitto 40470 12 aug 17:43 mosquitto.conf
-rw-r----- 1 root mosquitto 40470 30 jan 10:17 myconf.conf
-rw-r----- 1 root mosquitto 23 16 aug 2022 pskfile.example
-rw-r----- 1 root mosquitto 355 16 aug 2022 pwfile.example
ОС – opensuse TW и установлен mosquitto через менеджер пакетов:
i+ | mosquitto-devel | Файлы разработки для mosquitto | пакет
i+ | mosquitto | MQTT v3.1/v3.1.1 Брокер | пакет
i | libmosquittopp1 | Общая С++ библиотека для mosquitto | пакет
i | libmosquitto1 | Общая С библиотека для mosquitto | пакет
Strace показывает, что доступ запрещен:
openat(AT_FDCWD, "/etc/mosquitto/myconf.conf", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOTDIR (Не является каталогом)
newfstatat(AT_FDCWD, "/etc/mosquitto/myconf.conf", {st_mode=S_IFREG|0640, st_size=40470, ...}, 0) = 0
openat(AT_FDCWD, "/etc/mosquitto/myconf.conf", O_RDONLY) = -1 EACCES (Доступ запрещен)
Редактирование1: Похоже, что SELinux не включен, я не вижу, чтобы в конфигурационном файле было установлено Permissive
.
Как мне заставить mosquitto работать с моим собственным файлом конфигурации?
У меня такая же проблема на OpenSuse TW. Решено установкой “Разрешить” доступ в AppArmor.
.
Ответ или решение
Конфигурация и запуск серверов, таких как Mosquitto, могут вызывать определенные трудности, особенно если речь идет о настройке файлов конфигурации. В описанном вами случае вы столкнулись с проблемой, заключающейся в том, что Mosquitto не может открыть ваш собственный конфигурационный файл myconf.conf
, несмотря на то, что он является точной копией рабочего mosquitto.conf
.
Теория
Mosquitto — это сервер брокера MQTT, который используется для передачи сообщений между клиентами по протоколу MQTT. Он считывает настройки из конфигурационного файла, который определяет поведение сервера, такие как сетевые настройки, политики безопасности и другие параметры.
Ошибки, подобные «Unable to open config file», часто связаны с проблемами доступа и расширенными системами безопасности, которые могут быть настроены в вашей системе. В современном мире операционных систем используются различные механизмы обеспечения безопасности, такие как AppArmor или SELinux, которые могут ограничивать доступ даже при корректных файловых разрешениях.
Пример
В соответствии с вашей проблемой конфигурационный файл myconf.conf
имеет такие же разрешения и владельцев, как и mosquitto.conf
. Это подтверждает вывод команды ll
, где оба файла принадлежат пользователю и группе root
и mosquitto
соответственно, и имеют права rw-r-----
. Однако, используя утилиту strace
, вы смогли увидеть, что ошибка связана с отказом в доступе (EACCES), указывающем на то, что проблема может возникать не из-за файловых разрешений, а из-за ограничений безопасности системы.
Операционная система, которую вы используете — OpenSUSE Tumbleweed, включает механизмы безопасности, такие как AppArmor, которые могут контролировать действия приложений на более глубоком уровне. Несмотря на то, что SELinux в вашей системе, возможно, не активирован, AppArmor может быть включен по умолчанию.
Применение
Для решения проблемы необходимо проверить и при необходимости настроить правила AppArmor. Вот шаги, которые могут помочь в решении проблемы:
-
Проверка статуса AppArmor: Для начала необходимо проверить, активен ли AppArmor в вашей системе. Это можно сделать с помощью команды:
sudo aa-status
Если AppArmor активен, вы увидите список активных политик и профилей.
-
Настройка профиля Mosquitto: Если AppArmor включен и ограничивает доступ к
myconf.conf
, необходимо отредактировать профиль, чтобы предоставить Mosquitto доступ. Профили конфигурации обычно находятся в директории/etc/apparmor.d/
. -
Открытие профиля Mosquitto: Отредактируйте профиль Mosquitto с помощью текстового редактора:
sudo nano /etc/apparmor.d/usr.sbin.mosquitto
Здесь вы можете добавить строку, предоставляющую разрешение на чтение для вашего конфигурационного файла:
/etc/mosquitto/myconf.conf r,
-
Перезагрузка AppArmor: После внесения изменений необходимо перезагрузить службу AppArmor, чтобы изменения вступили в силу:
sudo systemctl restart apparmor
-
Перезапуск Mosquitto: Попробуйте снова запустить Mosquitto с вашим конфигурационным файлом:
sudo mosquitto -c /etc/mosquitto/myconf.conf
Следуя этим шагам, вы интегрируете свои изменения в систему безопасности OpenSUSE Tumbleweed, позволяя Mosquitto правильно загружать ваш файл конфигурации. Подобные проблемы распространены в системах, использующих мер безопасности уровня AppArmor или SELinux, и требуют тщательной настройки разрешений. В итоге, основываясь на понимании работы операционной системы и особенностей Mosquitto, можно эффективно решать подобные задачи.