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


71

我已经被默认安装在从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中的密码是否已经被哈希处理,或者这是纯文本密码?当您重新创建用户时,这很重要,但我似乎永远不会在第一次尝试时就搞定它。

谢谢


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

Answers:


57

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


1
“最好的计划就是不要失去它。” 认真吗 这就是了谁已经失去了它,因为我在升级过程中显然没有人帮助。对于那些谁需要重新创建用户,使用“GRANT ALL”,在其他的答案选项中的一个,因为这个用户是不是仅用于logrotate的操作-这是升级过程中的一个重要组成部分。
FKEinternet

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

22

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


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

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

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

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

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

19

您还可以:

sudo dpkg-reconfigure mysql-server-5.0

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


这也适用于mysql-server-5.5。
serverSentinel

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

19

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

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


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

这就是编辑的目的。
RobinJ

6

如果您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。另外,我可以确认它像吊饰一样工作。干杯!
Jealie

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

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

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

1
否否否,请勿遵循此答案的建议-您需要出于其他答案中标题为“ debian-sys-maint所需权限”的其他原因中所述的原因,将所有特权授予debian-sys-maint。简而言之,您可能每天都很好,但是在应用安全更新,打补丁或升级系统时会遇到严重问题。
Kurt Fitzner

3

代替

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

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上的select全局select,用于检查崩溃的表。通过/ 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年了!
乔·霍洛威

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

2

作为对此的附带说明,请查看此mysqlperformanceblog帖子,以了解可能要禁用特定于Debian的内容的原因。


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

2

当使用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

之后,/etc/mysql/debian.cnf可以更改debian特定的配置文件,以便用户名和密码详细信息不存储在文件中。

最后,更改MySQL的logrotate文件,以便它~/.mylogin.cnf通过替换替换存储在文件中的登录详细信息而不是Debian特定文件

/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf

/usr/bin/mysqladmin --login-path=debian-sys-maint

希望这可以帮助 :)

戴夫


但是,debian-sys-maint 用户的目的会由此达成吗?该软件包应该能够使用该用户/密码以rootLinux域中的用户身份进行某些系统维护(root如果没有管理员需要输入rootMySQL 的密码,则不是MySQL中的用户?)
Anders

如果您执行所有更改(例如更改/etc/mysql/debian.cnf来删除密码并更改logrotate文件以引用来使用安全的详细信息),那么它在我的测试中确实对我有用。我不确定debian-sys-maint用户是否用于其他任何用途,但是如果使用的话,这将帮助您指示Debian在哪里代表您使用此用户帐户。
戴夫·里克斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.