использование обратных кавычек в конфигурации rsyslog – невозможно получить доступ к файлу

Вопрос или проблема

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 может вызвать проблемы с доступом к файлам. Попробуйте использовать более подходящий метод, такой как указание пути к файлу непосредственно. Надеюсь, что эти рекомендации помогут вам успешно выполнить задачу. Если у вас будут дополнительные вопросы, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...