Доступ к файлу: открыть не удается для одной программы, но не для другой

Это самая необычная вещь. Я пытаюсь запустить mysqld с другим my.cnf (поэтому я могу запустить два демона MySQL без конфликтов). Файл /etc/mysql/my2.cnf, но mysql не откроет его.

Когда я запускаю эту команду:

sudo -u mysql strace /usr/sbin/mysqld --defaults-file=/etc/mysql/my2.cnf

Я вижу это в выводе:

stat("/etc/mysql/my2.cnf", {st_mode=S_IFREG|0644, st_size=3574, ...}) = 0
open("/etc/mysql/my2.cnf", O_RDONLY)    = -1 EACCES (Permission denied)

Однако, когда я изменяю команду на:

sudo -u mysql strace cat /etc/mysql/my2.cnf > /dev/null

Я вижу это в выводе:

fstat(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
open("/etc/mysql/my2.cnf", O_RDONLY)    = 3

Тот же пользователь - тот же вызов ядра - разные результаты!

Я проверил права доступа к файлам - и расширенные разрешения:

# ls -l $PWD/my2.cnf
-rw-r--r-- 1 root root 3574 2011-07-08 10:04 /etc/mysql/my2.cnf
# lsattr $PWD/my2.cnf
-----------------e- /etc/mysql/my2.cnf

Я получаю немного от AppArmour или SELinux? Я не видел ничего подобного в журналах (включая daemon.log, syslog или сообщения).

Как мне решить эту проблему?

1 ответ

Никто не ответил, поэтому я расскажу, что я узнал.

Короче проблема в следующем: когда файл /etc/mysql/my2.cnf доступ к catмы видим это:

open("/etc/mysql/my2.cnf", O_RDONLY)    = 3

Однако когда mysqld делает тот же звонок, он получает другой ответ:

open("/etc/mysql/my2.cnf", O_RDONLY)    = -1 EACCES (Permission denied)

Таким образом, ответ лежит в ядре. Что-то в ядре отличало вызов open(2) от cat и по mysqld, Единственное, что пришло в голову, это AppArmor.

Поиск пакетов в системе обнаружил несколько связанных с AppArmor. Листинг файлов в пакетах подвернул команду apparmor_status; запуск этого показал, что mysqld действительно подпадает под AppArmor:

# apparmor_status
apparmor module is loaded.
6 profiles are loaded.
6 profiles are in enforce mode.
   /sbin/dhclient3
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/lib/connman/scripts/dhclient-script
   /usr/sbin/mysqld
   /usr/sbin/ntpd
   /usr/sbin/tcpdump
0 profiles are in complain mode.
3 processes have profiles defined.
3 processes are in enforce mode :
   /usr/sbin/mysqld (22699) 
   /usr/sbin/mysqld (6808) 
   /usr/sbin/ntpd (2800) 
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.

Чтение справочных страниц для apparmor(7) показало, что профили хранятся в /etc/apparmor.d; глядя на этот каталог поворачивает файл usr.sbin.mysqld, Это оказывается файл для изменения.

Изменить файл просто, скопировав записи для исходных стандартных каталогов и файлов и превратив их в новые каталоги и файлы. Как только это будет сделано, активируйте новую конфигурацию с помощью service apparmor restart,

Я никогда не видел никаких сообщений в системном журнале о "ревизии" (из AppArmor). Причиной этого было то, что сообщения отправлялись /var/log/audit/audit.log вместо syslog или же messages, Этот файл содержит записи, подобные этим:

type=APPARMOR_DENIED msg=audit(1310141055.025:256):  operation="mknod" pid=28765 parent=28764 profile="/usr/sbin/mysqld" requested_mask="c::" de
nied_mask="c::" fsuid=104 ouid=104 name="/var/log/mysql2/error.log"
type=APPARMOR_DENIED msg=audit(1310141055.025:257):  operation="open" pid=28765 parent=28764 profile="/usr/sbin/mysqld" requested_mask="r::" den
ied_mask="r::" fsuid=104 ouid=104 name="/var/lib/mysql2/mysql/plugin.frm"
type=APPARMOR_DENIED msg=audit(1310141055.035:258):  operation="open" pid=28765 parent=28764 profile="/usr/sbin/mysqld" requested_mask="rw::" de
nied_mask="rw::" fsuid=104 ouid=104 name="/var/lib/mysql2/ibdata1"
type=APPARMOR_DENIED msg=audit(1310141097.085:259):  operation="open" pid=28780 parent=28779 profile="/usr/sbin/mysqld" requested_mask="::r" den
ied_mask="::r" fsuid=104 ouid=0 name="/etc/mysql/my2.cnf"
type=APPARMOR_DENIED msg=audit(1310141177.636:260):  operation="open" pid=28841 parent=28840 profile="/usr/sbin/mysqld" requested_mask="::r" den
ied_mask="::r" fsuid=104 ouid=0 name="/etc/mysql/my2.cnf"
type=APPARMOR_DENIED msg=audit(1310141614.953:261):  operation="open" pid=28903 parent=28902 profile="/usr/sbin/mysqld" requested_mask="::r" denied_mask="::r" fsuid=104 ouid=0 name="/etc/mysql/my2.cnf"
type=APPARMOR_DENIED msg=audit(1310141665.113:262):  operation="open" pid=28916 parent=28915 profile="/usr/sbin/mysqld" requested_mask="::r" denied_mask="::r" fsuid=104 ouid=0 name="/etc/mysql/my2.cnf"
type=APPARMOR_DENIED msg=audit(1310141739.863:263):  operation="open" pid=28926 parent=28925 profile="/usr/sbin/mysqld" requested_mask="::r" denied_mask="::r" fsuid=104 ouid=0 name="/etc/mysql/my2.cnf"
type=APPARMOR_DENIED msg=audit(1310142253.323:264):  operation="open" pid=28962 parent=19377 profile="/usr/sbin/mysqld" requested_mask="::r" denied_mask="::r" fsuid=104 ouid=0 name="/etc/mysql/conf2.d/"

Это доказывает мои рассуждения и расследование: AppArmor отклонял запросы open(2).

Теперь, когда я знал, что искать, я нашел записи в блоге, относящиеся к этому, - одну статью в далеком 2008 году.

Другие вопросы по тегам