第7章数据库安全

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

本章要点:MySQL权限系统原理如何授予撤销用户和授权如何直接修改授权表授予用户权限的规范和注意事项作为一个MySQL的系统管理员,你有责任维护你的MySQL数据库系统的数据安全性和完整性。本文主要主要介绍如何建立一个安全的MySQL系统,从系统内部和外部网络两个角度,为你提供一个指南。本章主要考虑下列安全性有关的问题:为什么安全性很重要,你应该防范那些攻击?服务器面临的风险(内部安全性),如何处理?连接服务器的客户端风险(外部安全性),如何处理?MySQL管理员有责任保证数据库内容的安全性,使得这些数据记录只能被那些正确授权的用户访问,这涉及到数据库系统的内部安全性和外部安全性。内部安全性关心的是文件系统级的问题,即,防止MySQL数据目录(DATADIR)被在服务器主机有账号的人(合法或窃取的)进行攻击。如果数据目录内容的权限过分授予,使得每个人均能简单地替代对应于那些数据库表的文件,那么确保控制客户通过网络访问的授权表设置正确,对此毫无意义。外部安全性关心的是从外部通过网络连接服务器的客户的问题,即,保护MySQL服务器免受来自通过网络对服务器的连接的攻击。你必须设置MySQL授权表(granttable),使得他们不允许访问服务器管理的数据库内容,除非提供有效的用户名和口令。数数数据据据库库库安安安全全全第第77章章MySQL金典培训教程150,实现MySQL的两级安全性。7.1MySQL的权限系统MySQL有一套先进的但非标准的安全/授权系统,掌握其授权机制是开始操作MySQL数据库必须要走的第一步,对于一个熟悉SQL基本操作的人来说,也是MySQL所有的知识中比较难以理解的一个部分。本节通过揭开其授权系统的运作机制,希望大家能够可以更好地操作和使用这个优秀的数据库系统。MySQL的安全系统是很灵活的,它允许你以多种不同方式设置用户权限。一般地,你可使用标准的SQL语句GRANT和REVOKE语句做,他们为你修改控制客户访问的授权表,然而,你可能由一个不支持这些语句的老版本的MySQL(在3.22.11之前这些语句不起作用),或者你发觉用户权限看起来不是以你想要的方式工作。对于这种情况,了解MySQL授权表的结构和服务器如何利用它们决定访问权限是有帮助的,这样的了解允许你通过直接修改授权表增加、删除或修改用户权限,它也允许你在检查这些表时诊断权限问题。7.1.1授权表的结构通过网络连接服务器的客户对MySQL数据库的访问由授权表内容来控制。这些表位于mysql数据库中,并在第一次安装MySQL的过程中初始化(运行mysql_install_db脚本)。授权表共有5个表:user、db、host、tables_priv和columns_priv。7.1.1.1授权表user、db和host的结构和作用表7-1授权表user、db和host的结构User表Db表Host表作用域列HostHostHostDbDbUserUserPassword数据库/表的权限列Alter_privAlter_privAlter_privCreate_privCreate_privDelete_privDelete_privDrop_privDrop_privIndex_privIndex_privIndex_privInsert_privInsert_privReferences_privReferences_privSelect_privSelect_privUpdate_privUpdate_privUpdate_privAlter_privAlter_privAlter_privFile_privGrant_privGrant_privGrant_privProcess_privReload_privShutdown_priv7数据库安全授权表的内容有如下用途:user表user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。db表db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。host表host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。7.1.1.2授权表tables_priv和columns_priv的结构和作用表7-2授权表tables_priv和columns_priv的结构授权表tables_priv授权表columns_privHostHostDbDbUserUserTable_nameTable_nameColumn_nameTable_privColumn_privTimestampTimestampGrantorMySQL没有rows_priv表,因为它不提供记录级权限,例如,你不能限制用户于表中包含特定列值的行。如果你确实需要这种能力,你必须用应用编程来提供。如果你想执行建议的记录级锁定,你可用GET_LOCK()函数做到。授权表的内容有如下用途:tables_priv表tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。columns_priv表columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。tables_priv和columns_priv表在MySQL3.22.11版引进(与GRANT语句同时)。如MySQL金典培训教程152,你的mysql数据库将只有user、db和host表。如果你从老版本升级到3.22.11或更新,而没有tables_priv和columns_priv表,运行mysql_fix_privileges_tables脚本创建它们。7.1.2用户的权限权限信息用user、db、host、tables_priv和columns_priv表被存储在mysql数据库中(即在名为mysql的数据库中)。在MySQL启动时和在7.5权限修改何时生效所说的情况时,服务器读入这些数据库表内容。7.1.2.1数据库和表的权限下列权限运用于数据库和表上的操作。SELECT允许你使用SELECT语句从表中检索数据。SELECT语句只有在他们真正从一个表中检索行是才需要select权限,你可以执行某个SELECT语句,甚至没有任何到服务器上的数据库里的存取任何东西的许可。例如,你可使用mysql客户作为一个简单的计算器:mysqlSELECT1+1;mysqlSELECTPI()*2;UPDATE允许你修改表中的已有的记录。INSERT允许在表中插入记录DELETE允许你从表中删除现有记录。ALTER允许你使用ALTERTABLE语句,这其实是一个简单的第一级权限,你必须由其他权限,这看你想对数据库实施什么操作。CREATE允许你创建数据库和表,但不允许创建索引。DROP允许你删除(抛弃)数据库和表,但不允许删除索引。注意:如果你将mysql数据库的drop权限授予一个用户,该用户能抛弃存储了MySQL存取权限的数据库!INDEX允许你创建并删除索引。REFERENCES目前不用。7数据库安全管理权限下列权限运用于控制服务器或用户授权能力的操作的管理性操作。FILE允许你告诉服务器读或写服务器主机上的文件。该权限不应该随便授予,它很危险,见“回避授权表风险”。服务器确实较谨慎地保持在一定范围内使用该权限。你只能读任何人都能读的文件。你正在写的文件必须不是现存的文件,这防止你迫使服务器重写重要文件,如/etc/passwd或属于别人的数据库的数据目录。如果你授权FILE权限,确保你不以UNIX的root用户运行服务器,因为root可在文件系统的任何地方创建新文件。如果你以一个非特权用户运行服务器,服务器只能在给用户能访问的目录中创建文件。GRANT允许你将你自己的权限授予别人,包括GRANT。PROCESS允许你通过使用SHOWPROCESS语句或mysqladminprocess命令查看服务器内正在运行的线程(进程)的信息。这个权限也允许你用KILL语句或mysqladminkill命令杀死线程。你总是能看到或杀死你自己的线程。PROCESS权限赋予你对任何线程做这些事情的能力。RELOAD允许你执行大量的服务器管理操作。你可以发出FLUSH语句,你也能指性mysqladmin的reload、refresh、flush-hosts、flush-logs、flush-privileges和flush-tables等命令。SHUTDOWN允许你用mysqladminshutdown关闭服务器。在user、db和host表中,每一个权限以一个单独的列指定。这些列全部声明为一个ENUM(N,Y)类型,所以每个权的缺省值是“N”。在tables_priv和columns_priv中的权限以一个SET表示,它允许权限用一个单个列以任何组合指定。这两个表比其他三个表更新,这就是为什么它们使用更有效的表示方式的原因。(有可能在未来,user、db和host表也用一个SET类型表示。)7.1.3授权表列的内容7.1.3.1作用域列内容一些范围列要求文字值,但它们大多数允许通配符或其他特殊值。表7-3作用域列的类型字段名类型HostCHAR(60)UserCHAR(16)PasswordCHAR(16)MySQL金典培训教程154(64)(tables_priv和columns_priv表为CHAR(60))Host一个Host列值可以是一个主机名或一个IP地址。值localhost意味着本地主机,但它只在你用一个localhost主机名时才匹配,而不是你在使用主机名时。假如你的本地主机名是pit.snake.net并且在user表中有对你的两条记录,一个有一个Host值或localhost,而另一个有pit.snake.net,有localhost的记录将只当你连接localhost时匹配,其他在只在连接pit.snake.net时才匹配。如果你想让客户能以两种方式连接,你需要在user表中有两条记录。你也可以用通配符指定Host值。可以使用SQL的模式字符“%”和“_”并具有当你在一个查询中使用LIKE算符同样的含义(不允许regex算符)。SQL模式字符都能用于主机名和IP地址。如%wisc.edu匹配任何wisc.edu域内的主机,而%.edu匹配任何教育学院的主机。类似地,192.168.%匹配任何在192.168B类子网的主机,而192.168.3.%匹配任何在192.168.3C类子网的主机。%值匹配所有主机,并可用于允许一个用户从任何地方连接。一个空白的Host值等同于%。(例外:在db表中,一个空白Host值含义是“进一步检查host表”,该过程在“查询访问验证”中介绍。)从MySQL3.23起,你也可以指定带一个表明那些为用于网络地址的网络掩码的IP地址,如192.168.128.0/17指定一个17位网络地址并匹配其IP地址是192.168.128前17位的任何主机。User用户名必须是文字的或空白。一个空白值匹配任何用户。%作为一个User值不意味着空白,相反它匹配一个字面上的%名字,这可能不是你想要的。当一个到来的连接通过user表被验证而匹配的记录包含一个空白的User值,客户被认为是

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功