作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统.docx

上传人:b****5 文档编号:5542123 上传时间:2022-12-19 格式:DOCX 页数:15 大小:29.50KB
下载 相关 举报
作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统.docx_第1页
第1页 / 共15页
作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统.docx_第2页
第2页 / 共15页
作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统.docx_第3页
第3页 / 共15页
作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统.docx_第4页
第4页 / 共15页
作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统.docx

《作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统.docx》由会员分享,可在线阅读,更多相关《作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统.docx(15页珍藏版)》请在冰豆网上搜索。

作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统.docx

作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统

作为一个MySQL的系统管理员,你有责任维护你的MySQL数据库系统的数据安全性和完整性。

本文主要主要介绍如何建立一个安全的MySQL系统,从系统内部和外部网络两个角度,为你提供一个指南。

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

为什么安全性很重要,你应该防范那些攻击?

服务器面临的风险(内部安全性),如何处理?

连接服务器的客户端风险(外部安全性),如何处理?

MySQL管理员有责任保证数据库内容的安全性,使得这些数据记录只能被那些正确授权的用户访问,这涉及到数据库系统的内部安全性和外部安全性。

内部安全性关心的是文件系统级的问题,即,防止MySQL数据目录(DATADIR)被在服务器主机有账号的人(合法或窃取的)进行攻击。

如果数据目录内容的权限过分授予,使得每个人均能简单地替代对应于那些数据库表的文件,那么确保控制客户通过网络访问的授权表设置正确,对此毫无意义。

外部安全性关心的是从外部通过网络连接服务器的客户的问题,即,保护MySQL服务器免受来自通过网络对服务器的连接的攻击。

你必须设置MySQL授权表(granttable),使得他们不允许访问服务器管理的数据库内容,除非提供有效的用户名和口令。

下面就详细介绍如何设置文件系统和授权表mysql,实现MySQL的两级安全性。

一、内部安全性-保证数据目录访问的安全

MySQL服务器通过在MySQL数据库中的授权表提供了一个灵活的权限系统。

你可以设置这些表的内容,允许或拒绝客户对数据库的访问,这提供了你防止未授权的网络访问对你数据库攻击的安全手段,然而如果主机上其他用户能直接访问数据目录内容,建立对通过网络访问数据库的良好安全性对你毫无帮助,除非你知道你是登录MySQL服务器运行主机的唯一用户,否则你需要关心在这台机器上的其他用户获得对数据目录的访问的可能性。

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

数据库文件。

很明显,你要维护服务器管理的数据库的私用性。

数据库拥有者通常并且应该考虑数据库内容的安全性,即使他们不想,也应该考虑时数据库内容公开化,而不是通过糟糕的数据目录的安全性来暴露这些内容。

日志文件。

一般和更新日志必须保证安全,因为他们包含查询文本。

对日志文件有访问权限的任何人可以监视数据库进行过的操作。

更要重点考虑的日志文件安全性是诸如GRANT和SETPASSWORD等的查询也被记载了,一般和更新日志包含有敏感查询的文本,包括口令(MySQL使用口令加密,但它在已经完成设置后才运用于以后的连接建立。

设置一个口令的过程设计象GRANT或SETPASSWORD等查询,并且这些查询以普通文本形式记载在日志文件中)。

如果一个攻击者犹如日文件的读权限,只需在日志文件上运行grep寻找诸如GRANT和PASSWORD等词来发现敏感信息。

显然,你不想让服务器主机上的其他用户有数据库目录文件的写权限,因为他们可以重写你的状态文件或数据库表文件,但是读权限也很危险。

如果一个数据库表文件能被读取,偷取文件并得到MySQL本身,以普通文本显示表的内容也很麻烦,为什么?

因为你要做下列事情:

在服务器主机上安装你自己“特制”的MySQL服务器,但是有一个不同于官方服务器版本的端口、套接字和数据目录。

运行mysql_install_db初始化你的数据目录,这赋予你作为MySQLroot用户访问你的服务器的权限,所以你有对服务器访问机制的完全控制,它也建立一个test数据库。

将对应于你想偷取得表文件拷贝到你服务器的数据库目录下的test目录。

启动你的服务器。

你可以随意访问数据库表,SHOWTABLESFROMtest显示你有一个偷来的表的拷贝,SELECT*显示它们任何一个的全部内容。

如果你确实很恶毒,将权限公开给你服务器的任何匿名用户,这样任何人能从任何地方连接服务器访问你的test数据库。

你现在将偷来的数据库表公布于众了。

在考虑一下,从相反的角度,你想让别人对你这样吗?

当然不!

你可以通过在数据库录下执行ls-l命令确定你的数据库是否包含不安全的文件和目录。

查找有“组”和“其他用户”权限设置的文件和目录。

下面是一个不安全数据目录的一部分列出:

 

%ls-l

total10148

drwxrwxr-x  11  mysqladmwheel    1024May  812:

20.

drwxr-xr-x  22  root     wheel     512May  813:

31..

drwx------   2  mysqladmmysqlgrp  512Apr1615:

57menagerie

drwxrwxr-x   2  mysqladmwheel     512Jan2520:

40mysql

drwxrwxr-x   7  mysqladmwheel     512Aug31  1998sql-bench

drwxrwxr-x   2  mysqladmwheel    1536May  606:

11test

drwx------   2  mysqladmmysqlgrp1024May  818:

43tmp

....

正如你看到的,有些数据库有正确的权限,而其他不是。

本例的情形是经过一段时间后的结果。

较少限制的权限由在权限设置方面比更新版本更不严格的较早版本服务器设置的(注意更具限制的目录menageria和tmp都有较近日期)。

MySQL当前版本确保这些文件只能由运行服务器的用户读取。

让我们来修正这些权限,使得只用服务器用户可访问它们。

你的主要保护工具来自于由UNIX文件系统本身提供的设置文件和目录属主和模式的工具。

下面是我们要做的:

进入该目录

%cdDATADIR

设置所有在数据目录下的文件属主为由用于运行服务器的账号拥有(你必须以root执行这步)。

在本文使用mysqladm和mysqlgrp作为该账号的用户名和组名。

你可以使用下列命令之一改变属主:

#chownmysqladm.mysqlgrp.

#find.-follow-typed-print|xargschownmysqladm.mysqlgrp

设置你的数据目录和数据库目录的模式使得他们只能由mysqladm读取,这阻止其他用户访问你数据库目录的内容。

你可以用下列命令之一以root或mysqladm身份运行。

%chmod-Rgo-rwx  .

%find.-follow-typed-print|xargschmodgo-rwx

数据目录内容的属主和模式为mysqladm设置。

现在你应该保证你总是以mysqladm用户运行服务器,因为现在这是唯一由访问数据库目录权限的用户(除root)。

在完成这些设置后,你最终应该得到下面的数据目录权限:

%ls-l

total10148

drwxrwx---  11  mysqladmmysqlgrp1024May  812:

20.

drwxr-xr-x  22  root     wheel     512May  813:

31..

drwx------   2  mysqladmmysqlgrp  512Apr1615:

57menagerie

drwx------   2  mysqladmmysqlgrp  512Jan2520:

40mysql

drwx------   7  mysqladmmysqlgrp  512Aug31  1998sql-bench

drwx------   2  mysqladmmysqlgrp1536May  606:

11test

drwx------   2  mysqladmmysqlgrp1024May  818:

43tmp

....

二、外部安全性-保证网络访问的安全

MySQL的安全系统是很灵活的,它允许你以多种不同方式设置用户权限。

一般地,你可使用标准的SQL语句GRANT和REVOKE语句做,他们为你修改控制客户访问的授权表,然而,你可能由一个不支持这些语句的老版本的MySQL(在3.22.11之前这些语句不起作用),或者你发觉用户权限看起来不是以你想要的方式工作。

对于这种情况,了解MySQL授权表的结构和服务器如何利用它们决定访问权限是有帮助的,这样的了解允许你通过直接修改授权表增加、删除或修改用户权限,它也允许你在检查这些表时诊断权限问题。

关于如何管理用户账号,见《MySQL的用户管理》。

而对GRANT和REVOKE语句详细描述,见《MySQL参考手册》。

2.1MySQL授权表的结构和内容

通过网络连接服务器的客户对MySQL数据库的访问由授权表内容来控制。

这些表位于mysql数据库中,并在第一次安装MySQL的过程中初始化(运行mysql_install_db脚本)。

授权表共有5个表:

user、db、host、tables_priv和columns_priv。

表1user、db和host授权表结构

访问范围列

userdbhost

HostHostHost

UserDbDb

PasswordUser  

数据库/表权限列

Alter_privAlter_privAlter_priv

Create_privCreate_privCreate_priv

Delete_privDelete_privDelete_priv

Drop_privDrop_privDrop_priv

Index_privIndex_privIndex_priv

Insert_privInsert_privInsert_priv

References_privReferences_privReferences_priv

Select_privSelect_privSelect_priv

Update_privUpdate_privUpdate_priv

Grant_privGrant_priv

Grant_priv   

Process_priv   

Reload_priv   

Shutdown_priv   

 

表2tables_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表在MySQL3.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权限。

  

2.1.3数据库和表权限

下列权限运用于数据库和表上的操作。

ALTER

允许你使用ALTERTABLE语句,这其实是一个简单的第一级权限,你必须由其他权限,这看你想对数据库实施什么操作。

CREATE

允许你创建数据库和表,但不允许创建索引。

DELETE

允许你从表中删除现有记录。

DROP

允许你删除(抛弃)数据库和表,但不允许删除索引。

INDEX

允许你创建并删除索引。

REFERENCES

目前不用。

SELECT

允许你使用SELECT语句从表中检索数据。

对不涉及表的SELECT语句就不必要,如SELECTNOW()或SELECT4/2。

UPDATE

允许你修改表中的已有的记录。

2.1.4管理权限

下列权限运用于控制服务器或用户授权能力的操作的管理性操作。

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类型表示。

在tables_priv表中的Table_priv列被定义成:

SET('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter')

在coloums_priv表中的Column_priv列被定义成:

 

SET('Select','Insert','Update','References')

列权限比表权限少,因为列级较少的权限有意义。

例如你能创建一个表,但你不能创建一个孤立的列。

user表包含某些在其他授权表不存在的权限的列:

、Process_priv、Reload_priv和Shutdown_priv。

这些权限运用于你让服务器执行的与任何特定数据库或表不相关的操作。

如允许一个用户根据当前数据库是什么来关闭数据库是毫无意义的。

2.2服务器如何控制客户访问

在你使用MySQL时,客户访问控制有两个阶段。

第一阶段发生在你试图连接服务器时。

服务器查找user表看它是否能找到一个条目匹配你的名字、你正在从那儿连接的主机和你提供的口令。

如果没有匹配,你就不能连接。

如果有一个匹配,建立连接并继续第二阶段。

在这个阶段,对于每一个你发出的查询,服务器检查授权表看你是否有足够的权限执行查询,第二阶段持续到你与服务器对话的结束。

本小节详细介绍MySQL服务器用于将授权表条目匹配到来的连接请求或查询的原则,这包括在授权表范围列中合法的值的类型、结合授权表中的权限信息的方式和表中条目被检查的次序。

2.2.1范围列内容

一些范围列要求文字值,但它们大多数允许通配符或其他特殊值。

Host

一个Host列值可以是一个主机名或一个IP地址。

值localhost意味着本地主机,但它只在你用一个localhost主机名时才匹配,而不是你在使用主机名时。

假如你的本地主机名是并且在user表中有对你的两条记录,一个有一个Host值或localhost,而另一个有,有localhost的记录将只当你连接localhost时匹配,其他在只在连接时才匹配。

如果你想让客户能以两种方式连接,你需要在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.168128前17位的任何主机。

User

用户名必须是文字的或空白。

一个空白值匹配任何用户。

%作为一个User值不意味着空白,相反它匹配一个字面上的%名字,这可能不是你想要的。

当一个到来的连接通过user表被验证而匹配的记录包含一个空白的User值,客户被认为是一个匿名用户。

Password

口令值可以是空或非空,不允许用通配符。

一个空口令不意味着匹配任何口令,它意味着用户必须不指定口令。

口令以一个加密过的值存储,不是一个字面上的文本。

如果你在Password列中存储一个照字面上的口令,用户将不能连接!

GRANT语句和mysqladminpassword命令为你自动加密口令,但是如果你用诸如INSERT、REPLACE、UPDATE或SETPASSWORD等命令,一定要用PASSWORD("new_password")而不是简单的"new_password"来指定口令。

Db

在columns_priv和tables_priv表中,Db值必须是真正的数据库名(照字面上),不允许模式和空白。

在db和host中,Db值可以以字面意义指定或使用SQL模式字符'%'或'_'指定一个通配符。

一个'%'或空白匹配任何数据库。

Table_name,Column_name

这些列中的值必须是照字面意思的表或列名,不允许模式和空白。

某些范围列被服务器视为大小写敏感的,其余不是。

这些原则总结在下表中。

特别注意Table_name值总是被看作大小写敏感的,即使在查询中的表名的大小写敏感性对待视服务器运行的主机的文件系统而定(UNIX下是大小写敏感,而Windows不是)。

表3授权表范围列的大小写敏感性

Host

User

Password

Db

Table_name

Column_name

大小写敏感性

No

Yes

Yes

Yes

Yes

No

2.2.2查询访问验证

每次你发出一个查询,服务器检查你是否有足够的权限执行它,它以user、db、tables_priv和columns_priv的顺序检查,知道它确定你有适当的访问权限或已搜索所有表而一无所获。

更具体的说:

服务器检查user表匹配你开始连接的记录以查看你有什么全局权限。

如果你有并且它们对查询足够了,服务器则执行它。

如果你的全局权限不够,服务器为你在db表中寻找并将该记录中的权限加到你的全局权限中。

如果结果对查询足够,服务器执行它。

如果你的全局和数据库级组合的权限不够,服务器继续查找,首先在tables_priv表,然后columns_priv表。

如果你在检查了所有表之后仍无权限,服务器拒绝你执行查询的企图。

用布尔运算的术语,授权表中的权限被服务器这样使用:

userORtables_privORcolumns_priv

你可能疑惑为什么前面的描述只引用4个授权表,而实际上有5个。

实际上服务器是这样检查访问权限:

userOR(dbANDhost)ORtables_privORcolumns_priv

第一个较简单的表达式是因为host表不受GRANT和REVOKE语句影响。

如果你总是用GRANT和REVOKE管理用户权限,你绝不需要考虑host表。

但是其工作原理你用该知道:

当服务器检查数据库级权限时,它对于客户查找db表。

如果Host列是空的,它意味着“检查host表以找出哪一个主机能访问数据库”。

服务器在host表中查找有与来自db表的记录相同的Db列值。

如果没有host记录匹配客户主机,则没有授予数据库级权限。

如果这些记录的任何一个的确有一个匹配连接的客户主机的Host列值,db表记录和host表记录结合产生客户的数据库级权限。

然而

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1