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

通常情况下,我会拉一个新副本生产数据库(不在Debian / Ubuntu上运行)进行故障排除或进行新开发时,忘记了排除mysql.user表,从而丢失了debian-sys-maint用户。

如果出于任何原因添加新的mysql用户,我必须将它们“合并”到开发环境中,而不是仅仅覆盖表。

没有用户我的系统似乎仍然可以正常运行,但是遇到诸如以下错误的困扰:
软件包维护者有更好的方法来做他们想做的事情吗?


丢失了它之后,最简单的恢复方法是什么?
该用户的正确/最小权限集是什么?


好像是个糟糕的主意,以“授予*。*上的所有特权...”



编辑

其他问题-/etc/mysql/debian.cnf中的密码是否已经散列或为纯文本密码?当您重新创建用户时,这很重要,而我似乎从来没有第一次尝试过。

感谢

评论

密码是/etc/mysql/debian.cnf
中的纯文本

#1 楼


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/750363)。

评论


“最好的计划就是不要失去它。”认真吗对于那些已经像我在升级期间丢失了它的人来说,这是零帮助。对于确实需要重新创建用户的用户,请在其他答案中使用“ GRANT ALL”选项之一,因为该用户不仅用于logrotate操作-这是升级过程中的关键部分。

– FKEinternet
19年8月13日在20:05

如果确实丢失了凭据,则始终可以选择以下选项:仅使用跳过权限系统的选项启动mysql / mariadb守护程序,或者以具有root mysql特权的其他用户身份登录并重置密码。在Google上的其他位置以及此站点上的其他问题中都有很好的文档,说明了重设密码和绕过特权系统的情况。

– Zoredache
19年8月13日在21:36



#2 楼

默认情况下,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中的密码匹配

评论


重新(好或坏)-如果有人设法成为root用户,则可以通过使用正确的选项重新启动服务器来完全绕开特权系统。如果攻击者成为root用户,那么您可能会遇到比该配置文件更大的问题。

– Zoredache
09年5月19日在16:53

还是这样:好或坏-我不得不依靠debian-sys-maint访问来在忘记了MySQL根帐户密码后重新设置它。拥有此后备选项非常好。

–布伦特
09年5月19日在17:58

@Brent:有关如何重置mysql根密码的信息,请参见dev.mysql.com/doc/refman/5.0/en/resetting-permissions.html。我已在Debian上的许多mysql安装上禁用了该用户,因为它在启动时会因检查表是否很大而造成严重破坏。

–内森(Nathan)
09年5月20日,0:23

内森,感谢您的链接。这对我来说是新信息。如果您有一个完全禁用debian-sys-maint帐户的过程,那么为什么不将其作为单独的答案包括在这里。那很好啊!

–布伦特
09年5月20日在13:57

更好的授权只是授予关闭/启动特权。

– jmtd
2010年8月25日在9:12

#3 楼

您还可以:

sudo dpkg-reconfigure mysql-server-5.0


这将为您提供重新创建debian-sys-maint用户的选项。现有的用户和数据库是安全的。

评论


这也适用于mysql-server-5.5。

– serverSentinel
15年4月21日在15:10

这仅在您的mysql服务器安装未中断的情况下才有效-如果缺少debian-sys-maint用户,可能会发生这种情况。

– FKEinternet
19年8月13日在20:08

这对我有用,但请确保MySQL服务器未运行,否则将无提示地执行任何操作。如果运行常规的service / systemctl / init.d命令后服务器仍未停止,请在运行dpkg-reconfigure命令之前使用killall mysqld。

– Ivo Smits
20/12/17在10:32

#4 楼

我只想发表评论,但我认为正确的语法值得它自己输入。这将创建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文件,只需在其中使用密码。

随时提出更偏执的安全解决方案。

评论


它与需要一样偏执。然后,只有一个应该能够读取文件/etc/mysql/debian.cnf的文件才是Linux超级用户。并且当某人可以读取该文件时,他们已经具有对该计算机的root访问权,并且可以停止MySQL服务器并添加自己的系统管理员。而且启动MySQL和其他软件包的脚本无法进行安全维护和其他维护。是的,它是如此安全。如果您松开MySQL管理员密码即可恢复它,而无需以不安全的方式重新启动它,则非常有用。 ;-)

–安德斯
16-3-22在1:57

这就是编辑的目的。

– RobinJ
18 Mar 27 '18 at 15:52

#5 楼

如果仅出于debian-sys-maint的目的而需要添加logrotate.d用户,则不应授予ALL PRIVILEGESGRANT 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所需的权限。另外,我可以确认它像吊饰一样工作。干杯!

–嫉妒
14年8月29日在16:04

这真的是安全漏洞吗?如果有人已经可以读取/etc/mysql/debian.cnf,那么他们大概具有root访问权限,并且无论如何都可以使用--skip-grant-tables重新启动mysql。

–mc0e
2014年12月9日13:51



谢谢。但是无需刷新两次,MySQL已经知道GRANT命令的作用。参见dev.mysql.com/doc/refman/5.6/en/privilege-changes.html

– ygoe
2014年12月30日15:35

而且这将不起作用,因为debian-sys-maint用户还用于关闭服务器。并在启动mysql服务器时检查root用户。因此,您至少需要授予mysql。*的选择权限和关闭权限。

–安德斯
2015年1月2日,下午3:26

否否否,不要听从此答案的建议-出于另一个答案为“ debian-sys-maint必需的权限”中列出的原因,您需要将所有特权授予debian-sys-maint。简而言之,您可能每天都很好,但是在应用安全更新,打补丁或升级系统时会遇到严重问题。

–库尔特·菲茨纳
19年1月11日在2:23

#6 楼

我认为
而不是

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;


因为密码没有被散列...?

#7 楼

debian-sys-maint所需的权限

其他答案已充分解决了所有问题,除了debian-sys-maint用户所需的最小权限集。在这方面,这里的许多答案简直是错误的,实际上是危险的。在没有阅读和理解以下内容之前,切勿减少debian-sys-maint特权(包括Grant选项):

Debian维护者并未任意地将所有特权授予用户。这是必需的,在哪里以及为什么。其中一些特权是其他特权的超集,但是如果您要自定义内容并删除对它们的要求,我将单独列出它们:




关闭并重新加载,必需不足为奇的是,对于关闭或运行数据库,由/etc/init.d/mysql

select on mysql.user完成,对于启动数据库时进行的完整性检查是必需的,确保有根用户。由/ etc / mysql / debian-start(由/etc/init.d/mysql调用)和文件/usr/share/mysql/debian-start.inc.sh中的check_root_accounts函数中的实际代码一起完成每次启动。 br />
在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发现表具有可能的不兼容性,它
执行表检查,如果发现问题,则尝试修复表。


警告
如果您决定减少debian-sys-maint拥有的特权,然后确保您准备好手动处理任何将来涉及MySQL的debian安全更新和/或升级。如果您以降低的debian-sys-maint特权对MySQL软件包执行更新,并且如果mysql_upgrade结果无法完成,则可能会使数据库处于未定义(读取中断)状态。降低特权可能不会有任何明显的日常问题,直到更新来临,因此,不要以您已经降低特权而没有有害影响的事实为依据,认为它是安全的。

评论


感谢详尽的回答。很难相信这个问题已经有10年了!

–乔·霍洛威(Joe Holloway)
19年1月11日,下午4:54

这应该是人们首先阅读的内容之一。

– FKEinternet
19年8月13日在20:13

#8 楼

作为对此的注释,请查看此mysqlperformanceblog帖子,以了解可能要禁用特定于debian的内容的原因。

评论


“请注意,对于Debian lenny的MySQL,这应该不成问题,因为它附带的初始化脚本不会在非MYISAM表上运行CHECK TABLE。” -从链接页面

–d -_- b
13年4月23日在5:38

#9 楼

使用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,以便用户名和密码详细信息不存储在文件中。以便通过将

~/.mylogin.cnf

替换为

/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf /usr/bin/mysqladmin --login-path=debian-sys-maint文件中的登录详细信息而不是Debian特定文件。 >
希望对您有所帮助:)

戴夫

评论


但是,这样可以实现debian-sys-maint用户的目的吗?那些软件包应该能够使用该用户/密码以Linux域中的root用户(不是MySQL的root用户,而无需管理员输入MySQL的root密码)来进行一些系统维护?

–安德斯
16-3-22在1:47

如果您执行所有更改,例如对/etc/mysql/debian.cnf进行更改以删除密码,并更改logrotate文件以引用,以使用安全的详细信息,那么它在我的测试中确实对我有用。我不确定debian-sys-maint用户是否用于其他任何用途,但是如果使用的话,这将帮助您指示Debian在哪里代表您使用此用户帐户。

–戴夫·里克斯
16-3-22在13:49