4

假设您正在使用 Ruby 和 MySQL 编写一个简单的数据库 Web 应用程序。对数据库的访问由 Ruby 代码控制。Ruby 代码用来访问数据的用户名是数据库中唯一的常规用户。该用户成为“root”是否有意义?或者为应用程序创建第二个用户是否有任何额外的安全性?

4

6 回答 6

3

很简单,将 root 视为主要用户,他可以做任何事情(默认情况下)。

如果他想转储整个数据库,他可以,如果他想创建一些数据来创建(例如)假账户以越过您的银行系统,他可以。因此,如果您的代码不够安全(通常这种情况很常见),那么您就会遇到严重的安全问题。

通常,“一个基本的”安全性(真正的基本)应该是这样的:创建一个简单的用户,赋予他(使用 GRANTS)对特定数据库进行 SELECT、INSERT、UPDATE 和 DELETE 的权利。

创建另一个可以选择和锁定表和显示视图以执行转储(数据库保存)的用户。

在更“复杂”的系统上,您应该根据他们应该访问的内容创建许多用户,原因很简单:如果有人获得了 SQL 注入访问权限,如果用户只能访问单个视图(例如),而不是整个数据库,这是一个安全问题,但不是最糟糕的问题......视图也经常用于那个......

最后不要忘记触发器(例如日志表),禁用表上的插入或更新或删除,对于每个人(当​​然可以销毁触发器的人除外): 使用触发器来停止插入或更新

于 2012-06-15T23:57:30.323 回答
2

除了编辑或删除数据库中的所有数据外,root 用户还具有FILE权限,可以访问:

  • LOAD DATA INFILE可用于读取服务器机器上的任何文件。
  • LOAD DATA LOCAL INFILE它可以读取客户端机器(网络服务器机器)上的文件。
  • SELECT ... INTO OUTFILE它可以在服务器机器上创建文件。

这就是为什么你的应用程序应该只拥有它需要的权限,这也是你的 MySQL 服务器守护程序应该作为服务器机器上的非特权用户运行的原因。

另请参阅手册中的一般安全问题

于 2012-06-16T14:56:37.260 回答
1

如果每个人/事物都是 root,您将失去可审计性,您将失去限制应用程序阻止攻击的能力(即,您的应用程序不需要这部分敏感信息,将其与用户隔离开来)。如果有人破坏了该应用程序,您可以暂停该帐户等。

于 2012-06-15T23:48:06.190 回答
0

不会让用户成为“root”。

我将为该应用程序创建一个单独的用户名和密码,并仅授予它完成其工作所需的权限。

于 2012-06-15T23:48:22.220 回答
0

我会创建一个新用户,只给它所需的权限(SELECT、UPDATE、INSERT 和 DELETE 通常可以解决问题)。像这样,您限制了以非预期方式操作代码的能力。

于 2012-06-15T23:50:56.180 回答
0

“root”,或者一般来说,具有超级用户权限的用户,可以更改密码、删除帐户,从而阻止您访问自己的数据库。

如果您的服务器仅托管一个应用程序,那么您可能不需要创建多个特权较低的帐户。但是,通常的做法是为每个应用程序创建至少一个用户,这样如果一个应用程序受到威胁,其他应用程序(和底层数据)可能不会受到威胁。

于 2012-06-16T02:15:38.393 回答