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

<p>меня несколько раз укусил пользователь 'debian-sys-maint', который установлен по умолчанию на пакеты mysql-server, установленные из репозиториев ubuntu.</p><p>обычно, что происходит, я беру свежую копию нашей производственной базы данных (которая не работает в debian/ubuntu) для устранения неполадок или новой разработки и забываю исключить таблицу mysql.user, следовательно, теряю пользователя debian-sys-maint.</p><p>если по какой-либо причине мы добавим новых пользователей mysql, мне придется "объединить" их в мою среду разработки, а не просто наложить таблицу.</p><p>без пользователя моя система все еще кажется работоспособной, но страдает от таких ошибок, как:</p><pre><code>sudo /etc/init.d/mysql restart stopping mysql database server: mysqld...failed. error: 'access denied for user 'debian-sys-maint'@'localhost' (using password: yes)' </code></pre><ul> <li>для чего используется debian-sys-maint? <ul> <li>есть ли лучший способ для разработчиков пакетов сделать то, что они пытаются сделать?</li> </ul> </li> <li>какой самый простой способ восстановить его после того, как я его потерял?</li> <li>каков правильный/минимальный набор привилегий для этого пользователя? <ul> <li>похоже, плохая идея "предоставить все привилегии для *. * ..."</li> </ul> </li> </ul><p><strong>edit</strong></p><p>дополнительный вопрос - пароль в /etc/mysql/debian.cnf уже хеширован или это пароль в виде открытого текста? это имеет значение, когда вы идете воссоздать пользователя, и я, кажется, никогда не понимаю это правильно с первой попытки.</p><p>спасибо</p>

<blockquote> <p>для чего используется debian-sys-maint?</p> </blockquote><p>одна из главных вещей, для которой он используется, - указание серверу накатывать логи. для этого требуется как минимум привилегия перезагрузки и завершения работы.</p><p>смотрите файл <strong>/etc/logrotate.d/mysql-server </strong></p><p>используется <code>/etc/init.d/mysql</code> скрипт для получения статуса сервера. он используется для корректного выключения/перезагрузки сервера.</p><p>вот цитата из readme.debian</p><pre><code>* 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. </code></pre><hr><blockquote> <p>какой самый простой способ восстановить его после того, как я его потерял?</p> </blockquote><p>лучший план - просто не потерять его. если вы действительно потеряли пароль, сбросьте его, используя другую учетную запись. если вы потеряли все привилегии администратора на сервере mysql, следуйте инструкциям по сбросу пароля root, а затем восстановите <code>debian-sys-maint</code>.</p><p>вы можете использовать команду, подобную этой, чтобы создать файл sql, который вы можете использовать позже для воссоздания учетной записи.</p><pre><code>mysqldump --complete-insert --extended-insert=0 -u root -p mysql | grep 'debian-sys-maint' > debian\_user.sql </code></pre><hr><blockquote> <p>пароль в /etc/mysql/debian.cnf уже хэширован</p> </blockquote><p>при установке пароль не хешируется/не шифруется, но в новых версиях mysql теперь есть способ шифрования учетных данных (см .: <a href="https://serverfault.com/a/750363">https://serverfault.com/a/75036</a> ).</p>

<p>пользователь <strong>debian-sys-maint</strong> по умолчанию является <strong>корневой эквивалент</strong>. он используется некоторыми сценариями обслуживания в системах debian и, как побочный эффект, позволяет пользователям с правами root на коробке просматривать открытый текстовый пароль в /etc/mysql/debian.cnf (хорошо или плохо?)</p><p>вы можете заново создать пользователя:</p><pre><code>grant all privileges on *.* to `debian-sys-maint`@`localhost` identified by 'your password' with grant option; </code></pre><p>просто <strong>убедитесь, что пароль совпадает</strong> в /etc/mysql/debian.cnf</p>

<p>я хотел просто прокомментировать, но я думаю <strong>правильный синтаксис</strong> заслуживает отдельной записи. это создаст <em> пользователя debian-sys-maint </em>:</p><pre><code>mysql> grant all privileges on *.* to 'debian-sys-maint'@'localhost' identified by 'plaintextpassword' with grant option; flush privileges; </code></pre><p>если у вас все еще есть файл /etc/mysql/debian.cnf, просто используйте там пароль.</p><p>не стесняйтесь придумать больше <strike>параноик</strike> безопасное решение.</p>

<p>вы также можете:</p><pre><code>sudo dpkg-reconfigure mysql-server-5.0 </code></pre><p>что даст вам возможность воссоздать пользователя debian-sys-maint. существующие пользователи и базы данных в безопасности.</p>

<p>если вам нужно добавить <code>debian-sys-maint</code> пользователь только для <code>logrotate.d</code> цели, вы должны <strong>не</strong> предоставить <code>all privileges</code> или <code>grant option</code> - это ненужная гигантская дыра в безопасности. вместо этого вы можете просто добавить пользователя с привилегией <code>reload</code>, как это (при условии, что вы обращаетесь к своей базе данных как <code>root</code>, и вы заменяете xxxxxx своим паролем)</p><pre><code># 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; </code></pre><p><strong>обновление 2019 г.</strong></p><p>этот ответ может быть устаревшим - см. комментарии со строгим мнением ниже.</p>

<h2><strong> debian-sys-maint необходимые разрешения </strong></h2><p>другие ответы в достаточной степени касаются всего, кроме минимального набора разрешений, необходимых для пользователя debian-sys-maint. многие из ответов здесь просто неверны в этом отношении и фактически опасны. не уменьшайте привилегии debian-sys-maint (включая опцию grant) без чтения и понимания ниже:</p><p>сопровождающий debian не давал капризным пользователям все привилегии. вот что требуется, где и почему. некоторые из этих привилегий являются надмножествами других, но я перечислю их независимо, на случай, если вы захотите что-то настроить и отменить требования к ним:</p><ul> <li><strong> выключение </strong> и <strong> перезагрузка </strong>, достаточно неудивительно, для выключения или выполнения база данных, сделано /etc/init.d/mysql</li> <li><strong> выберите в mysql.user </strong>, необходимый для проверок работоспособности, выполняемых при запуске базы данных, обеспечивая наличие пользователя root. завершение каждого запуска с помощью/etc/mysql/debian-start (вызываемого /etc/init.d/mysql) с фактическим кодом в функции check\_root\_accounts в файле /usr/share/mysql/debian-start.inc.sh</li> <li><strong> выбрать в файлах information\_schema.tables </strong>, <strong> глобальный выбор </strong>, необходимый для проверки на сбой столы. завершение каждого запуска с помощью/etc/mysql/debian-start (вызываемого /etc/init.d/mysql) с фактическим кодом в функции check\_for\_crashed\_tables в файле /usr/share/mysql/debian-start.inc.sh</li> <li><strong> глобальные все привилегии </strong>, необходимые для обновления таблиц, если/когда новая версия 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), это может потенциально затронуть все таблицы - см. ниже</li> </ul><p>последнее, конечно, главное требование для привилегий. страница man для mysql\_upgrade гласит:</p><blockquote> <p>mysql\_upgrade проверяет все таблицы во всех базах данных на несовместимость с текущей версией mysql server. mysql\_upgrade также обновляет системные таблицы, чтобы вы могли воспользоваться новыми привилегиями или возможностями, которые могли быть добавлены.</p> <p>если mysql\_upgrade обнаруживает, что таблица имеет возможную несовместимость, он выполняет проверку таблицы и, если обнаруживаются проблемы, пытается восстановить таблицу.</p> </blockquote><p><strong> [~ # ~] предупреждение [~ # ~] </strong> если вы решили сократить привилегии, которыми обладает debian-sys-maint, то убедитесь, что вы готовы обрабатывать любые будущие обновления безопасности debian и/или обновления, которые касаются mysql. если вы выполняете обновление пакетов mysql с ограниченными привилегиями debian-sys-maint, и если mysql\_upgrade не может завершиться в результате, он может оставить вашу базу данных в неопределенном состоянии (чтение не выполнено). снижение привилегий может не вызывать каких-либо очевидных повседневных проблем до тех пор, пока не появится обновление, поэтому не стоит полагать, что вы уже уменьшили привилегии без каких-либо вредных последствий в качестве основания полагать, что это безопасно.</p>

<p>вместо</p><pre><code>grant all privileges on *.* to 'debian-sys-maint'@'localhost' identified by password('your password') with grant option; flush privileges; </code></pre><p>я думаю</p><pre><code>grant all privileges on *.* to 'debian-sys-maint'@'localhost' identified by 'your password' with grant option; flush privileges; </code></pre><p>потому что пароль не хэшируется ...?</p>

<p>при использовании mysql 5.6+ я бы рекомендовал использовать <code>mysql\_config\_editor</code> команда для создания записи для пользователя <code>'debian-sys-maint'@'localhost'</code> используя соответствующий пароль, то есть пароль не нужно хранить в виде простого текста на сервере.</p><p><code>mysql\_config\_editor set --login-path=debian-sys-maint --host=localhost --user=debian-sys-maint --password</code></p><p>после этого, специфичный для debian конфигурационный файл <code>/etc/mysql/debian.cnf</code> может быть изменено, поэтому имя пользователя и пароль не сохраняются в файле.</p><p>наконец, измените файл logrotate для mysql, чтобы он использовал данные для входа, хранящиеся в <code>~/.mylogin.cnf</code> файл вместо конкретного файла debian, заменив</p><p><code>/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf</code></p><p>с</p><p><code>/usr/bin/mysqladmin --login-path=debian-sys-maint</code></p><p>надеюсь это поможет :)</p><p>дейв</p>

<p>как примечание к этому, взгляните на <a href="http://www.mysqlperformanceblog.com/2009/01/28/the-perils-of-innodb-with-debian-and-startup-scripts/">это сообщение в блоге о производительности mysql</a> по причинам, по которым вы можете захотеть отключить специфичные для debian вещи.</p>