mysql安全性指南(3)(转)_数据库安全

mysql安全性指南(3)(转)_数据库安全,第1张

概述MySQL安全性指南(3)     作 者: 晏子 2.4 不用GRANT设置用户 如果你有一个早于3.22.11的MySQL版本,你不能使用GRANT(或REVOKE)语句设置用户及其访问权限,但你可以直接修改授权表的内容。如果你理解GRANT语句如何修改授权表,这很容易。那么你通过手工发出INSERT语句就能自己做同样的事情。 当你发出一条GRANT语句时,你指定一个用户名和主机名,可能还有口 MysqL安全性指南(3)     作 者: 晏子 2.4 不用GRANT设置用户 如果你有一个早于3.22.11的MysqL版本,你不能使用GRANT(或REVOKE)语句设置用户及其访问权限,但你可以直接修改授权表的内容。如果你理解GRANT语句如何修改授权表,这很容易。那么你通过手工发出INSERT语句就能自己做同样的事情。 当你发出一条GRANT语句时,你指定一个用户名和主机名,可能还有口令。对该用户生成一个user表记录,并且这些值记录在User、Host和Password列中。如果你在GRANT语句中指定全局权限,这些权限记录在记录的权限列中。其中要留神的是GRANT语句为你加密口令,而INSERT不是,你需要在INSERT中使用PASSWORD()函数加密口令。 如果你指定数据库级权限,用户名和主机名被记录在db表的User和Host列。你为其授权的数据库记录在Db列中,你授予的权限记录在权限列中。 对于表级和列级权限,效果是类似的。在tables_priv和columns_priv表中创建记录以记录用户名、主机名和数据库,还有相关的表和列。授予的权限记录在权限列中。 如果你还记得前面的介绍,你应该能即使不用GRANT语句也能做GRANT做的事情。记住在你直接修改授权表时,你将通知服务器重载授权表,否则他不知道你的改变。你可以执行一个MysqLadmin flush-privileges或MysqLadmin reload命令强迫一个重载。如果你忘记做这个,你会疑惑为什么服务器不做你想做的事情。 下列GRANT语句创建一个拥有所有权的超级用户。包括授权给别人的能力: GRANT ALL ON *.* TO anyname@localhost IDENTIFIED BY "passwd"     WITH GRANT OPTION 该语句将在user表中为anyname@localhost创建一个记录,打开所有权限,因为这里是超级用户(全局)权限存储的地方,要用INSERT语句做同样的事情,语句是: INSERT INTO user  VALUES("localhost","anyname",PASSWORD("passwd"),    "Y","Y","Y") 你可能发现它不工作,这要看你的MysqL版本。授权表的结构已经改变而且你在你的user表可能没有14个权限列。用SHOW ColUMNS找出你的授权表包含的每个权限列,相应地调整你的INSERT语句。 下列GRANT语句也创建一个拥有超级用户身份的用户,但是只有一个单个的权限: GRANT RELOAD ON *.* TO flush@localhost IDENTIFIED BY "flushpass" 本例的INSERT语句比前一个简单,它很容易列出列名并只指定一个权限列。所有其它列将设置为缺省的"N": INSERT INTO user (Host,Password,Reload) VALUES("localhost","flush",PASSWORD("flushpass"),"Y") 数据库级权限用一个ON db_name.*子句而不是ON *.*进行授权: GRANT ALL ON sample.* TO boris@localhost IDENTIFIED BY "ruby" 这些权限不是全局的,所以它们不存储在user表中,我们仍然需要在user表中创建一条记录(使得用户能连接),但我们也需要创建一个db表记录记录数据库集权限: INSERT INTO user (Host,User,Password) VALUES("localhost","boris",PASSWORD("ruby")) INSERT INTO db VALUES("localhost","sample_db","N","Y") "N"列是为GRANT权限;对末尾的一个数据库级具有WITH GRANT OPTION的GRANT语句,你要设置该列为"Y"。 要设置表级或列级权限,你对tables_priv或columns_priv使用INSERT语句。当然,如果你没有GRANT语句,你将没有这些表,因为它们在MysqL中同时出现。如果你确实有这些表并且为了某些原因想要手工 *** 作它们,要知道你不能用单独的列启用权限。 你设置tables_priv.table_priv或columns_priv.Column_priv列来设置包含你想启用的权限值。例如,要对一个表启用SELECT和INSERT权限,你要在相关的tables_priv的记录中设置table_priv为"Select,Insert"。 如果你想对一个拥有MysqL账号的用户修改权限,使用UPDATE而不是INSERT,不管你增加或撤销权限都是这样。要完全删除一个用户,从用户使用的每个表中删除记录。 如果你愿意避免发一个查询来直接修改全权表,你可以看一下MysqL自带的MysqLaccess和MysqL_setpermissions脚本。 附录1 小测验 在你刚刚新安装了一个MysqL服务器,在你增加了一个允许连接MysqL的用户,用下列语句: GRANT ALL ON samp_db.* TO fred@*.snake.net IDENTIFIED "cocoa" 而fred碰巧在服务器主机上有个账号,所以他试图连接服务器: %MysqL -u fred -pcocoa samp_db ERROR 1045: Access denIEd for user: fred@localhost (Using password: YES) 为什么? 原因是: 先考虑一下MysqL_install_db如何建立初始权限表和服务器如何使用user表记录匹配客户连接。在你用MysqL_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> DELETE FROM user WHERE User=""; 更进一步,同时删除其他授权表中的任何匿名用户,有User列的表有db、tables_priv和columns_priv。 附录2 使一个新的MysqL安装更安全 在你自己安装了一个新的MysqL服务器后,你需要为MysqL的root用户指定一个目录(缺省无口令),否则如果你忘记这点,你将你的MysqL处于极不安全的状态(至少在一段时间内)。 在Unix(linux)上,在按照手册的指令安装好MysqL后,你必须运行MysqL_install_db脚本建立包含授权表的MysqL数据库和初始权限。在windows上,运行分发中的Setup程序初始化数据目录和MysqL数据库。假定服务器也在运行。 当你第一次在机器上安装MysqL时,MysqL数据库中的授权表是这样初始化的: 你可以从本地主机(localhost)上以root连接而不指定口令。root用户拥有所有权限(包括管理权限)并可做任何事情。(顺便说明,MysqL超级用户与Unix超级用户有相同的名字,他们彼此毫无关系。) 匿名访问被授予用户可从本地连接名为test和任何名字以test_开始的数据库。匿名用户可对数据库做任何事情,但无管理权限。 从本地主机多服务器的连接是允许的,不管连接的用户使用一个localhost主机名或真实主机名。如: % MysqL -h localhost test % MysqL -h pit.snake.net test 你以root连接MysqL甚至不指定口令的事实只是意味着初始安装不安全,所以作为管理员的你首先要做的应该是设置root口令,然后根据你设置口令使用的方法,你也可以告诉服务器重载授权表是它知道这个改变。(在服务器启动时,它重载表到内存中而可能不知道你已经修改了它们。) 对MysqL 3.22和以上版本,你可以用MysqLadmin设置口令: % MysqLadmin -u root password yourpassword 对于MysqL的任何版本,你可以用MysqL程序并直接修改MysqL数据库中的user授权表: % MysqL -u root MysqL MysqL>UPDATE user SET password=PASSWORD("yourpassword") WHERE User="root"; 如果你有MysqL的老版本,使用MysqL和UPDATE。 在你设置完口令后,通过运行下列命令检查你是否需要告诉服务器重载授权表: % MysqLadmin -u root status 如果服务器仍然让你以root而不指定口令而连接服务器,重载授权表: % MysqLadmin -u root reload 在你设置了root的口令后(并且如果需要重载了授权表),你将需要在任何时候以root连接服务器时指定口令。 总结

以上是内存溢出为你收集整理的mysql安全性指南(3)(转)_数据库安全全部内容,希望文章能够帮你解决mysql安全性指南(3)(转)_数据库安全所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1058466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存