Меня несколько раз укусил пользователь '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)'
Edit
Дополнительный вопрос - пароль в /etc/mysql/debian.cnf уже хеширован или это пароль в виде открытого текста? Это имеет значение, когда вы идете воссоздать пользователя, и я, кажется, никогда не понимаю это правильно с первой попытки.
Спасибо
Для чего используется 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 ).
Пользователь 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
Я хотел просто прокомментировать, но я думаю правильный синтаксис заслуживает отдельной записи. Это создаст пользователя 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, просто используйте там пароль.
Не стесняйтесь придумать больше параноик безопасное решение.
Вы также можете:
Sudo dpkg-reconfigure mysql-server-5.0
Что даст вам возможность воссоздать пользователя debian-sys-maint. Существующие пользователи и базы данных в безопасности.
Если вам нужно добавить 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. Многие из ответов здесь просто неверны в этом отношении и фактически опасны. Не уменьшайте привилегии debian-sys-maint (включая опцию grant) без чтения и понимания ниже:
Сопровождающий Debian не давал капризным пользователям все привилегии. Вот что требуется, где и почему. Некоторые из этих привилегий являются надмножествами других, но я перечислю их независимо, на случай, если вы захотите что-то настроить и отменить требования к ним:
Последнее, конечно, главное требование для привилегий. Страница man для mysql_upgrade гласит:
mysql_upgrade проверяет все таблицы во всех базах данных на несовместимость с текущей версией MySQL Server. mysql_upgrade также обновляет системные таблицы, чтобы вы могли воспользоваться новыми привилегиями или возможностями, которые могли быть добавлены.
Если mysql_upgrade обнаруживает, что таблица имеет возможную несовместимость, он выполняет проверку таблицы и, если обнаруживаются проблемы, пытается восстановить таблицу.
[~ # ~] предупреждение [~ # ~] Если вы решили сократить привилегии, которыми обладает debian-sys-maint, то убедитесь, что вы готовы обрабатывать любые будущие обновления безопасности Debian и/или обновления, которые касаются MySQL. Если вы выполняете обновление пакетов MySQL с ограниченными привилегиями debian-sys-maint, и если mysql_upgrade не может завершиться в результате, он может оставить вашу базу данных в неопределенном состоянии (чтение не выполнено). Снижение привилегий может не вызывать каких-либо очевидных повседневных проблем до тех пор, пока не появится обновление, поэтому не стоит полагать, что вы уже уменьшили привилегии без каких-либо вредных последствий в качестве основания полагать, что это безопасно.
Вместо
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;
потому что пароль не хэшируется ...?
При использовании 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
Надеюсь это поможет :)
Дейв
Как примечание к этому, взгляните на это сообщение в блоге о производительности mysql по причинам, по которым вы можете захотеть отключить специфичные для debian вещи.