数据库原理与MySQL应用-7 数据库的安全管理_第1页
数据库原理与MySQL应用-7 数据库的安全管理_第2页
数据库原理与MySQL应用-7 数据库的安全管理_第3页
数据库原理与MySQL应用-7 数据库的安全管理_第4页
数据库原理与MySQL应用-7 数据库的安全管理_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章数据库的安全管理数据库存在的不安全因素非授权用户对数据库的恶意存取和破坏

一些黑客和犯罪分子在用户存取数据库时猎取用户名和用户口令,然后假冒合法用户偷取、修改甚至破坏用户数据。数据库中重要或敏感的数据被泄露

黑客和敌对分子千方百计盗窃数据库中的重要数据,一些机密信息被暴露。安全环境的脆弱性

数据库的安全性与计算机系统的安全性,包括计算机硬件、操作系统、网络系统等的安全性是紧密联系的。操作系统安全的脆弱,网络协议安全保障的不足等都会造成数据库安全性的破坏。曾经在伊朗以及其他中东国家发现过一种被称为“flame”(火焰)的病毒程序,这个程序可以让自己假冒成Windows更新文件隐藏在目标计算机里。它的作用非常特别,可以随时复制文件、截图、下载聊天记录甚至可以远程启动计算机、激活麦克风和摄像头并偷偷录下视频和音频。这是一种特工病毒,它的作用不是搞破坏而是尽可能的隐藏自己窃取一切有用的信息。“flame”通过蓝牙系统来接收指令,并且可以制造假的电子凭证来隐藏身份,最牛的是当它被发现后还可以立即删除掉所有记录痕迹并自我毁灭,这简直就跟特工干的事儿一模一样。7.1数据库安全性概述数据库原理与设计5数据库安全技术用户标识与鉴别存取控制视图审计数据加密1.用户标识与鉴别

当前最常用的鉴别方法。即用什么来标识一个用户,又怎样去识别它。用户的个人特征识别:如用户的声音、指纹、签名等。用户的特有东西识别:如用户的磁卡、钥匙等。用户的自定义识别:如用户设置口令、密码和一组预定的问答等。2.存取控制策略(1)定义用户权限,并将用户权限登记到数据字典中。用户对某一数据对象的操作权力称为权限。某个用户应该具有何种权限是个管理问题和政策问题而不是技术问题。DBMS的功能就是保证这些决定的执行。DBMS系统必须提供适当的语言来定义用户权限,这些定义经过编译后存放在数据字典中,被称做安全规则或授权规则。(2)合法权限检查当用户发出存取数据库的操作请求后,DBMS查找数据字典,根据安全规则进行合法权限检查,若用户的操作请求超出了定义的权限,系统将拒绝执行此操作。通过视图用户只能查看和修改他们所能看到的数据。①建立视图score_db。CREATEVIEWscore_dbASSELECT*FROMscoreWHEREcnam=’数据库’;示例②为用户授予操作视图的权限。GRANTSELECTONscore_dbTO王莎;视图+授权常用的安全性控制方法3.视图机制

审计功能把用户对数据库的所有操作自动记录下来放入“审计日志”中,称为审计跟踪。

审计员可以利用审计日志监控数据库中的各种行为,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。

还可以通过对审计日志分析,对潜在的威胁提前采取措施加以防范。审计通常是很费时间和空间的,所以DBMS往往都将其作为可选特征,审计功能一般主要用于安全性要求较高的部门。4.审计跟踪数据加密是防止数据库中数据在存储和传输中失密的有效手段。加密的基本思想是根据一定的算法将原始数据(称为明文)变换为不可直接识别的格式(称为密文),从而使得不知道解密算法的人无法获知数据的内容。

由于数据加密与解密也是比较费时的操作,而且数据加密与解密程序会占用大量系统资源,因此数据加密功能通常也作为可选特征。5.数据加密7.2MySQL的安全设置数据库原理与设计137.2.1权限表1.user表user表字段可以分为4类,用户列、权限列、安全列和资源控制列。(1)用户列用户列常用的字段有Host、User、authentication_string,分别表示主机名、用户名和密码。当添加、删除、修改或者查看用户信息时,其实就是对user表进行增、删、改、查的操作。【例7-1】查询user表中相关用户字段信息。SELECTHost,User,authentication_stringFROMmysql.user;(2)权限列user表中包含了几十个以_priv结尾的与权限有关的字段,这些权限不仅包括查询权限、修改权限等普通权限,还包括关闭服务器权限、超级权限和加载用户等高级权限。【例7-2】查询localhost主机下的用户的select、insert、update权限。SELECTselect_priv,insert_priv,update_priv,User,HostFROMmysql.userWHEREHost='localhost';(3)安全列安全列有12个字段,其中ssl用于加密,x509标准可用于标识用户,plugin字段是用于验证用户身份的插件,如果该字段为空,服务器就使用内建授权验证机制验证用户身份。【例7-3】查询服务器是否支持ssl功能。SHOWVARIABLESLIKE'have_openssl';(4)资源控制列资源控制列的字段用来限制用户使用的资源,包括4个字段。①max_questions:用户每小时允许执行的查询操作次数。②max_updates:用户每小时允许执行的更新操作次数。③max_connections:用户每小时允许执行的连接操作次数。④max_user_connections:用户允许同时建立的连接次数。【例7-4】查询root用户的4个资源控制字段的信息。SELECTmax_questions,max_updates,max_connections,max_user_connectionsFROMmysql.userWHEREUser='root';2.db表

db表中存储了用户对某个数据库的操作权限,决定用户能从哪个主机存取哪个数据库。(1)用户列db表的用户列有3个字段Host、User、Db,分别表示主机名、用户名和数据库名,具体表示从某个主机连接某个用户对某个数据库的操作权限。(2)权限列db表中有19个权限字段,其中create_routine_priv和alter_routine_priv两个字段表明用户是否有创建和修改存储过程的权限。3.tables_priv表

tables_priv表用来对单个表设置操作权限,包括8个字段。(1)Host、Db、User、Table_name分别表示主机名、数据库名、用户名和表名。(2)Grantor表示修改该记录的用户。(3)Timestamp表示修改该记录的时间。(4)Table_priv表示对表进行操作的权限,包括select、insert、update、delete、create、drop、grant、references、index和alter。(5)Column_priv表示对表中的列进行操作的权限,包括select、insert、update和refrences。4.column_priv表

column_priv表用来对表中的某一列设置操作权限。包括7个字段,分别是Host、Db、User、Table_name、Column_name、Timestamp、Column_priv。其中Column_name用来指定对哪些数据列具有操作权限。5.proc_priv表

proc_priv表用来对存储过程和存储函数设置操作权限,(1)Host、Db、User分别表示主机名、数据库名和用户名。(2)Routine_name表示存储过程或存储函数的名称。(3)Routine_type表示存储过程或存储函数的类型。(4)Grantor表示插入或修改该记录的用户。(5)Proc_priv表示拥有的权限,包括excute、alterroutine、grant三种。(6)Timestamp表示存储记录更新的时间。7.2.2用户管理MySQL的用户包括root用户和普通用户,root用户是超级管理员,拥有对整个MySQL服务器完全控制的权限,而普通用户只能拥有赋予给它的权限。在MySQL数据库中,为了防止非授权用户对数据库进行存取,DBA可以创建登录用户、修改用户信息和删除用户。1.创建用户CREATEUSER用户[IDENTIFIEDBY'密码'][,用户[IDENTIFIEDBY'密码']]…;【说明】①用户的格式:用户名@主机名主机名即用户连接MySQL时所在主机的名字。如果在创建时只给出了账号的用户名,而没有指定主机名,则主机名会默认为是“%”,表示一组主机;localhost表示本地主机。②IDENTIFIEDBY子句指定创建用户时的密码。【例7-6】创建本机用户tempuser,其密码为temp。CREATEUSERtempuser@localhostIDENTIFIEDBY'temp';

创建的新用户的详细信息自动保存在系统数据库mysql的user表中,执行如下SQL语句,可查看数据库服务器的用户信息。USEmysql;SELECT*FROMuserWHEREuser='tempuser';2.修改用户密码SETPASSWORDFOR用户='新密码';【例7-7】修改用户账号tempuser的密码为123456。SETPASSWORDFORtempuser@localhost='123456';【例7-8】修改root超级用户的密码为root。SETPASSWORDFORroot@localhost='root';3.修改用户名RENAMEUSER旧用户名TO新用户名[,旧用户名TO新用户名][,…];【例7-9】修改普通用户tempuser的用户名为temp_U。RENAMEUSERtempuser@localhostTOtemp_U@localhost;USEmysql;SELECT*FROMuserWHEREuser='temp_U'andhost='localhost';4.删除用户DROPUSER用户[,…];【例7-10】删除用户temp_U。DROPUSERtemp_U@localhost;USEmysql;SELECT*FROMuserWHEREuser='temp_U'andhost='localhost';7.2.3权限管理权限管理主要是对登录到MySQL服务器的数据库用户进行权限验证。所有用户的权限都存储在MySQL的权限表中。合理的权限管理能够保证数据库系统的安全,不合理的权限设置会给数据库系统带来危害。权限管理主要包括两个内容:授予权限和取消权限。1.授予权限(1)授予MySQL字段级别权限GRANT

权限名称(列名[,列名,…])[,权限名称(列名[,列名,…]),…]

ONTABLE数据库名.表名或视图名

TO用户[,用户,…];在MySQL中,针对不同的数据库资源,可以将权限分为五类,即MySQL字段级别权限、MySQL表级别权限、MySQL存储程序级别权限、MySQL数据库级别权限和MySQL服务器管理员级别权限。

系统数据库mysql的系统表columns_priv中记录了用户字段级别权限的验证信息。【例7-11】创建新用户column_user,并为其授予对fruits表中列的操作权限。CREATEUSERcolumn_user@localhostIDENTIFIEDBY'password';GRANT

SELECT(f_name,f_price),UPDATE(f_price),REFERENCES(s_id)

ONTABLEfruitsales.fruits

TOcolumn_user@localhost;SELECT*FROMmysql.columns_priv;以column_user用户连接MySQL服务器SELECTf_name,f_priceFROMfruitsales.fruits;SELECTf_idFROMfruitsales.fruits;(2)授予MySQL表级别权限GRANT

权限名称[,权限名称,…]

ONTABLE数据库名.表名或数据库名.视图名

TO用户[,用户,…];

系统数据库mysql的系统表tables_priv中记录了用户MySQL表级别权限的验证信息。【例7-12】创建新用户table_user,并为其授予对fruits表的操作权限。CREATEUSERtable_user@localhostIDENTIFIEDBY'password';GRANTALTER,SELECT,INSERT(f_id,f_name,f_price)

ONTABLEfruitsales.fruits

TOtable_user@localhost;SELECT*FROMmysql.tables_privWHEREhost='localhost'anduser='table_user';以table_user用户连接MySQL服务器ALTERTABLEfruitsales.fruits

ADDf_originVARCHAR(50);

DESCfruitsales.fruits;【例7-13】创建新用户view_user,授予其只能查询供应商101水果销售情况信息。CREATEUSERview_user@localhostIDENTIFIEDBY'password';USEfruitsales;CREATEVIEWs101_od

ASSELECTs_name,o_num,f_name,quantityFROMfruitsf,orderitemso,supplierssWHEREf.f_id=o.f_idANDf.s_id=s.s_idANDs.s_id=101;GRANTSELECTON

s101_od

TOview_user@localhost;以view_user用户连接MySQL服务器SELECT*FROMfruitsales.s101_od;(3)授予MySQL存储程序级别权限GRANT权限名称[,权限名称,…]

ONFUNCTION|PROCEDURE数据库名.函数名|数据库名.存储过程名

TO用户[,用户,…];

系统数据库mysql的系统表procs_priv中记录了用户MySQL存储程序级别权限的验证信息。【例7-14】创建新用户proc_user,并为其授予对fruitsales数据库中的存储过程的操作权限。CREATEUSERproc_user@localhostIDENTIFIEDBY'password';DELIMITER@@CREATEPROCEDUREfruitsales.test_p()BEGINSELECT*FROMfruitsales.fruits;END@@GRANTEXECUTEONPROCEDUREfruitsales.test_pTOproc_user@localhost;以proc_user用户连接MySQL服务器CALLfruitsales.test_p;(4)授予MySQL数据库级别权限GRANT权限名称[,权限名称,…]

ON

数据库名.*TO用户[,用户,…];

系统数据库mysql的系统表db中记录了用户MySQL数据库级别权限的验证信息。【例7-15】创建新用户database_user,并为其授予对fruitsales数据库的操作权限。CREATEUSERdatabase_user@localhostIDENTIFIEDBY'password';GRANTCREATE,SELECT,DROPONfruitsales.*

TOdatabase_user@localhost;以database_user用户连接MySQL服务器CREATETABLEfruitsales.test(idINTNOTNULLPRIMARYKEY,nameVARCHAR(10));DROPTABLEfruitsales.test;(5)授予MySQL服务器管理员级别权限GRANT权限名称[,权限名称,…]

ON

*.*

TO用户[,用户,…];

系统数据库mysql的系统表user中记录了用户MySQL服务器管理员级别权限的验证信息。【例7-16】创建新用户server_user,并为其授予对所有数据库的操作权限。CREATEUSERserver_user@localhostIDENTIFIEDBY'password';GRANTALLPRIVILEGES

ON*.*

TOserver_user@localhost;以sever_user用户连接MySQL服务器CREATEDATABASEtest_db;(6)权限的转移权限的转移通过在GRANT语句中使用WITHGRANTOPTION子句来实现。如果指定为WITHGRANTOPTION,则表示TO子句中的所有用户都具有把自己所拥有的权限授予给其他用户的权利,而无论那些其它用户是否拥有该权限。【例7-17】创建新用户u1和u2,为u1赋予对fruits表增删改查的权限,并且u1能够将所拥有的权限再赋予给u2。CREATEUSERu1@localhostIDENTIFIEDBY'123';CREATEUSERu2@localhostIDENTIFIEDBY'456';GRANTSELECT,INSERT,UPDATE,DELETEONfruitsales.fruits

TO

u1@localhost

WITHGRANTOPTION;以u1用户连接MySQL服务器GRANTSELECTONfruitsales.fruitsTO

u2@localhost;以u2用户连接MySQL服务器SELECT*FROMfruitsales.fruits;2.撤消权限(1)撤消所有权限REVOKE

ALLPRIVILEGES,GRANTOPTION

FROM用户[,用户,…];【例7-18】撤消例7-11用户column_user@localhost的所有权限。SELECT*FROMmysql.columns_priv

WHEREuser='column_user'ANDhost='localhost';REVOKE

ALLPRIVILEGES,GRANTOPTION

FROMcolumn_user@localhost;

SELECT*FROMmysql.columns_privWHEREuser='column_user'ANDhost='localhost';(2)撤消指定权限REVOKE权限名称[(列名[,列名,…])][,权限名称[(列名[,列名,…])],…]ON*.*|数据库名.*|数据库名.表名或视图名FROM用户[,用户,…];【例7-19】撤消例7-14用户database_user@localhost的CREAT和DROP权限。SELECT*FROMdbWHEREhost='localhost'anduser='database_user';REVOKE

CREATE,DROP

ONfruitsales.*

FROMdatabase_user@localhost;SELECT*FROMmysql.dbWHEREhost='localhost'anduser='database_user';7.2.4角色管理MySQL的权限设置是非常复杂的,权限的类型也非常多,这就为DBA有效地管理数据库权限带来了困难。另外,数据库的用户通常有几十个、几百个、甚至成千上万个。如果管理员为每个用户授予或者撤销相应的权限,则这个工作量是非常庞大的。为了简化权限管理,MySQL提供了角色的概念。角色是具有名称的一组相关权限的集合,即将不同的权限集合在一起就形成了角色。可以使用角色为用户授权,同样也可以撤销角色。由于角色集合了多种权限,所以当为用户授予角色时,相当于为用户授予了多种权限。这样就避免了向用户逐一授权,从而简化了用户权限的管理。1.创建角色CREATEROLE角色;【说明】角色格式:角色名@主机名。【例7-20】分别在本地主机上创建应用程序角色app、运维人员角色ops、开发人员读角色dev_read、开发人员写角色dev_write。CREATEROLEapp@localhost,ops@localhost,dev_read@localhost,dev_write@localhost;SELECT*FROMmysql.userWHEREhost='localhost'ANDuserIN('app','ops','dev_read','dev_write');2.授予角色权限只需将GRANT语句TO后的用户改为角色即可。【例7-21】分别授予角色app数据读写权限、角色ops访问数据库权限、角色dev_read读取权限、角色dev_write写权限。GRANTSELECT,INSERT,UPDATE,DELETEONfruitsales.*TOapp@localhost;GRANTALLPRIVILEGESONfruitsales.*TOops@localhost;GRANTSELECTONfruitsales.*TOdev_read@localhost;GRANTINSERT,UPDATE,DELETEONfruitsales.*TOdev_write@localhost;3.授予用户角色GRANT

角色[,角色,…]TO用户[,用户,…];【例7-22】分别将角色授予新用户app01、ops01、dev01、dev02、dev03。CREATEUSERapp01@localhostIDENTIFIEDBY'000000';CREATEUSERops01@localhostIDENTIFIEDBY'000000';CREATEUSERdev01@localhostIDENTIFIEDBY'000000';CREATEUSERdev02@localhostIDENTIFIEDBY'000000';CREATEUSERdev03@localhostIDENTIFIEDBY'000000';创建新的用户账号GRANTapp@localhostTOapp01@localhost;GRANTops@localhostTOops01@localhost;GRANTdev_read@localhostTOdev01@localhost;GRANTdev_read@localhost,dev_write@localhostTOdev02@localhost,dev03@localhost;给用户账号分配角色setglobalactivate_all_roles_on_login=ON;用户使用角色权限前,必须要先激活角色以dev01用户连接MySQL服务器SELECT*FROMfruitsales.suppliers;4.撤消用户角色REVOKE角色[,角色,…]FROM用户[,用户,…];【例7-23】撤消用户dev01的角色dev_read。REVOKEdev_read@localhostFROMdev01@localhost;以dev01用户连接MySQL服务器SELECT*FROMfruitsales.suppliers;5.删除角色DROPROLE角色[,角色,…];【例7-24】删除角色app和ops。DROPROLE'app'@'localhost','ops'@'localhost';7.2.5密码管理**1.Windows系统下丢失MySQLroot登录密码的解决方法(1)授予MySQL字段级别权限(1)以管理员身份打开“命令提示符”窗口,关闭MySQL服务,进入MySQL的bin目录,执行命令及执行结果如图7-1所示。(2)开启安全模式下的MySQL服务,执行命令及执行结果如图7-2所示,命令执行后光标一直在闪烁。(3)在不关闭图7-2窗口的基础上,重新打开一个“命令提示符”窗口,登录MySQL,执行命令及执行结果如图7-3所示。(4)使用UPDATE语句将root的密码置空。在MySQL8.0版本的安全模式下,如果root用户的密码不为空,就无法直接修改。SQL语句及执行结果如图7-4所示。(5)执行完图7-4中的语句后,需要刷新一下,如果不刷新将会报错,SQL语句及执行结果如图7-5所示。(6)刷新之后使用ALTERUSER语句修改用户的密码,SQL语句及执行结果如图7-6所示。(7)退出MySQL,SQL语句及执行结果如图7-7所示。(8)关闭图7-7和图7-2所示的两个“命令提示符”窗口。(9)重新打开一个新的“命令提示符”窗口,重启MySQL服务,执行命令及执行结果如图7-8所示。(10)MySQL服务启动成功之后,root用户用新密码登录MySQL,执行命令及执行结果如图7-9所示。执行结果显示,在Windows下重新设置root用户密码成功。2.密码管理(1)密码过期策略手动设置账号密码过期的SQL语句格式如下:

ALTERUSER用户PASSWORDEXPIRE;【例7-25】将用户pwd账号的密码设置为过期。CREATEUSERpwd@localhostIDENTIFIEDBY'123456';SELECTuser,host,password_last_changed,password_lifetime,password_expiredFROMmysql.userWHEREuser='pwd'ANDhost='localhost';ALTERUSERpwd@localhostPASSWORDEXPIRE;

以pwd用户连接MySQL服务器,将会显示密码过期重置的窗口,在窗口中重新设置新密码,如图7-10所示。因为密码过期后,只有重新设置了新密码,该用户才能正常使用。为每个用户单独设置密码过期策略的SQL语句

ALTERUSER用户PASSWORDEXPIRE

INTERVALnDAY|NEVER|DEFAULT;①INTERVALnDAY:设置密码过期的天数;②NEVER:设置密码永不过期;③DEFAULT:延用全局密码过期策略。ALTERUSERpwd@localhostPASSWORDEXPIREINTERVAL90DAY;SELECTuser,host,password_last_changed,password_lifetime,password_expiredFROMmysql.userWHEREuser='pwd'ANDhost='localhost';设置pwd用户账号密码每90天过期【例7-26】设置用户pwd密码过期策略。ALTERUSERpwd@localhostPASSWORDEXPIRENEVER;SELECTuser,host,password_last_changed,password_lifetime,password_expiredFROMmysql.userWHEREuser='pwd'ANDhost='localhost';设置密码永不过期SETPERSISTdefault_password_lifetime=180;设置全局密码过期策略,每隔180天过期延用全局密码过期策略ALTERUSERpwd@localhostPASSWORDEXPIREDEFAULT;SELECTuser,host,password_last_changed,password_lifetime,password_expiredFROMmysql.userWHEREuser='pwd'ANDhost='localhost';(2)密码重用策略

账号的历史密码包含过去该账号所使用的密码。MySQL基于以下规则来限制密码重用。①如果

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论