Меня несколько раз кусал пользователь 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)'
редактировать
Дополнительный вопрос - пароль в /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/750363).
В 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
Этот ответ может быть устаревшим - см. Категорические комментарии ниже.
Вместо того
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;
потому что пароль не хеширован ...?
Другие ответы в достаточной степени касались всего, кроме минимального набора разрешений, необходимых для пользователя debian-sys-maint. Многие ответы здесь просто неверны в этом отношении и даже опасны. Не уменьшайте права debian-sys-maint (включая параметр предоставления), не прочитав и не поняв ниже:
Сопровождающий Debian не прихотливо предоставил пользователю все привилегии. Вот что требуется, где и почему. Некоторые из этих привилегий являются надмножествами других, но я перечислю их отдельно на тот случай, если вы захотите что-то настроить и удалить для них требование:
Последнее, конечно же, главное требование для получения привилегий. На странице руководства для mysql_upgrade указано, что:
mysql_upgrade проверяет все таблицы во всех базах данных на несовместимость с текущей версией MySQL Server. mysql_upgrade также обновляет системные таблицы, чтобы вы могли воспользоваться новыми привилегиями или возможностями, которые могли быть добавлены.
Если mysql_upgrade обнаруживает, что таблица имеет возможную несовместимость, она выполняет проверку таблицы и, если обнаружены проблемы, пытается восстановить таблицу.
ПРЕДУПРЕЖДЕНИЕ Если вы решите сократить привилегии, которые имеет debian-sys-maint, убедитесь, что вы готовы вручную обрабатывать любые будущие обновления безопасности debian и / или обновления, касающиеся MySQL. Если вы выполняете обновление пакетов MySQL с уменьшенной привилегией debian-sys-maint, и если в результате mysql_upgrade не может быть завершен, он может оставить вашу базу данных в неопределенном (чтение прервано) состоянии. Снижение привилегий может не иметь никаких очевидных повседневных проблем до тех пор, пока не появится обновление, поэтому не стоит полагаться на тот факт, что вы уже уменьшили привилегии без каких-либо вредных последствий, как основание для того, чтобы думать, что это безопасно.
В качестве примечания к этому, взгляните на это сообщение в блоге о производительности mysql по причинам, по которым вы можете захотеть отключить специфичные для debian вещи.
При использовании 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
Надеюсь это поможет :)
Дэйв