假设您正在使用 Ruby 和 MySQL 编写一个简单的数据库 Web 应用程序。对数据库的访问由 Ruby 代码控制。Ruby 代码用来访问数据的用户名是数据库中唯一的常规用户。该用户成为“root”是否有意义?或者为应用程序创建第二个用户是否有任何额外的安全性?
6 回答
很简单,将 root 视为主要用户,他可以做任何事情(默认情况下)。
如果他想转储整个数据库,他可以,如果他想创建一些数据来创建(例如)假账户以越过您的银行系统,他可以。因此,如果您的代码不够安全(通常这种情况很常见),那么您就会遇到严重的安全问题。
通常,“一个基本的”安全性(真正的基本)应该是这样的:创建一个简单的用户,赋予他(使用 GRANTS)对特定数据库进行 SELECT、INSERT、UPDATE 和 DELETE 的权利。
创建另一个可以选择和锁定表和显示视图以执行转储(数据库保存)的用户。
在更“复杂”的系统上,您应该根据他们应该访问的内容创建许多用户,原因很简单:如果有人获得了 SQL 注入访问权限,如果用户只能访问单个视图(例如),而不是整个数据库,这是一个安全问题,但不是最糟糕的问题......视图也经常用于那个......
最后不要忘记触发器(例如日志表),禁用表上的插入或更新或删除,对于每个人(当然可以销毁触发器的人除外): 使用触发器来停止插入或更新
如果每个人/事物都是 root,您将失去可审计性,您将失去限制应用程序阻止攻击的能力(即,您的应用程序不需要这部分敏感信息,将其与用户隔离开来)。如果有人破坏了该应用程序,您可以暂停该帐户等。
我不会让用户成为“root”。
我将为该应用程序创建一个单独的用户名和密码,并仅授予它完成其工作所需的权限。
我会创建一个新用户,只给它所需的权限(SELECT、UPDATE、INSERT 和 DELETE 通常可以解决问题)。像这样,您限制了以非预期方式操作代码的能力。
“root”,或者一般来说,具有超级用户权限的用户,可以更改密码、删除帐户,从而阻止您访问自己的数据库。
如果您的服务器仅托管一个应用程序,那么您可能不需要创建多个特权较低的帐户。但是,通常的做法是为每个应用程序创建至少一个用户,这样如果一个应用程序受到威胁,其他应用程序(和底层数据)可能不会受到威胁。