MySQL安全性指南
2005-11-06 17:18:47 来源:WEB开发网核心提示: "N"列是为GRANT权限;对末尾的一个数据库级具有WITH GRANT OPTION的GRANT语句,你要设置该列为"Y",MySQL安全性指南(5),要设置表级或列级权限,你对tables_priv或columns_priv使用INSERT语句,通过运行下列命令检查你是否
"N"列是为GRANT权限;对末尾的一个数据库级具有WITH GRANT OPTION的GRANT语句,你要设置该列为"Y"。
要设置表级或列级权限,你对tables_priv或columns_priv使用INSERT语句。当然,如果你没有GRANT语句,你将没有这些表,因为它们在MySQL(和PHP搭配之最佳组合)中同时出现。如果你确实有这些表并且为了某些原因想要手工操作它们,要知道你不能用单独的列启用权限。
你设置tables_priv.Table_priv或columns_priv.Column_priv列来设置包含你想启用的权限值。例如,要对一个表启用SELECT和INSERT权限,你要在相关的tables_priv的记录中设置Table_priv为"Select,Insert"。
如果你想对一个拥有MySQL(和PHP搭配之最佳组合)账号的用户修改权限,使用UPDATE而不是INSERT,不管你增加或撤销权限都是这样。要完全删除一个用户,从用户使用的每个表中删除记录。
如果你愿意避免发一个查询来直接修改全权表,你可以看一下MySQL(和PHP搭配之最佳组合)自带的MySQL(和PHP搭配之最佳组合)access和MySQL(和PHP搭配之最佳组合)_setpermissions脚本。
附录1 小测验
在你刚刚新安装了一个MySQL(和PHP搭配之最佳组合)服务器,在你增加了一个允许连接MySQL(和PHP搭配之最佳组合)的用户,用下列语句:
GRANT ALL ON samp_db.* TO fred@*.snake.net IDENTIFIED "cocoa"
而fred碰巧在服务器主机上有个账号,所以他试图连接服务器:
%MySQL(和PHP搭配之最佳组合) -u fred -pcocoa samp_db
ERROR 1045: Access denied for user: 'fred@localhost' (Using password: YES)
为什么?
原因是:
先考虑一下MySQL(和PHP搭配之最佳组合)_install_db如何建立初始权限表和服务器如何使用user表记录匹配客户连接。在你用MySQL(和PHP搭配之最佳组合)_install_db初始化你的数据库时,它创建类似这样的user表:
Host User
localhost
pit.snake.net
localhost
pit.snake.net root
root
头两个记录允许root指定localhost或主机名连接本地服务器,后两个允许匿名用户从本地连接。当增加fred用户后,
Host User
localhost
pit.snake.net
localhost
pit.snake.net
%.snake.net root
root
fred
在服务器启动时,它读取记录并排序它们(首先按主机,然后按主机上的用户),越具体越排在前面:
Host User
localhost
localhost
pit.snake.net
pit.snake.net
%.snake.net root
root
fred
有localhost的两个记录排在一起,而对root的记录排在第一,因为它比空值更具体。pit.snake.net的记录也类似。所有这些均是没有任何通配符的字面上的Host值,所以它们排在对fred记录的前面,特别是匿名用户排在fred之前。
结果是在fred试图从localhost连接时,Host列中的一个空用户名的记录在包含%.snake.net的记录前匹配。该记录的口令是空的,因为缺省的匿名用户没有口令。因为在fred连接时指定了一个口令,由一个错配连接失败。
这里要记住的是,虽然用通配符指定用户可以从其连接的主机是很方便。但你从本地主机连接时会有问题,只要你在table表中保留匿名用户记录。
一般地,建议你删除匿名用户记录:
MySQL(和PHP搭配之最佳组合)> DELETE FROM user WHERE User="";
更进一步,同时删除其他授权表中的任何匿名用户,有User列的表有db、tables_priv和columns_priv。
附录2 使一个新的MySQL(和PHP搭配之最佳组合)安装更安全
在你自己安装了一个新的MySQL(和PHP搭配之最佳组合)服务器后,你需要为MySQL(和PHP搭配之最佳组合)的root用户指定一个目录(缺省无口令),否则如果你忘记这点,你将你的MySQL(和PHP搭配之最佳组合)处于极不安全的状态(至少在一段时间内)。
在Unix(Linux)上,在按照手册的指令安装好MySQL(和PHP搭配之最佳组合)后,你必须运行MySQL(和PHP搭配之最佳组合)_install_db脚本建立包含授权表的MySQL(和PHP搭配之最佳组合)数据库和初始权限。在Windows上,运行分发中的Setup程序初始化数据目录和MySQL(和PHP搭配之最佳组合)数据库。假定服务器也在运行。
当你第一次在机器上安装MySQL(和PHP搭配之最佳组合)时,MySQL(和PHP搭配之最佳组合)数据库中的授权表是这样初始化的:
·你可以从本地主机(localhost)上以root连接而不指定口令。root用户拥有所有权限(包括管理权限)并可做任何事情。(顺便说明,MySQL(和PHP搭配之最佳组合)超级用户与Unix超级用户有相同的名字,他们彼此毫无关系。)
·匿名访问被授予用户可从本地连接名为test和任何名字以test_开始的数据库。匿名用户可对数据库做任何事情,但无管理权限。
从本地主机多服务器的连接是允许的,不管连接的用户使用一个localhost主机名或真实主机名。如:
% MySQL(和PHP搭配之最佳组合) -h localhost test
% MySQL(和PHP搭配之最佳组合) -h pit.snake.net test
你以root连接MySQL(和PHP搭配之最佳组合)甚至不指定口令的事实只是意味着初始安装不安全,所以作为管理员的你首先要做的应该是设置root口令,然后根据你设置口令使用的方法,你也可以告诉服务器重载授权表是它知道这个改变。(在服务器启动时,它重载表到内存中而可能不知道你已经修改了它们。)
对MySQL(和PHP搭配之最佳组合) 3.22和以上版本,你可以用MySQL(和PHP搭配之最佳组合)admin设置口令:
% MySQL(和PHP搭配之最佳组合)admin -u root password yourpassword
对于MySQL(和PHP搭配之最佳组合)的任何版本,你可以用MySQL(和PHP搭配之最佳组合)程序并直接修改MySQL(和PHP搭配之最佳组合)数据库中的user授权表:
% MySQL(和PHP搭配之最佳组合) -u root MySQL(和PHP搭配之最佳组合)
MySQL(和PHP搭配之最佳组合)>UPDATE user SET password=PASSWORD("yourpassword") WHERE User="root";
如果你有MySQL(和PHP搭配之最佳组合)的老版本,使用MySQL(和PHP搭配之最佳组合)和UPDATE。
在你设置完口令后,通过运行下列命令检查你是否需要告诉服务器重载授权表:
% MySQL(和PHP搭配之最佳组合)admin -u root status
如果服务器仍然让你以root而不指定口令而连接服务器,重载授权表:
% MySQL(和PHP搭配之最佳组合)admin -u root reload
在你设置了root的口令后(并且如果需要重载了授权表),你将需要在任何时候以root连接服务器时指定口令。
要设置表级或列级权限,你对tables_priv或columns_priv使用INSERT语句。当然,如果你没有GRANT语句,你将没有这些表,因为它们在MySQL(和PHP搭配之最佳组合)中同时出现。如果你确实有这些表并且为了某些原因想要手工操作它们,要知道你不能用单独的列启用权限。
你设置tables_priv.Table_priv或columns_priv.Column_priv列来设置包含你想启用的权限值。例如,要对一个表启用SELECT和INSERT权限,你要在相关的tables_priv的记录中设置Table_priv为"Select,Insert"。
如果你想对一个拥有MySQL(和PHP搭配之最佳组合)账号的用户修改权限,使用UPDATE而不是INSERT,不管你增加或撤销权限都是这样。要完全删除一个用户,从用户使用的每个表中删除记录。
如果你愿意避免发一个查询来直接修改全权表,你可以看一下MySQL(和PHP搭配之最佳组合)自带的MySQL(和PHP搭配之最佳组合)access和MySQL(和PHP搭配之最佳组合)_setpermissions脚本。
附录1 小测验
在你刚刚新安装了一个MySQL(和PHP搭配之最佳组合)服务器,在你增加了一个允许连接MySQL(和PHP搭配之最佳组合)的用户,用下列语句:
GRANT ALL ON samp_db.* TO fred@*.snake.net IDENTIFIED "cocoa"
而fred碰巧在服务器主机上有个账号,所以他试图连接服务器:
%MySQL(和PHP搭配之最佳组合) -u fred -pcocoa samp_db
ERROR 1045: Access denied for user: 'fred@localhost' (Using password: YES)
为什么?
原因是:
先考虑一下MySQL(和PHP搭配之最佳组合)_install_db如何建立初始权限表和服务器如何使用user表记录匹配客户连接。在你用MySQL(和PHP搭配之最佳组合)_install_db初始化你的数据库时,它创建类似这样的user表:
Host User
localhost
pit.snake.net
localhost
pit.snake.net root
root
头两个记录允许root指定localhost或主机名连接本地服务器,后两个允许匿名用户从本地连接。当增加fred用户后,
Host User
localhost
pit.snake.net
localhost
pit.snake.net
%.snake.net root
root
fred
在服务器启动时,它读取记录并排序它们(首先按主机,然后按主机上的用户),越具体越排在前面:
Host User
localhost
localhost
pit.snake.net
pit.snake.net
%.snake.net root
root
fred
有localhost的两个记录排在一起,而对root的记录排在第一,因为它比空值更具体。pit.snake.net的记录也类似。所有这些均是没有任何通配符的字面上的Host值,所以它们排在对fred记录的前面,特别是匿名用户排在fred之前。
结果是在fred试图从localhost连接时,Host列中的一个空用户名的记录在包含%.snake.net的记录前匹配。该记录的口令是空的,因为缺省的匿名用户没有口令。因为在fred连接时指定了一个口令,由一个错配连接失败。
这里要记住的是,虽然用通配符指定用户可以从其连接的主机是很方便。但你从本地主机连接时会有问题,只要你在table表中保留匿名用户记录。
一般地,建议你删除匿名用户记录:
MySQL(和PHP搭配之最佳组合)> DELETE FROM user WHERE User="";
更进一步,同时删除其他授权表中的任何匿名用户,有User列的表有db、tables_priv和columns_priv。
附录2 使一个新的MySQL(和PHP搭配之最佳组合)安装更安全
在你自己安装了一个新的MySQL(和PHP搭配之最佳组合)服务器后,你需要为MySQL(和PHP搭配之最佳组合)的root用户指定一个目录(缺省无口令),否则如果你忘记这点,你将你的MySQL(和PHP搭配之最佳组合)处于极不安全的状态(至少在一段时间内)。
在Unix(Linux)上,在按照手册的指令安装好MySQL(和PHP搭配之最佳组合)后,你必须运行MySQL(和PHP搭配之最佳组合)_install_db脚本建立包含授权表的MySQL(和PHP搭配之最佳组合)数据库和初始权限。在Windows上,运行分发中的Setup程序初始化数据目录和MySQL(和PHP搭配之最佳组合)数据库。假定服务器也在运行。
当你第一次在机器上安装MySQL(和PHP搭配之最佳组合)时,MySQL(和PHP搭配之最佳组合)数据库中的授权表是这样初始化的:
·你可以从本地主机(localhost)上以root连接而不指定口令。root用户拥有所有权限(包括管理权限)并可做任何事情。(顺便说明,MySQL(和PHP搭配之最佳组合)超级用户与Unix超级用户有相同的名字,他们彼此毫无关系。)
·匿名访问被授予用户可从本地连接名为test和任何名字以test_开始的数据库。匿名用户可对数据库做任何事情,但无管理权限。
从本地主机多服务器的连接是允许的,不管连接的用户使用一个localhost主机名或真实主机名。如:
% MySQL(和PHP搭配之最佳组合) -h localhost test
% MySQL(和PHP搭配之最佳组合) -h pit.snake.net test
你以root连接MySQL(和PHP搭配之最佳组合)甚至不指定口令的事实只是意味着初始安装不安全,所以作为管理员的你首先要做的应该是设置root口令,然后根据你设置口令使用的方法,你也可以告诉服务器重载授权表是它知道这个改变。(在服务器启动时,它重载表到内存中而可能不知道你已经修改了它们。)
对MySQL(和PHP搭配之最佳组合) 3.22和以上版本,你可以用MySQL(和PHP搭配之最佳组合)admin设置口令:
% MySQL(和PHP搭配之最佳组合)admin -u root password yourpassword
对于MySQL(和PHP搭配之最佳组合)的任何版本,你可以用MySQL(和PHP搭配之最佳组合)程序并直接修改MySQL(和PHP搭配之最佳组合)数据库中的user授权表:
% MySQL(和PHP搭配之最佳组合) -u root MySQL(和PHP搭配之最佳组合)
MySQL(和PHP搭配之最佳组合)>UPDATE user SET password=PASSWORD("yourpassword") WHERE User="root";
如果你有MySQL(和PHP搭配之最佳组合)的老版本,使用MySQL(和PHP搭配之最佳组合)和UPDATE。
在你设置完口令后,通过运行下列命令检查你是否需要告诉服务器重载授权表:
% MySQL(和PHP搭配之最佳组合)admin -u root status
如果服务器仍然让你以root而不指定口令而连接服务器,重载授权表:
% MySQL(和PHP搭配之最佳组合)admin -u root reload
在你设置了root的口令后(并且如果需要重载了授权表),你将需要在任何时候以root连接服务器时指定口令。
更多精彩
赞助商链接