суббота, 7 сентября 2019 г.

AppArmor и CUPS-PDF в Debian 10.



После обновления у меня почему-то перестали печататься документы на виртуальном принтере CUPS-PDF. Задание на печать создаётся, на сервер успешно отправляется, но PDF-файл при этом не создаётся. В процессе изучения проблемы оказалось, что "виноват" в подобном поведении механизм AppArmor. Так я с его настройкой я и познакомился немного.

Внешние признаки проблемы.
В файле "/var/log/cups/cups-pdf-CUPS-PDF_log" появляются записи вида:
Sat Sep  7 11:15:13 2019  [ERROR] failed to open spoolfile: /data/PDF/cups2pdf-12242
В логе ядра появляются записи такого вида:
audit: type=1400 audit(1567844113.674:24): apparmor="DENIED" operation="mknod" profile="/usr/lib/cups/backend/cups-pdf" name="/data/PDF/cups2pdf-12242" pid=12242 comm="cups-pdf" requested_mask="c" denied_mask="c" fsuid=0 ouid=0

Видно, что система явно запрещает создавать spool-файл в каталоге. Такого быть не должно, потому что изначально для этого выделен каталог "/var/spool/cups-pdf/", но я его переназначил, чтобы случайно не переполнить системный раздел очень большим заданием на печать.

Беглый гуглинг и анализ профилей других приложений навёл на мысль, что надо добавить в профиль два правила:

  /data/PDF/ rw,
  /data/PDF/* rw,

Что я и сделал, дописав их в раздел "/usr/lib/cups/backend/cups-pdf" файла "/etc/apparmor.d/usr.sbin.cupsd". После перезагрузки правил печать в PDF заработала. Для перезагрузки правил только из одного файла используется команда:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.cupsd

Но скорее всего это правило может сломаться при следующем обновлении CUPS, потому что файл "/etc/apparmor.d/usr.sbin.cupsd" содержится в пакете "cups-daemon". Можно было бы добавить правила в файл "/etc/apparmor.d/local/usr.sbin.cupsd", но он включается только в секции "/usr/sbin/cupsd" и на "cups-pdf" никак не влияет.

Как исправить правило и при этом ничего не сломать, я пока не нашел.