Вопрос или проблема
rsyslog 8.2312.0 на Ubuntu 24.04.1 LTS
Мне нужно включить номер лицензии в запись rsyslog. Номер лицензии находится в файле /mydir/license.txt
.
Использование обратных кавычек кажется подходящим вариантом, но я не могу заставить их работать.
Файл доступен для чтения всем, и выполнение команды обратных кавычек из командной строки bash работает нормально как у непривилегированного пользователя.
# ll /mydir/license.txt
-rw-r--r-- 1 root root 16 Nov 4 16:48 /mydir/license.txt
# echo `cat /mydir/license.txt`
MY-LICENSE-CODE
Я следую этому руководству и добавил дополнительное поле в конец:
template(name="json-template" type="list" option.jsonf="on") {
property(outname="@timestamp" name="timereported" dateFormat="rfc3339" format="jsonf")
property(outname="host" name="hostname" format="jsonf")
property(outname="severity" name="syslogseverity" caseConversion="upper" format="jsonf" datatype="number")
property(outname="facility" name="syslogfacility" format="jsonf" datatype="number")
property(outname="syslog-tag" name="syslogtag" format="jsonf")
property(outname="source" name="app-name" format="jsonf" onEmpty="null")
property(outname="message" name="msg" format="jsonf")
constant(outname="environment" value="dev" format="jsonf")
constant(outname="license" value=`cat /mydir/license.txt` format="jsonf" )
}
Когда я перезапускаю сервис rsyslog, я получаю следующую ошибку в syslog, где строка 27 – это команда cat.
rsyslogd: ошибка при разборе файла /etc/rsyslog.d/51-rsyslog-logify.conf, на строке 27 или раньше: файл не может быть доступен для `cat /mydir/license.txt` [v8.2312.0 попробуйте https://www.rsyslog.com/e/2207 ]
и записанные записи отображают
"license": "\/* файл не может быть доступен - см. сообщения об ошибках *\/"
Я также пробовал положить файл лицензии в тот же каталог, что и файл конфигурации, и использовал абсолютные и относительные пути для его нахождения, но успеха не достиг.
Apparmor работает, но я не вижу никаких ошибок в syslog, связанных с этой проблемой.
Если я изменю cat
на команду echo
, она правильно выводит путь к файлу, так что, похоже, проблема именно в доступе к файлу, но я не могу понять, в чем дело.
Ответ или решение
Приветствую! Давайте разберем проблему, связанную с использованием обратных кавычек (backticks) в конфигурации rsyslog для доступа к файлу, который содержит номер лицензии. Вы описали, что сталкиваетесь с ошибкой, указывающей на то, что rsyslog не может получить доступ к файлу, несмотря на то, что файл доступен для чтения всем пользователям. Рассмотрим возможные причины и решения этой проблемы.
1. Понимание контекста
Согласно вашему описанию, вы используете rsyslog версии 8.2312.0 на операционной системе Ubuntu 24.04.1 LTS. Вы пытаетесь добавить номер лицензии в записи rsyslog, используя файл /mydir/license.txt
, к которому, как вы уже отметили, должен иметь доступ любой пользователь. Однако rsyslog, в отличие от обычного терминала, может иметь свои ограничения, связанные с безопасностью и доступом к файлам.
2. Проблемы с правами доступа
Несмотря на то, что файл /mydir/license.txt
является мирочитаемым, важно учитывать следующую информацию:
-
Контексты безопасности: Иногда может быть активирована система контроля доступа, такая как AppArmor или SELinux, которая может ограничивать доступ rsyslog к файлам даже при корректных UNIX-правах. Вы упомянули, что AppArmor активен, но не наблюдали ошибок в syslog. Однако стоит проверить профили AppArmor для rsyslog, чтобы убедиться, что ему разрешён доступ к файлу.
-
Пути к файлам: Убедитесь, что путь
/mydir/license.txt
является абсолютным и корректным. Проверьте наличие символических ссылок, которые могут приводить к неправильному разрешению пути.
3. Использование обратных кавычек
Теперь, что касается использования обратных кавычек. В конфигурации rsyslog:
constant(outname="license" value=`cat /mydir/license.txt` format="jsonf")
Вы пытаетесь выполнить команду cat
через обратные кавычки, чтобы извлечь содержимое файла. Однако rsyslog может не поддерживать выполнение команд в данном контексте. В результате этого, он не может доступиться к файлу, что и вызывает ошибку.
4. Решение
a. Использование file
вместо cat
Вместо того чтобы использовать команды в обратных кавычках, вы можете использовать функцию file
в rsyslog для извлечения текста из файла. Например, в вашей конфигурации вы можете заменить строку на:
constant(outname="license" value="/mydir/license.txt" format="jsonf")
b. Замена значений вручную
Если это возможно, попробуйте временно вставить номер лицензии непосредственно в конфигурацию, чтобы исключить проблему с доступом:
constant(outname="license" value="MY-LICENSE-CODE" format="jsonf")
Это поможет вам проверить, работает ли остальная часть конфигурации правильно.
5. Проверка системных логов
Если ошибка сохраняется, обязательно проверьте системные журналы (например, /var/log/syslog
или /var/log/daemon.log
), чтобы понять, если rsyslog выдаёт другие предупреждения о безопасности, которые могут помочь в диагностике проблемы.
6. Перезапуск и тестирование
После внесенных изменений обязательно перезапустите службу rsyslog с помощью:
sudo systemctl restart rsyslog
И протестируйте конфигурацию:
sudo rsyslogd -N1
Этот командный вариант проверит конфигурацию на наличие ошибок, не перезапуская службу.
Заключение
Использование обратных кавычек для выполнения команд в конфигурациях rsyslog может вызвать проблемы с доступом к файлам. Попробуйте использовать более подходящий метод, такой как указание пути к файлу непосредственно. Надеюсь, что эти рекомендации помогут вам успешно выполнить задачу. Если у вас будут дополнительные вопросы, не стесняйтесь обращаться!