it-swarm-ru.tech

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

Меня несколько раз укусил пользователь '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?
    • Есть ли лучший способ для разработчиков пакетов сделать то, что они пытаются сделать?
  • Какой самый простой способ восстановить его после того, как я его потерял?
  • Каков правильный/минимальный набор привилегий для этого пользователя?
    • Похоже, плохая идея "предоставить все привилегии для *. * ..."

Edit

Дополнительный вопрос - пароль в /etc/mysql/debian.cnf уже хеширован или это пароль в виде открытого текста? Это имеет значение, когда вы идете воссоздать пользователя, и я, кажется, никогда не понимаю это правильно с первой попытки.

Спасибо

69
Joe Holloway

Для чего используется 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/75036 ).

58
Zoredache

Пользователь 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

22
Brent

Я хотел просто прокомментировать, но я думаю правильный синтаксис заслуживает отдельной записи. Это создаст пользователя 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, просто используйте там пароль.

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

19
d-_-b

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

Sudo dpkg-reconfigure mysql-server-5.0

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

19
Spoom

Если вам нужно добавить 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 г.

Этот ответ может быть устаревшим - см. Комментарии со строгим мнением ниже.

6
Mark Chackerian

debian-sys-maint необходимые разрешения

Другие ответы в достаточной степени касаются всего, кроме минимального набора разрешений, необходимых для пользователя debian-sys-maint. Многие из ответов здесь просто неверны в этом отношении и фактически опасны. Не уменьшайте привилегии debian-sys-maint (включая опцию grant) без чтения и понимания ниже:

Сопровождающий 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 Необходимого в файле /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 не может завершиться в результате, он может оставить вашу базу данных в неопределенном состоянии (чтение не выполнено). Снижение привилегий может не вызывать каких-либо очевидных повседневных проблем до тех пор, пока не появится обновление, поэтому не стоит полагать, что вы уже уменьшили привилегии без каких-либо вредных последствий в качестве основания полагать, что это безопасно.

3
Kurt Fitzner

Вместо

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
Sean

При использовании 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

Надеюсь это поможет :)

Дейв

2
Dave Rix

Как примечание к этому, взгляните на это сообщение в блоге о производительности mysql по причинам, по которым вы можете захотеть отключить специфичные для debian вещи.

2
Jon Topper