Доступ к файлу: открыть не удается для одной программы, но не для другой
Это самая необычная вещь. Я пытаюсь запустить 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 году.