第7章 数据库的安全管理数据库存在的不安全因素非授权用户对数据库的恶意存取和破坏 一些黑客和犯罪分子在用户存取数据库时猎取用户名和用户口 令,然后假冒合法用户偷取、修改甚至破坏用户数据。数据库中重要或敏感的数据被泄露 黑客和敌对分子千方百计盗窃数据库中的重要数据, 一些机密信息被暴露。安全环境的脆弱性 数据库的安全性与计算机系统的安全性,包括计算机硬件、操作系统、网络系统等 的安全性是紧密 联系的。操作系统安全的脆弱,网络协议安全保障的不足等都会造成数据库安全性的破坏。 曾经在伊朗以及其他中东国家发现过一种被称为“fl ame”(火焰)的病毒程序,这个程序可以让自己假冒成 Windows 更新文件隐藏在目标计算机里。它的作用非常特别,可以随时复制文 件、截图、下载聊天记录甚至可以远程启动计算机、激活麦克风和摄像头并偷偷录下视频和音频。 这是一种特工病毒,它的作用不是搞破坏而 是尽可能的隐藏自己窃取一切有用的信息。“flame”通过蓝牙系统来接收指令,并且可以制造假的电子凭证来隐藏身份,最牛的是当它被发现 后还可以立即删除掉所有记录痕迹并自我毁灭,这简直就跟特工干的事儿一模一样。7.1数据库安全性概述数据库原理与设计5数据库安全技术用 户标识与鉴别存取控制视图审计数据加密1. 用户标识与鉴别 当前最常用的鉴别方法。即用什么来标识一个用户,又怎样去识别它。用 户的个人特征识别:如用户的声音、指纹、签名等。用户的特有东西识别:如用户的磁卡、钥匙等。用户的自定义识别:如用户设置口令、密码和一 组预定的问答等。2. 存取控制策略(1)定义用户权限,并将用户权限登记到数据字典中。用户对某一数据对象的操作权力称为权限。某个用户 应该具有何种权限是个管理问题和政策问题而不是技术问题。DBMS的功能就是保证这些决定的执行。DBMS系统必须提供适当的语言来定义用 户权限,这些定义经过编译后存放在数据字典中,被称做安全规则或授权规则。(2)合法权限检查当用户发出存取数据库的操作请求后,DBMS 查找数据字典,根据安全规则进行合法权限检查,若用户的操作请求超出了定义的权限,系统将拒绝执行此操作。通过视图用户只能查看和修改他们 所能看到的数据。① 建立视图score_db。 CREATE VIEW score_db AS SEL ECT FROM score WHERE cnam=’数据库’;示例② 为用户授予操作视图的 权限。 GRANT SELECT ON score_db TO 王莎;视图+授权 常用的安全性控制方 法3. 视图机制 审计功能把用户对数据库的所有操作自动记录下来放入“审计日志”中,称为审计跟踪。 审计员可以利用 审计日志监控数据库中的各种行为,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。 还可以通过对审计日 志分析,对潜在的威胁提前采取措施加以防范。 审计通常是很费时间和空间的,所以DBMS往往都将其作为可选特征,审计功能一 般主要用于安全性要求较高的部门。4. 审计跟踪数据加密是防止数据库中数据在存储和传输中失密的有效手段。 加密的基本思想 是根据一定的算法将原始数据(称为明文)变换为不可直接识别的格式(称为密文),从而使得不知道解密算法的人无法获知数据的内容。 由于数据加密与解密也是比较费时的操作,而且数据加密与解密程序会占用大量系统资源,因此数据加密功能通常也作为可选特征。5. 数据 加密7.2MySQL的安全设置数据库原理与设计137.2.1 权限表1. user表user表字段可以分为4类,用户列、权限列、安 全列和资源控制列。(1)用户列用户列常用的字段有Host、User、authentication_string,分别表示主机名、用 户名和密码。当添加、删除、修改或者查看用户信息时,其实就是对user表进行增、删、改、查的操作。【例7-1】查询user表中相关用 户字段信息。SELECT Host,User,authentication_string FROM mysql.user;( 2)权限列user表中包含了几十个以_priv结尾的与权限有关的字段,这些权限不仅包括查询权限、修改权限等普通权限,还包括关闭服务 器权限、超级权限和加载用户等高级权限。【例7-2】查询localhost主机下的用户的select、insert、update权限 。SELECT select_priv,insert_priv,update_priv,User,Host FROM mysql. user WHERE Host=''localhost'';(3)安全列安全列有12个字段,其中ssl用于加密,x509标准可用 于标识用户,plugin字段是用于验证用户身份的插件,如果该字段为空,服务器就使用内建授权验证机制验证用户身份。【例7-3】查询服 务器是否支持ssl功能。SHOW VARIABLES LIKE ''have_openssl'';(4)资源控制列资源控制列的字段用来 限制用户使用的资源,包括4个字段。 ① max_questions:用户每小时允许执行的查询操作次数。 ② max _updates:用户每小时允许执行的更新操作次数。 ③ max_connections:用户每小时允许执行的连接操作次数 。 ④ max_user_connections:用户允许同时建立的连接次数。【例7-4】查询root用户的4个资源控制字 段的信息。SELECT max_questions,max_updates,max_connections,max_user_co nnections FROM mysql.user WHERE User=''root'';2. db表 db表中存储了用户 对某个数据库的操作权限,决定用户能从哪个主机存取哪个数据库。(1)用户列db表的用户列有3个字段Host、User、Db,分别表示 主机名、用户名和数据库名,具体表示从某个主机连接某个用户对某个数据库的操作权限。(2)权限列db表中有19个权限字段,其中crea te_routine_priv和alter_routine_priv两个字段表明用户是否有创建和修改存储过程的权限。3. tabl es_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、Timesta mp、Column_priv。其中Column_name用来指定对哪些数据列具有操作权限。5. proc_priv表 proc _priv表用来对存储过程和存储函数设置操作权限,(1)Host、Db、User分别表示主机名、数据库名和用户名。(2)Routi ne_name表示存储过程或存储函数的名称。(3)Routine_type表示存储过程或存储函数的类型。(4)Grantor表示插 入或修改该记录的用户。(5)Proc_priv表示拥有的权限,包括excute、alter routine、grant三种。(6) Timestamp表示存储记录更新的时间。7.2.2 用户管理MySQL的用户包括root用户和普通用户,root用户是超级管理 员,拥有对整个MySQL服务器完全控制的权限,而普通用户只能拥有赋予给它的权限。在MySQL数据库中,为了防止非授权用户对数据库进 行存取,DBA可以创建登录用户、修改用户信息和删除用户。1.创建用户CREATE USER 用户 [IDENTIFIED BY ''密码''] [,用户 [IDENTIFIED BY ''密码'' ]]…;【说明】① 用户的格式:用户名@主机名 主机名即用户连接MySQL时所在主机的名字。如果在创建时只给出了账号的用户名 ,而没有指定主机名,则主机名会默认为是“%”,表示一组主机;localhost表示本地主机。② IDENTIFIED BY子句指 定创建用户时的密码。【例7-6】创建本机用户tempuser,其密码为temp。CREATE USER tempuser@loca lhost IDENTIFIED BY ''temp''; 创建的新用户的详细信息自动保存在系统数据库mysql的user表中,执 行如下SQL语句,可查看数据库服务器的用户信息。USE mysql;SELECT FROM user WHERE user='' tempuser'';2.修改用户密码SET PASSWORD FOR 用户=''新密码'';【例7-7】修改用户账号tempuser的 密码为123456。SET PASSWORD FOR tempuser@localhost=''123456'';【例7-8】修改ro ot超级用户的密码为root。SET PASSWORD FOR root@localhost=''root'';3.修改用户名RENA ME USER 旧用户名 TO 新用户名 [,旧用户名 TO 新用户名][,…];【例7-9】修改普通用户tempuser的用户名为temp_U。RENAME USER tempuser@lo calhost TO temp_U@localhost;USE mysql;SELECT FROM user WHER E user=''temp_U'' and host=''localhost'';4.删除用户DROP USER 用户[,…]; 【 例7-10】删除用户temp_U。DROP USER temp_U@localhost;USE mysql;SELECT FR OM user WHERE user=''temp_U'' and host=''localhost'';7.2.3 权限管理权限 管理主要是对登录到MySQL服务器的数据库用户进行权限验证。所有用户的权限都存储在MySQL的权限表中。合理的权限管理能够保证数据 库系统的安全,不合理的权限设置会给数据库系统带来危害。权限管理主要包括两个内容:授予权限和取消权限。1. 授予权限(1)授予MyS QL字段级别权限GRANT 权限名称(列名[,列名,…])[, 权限名称(列名[,列名,…]),…] ON TABLE 数据库名 .表名或视图名 TO 用户[,用户,…];在MySQL中,针对不同的数据库资源,可以将权限分为五类,即MySQL字段级别权限、M ySQL表级别权限、MySQL存储程序级别权限、MySQL数据库级别权限和MySQL服务器管理员级别权限。 系统数据库mys ql的系统表columns_priv中记录了用户字段级别权限的验证信息。【例7-11】创建新用户column_user,并为其授予 对fruits表中列的操作权限。CREATE USER column_user@localhost IDENTIFIED BY ''password'';GRANT SELECT(f_name,f_price),UPDATE(f_price),REFE RENCES(s_id) ON TABLE fruitsales.fruits TO column_user@local host;SELECT FROM mysql.columns_priv;以column_user用户连接MySQL服务器SEL ECT f_name,f_price FROM fruitsales.fruits;SELECT f_id FROM fruits ales.fruits;(2)授予MySQL表级别权限GRANT 权限名称[, 权限名称,…] ON TABLE 数据库名.表名 或数据库名.视图名 TO 用户[,用户,…]; 系统数据库mysql的系统表tables_priv中记录了用户MySQL表级 别权限的验证信息。【例7-12】创建新用户table_user,并为其授予对fruits表的操作权限。CREATE USER ta ble_user@localhost IDENTIFIED BY ''password'';GRANT ALTER,SELECT,IN SERT(f_id,f_name,f_price) ON TABLE fruitsales.fruits TO table_us er@localhost;SELECT FROM mysql.tables_priv WHERE host=''local host'' and user=''table_user'';以table_user用户连接MySQL服务器ALTER TABLE fr uitsales.fruits ADD f_origin VARCHAR(50); DESC fruitsales.fruit s;【例7-13】创建新用户view_user,授予其只能查询供应商101水果销售情况信息。CREATE USER view_us er@localhost IDENTIFIED BY ''password'';USE fruitsales;CREATE VIEW s101_od AS SELECT s_name,o_num,f_name,quantity FROM fruits f,orderitems o,suppliers s WHERE f.f_id=o.f_id AND f.s_id=s. s_id AND s.s_id=101;GRANT SELECT ON s101_od TO view_user@localhos t;以view_user用户连接MySQL服务器SELECT FROM fruitsales.s101_od;(3)授予MyS QL存储程序级别权限GRANT 权限名称[, 权限名称,…] ON FUNCTION|PROCEDURE 数据库名.函数名 |数据库名.存储过 程名 TO 用户[,用户,…]; 系统数据库mysql的系统表procs_priv中记录了用户MySQL存储程序级别权限的验证 信息。【例7-14】创建新用户proc_user,并为其授予对fruitsales数据库中的存储过程的操作权限。CREATE US ER proc_user@localhost IDENTIFIED BY ''password'';DELIMITER @@CREA TE PROCEDURE fruitsales.test_p() BEGIN SELECT FROM fruitsales .fruits; END@@GRANT EXECUTE ON PROCEDURE fruitsales.test_p TO proc_user@localhost; 以proc_user用户连接MySQL服务器CALL fruitsales.test_ p;(4)授予MySQL数据库级别权限GRANT 权限名称[, 权限名称,…] ON 数据库名. TO 用户[,用户,…]; 系统数据库mysql的系统表db中记录了用户MySQL数据库级别权限的验证信息。【例7-15】创建新用户database_us er,并为其授予对fruitsales数据库的操作权限。CREATE USER database_user@localhost I DENTIFIED BY ''password'';GRANT CREATE,SELECT,DROP ON fruitsales. TO database_user@localhost;以database_user用户连接MySQL服务器CREATE TABLE fruitsales.test( id INT NOT NULL PRIMARY KEY, name VARCHAR (10));DROP TABLE fruitsales.test;(5)授予MySQL服务器管理员级别权限GRANT 权限名称[, 权限名称,…] ON . TO 用户[,用户,…]; 系统数据库mysql的系统表user中记录了用户MySQL服务器 管理员级别权限的验证信息。【例7-16】创建新用户server_user,并为其授予对所有数据库的操作权限。CREATE USER server_user@localhost IDENTIFIED BY ''password'';GRANT ALL PRIVILE GES ON . TO server_user@localhost;以sever_user用户连接MySQL服务器CREAT E DATABASE test_db;(6)权限的转移权限的转移通过在GRANT语句中使用WITH GRANT OPTION子句来 实现。如果指定为WITH GRANT OPTION,则表示TO子句中的所有用户都具有把自己所拥有的权限授予给其他用户的权利,而无论 那些其它用户是否拥有该权限。【例7-17】创建新用户u1和u2,为u1赋予对fruits表增删改查的权限,并且u1能够将所拥有的权 限再赋予给u2。CREATE USER u1@localhost IDENTIFIED BY ''123'';CREATE USER u2@localhost IDENTIFIED BY ''456'';GRANT SELECT,INSERT,UPDATE,DELET E ON fruitsales.fruits TO u1@localhost WITH GRANT OPTION;以u1 用户连接MySQL服务器GRANT SELECT ON fruitsales.fruits TO u2@localhost;以u2 用户连接MySQL服务器SELECT FROM fruitsales.fruits;2. 撤消权限(1)撤消所有权限REVOK E ALL PRIVILEGES,GRANT OPTION FROM 用户[,用户,…];【例7-18】撤消例7-11用户co lumn_user@localhost的所有权限。SELECT FROM mysql.columns_priv WHERE user=''column_user'' AND host=''localhost'';REVOKE ALL PRIVILEGES,GR ANT OPTION FROM column_user@localhost; SELECT FROM mysql.column s_priv WHERE user=''column_user'' AND host=''localhost'';(2)撤消指定权限RE VOKE 权限名称[(列名[,列名,…])] [,权限名称[(列名[,列名,…])],…] ON . | 数据库名. | 数据库名.表名或视图名 FROM 用户[,用户,…];【例7-19】撤消例7-14用户data base_user@localhost的CREAT和DROP权限。SELECT FROM db WHERE host=''loc alhost'' and user=''database_user'';REVOKE CREATE,DROP ON fruitsal es. FROM database_user@localhost;SELECT FROM mysql.db WHERE ho st=''localhost'' and user=''database_user'';7.2.4 角色管理MySQL的权限设置是非常复杂 的,权限的类型也非常多,这就为DBA有效地管理数据库权限带来了困难。另外,数据库的用户通常有几十个、几百个、甚至成千上万个。如果管 理员为每个用户授予或者撤销相应的权限,则这个工作量是非常庞大的。为了简化权限管理,MySQL提供了角色的概念。角色是具有名称的一组 相关权限的集合,即将不同的权限集合在一起就形成了角色。可以使用角色为用户授权,同样也可以撤销角色。由于角色集合了多种权限,所以当为 用户授予角色时,相当于为用户授予了多种权限。这样就避免了向用户逐一授权,从而简化了用户权限的管理。1.创建角色CREATE RO LE 角色;【说明】角色格式:角色名@主机名。【例7-20】分别在本地主机上创建应用程序角色app、运维人员角色ops、开发人 员读角色dev_read、开发人员写角色dev_write。CREATE ROLE app@localhost, ops@loca lhost, dev_read@localhost, dev_write@lo calhost;SELECT FROM mysql.user WHERE host=''localhost'' AN D user IN(''app'',''ops'',''dev_read'',''dev_write'');2.授予角色权限只需将GRANT语句T O后的用户改为角色即可。【例7-21】分别授予角色app数据读写权限、角色ops访问数据库权限、角色dev_read读取权限、角色 dev_write写权限。GRANT SELECT,INSERT,UPDATE,DELETE ON fruitsales. TO app@localhost;GRANT ALL PRIVILEGES ON fruitsales. TO op s@localhost;GRANT SELECT ON fruitsales. TO dev_read@localhost; GRANT INSERT,UPDATE,DELETE ON fruitsales. TO dev_write@localh ost;3.授予用户角色GRANT 角色[,角色,…] TO 用户[,用户,…];【例7-22】分别将角色授予新用户app01、 ops01、dev01、dev02、dev03。CREATE USER app01@localhost IDENTIFIED B Y ''000000'';CREATE USER ops01@localhost IDENTIFIED BY ''000000''; CREATE USER dev01@localhost IDENTIFIED BY ''000000''; CREATE USE R dev02@localhost IDENTIFIED BY ''000000'';CREATE USER dev03@loca lhost IDENTIFIED BY ''000000'';创建新的用户账号GRANT app@localhost TO app 01@localhost;GRANT ops@localhost TO ops01@localhost;GRANT dev_rea d@localhost TO dev01@localhost;GRANT dev_read@localhost,dev_write @localhost TO dev02@localhost,dev03@localhost;给用户账号分配角色set glo bal activate_all_roles_on_login=ON;用户使用角色权限前,必须要先激活角色以dev01用户连接My SQL服务器SELECT FROM fruitsales.suppliers;4.撤消用户角色REVOKE 角色[,角色,…] FROM 用户[,用户,…];【例7-23】撤消用户dev01的角色dev_read。REVOKE dev_read@local host FROM dev01@localhost;以dev01用户连接MySQL服务器SELECT FROM fruitsa les.suppliers;5.删除角色DROP ROLE 角色[,角色,…];【例7-24】删除角色app和ops。DROP R OLE ''app''@''localhost'',''ops''@''localhost'';7.2.5 密码管理1. Windows系统下 丢失MySQL root登录密码的解决方法(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中的语句后,需要刷新一下,如果不刷新将会报错,SQ L语句及执行结果如图7-5所示。(6)刷新之后使用ALTER USER语句修改用户的密码,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语句格式如下: ALTER USER 用户 PASSWORD EX PIRE;【例7-25】将用户pwd账号的密码设置为过期。CREATE USER pwd@localhost IDENTIFIED BY ''123456'';SELECT user,host,password_last_changed,password_life time, password_expired FROM mysql.user WHERE user =''pwd'' AND host=''localhost'';ALTER USER pwd@localhost PASSWORD EXP IRE; 以pwd用户连接MySQL服务器,将会显示密码过期重置的窗口,在窗口中重新设置新密码,如图7-10所示。因为密码过期后 ,只有重新设置了新密码,该用户才能正常使用。为每个用户单独设置密码过期策略的SQL语句 ALTER USER 用户 PASSWORD EXPIRE INTERVAL n DAY|NEVER|DEFAULT;① I NTERVAL n DAY:设置密码过期的天数;② NEVER:设置密码永不过期;③ DEFAULT:延用全局密码过期策略。ALT ER USER pwd@localhost PASSWORD EXPIRE INTERVAL 90 DAY;SELECT u ser,host,password_last_changed,password_lifetime,password_expired FROM mysql.user WHERE user=''pwd'' AND host=''localhost'';设置pwd用户账号密 码每90天过期【例7-26】设置用户pwd密码过期策略。ALTER USER pwd@localhost PASSWORD EXP IRE NEVER;SELECT user,host,password_last_changed,password_lifetim e, password_expired FROM mysql.user WHERE user=''pwd'' AND host= ''localhost'';设置密码永不过期SET PERSIST default_password_lifetime=180;设置全 局密码过期策略,每隔180天过期延用全局密码过期策略ALTER USER pwd@localhost PASSWORD EXPIR E DEFAULT;SELECT user,host,password_last_changed,password_lifetim e,password_expired FROM mysql.user WHERE user=''pwd'' AND host=''loc alhost'';(2)密码重用策略 账号的历史密码包含过去该账号所使用的密码。MySQL基于以下规则来限制密码重用。① 如果 账号的密码限制基于密码更改的数量,那么新密码不能从最近限制的密码数量中选择。例如,如果密码更改的最小值为3,那么新密码不能与最近3 个密码中任何一个相同。② 如果账号密码限制基于时间,那么新密码不能从规定时间内选择。例如,如果密码重用周期为60天,那么新密码不能 从最近60天内使用的密码中选择。手动设置全局密码重用策略的SQL语句SET PERSIST password_history= 密 码重用数量;SET PERSIST password_reuse_interval = 密码重用周期数;ALTER USER 用户 PASSWORD HISTORY n|DEFAULT [REUSE INTERVAL n DAY|DEFAULT]; 为每个用户单独设置密码重用策略的SQL语句或ALTER USER 用户 PASSWORD REUSE INTERVAL n D AY|DEFAULT [HISTORY n|DEFAULT];【说明】① INTERVAL n DAY:设置密码重用限制天数; ② HISTORY n:设置密码重用限制个数;③ DEFAULT:延用全局密码重用策略。【例7-27】设置用户pwd密码重用策略。ALTER USER pwd@localhost PASSWORD HISTORY 3;SELECT user,host,password_reuse_history,password_reuse_time FROM mysql.user WHERE user=''pwd'' AND host=''localhost'';不能使用最近3个密码ALTER USER pwd@localhost PASSWORD REUSE INTERVAL 365 DAY;SELECT user,host,password_reuse_history,password_reuse_time FROM mysql.user WHERE user=''pwd'' AND host=''localhost'';不能使用最近一年内的密码ALTER USER pwd@localhost PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 300 DAY;SELECT user,host,password_reuse_history,password_reuse_time FROM mysql.user WHERE user=''pwd'' AND host=''localhost'';既不能使用最近5个密码,也不使用300天内的密码SET PERSIST password_history=6;SET PERSIST password_reuse_interval=180;设置全局密码重用策略,不能使用最近6个密码ALTER USER pwd@localhost PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT;SELECT user,host,password_reuse_history,password_reuse_time FROM mysql.user WHERE user=''pwd'' AND host=''localhost''; 延用全局策略Thank You ! |
|