Username: Password:

MySQL安全性指南 (1)(转)-PHP教程,数据库相关
来源:作者: 发布时间:2007-12-26 02:12:27

mysql安全性指南 (1)

发布日期: 2000-5-10
内容:
--------------------------------------------------------------------------------

mysql安全性指南 (1)    


mysql安全性指南
作 者: 晏子


作为一个mysql的系统管理员,您有责任维护您的mysql数据库系统的数据安全性和完整性。本文主要主要介绍怎样建立一个安全的mysql系统,从系统内部和外部网络两个角度,为您提供一个指南。

本文主要考虑下列安全性有关的问题:

为什么安全性很重要,您应该防范那些攻击?
服务器面临的风险(内部安全性),怎样处理?
连接服务器的客户端风险(外部安全性),怎样处理?
mysql管理员有责任确保数据库内容的安全性,使得这些数据记录只能被那些正确授权的用户访问,这涉及到数据库系统的内部安全性和外部安全性。
内部安全性关心的是文档系统级的问题,即,防止mysql数据目录(datadir)被在服务器主机有账号的人(合法或窃取的)进行攻击。假如数据目录内容的权限过分授予,使得每个人均能简单地替代对应于那些数据库表的文档,那么确保控制客户通过网络访问的授权表配置正确,对此毫无意义。

外部安全性关心的是从外部通过网络连接服务器的客户的问题,即,保护mysql服务器免受来自通过网络对服务器的连接的攻击。您必须配置mysql授权表(grant table),使得他们不允许访问服务器管理的数据库内容,除非提供有效的用户名和口令。

下面就周详介绍怎样配置文档系统和授权表mysql,实现mysql的两级安全性。


一、内部安全性-确保数据目录访问的安全
mysql服务器通过在mysql数据库中的授权表提供了一个灵活的权限系统。您能够配置这些表的内容,允许或拒绝客户对数据库的访问,这提供了您防止未授权的网络访问对您数据库攻击的安全手段,然而假如主机上其他用户能直接访问数据目录内容,建立对通过网络访问数据库的良好安全性对您毫无帮助,除非您知道您是登录mysql服务器运行主机的唯一用户,否则您需要关心在这台机器上的其他用户获得对数据目录的访问的可能性。

以下是您应该保护的内容:

数据库文档。很明显,您要维护服务器管理的数据库的私用性。数据库拥有者通常并且应该考虑数据库内容的安全性,即使他们不想,也应该考虑时数据库内容公开化,而不是通过糟糕的数据目录的安全性来暴露这些内容。
日志文档。一般和更新日志必须确保安全,因为他们包含查询文本。对日志文档有访问权限的任何人能够监控数据库进行过的操作。
更要重点考虑的日志文档安全性是诸如grant和set password等的查询也被记载了,一般和更新日志包含有敏感查询的文本,包括口令(mysql使用口令加密,但他在已完成配置后才运用于以后的连接建立。配置一个口令的过程设计象grant或set password等查询,并且这些查询以普通文本形式记载在日志文档中)。假如一个攻击者犹如日文档的读权限,只需在日志文档上运行grep寻找诸如grant和password等词来发现敏感信息。
显然,您不想让服务器主机上的其他用户有数据库目录文档的写权限,因为他们能够重写您的状态文档或数据库表文档,但是读权限也很危险。假如一个数据库表文档能被读取,偷取文档并得到mysql本身,以普通文本显示表的内容也很麻烦,为什么?因为您要做下列事情:

在服务器主机上安装您自己“特制”的mysql服务器,但是有一个不同于官方服务器版本的端口、套接字和数据目录。
运行mysql_install_db初始化您的数据目录,这赋予您作为mysql root用户访问您的服务器的权限,所以您有对服务器访问机制的完全控制,他也建立一个test数据库。
将对应于您想偷取得表文档拷贝到您服务器的数据库目录下的test目录。
启动您的服务器。您能够随意访问数据库表,show tables from test显示您有一个偷来的表的拷贝,select *显示他们任何一个的全部内容。
假如您确实很恶毒,将权限公开给您服务器的任何匿名用户,这样任何人能从任何地方连接服务器访问您的test数据库。您现在将偷来的数据库表公开于众了。
在考虑一下,从相反的角度,您想让别人对您这样吗?当然不!您能够通过在数据库录下执行ls -l命令确定您的数据库是否包含不安全的文档和目录。查找有“组”和“其他用户”权限配置的文档和目录。下面是个不安全数据目录的一部分列出:

 
% ls -l
total 10148
drwxrwxr-x  11  mysqladm wheel    1024 may  8 12:20 .
drwxr-xr-x  22  root     wheel     512 may  8 13:31 ..
drwx------   2  mysqladm mysqlgrp  512 apr 16 15:57 menagerie
drwxrwxr-x   2  mysqladm wheel     512 jan 25 20:40 mysql
drwxrwxr-x   7  mysqladm wheel     512 aug 31  1998 sql-bench
drwxrwxr-x   2  mysqladm wheel    1536 may  6 06:11 test
drwx------   2  mysqladm mysqlgrp 1024 may  8 18:43 tmp
....


正如您看到的,有些数据库有正确的权限,而其他不是。本例的情形是经过一段时间后的结果。较少限制的权限由在权限配置方面比更新版本更不严格的较早版本服务器配置的(注意更具限制的目录menageria和tmp都有较近日期)。mysql当前版本确保这些文档只能由运行服务器的用户读取。

让我们来修正这些权限,使得只用服务器用户可访问他们。您的主要保护工具来自于由unix文档系统本身提供的配置文档和目录属主和模式的工具。下面是我们要做的:

进入该目录
% cd datadir

配置任何在数据目录下的文档属主为由用于运行服务器的账号拥有(您必须以root执行这步)。在本文使用mysqladm和mysqlgrp作为该账号的用户名和组名。您能够使用下列命令之一改变属主:
# chown mysqladm.mysqlgrp .

# find . -follow -type d -print | xargs chown mysqladm.mysqlgrp

配置您的数据目录和数据库目录的模式使得他们只能由mysqladm读取,这阻止其他用户访问您数据库目录的内容。您能够用下列命令之一以root或mysqladm身份运行。
% chmod -r go-rwx  .

% find . -follow -type d -print | xargs chmod go-rwx

数据目录内容的属主和模式为mysqladm配置。现在您应该确保您总是以mysqladm用户运行服务器,因为现在这是唯一由访问数据库目录权限的用户(除root)。
在完成这些配置后,您最终应该得到下面的数据目录权限:

% ls -l
total 10148
drwxrwx---  11  mysqladm mysqlgrp 1024 may  8 12:20 .
drwxr-xr-x  22  root     wheel     512 may  8 13:31 ..
drwx------   2  mysqladm mysqlgrp  512 apr 16 15:57 menagerie
drwx------   2  mysqladm mysqlgrp  512 jan 25 20:40 mysql
drwx------   7  mysqladm mysqlgrp  512 aug 31  1998 sql-bench
drwx------   2  mysqladm mysqlgrp 1536 may  6 06:11 test
drwx------   2  mysqladm mysqlgrp 1024 may  8 18:43 tmp
....



二、外部安全性-确保网络访问的安全
mysql的安全系统是很灵活的,他允许您以多种不同方式配置用户权限。一般地,您可使用标准的sql语句grant和revoke语句做,他们为您修改控制客户访问的授权表,然而,您可能由一个不支持这些语句的老版本的mysql(在3.22.11之前这些语句不起作用),或您发觉用户权限看起来不是以您想要的方式工作。对于这种情况,了解mysql授权表的结构和服务器怎样利用他们决定访问权限是有帮助的,这样的了解允许您通过直接修改授权表增加、删除或修改用户权限,他也允许您在检查这些表时诊断权限问题。

关于怎样管理用户账号,见《mysql的用户管理》。而对grant和revoke语句周详描述,见《mysql参考手册》。

2.1 mysql授权表的结构和内容
通过网络连接服务器的客户对mysql数据库的访问由授权表内容来控制。这些表位于mysql数据库中,并在第一次安装mysql的过程中初始化(运行mysql_install_db脚本)。授权表共有5个表:user、db、host、tables_priv和columns_priv。

表1 user、db和host授权表结构
访问范围列

user db host
host host host
user db db
password user  
数据库/表权限列
alter_priv alter_priv alter_priv
create_priv create_priv create_priv
delete_priv delete_priv delete_priv
drop_priv drop_priv drop_priv
index_priv index_priv index_priv
insert_priv insert_priv insert_priv
references_priv references_priv references_priv
select_priv select_priv select_priv
update_priv update_priv update_priv
file_priv grant_priv grant_priv
grant_priv   
process_priv   
reload_priv   
shutdown_priv   
 
表2 tables_priv和columns_priv属权表结构

访问范围列
tables_priv  columns_priv
host  host
db  db
user  user
table_name  table_name
column_name   
权限列
table_priv  column_priv

授权表的内容有如下用途:

user表
user表列出能够连接服务器的用户及其口令,并且他指定他们有哪种全局(终极用户)权限。在user表启用的任何权限均是全局权限,并适用于任何数据库。例如,假如您启用了delete权限,在这里列出的用户能够从任何表中删除记录,所以在您这样做之前要认真考虑。
db表
db表列出数据库,而用户有权限访问他们。在这里指定的权限适用于一个数据库中的任何表。
host表
host表和db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受grant和revoke语句的影响,所以,您可能发觉您根本不是用他。
tables_priv表
tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的任何列。
columns_priv表
columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。
在“不用grant配置用户”一节里,我们再讨论grant语句怎样对修改这些表起作用,和您怎样能通过直接修改授权表达到同样的效果。

tables_priv和columns_priv表在mysql 3.22.11版引进(和grant语句同时)。假如您有较早版本的mysql,您的mysql数据库将只有user、db和host表。假如您从老版本升级到3.22.11或更新,而没有tables_priv和columns_priv表,运行mysql_fix_privileges_tables脚本创建他们。

mysql没有rows_priv表,因为他不提供记录级权限,例如,您不能限制用户于表中包含特定列值的行。假如您确实需要这种能力,您必须用应用编程来提供。假如您想执行建议的记录级锁定,您可用get_lock()函数做到。

授权表包含两种列:决定一个权限何时运用的范围列和决定授予哪种权限的权限列。

2.1.1 授权表范围列
授权表范围列指定表中的权限何时运用。每个授权表条目包含user和host列来指定权限何时运用于一个给定用户从给定主机的连接。其他表包含附加的范围列,如db表包含一个db列指出权限运用于哪个数据库。类似地,tables_priv和columns_priv表包含范围字段,缩小范围到一个数据库中的特定表或一个表的特定列。

2.1.2 授权表权限列
授权表还包含权限列,他们指出在范围列中指定的用户拥有何种权限。由mysql支持的权限如下表所示。该表使用grant语句的权限名称。对于绝大多数在user、db和host表中的权限列的名称和grant语句中有明显的联系。如select_priv对应于select权限。

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅