it-swarm.cn

什么是debian-sys-maint MySQL用户(及更多)?

我已经被默认安装在从Ubuntu存储库安装的mysql-server软件包上的'debian-sys-maint'用户咬过几次。

通常,发生的事情是我提取生产数据库的新副本(该数据库不在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中的密码是否已经被哈希处理,或者这是纯文本密码?当您重新创建用户时,这很重要,但我似乎永远不会在第一次尝试时就搞定它。

谢谢

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服务器上的所有管理员权限,请按照指南重置根密码,然后修复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用户在默认情况下是等效于root用户。它由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目的,您应该not授予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维护者并未任意地给用户所有特权。这是必需的,在哪里以及为什么。其中一些特权是其他特权的超集,但是如果您要自定义事物并删除对它们的要求,我将独立列出它们:

  • shutdownreload,这对于/etc/init.d/mysql是必需的,足以关闭或关闭数据库
  • 在mysql.user上选择,启动数据库时进行完整性检查所需,确保有root用户。通过/ etc/mysql/debian-start(由/etc/init.d/mysql调用)和文件/usr/share/mysql/debian-start.inc.sh中的check_root_accounts函数中的实际代码一起完成每次启动
  • 在information_schema.tables上选择全局选择,这是检查崩溃表所必需的。通过/ etc/mysql/debian-start(由/etc/init.d/mysql调用)和文件/usr/share/mysql/debian-start.inc.sh中的check_for_crashed_tables函数中的实际代码一起完成每次启动
  • 全局所有特权,如果/通过更新或Debian升级安装了新版本的MySQL时,则需要升级表。通过/ etc/mysql/debian-start(由/etc/init.d/mysql调用)和文件/usr/share/mysql/debian-start.inc.sh中的upgrade_system_tables_if_necessary函数中的实际代码一起完成每次启动-实际调用MySQL二进制文件mysql_upgrade-不要被函数名(upgrade_system_tables_if_necessary)欺骗,这可能会涉及所有表-参见下文

最后,当然是特权的主要要求。 mysql_upgrade的手册页指出:

mysql_upgrade检查所有数据库中的所有表是否与当前版本的MySQL Server不兼容。 mysql_upgrade还会升级系统表,以便您可以利用可能已添加的新特权或功能。

如果mysql_upgrade发现表可能不兼容,它将执行表检查,如果发现问题,则尝试表修复。

[〜#〜] warning [〜#〜]如果您决定减少debian-sys-maint所拥有的特权,那么请确保您准备好手动处理将来的任何debian安全更新,并/或涉及MySQL的升级。如果您以降低的debian-sys-maint特权对MySQL软件包执行更新,并且如果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,以便用户名和密码详细信息不存储在该文件中。

最后,更改MySQL的logrotate文件,以使它使用存储在~/.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