Проблема с правами доступа в Linux
версия для печатиСталивались с проблемой "права есть, но прав нет"? Я вот сегодня опять на тех же граблях.
Линуха KUbuntu 16.01. Пытаюсь подсунуть старые базы новому MySQL-серверу. Полдня убиты, сервер побеждает.
Для эксперимента создал отдельный каталог с базами, определил владельца и права доступа. Запускаю сервер - ошибка доступа. Отлично.. Задал полные права всем - ошибка доступа. Привет, Когнитивный Диссонанс.
Не вдаваясь в подробности (коих я кстати и не знаю), в Линухе кроме прав доступа есть еще некий демон AppArmor. Он тоже контроллирует доступ! Его запреты внешне в приложении будут выглядеть точно так же, как-будто я просто права на файл/каталог не описал. Для примера, вот лог MySQL-сервера:
2016-07-11T11:01:50.043344Z 0 [Warning] Can't create test file /home/all/mysql_5.7_clear/Z710.lower-test
2016-07-11T11:01:50.043384Z 0 [Note] /usr/sbin/mysqld (mysqld 5.7.12-0ubuntu1.1-log) starting as process 3631 ...
2016-07-11T11:01:50.044811Z 0 [Warning] Can't create test file /home/all/mysql_5.7_clear/Z710.lower-test
2016-07-11T11:01:50.044827Z 0 [Warning] Can't create test file /home/all/mysql_5.7_clear/Z710.lower-test
2016-07-11T11:01:50.048348Z 0 [Note] InnoDB: PUNCH HOLE support available
...
2016-07-11T11:01:50.062726Z 0 [Note] InnoDB: Completed initialization of buffer pool
2016-07-11T11:01:50.064034Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2016-07-11T11:01:50.074127Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
2016-07-11T11:01:50.074167Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
2016-07-11T11:01:50.074173Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
...
Зато dmesg выдал такое:
12.07.16 10:10 Z710 kernel [14103.419486] audit: type=1400 audit(1468293048.819:21): apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/home/all/mysql_5.7_bugs/Z710.lower-test" pid=7252 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=122 ouid=122
Лечение
Правим профиль AppArmor. Идем в файл /etc/apparmor.d/usr.sbin.mysqld, находим в нем строки про каталог с базами и добавляем свое:
# было
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
# добавил
/home/all/mysql_5.7_bugs/ r,
/home/all/mysql_5.7_bugs/** rwk,
Перегружаем профиль и рестартуем MySQL-сервер:
sudo systemctl restart mysql
Понравилась статья? Расскажите о ней друзьям: