Що таке користувач debian-sys-maint MySQL (та більше)?


71

Мене кілька разів вкусив користувач 'debian-sys-maint', встановлений за замовчуванням на пакунках серверів mysql, встановлених із сховищ Ubuntu.

Як правило, те, що я витягую нову копію нашої виробничої бази даних (яка не працює на Debian / Ubuntu) для усунення несправностей або нової розробки, і забуваю виключити таблицю mysql.user, отже втрачаючи користувача debian-sys-maint.

Якщо ми додамо нових користувачів mysql з будь-якої причини, я повинен "об'єднати" їх у моє середовище розробки, на відміну від простого накладання таблиці.

Без користувача моя система все ще здається функціональною, але зазнає помилок, таких як:

sudo /etc/init.d/mysql restart
Stopping MySQL database server: mysqld...failed.
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
  • Для чого використовується debian-sys-maint?
    • Чи є кращий спосіб, щоб обслуговуючі пакети робили те, що намагаються зробити?
  • Який найпростіший спосіб відновити його після того, як я його втратив?
  • Який правильний / мінімальний набір привілеїв для цього користувача?
    • Здається, погана ідея "надавати всі привілеї на *. * ..."

Редагувати

Додаткове запитання - Чи паролем у /etc/mysql/debian.cnf вже є хеш або це пароль простого тексту? Має значення, коли ви збираєтесь відтворити користувача, і я, здається, ніколи не зрозумію це з першої спроби.

Дякую


8
Пароль простий текст у /etc/mysql/debian.cnf
Brent

Відповіді:


57

Для чого використовується debian-sys-maint?

Одне головне, для чого він використовується - це сказати серверу виконувати журнали. Для цього потрібні принаймні права перезавантаження та відключення.

Дивіться файл /etc/logrotate.d/mysql-server

Він використовується /etc/init.d/mysqlсценарієм для отримання статусу сервера. Він використовується для витонченого відключення / перезавантаження сервера.

Ось цитата з README.Debian

* MYSQL WON'T START OR STOP?:
=============================
You may never ever delete the special mysql user "debian-sys-maint". This user
together with the credentials in /etc/mysql/debian.cnf are used by the init
scripts to stop the server as they would require knowledge of the mysql root
users password else.

Який найпростіший спосіб відновити його після того, як я його втратив?

Найкращий план - просто не втратити його. Якщо ви дійсно втратили пароль, відновіть його, використовуючи інший обліковий запис. Якщо ви втратили всі права адміністратора на сервері mysql, дотримуйтесь інструкцій для скидання пароля root, а потім відновіть debian-sys-maint.

Ви можете використати таку команду, щоб створити файл SQL, який ви зможете використовувати пізніше для відтворення облікового запису.

mysqldump --complete-insert --extended-insert=0 -u root -p mysql | grep 'debian-sys-maint' > debian_user.sql

Чи паролем у /etc/mysql/debian.cnf вже є хеш

Пароль не хеширується / шифрується при встановленні, але нові версії mysql тепер мають спосіб шифрування облікових даних (див. Https://serverfault.com/a/750363 ).


1
"Найкращий план - просто не втратити його". Серйозно? Це нульова допомога людям, які вже втратили її, як я, мабуть, робив під час оновлення. Для тих, кому потрібно повторно створити користувача, використовуйте один з варіантів "ЗАРУБИТИ ВСІ" в інших відповідях, оскільки цей користувач НЕ використовується лише для операцій логротату - це важлива частина процесу оновлення.
FKEinternet

Якщо ви втрачаєте облікові дані, у вас завжди є можливість просто запустити демон mysql / mariadb з можливістю пропускати систему дозволів, або увійти як інший користувач з привілеями root mysql та скинути пароль. Скидання паролів та обхід системи привілеїв добре задокументовано в інших місцях Google та інших питаннях на цьому веб-сайті.
Зоредаче

22

Користувач debian-sys-maint за замовчуванням є кореневим еквівалентом . Він використовується певними скриптами технічного обслуговування в системах Debian, і як побічний ефект дозволяє користувачам з кореневим доступом у вікні переглядати пароль простого тексту в /etc/mysql/debian.cnf (добре чи погано?)

Ви можете створити користувача заново:

GRANT ALL PRIVILEGES on *.* TO `debian-sys-maint`@`localhost` IDENTIFIED BY 'your password' WITH GRANT OPTION;

Просто переконайтеся, що пароль відповідає паролю в /etc/mysql/debian.cnf


9
Re (добре чи погано) - Якщо комусь вдається отримати root, він може повністю обійти систему привілеїв, просто перезавантаживши сервер з правильними параметрами. Якщо ви зловмисник отримує корінь, у вас, ймовірно, виникають більші проблеми, ніж цей файл конфігурації.
Зоредаче

2
також повторно: добре чи погано - мені довелося покладатися на доступ до debian-sys-maint, щоб повторно встановити пароль кореневого облікового запису MySQL, коли він був забутий. Було приємно мати цей запасний варіант.
Brent

1
@Brent: Див. Dev.mysql.com/doc/refman/5.0/en/resetting-permissions.html про те, як відновити пароль root mysql. Я відключив цього користувача у багатьох встановленнях mysql на Debian, оскільки це може спричинити загрозу при запуску, перевіряючи таблиці, якщо вони великі таблиці.
Натан

1
Натане, дякую за це посилання. Це нова інформація для мене. Якщо у вас є процедура відключення облікового запису debian-sys-maint взагалі, чому б ви не включили його сюди як окрему відповідь. Було б чудово!
Brent

3
кращим грантом було б просто надання пільг на закриття / запуск.
jmtd

19

Ви також можете:

sudo dpkg-reconfigure mysql-server-5.0

Що дасть вам можливість відтворити користувача debian-sys-maint. Існуючі користувачі та бази даних є безпечними.


Це також працювало на mysql-сервері-5.5.
serverSentinel

Це буде працювати лише в тому випадку, якщо ваша установка mysql-сервера не порушена - як це може статися, якщо відсутній користувач debian-sys-maint.
FKEinternet

19

Мені хотілося просто прокоментувати, але я думаю, що правильний синтаксис заслуговує на те, що це власний запис. Це створить користувача debian-sys-maint :

mysql> GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'plaintextpassword' WITH GRANT OPTION; FLUSH PRIVILEGES;

Якщо у вас все ще є файл /etc/mysql/debian.cnf, просто введіть пароль там.

Не соромтеся придумати більш параноїчне безпечне рішення.


1
Це настільки параноїчно, як і потрібно. Тоді лише той, хто повинен мати можливість читати /etc/mysql/debian.cnfфайл, - це rootкористувач Linux . І коли хтось може прочитати цей файл, він вже має rootдоступ до машини і може зупинити сервер MySQL та додати власного системного адміністратора. І сценарій, що запускає MySQL та інші пакети, не може підтримувати безпеку та інше обслуговування. Так що так, це так само безпечно, як і колись потрібно. І корисно, якщо ви втратите пароль адміністратора MySQL, щоб відновити його, без необхідності перезапускати його в незахищеному режимі. ;-)
Андерс

Ось для чого потрібна редакція.
RobinJ

6

Якщо вам потрібно додати debian-sys-maintкористувача лише для logrotate.dцілей, ви не повинні надавати ALL PRIVILEGESабо GRANT OPTION- це зайвий гігантський отвір у безпеці. Натомість ви можете просто додати користувача з таким RELOADпривілеєм (якщо припустити, що ви отримуєте доступ до свого db як rootі заміните xxxxxx своїм паролем)

# add the user with the reload right
GRANT RELOAD on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'xxxxxx'; 

# reload the rights
FLUSH PRIVILEGES;

# double check
select * from mysql.user;

Оновлення 2019 року

Ця відповідь може бути застарілою. Будь ласка, дивіться вкрай впевнені коментарі нижче.


Це єдина безпечна відповідь, вона дає лише необхідні дозволи debian-sys-maint. Також можу підтвердити, що це працює як шарм. Ура!
Джалі

2
Це справді дірка для безпеки? Якщо хтось уже може прочитати /etc/mysql/debian.cnf, то, ймовірно, він має кореневий доступ і може будь-коли перезапустити mysql з --skip-grant-table.
mc0e

Дякую. Але не потрібно промивати речі двічі, MySQL вже знає, що робить команда GRANT. Дивіться dev.mysql.com/doc/refman/5.6/uk/privilege-changes.html
ygoe

1
І це не буде працювати, оскільки debian-sys-maintкористувач також використовується для відключення сервера. А також перевірити користувачів root при запуску сервера mysql. Тож вам потрібно принаймні надати привілеї вибору на mysql. * Та привілеї вимкнення.
Андерс

1
НІ НІ НІ, НЕ дотримуйтесь порад цієї відповіді - вам потрібно надати всі привілеї debian-sys-maint з причин, зазначених в іншій відповіді під назвою "необхідні дозволи на debian-sys-maint". Коротше кажучи, ви можете бути щодня непоганими, але у вас виникнуть серйозні проблеми, коли ви застосуєте оновлення безпеки, виправлення або оновлення системи.
Курт Фіцнер

3

Замість

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY PASSWORD('your password') WITH GRANT OPTION; FLUSH PRIVILEGES;

Я думаю

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'your password' WITH GRANT OPTION; FLUSH PRIVILEGES;

тому що пароль не хеширован ...?


3

debian-sys-maint необхідні дозволи

Інші відповіді достатньо стосуються всього, крім мінімального набору дозволів, необхідних для користувача debian-sys-maint. Багато відповідей тут просто неправильні в цьому відношенні і насправді небезпечні. Не зменшуйте привілеї debian-sys-maint (включаючи опцію надання грантів), не читаючи та розуміючи нижче:

Технічний сервіс Debian не давав всім привілеям користувачеві примхливо. Ось що потрібно, де і чому. Деякі з цих привілеїв є набором інших, але я перелічу їх незалежно, якщо ви хочете налаштувати речі та усунути вимогу до них:

  • вимкнення та перезавантаження , потрібне не дивно, для вимкнення або роботи з базою даних, виконане /etc/init.d/mysql
  • виберіть на mysql.user , необхідний для перевірки правильності, здійсненого при запуску бази даних, гарантуючи, що є користувач root. Кожен запуск робиться / etc / mysql / debian-start (викликається /etc/init.d/mysql) фактичним кодом у функції check_root_accounts у файлі /usr/share/mysql/debian-start.inc.sh
  • вибрати на INFORMATION_SCHEMA.TABLES , глобальний вибір , необхідний для перевірки розбитих таблиць. Зробити кожен запуск в / etc / mysql / debian-start (викликається /etc/init.d/mysql) фактичним кодом у функції check_for_crashed_tables у файлі /usr/share/mysql/debian-start.inc.sh
  • глобальні всі привілеї , необхідні для оновлення таблиць, якщо / коли нова версія MySQL встановлена ​​за допомогою оновлення або оновлення Debian. Здійснював кожен запуск в / etc / mysql / debian-start (викликається /etc/init.d/mysql) фактичним кодом у функції upgrade_system_tables_if_ne potrebno у файлі /usr/share/mysql/debian-start.inc.sh - насправді викликає MySQL бінарний mysql_upgrade - не обманюйте ім'я функції (upgrade_system_tables_if_ne необходимо), це може потенційно торкнутися всіх таблиць - див. нижче

Останнє - це, звичайно, головна вимога до пільг. Сторінка man для mysql_upgrade зазначає, що:

mysql_upgrade вивчає всі таблиці у всіх базах даних на предмет несумісності з поточною версією MySQL Server. mysql_upgrade також оновлює системні таблиці, щоб ви могли скористатися новими привілеями чи можливостями, які могли бути додані.

Якщо mysql_upgrade виявить, що в таблиці можлива несумісність, вона виконує перевірку таблиці і, якщо виявлені проблеми, намагається відновити таблицю.

ПОПЕРЕДЖЕННЯ Якщо ви вирішили зменшити привілеї, які має debian-sys-maint, то переконайтеся, що ви готові вручну обробляти будь-які майбутні оновлення безпеки debian та / або оновлення, що стосуються MySQL. Якщо ви виконуєте оновлення пакетів MySQL зі зменшеним привілеєм debian-sys-maint, і якщо mysql_upgrade не може завершитися в результаті, він може залишити вашу базу даних у невизначеному (прочитаному ламаному) стані. Зниження привілеїв може не мати жодних очевидних проблем із повсякденним доти, доки не з’явиться оновлення, тому не слід підходити до того, що ви вже зменшили привілеї без шкідливих наслідків, як основа для того, щоб вважати, що це безпечно.


Дякую за детальну відповідь. Важко повірити цьому питанню майже 10 років!
Джо Холлоуей,

Це має бути одним із перших речей, які люди читають.
FKEinternet

2

Як додаткову увагу до цього, погляньте на цей пост mysqlperformanceblog з причин, чому ви можете відключити специфічні для debian речі.


1
"Зауважте, що це не повинно бути проблемою з MySQL від Debian lenny, оскільки він постачається з init-скриптами, які не запускаються CHECK TABLE на таблицях, які не є MYISAM." - із пов’язаної сторінки
d -_- b

2

Під час використання MySQL 5.6+ я рекомендую використовувати mysql_config_editorкоманду для створення запису для користувача 'debian-sys-maint'@'localhost'за допомогою відповідного пароля, тобто пароль не потрібно зберігати у простому тексті на сервері.

mysql_config_editor set --login-path=debian-sys-maint --host=localhost --user=debian-sys-maint --password

Після цього певний конфігураційний файл для debian /etc/mysql/debian.cnfможе бути змінений, щоб дані про ім’я користувача та пароль не зберігалися у файлі.

Нарешті, змініть файл logrotate для MySQL, щоб він використовував дані входу, збережені у ~/.mylogin.cnfфайлі, а не конкретний файл debian, замінюючи

/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf

з

/usr/bin/mysqladmin --login-path=debian-sys-maint

Сподіваюся, це допомагає :)

Дейв


Але, чи буде досягнуто ціль debian-sys-maint користувача цим? Ці пакети повинні мати змогу використовувати цього користувача / пароль, щоб виконати деяке обслуговування системи як rootкористувач у домені Linux (не rootкористувачеві в MySQL без адміністратора, необхідного для введення rootпароля для MySQL?
Anders

Мені це спрацьовує в моїх тестах, якщо виконувати всі зміни, наприклад змінити /etc/mysql/debian.cnfвидалення паролів та змінити файл logrotate для посилання на використання захищених деталей. Я не впевнений, чи використовується користувач debian-sys-maint для чого-небудь іншого, але якщо це так, це допоможе дати вам вказівку, де Debian використовує цей обліковий запис користувача від вашого імені.
Дейв Рікс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.