數據庫原理與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

提交評論