Что такое пользователь MySQL debian-sys-maint (и не только)?

71

Меня несколько раз укусил пользователь 'debian-sys-maint', который установлен по умолчанию в пакетах mysql-server, установленных из репозиториев 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 ).

Zoredache
источник
1
«Лучший план - просто не потерять его». Шутки в сторону? Это ноль помощи для людей, которые уже потеряли его, как я, очевидно, сделал во время обновления. Для тех, кому нужно заново создать пользователя, используйте один из вариантов «GRANT ALL» в других ответах, потому что этот пользователь НЕ используется только для операций logrotate - это важная часть процесса обновления.
FKEinternet
Если вы теряете учетные данные, у вас всегда есть возможность, просто запустить демон mysql / mariadb с опцией, которая пропускает систему разрешений, или войти в систему как другой пользователь с привилегиями root для mysql и сбросить пароль. Сброс паролей и обход системы привилегий хорошо задокументированы в других местах в Google и других вопросах на этом сайте.
Зоредаче
22

Пользователь debian-sys-maint по умолчанию является корневым эквивалентом . Он используется некоторыми сценариями обслуживания в системах Debian и, как побочный эффект, позволяет пользователям с правами root на коробке просматривать открытый текстовый пароль в /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, он может полностью обойти систему привилегий, просто перезапустив сервер с правильными параметрами. Если вы, злоумышленник, получите root, у вас, вероятно, больше проблем, чем у этого файла конфигурации.
Зоредаче
2
также re: хорошо или плохо - мне пришлось положиться на доступ к debian-sys-maint, чтобы заново установить пароль учетной записи root MySQL, когда он был забыт. Было приятно иметь этот запасной вариант.
Брент
1
@Brent: См dev.mysql.com/doc/refman/5.0/en/resetting-permissions.html для того, как сбросить MySQL корневой пароль. Я отключил этого пользователя во многих установках mysql в Debian, так как это может вызвать хаос при запуске с проверкой таблиц, если они большие таблицы.
Натан
1
Натан, спасибо за эту ссылку. Это новая информация для меня. Если у вас есть процедура полного отключения учетной записи debian-sys-maint, почему бы вам не включить ее здесь как отдельный ответ? Это было бы прекрасно!
Брент
3
лучший грант - просто дать привилегии завершения работы / запуска.
2010 года
19

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

sudo dpkg-reconfigure mysql-server-5.0

Что даст вам возможность воссоздать пользователя debian-sys-maint. Существующие пользователи и базы данных в безопасности.


источник
Это работало и на mysql-server-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, просто используйте там пароль.

Не стесняйтесь придумать более безопасное решение для параноиков .

d -_- б
источник
1
Это настолько параноидально, насколько это необходимо. Тогда только тот, кто сможет прочитать /etc/mysql/debian.cnfфайл, является rootпользователем Linux . И когда кто-то может прочитать этот файл, он уже имеет rootдоступ к компьютеру и может остановить сервер MySQL и добавить своего системного администратора. И сценарий, запускающий MySQL и другие пакеты, не может выполнять обслуживание безопасности и другое обслуживание. Так что да, это настолько безопасно, насколько это необходимо. И полезно, если вы потеряете пароль администратора MySQL для его восстановления, без необходимости перезапускать его в небезопасном режиме. ;-)
Андерс
Это то, что редактировать для.
RobinJ
6

Если вам нужно добавить debian-sys-maintпользователя только для logrotate.dцелей, вы не должны предоставлять ALL PRIVILEGESили GRANT OPTION- это ненужная гигантская дыра в безопасности. Вместо этого вы можете просто добавить пользователя с такой RELOADпривилегией (при условии, что вы обращаетесь к своей базе данных как 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, то он, по-видимому, имеет root-доступ и в любом случае может перезапустить mysql с --skip-grant-tables.
mc0e
Благодарю. Но нет необходимости дважды очищать объекты, MySQL уже знает, что делает команда GRANT. См dev.mysql.com/doc/refman/5.6/en/privilege-changes.html
ygoe
1
И это не будет работать, так как debian-sys-maintпользователь также используется для выключения сервера. А также для проверки пользователей root при запуске сервера mysql. Поэтому вам по крайней мере необходимо предоставить привилегии select для 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;

потому что пароль не хешируется ...?

Fortega
источник
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
  • select на 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 Необходимого в файле /usr/share/mysql/debian-start.inc.sh - фактически вызывает двоичный MySQL mysql_upgrade - не дайте себя одурачить именем функции (upgrade_system_tables_if_needed), это может потенциально затронуть все таблицы - см. ниже

Последнее, конечно, является основным требованием для привилегий. Страница 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 использует эту учетную запись пользователя от вашего имени.
Дейв Рикс,