我们的VPS的设置方式是通过本地主机和用户名/密码/数据库名从任何域访问所有数据库。
这是通常的设置,还是应该有一些“监禁”每个用户的方式,所以他们不能访问本地主机上的其他数据库?
谢谢,马克
正如Caleb提到的,在设置MySQL时,与其他系统一样,最好是运行一个最不需要的权限系统 – 除非不同的应用程序是相关的,那么他们几乎没有理由访问彼此的数据库。 如果有一些是相关的,那么他们应该被授予在他们需要访问的表上的特定的,有限的特权,而不是更多。
当你说的时候,我正在假设
通过本地主机可以从任何域访问
你的意思是说你正在运行一个多域的Apache安装(或类似的),这意味着你所有的应用程序都运行在同一台机器上,因此,从MySQL的angular度来看,每一个用户都是一个'username'@'localhost'用户,所以你只能通过用户名来指定用户。
需要注意的是,由于MySQL权限的工作方式,在有远程用户的情况下, 'user1'@'abc.example.com'实际上是与'user1'@'abc.example.com' 完全不同的用户 'user1'@'xyz.example.com'或'user1'@'localhost'尽pipe共享一个用户名,这会显着增加您设置权限的灵活性(或者使事情非常混乱,取决于您的观点)。 如果你能够在不同的虚拟机上运行你的数据库服务器,那么这是有利的,当然这不是必须的。
用于添加数据库用户的常见的,易于使用(和不安全)的方法往往是沿着以下方向的:
GRANT ALL ON *.* TO `user1`@`localhost`;
它只是给这个用户GLOBAL权限来做任何事情在任何数据库上。
这对于一些明显的和其他不太明显的原因是不利的。 *.*包括mysql数据库本身 – 可以让你做任何你喜欢的其他用户,设置等等,应该避免。 声明的ALL部分授予GLOBAL范围内的所有可用权限 – 这意味着它们可以执行SHOW PROCESSLIST和KILL <query-id> 。 看起来很好(“为什么他们会这么做?”),但正如Caleb所指出的那样,如果应用程序受到攻击,连接的数据库用户就是攻击者“使用”的用户。
上面的一个简单的改进是为每个数据库使用这样的语句分配权限:
GRANT ALL ON `user1_database`.* TO `user1`@`localhost`;
这将授予user1_database上的user1所有DATABASE级别的权限 – 这是非常重要的,因为它排除了上面列出的所有强大的GLOBAL权限,所以现在用户可以在最坏的情况下删除自己的数据库。
对此方法的进一步改进是为每个应用程序创build至less两个用户。 一个在数据库上有一个GRANT ALL (用于pipe理),另一个由Web应用程序本身使用,只有它需要的权限,并且只在需要访问的对象上使用。 当你做出改变和额外的testing时,这显然是相当多的额外的工作,但是做得很好,如果系统受到损害,它可以显着减less可能的损害。
我经常有一个标准的用户,另一个用于Web应用程序的_www后缀。
您可以使用MySQL的通配符权限来简化其中的一些权限,并让用户能够创build自己的数据库(匹配某种模式)和
-- Create a user that has ALL privileges on databases beginning with 'user1_' -- This is our application admin user -- it can create any database that matches the pattern GRANT ALL ON `user1\_%`.* TO `user1`@`localhost`; -- Create a "safe" version of this user with just the ability to modify data -- This is a generic approach and could be applied at object level per-database GRANT SELECT, INSERT, UPDATE, DELETE ON `user1\_%`.* TO `user1_www`@`localhost`;
在示例中创buildpipe理员用户的方式是共享环境中的常用方法 – 它允许用户创build数据库,而不分配任何GLOBAL权限,以便他们无法查看其他用户的数据库。
您应该使用MySQL权限表使用更细粒度的权限,以便每个应用程序(甚至应用程序的组件)只能访问其function所需的数据库或表。 这将减less隐私侵犯的潜在问题,在发生安全漏洞时减less损失,甚至在testing期间帮助揭示软件中的错误。
正如@simon和@caleb提到的那样,全局权限是很常见的,但这并不是一个好习惯,我使用这个“macros”(我根据serverfault或so上的另一个post拼凑起来的)记得哪一个“)的特权:
SET @usr = '\'username\'@\'localhost\''; SET @pwd = '\'longpassword\''; SET @db = 'database'; set @query = CONCAT('revoke all privileges on *.* from ', @usr);PREPARE stmt FROM @query;EXECUTE stmt;DEALLOCATE PREPARE stmt; set @query = CONCAT('drop user ', @usr);PREPARE stmt FROM @query;EXECUTE stmt;DEALLOCATE PREPARE stmt; set @query = CONCAT('create user ', @usr, ' identified by ', @pwd);PREPARE stmt FROM @query;EXECUTE stmt;DEALLOCATE PREPARE stmt; set @obj = CONCAT(@db, '.tablename');SET @query = CONCAT('GRANT select ON ', @obj, ' TO ', @usr, ' identified by ', @pwd);PREPARE stmt FROM @query;EXECUTE stmt;DEALLOCATE PREPARE stmt;
删除'撤销','删除'和'创build'行,并根据需要更改表名和权限。 正如@caleb所暗示的,它允许以最小的麻烦创build细粒度的权限。