在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 應用軟件教程 > 詳細頁面

MySQL安全向導

MySQL安全向導

更新時間:2025-10-17 文章作者:未知 信息來源:網絡 閱讀次數:

數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應...
數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合。
作為一個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()函數做到。 

授權表包含兩種列:決定一個權限何時運用的范圍列和決定授予哪種權限的權限列。 
[page_break]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 
允許你使用ALTER TABLE語句,這其實是一個簡單的第一級權限,你必須由其他權限,這看你想對數據庫實施什么操作。 
CREATE 
允許你創建數據庫和表,但不允許創建索引。 
DELETE 
允許你從表中刪除現有記錄。 
DROP 
允許你刪除(拋棄)數據庫和表,但不允許刪除索引。 
INDEX 
允許你創建并刪除索引。 
REFERENCES 
目前不用。 
SELECT 
允許你使用SELECT語句從表中檢索數據。對不涉及表的SELECT語句就不必要,如SELECT NOW()或SELECT 4/2。 
UPDATE 
允許你修改表中的已有的記錄。 
2.1.4 管理權限 
下列權限運用于控制服務器或用戶授權能力的操作的管理性操作。 

FILE 
允許你告訴服務器讀或寫服務器主機上的文件。該權限不應該隨便授予,它很危險,見“回避授權表風險”。服務器確實較謹慎地保持在一定范圍內使用該權限。你只能讀任何人都能讀的文件。你正在寫的文件必須不是現存的文件,這防止你迫使服務器重寫重要文件,如/etc/passwd或屬于別人的數據庫的數據目錄。 
如果你授權FILE權限,確保你不以UNIX的root用戶運行服務器,因為root可在文件系統的任何地方創建新文件。如果你以一個非特權用戶運行服務器,服務器只能在給用戶能訪問的目錄中創建文件。 

GRANT 
允許你將你自己的權限授予別人,包括GRANT。 
PROCESS 
允許你通過使用SHOW PROCESS語句或mysqladmin process命令查看服務器內正在運行的線程(進程)的信息。這個權限也允許你用KILL語句或mysqladmin kill命令殺死線程。 
你總是能看到或殺死你自己的線程。PROCESS權限賦予你對任何線程做這些事情的能力。 

RELOAD 
允許你執行大量的服務器管理操作。你可以發出FLUSH語句,你也能指性mysqladmin的reload、refresh、flush-hosts、flush-logs、flush-privileges和flush-tables等命令。 
SHUTDOWN 
允許你用mysqladmin shutdown關閉服務器。 
在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表包含某些在其他授權表不存在的權限的列:File_priv、Process_priv、Reload_priv和Shutdown_priv。這些權限運用于你讓服務器執行的與任何特定數據庫或表不相關的操作。如允許一個用戶根據當前數據庫是什么來關閉數據庫是毫無意義的。 

2.2 服務器如何控制客戶訪問 
在你使用MySQL時,客戶訪問控制有兩個階段。第一階段發生在你試圖連接服務器時。服務器查找user表看它是否能找到一個條目匹配你的名字、你正在從那兒連接的主機和你提供的口令。如果沒有匹配,你就不能連接。如果有一個匹配,建立連接并繼續第二階段。在這個階段,對于每一個你發出的查詢,服務器檢查授權表看你是否有足夠的權限執行查詢,第二階段持續到你與服務器對話的結束。 

本小節詳細介紹MySQL服務器用于將授權表條目匹配到來的連接請求或查詢的原則,這包括在授權表范圍列中合法的值的類型、結合授權表中的權限信息的方式和表中條目被檢查的次序。 

2.2.1 范圍列內容 
一些范圍列要求文字值,但它們大多數允許通配符或其他特殊值。 

Host 
一個Host列值可以是一個主機名或一個IP地址。值localhost意味著本地主機,但它只在你用一個localhost主機名時才匹配,而不是你在使用主機名時。假如你的本地主機名是pit.snake.net并且在user表中有對你的兩條記錄,一個有一個Host值或localhost,而另一個有pit.snake.net,有localhost的記錄將只當你連接localhost時匹配,其他在只在連接pit.snake.net時才匹配。如果你想讓客戶能以兩種方式連接,你需要在user表中有兩條記錄。 

你也可以用通配符指定Host值。可以使用SQL的模式字符“%”和“_”并具有當你在一個查詢中使用LIKE算符同樣的含義(不允許regex算符)。 SQL模式字符都能用于主機名和IP地址。如%wisc.edu匹配任何wisc.edu域內的主機,而%.edu匹配任何教育學院的主機。類似地,192.168.%匹配任何在192.168 B類子網的主機,而192.168.3.%匹配任何在192.168.3 C類子網的主機。 

%值匹配所有主機,并可用于允許一個用戶從任何地方連接。一個空白的Host值等同于%。(例外:在db表中,一個空白Host值含義是“進一步檢查host表”,該過程在“查詢訪問驗證”中介紹。) 

從MySQL 3.23起,你也可以指定帶一個表明那些為用于網絡地址的網絡掩碼的IP地址,如192.168.128.0/17指定一個17位網絡地址并匹配其IP地址是192.168.128前17位的任何主機。 

User 
用戶名必須是文字的或空白。一個空白值匹配任何用戶。%作為一個User值不意味著空白,相反它匹配一個字面上的%名字,這可能不是你想要的。 

當一個到來的連接通過user表被驗證而匹配的記錄包含一個空白的User值,客戶被認為是一個匿名用戶。 

Password 
口令值可以是空或非空,不允許用通配符。一個空口令不意味著匹配任何口令,它意味著用戶必須不指定口令。 

口令以一個加密過的值存儲,不是一個字面上的文本。如果你在Password列中存儲一個照字面上的口令,用戶將不能連接!GRANT語句和mysqladmin password命令為你自動加密口令,但是如果你用諸如INSERT、REPLACE、UPDATE或SET PASSWORD等命令,一定要用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表。 
如果你在檢查了所有表之后仍無權限,服務器拒絕你執行查詢的企圖。 
用布爾運算的術語,授權表中的權限被服務器這樣使用: 

user OR tables_priv OR columns_priv 

你可能疑惑為什么前面的描述只引用4個授權表,而實際上有5個。實際上服務器是這樣檢查訪問權限: 

user OR (db AND host) OR tables_priv OR columns_priv 

第一個較簡單的表達式是因為host表不受GRANT和REVOKE語句影響。如果你總是用GRANT和REVOKE管理用戶權限,你絕不需要考慮host表。但是其工作原理你用該知道: 
[page_break]user OR tables_priv OR columns_priv 

你可能疑惑為什么前面的描述只引用4個授權表,而實際上有5個。實際上服務器是這樣檢查訪問權限: 

user OR (db AND host) OR tables_priv OR columns_priv 

第一個較簡單的表達式是因為host表不受GRANT和REVOKE語句影響。如果你總是用GRANT和REVOKE管理用戶權限,你絕不需要考慮host表。但是其工作原理你用該知道: 

當服務器檢查數據庫級權限時,它對于客戶查找db表。如果Host列是空的,它意味著“檢查host表以找出哪一個主機能訪問數據庫”。 
服務器在host表中查找有與來自db表的記錄相同的Db列值。如果沒有host記錄匹配客戶主機,則沒有授予數據庫級權限。如果這些記錄的任何一個的確有一個匹配連接的客戶主機的Host列值,db表記錄和host表記錄結合產生客戶的數據庫級權限。 
然而,權限用一個邏輯AND(與)結合起來,這意味著除非一個給定的權限在兩個表中都有,否則客戶就不具備該權限。以這種方式,你可以在db表中授予一個基本的權限集,然后使用host表對特定的主機有選擇地禁用它們。如你可以允許從你的域中的所有主機訪問數據庫,但關閉了那些在較不安全區域的主機的數據庫權限。 

前面的描述毫無疑問使訪問檢查聽起來一個相當復雜的過程,特別是你以為服務器對你發出的每個查詢進行權限檢查,然而此過程是很快的,因為服務器其實不從授權表對每個查詢查找信息,相反,它在啟動時將表的內容讀入內存,然后驗證查詢用的是內存中的副本。這大大提高了訪問檢查操作的性能。但有一個非常明顯的副作用。如果你直接修改授權表的內容,服務器將不知道權限的改變。 

例如,如果你用一條INSERT語句向user表加入一個新記錄來增加一個新用戶,命名在記錄中的用戶將不能連接服務器。這對管理員新手(有時對有經驗的老手)是很困惑的事情,當時解決方法很簡單:在你改變了它們之后告訴服務器重載授權表內容,你可以發一條FLUSH PRIVILEGES或執行mysqladmin flush-privileges(或如果你有一個不支持flush-privileges的老版本,用mysqladmin reload。)。 

2.2.3 范圍列匹配順序 
MySQL服務器按一種特定方式排序符授權表中的記錄,然后通過按序瀏覽記錄匹配到來的連接。找到的第一個匹配決定了被使用的記錄。理解MySQL使用的排序順序很重要,特別是對user表。 

當服務器讀取user表內容時,它根據在Host和User列中的值排序記錄,Host值起決定作用(相同的Host值排在一起,然后再根據User值排序)。然而,排序不是典序(按詞排序),它只是部分是。要牢記的是字面上的詞優先于模式。這意味著如果你正從client.your.net連接服務器而Host有client.your.net和%.your.net兩個值,則第一個先選。類似地,%.your.net優先于%.net,然后是%。IP地址的匹配也是這樣的。 

總之一句話,越具體越優先。可以參見本文附錄的實例。 

2.3 避免授權表風險 
本屆介紹一些在你授權時的一些預防措施,以及不明值的選擇帶來的風險。一般地,你要很“吝嗇”地授予超級用戶權限,即不要啟用user表中條目中的權限,而使用其它授權表,以將用戶權限限制于數據庫、表、或列。在user表中的權限允許于影響到你的服務器操作或能訪問任何數據庫中的任何表。 

不要授予對mysql數據庫的權限。一個擁有包含授權表數據庫權限的用戶可能會修改表以獲取對其他任何數據庫的權限。授予允許一個用戶修改mysql數據庫表的權限也實際上給了用戶以一個全局GRANT權限。如果用戶能直接修改表,這也等價于能夠發出任何你能想象的任何GRANT語句。 

FILE權限尤其危險,不要輕易授權它。以下是一個擁有FILE權限的人能干除的事情: 

    CREATE TABLE etc_passwd (pwd_entry TEXT); 
    LOAD DATA INFILE "/etc/passwd" into TABLE etc_passwd; 
    SELECT * FROM etc_passwd; 

在發出這些語句后,用戶已經擁有了你的口令文件的內容了。實際上,服務器上任何公開可讀文件的內容都可被擁有FILE權限的用戶通過網絡訪問。 

FILE權限也能被利用來危害沒有設置足夠權限制的文件權限的系統上的數據庫。這就是你為什么應該設置數據目錄只能由服務器讀取的原因。如果對應于數據庫表的文件可被任何人讀取,不只是用戶服務器賬號的用戶可讀,任何有FILE權限的用戶也可通過網絡連接并讀取它們。下面演示這個過程: 

創建一個有一個LONGBLOB列的表: 
USER test; 
CREATE TABLE tmp (b LONGBLOB); 

使用該表讀取每個對應于你想偷取的數據庫表文件的內容,然后將表內容寫入你自己數據庫的一個文件中: 

LOAD DATA INFILE "./other_db/x.frm" INTO TABLE tmp 
     FIELDS ESCAPED BY "" LINES TERMINATED BY ""; 
SELECT * FROM tmp INTO OUTFILE "y.frm" 
     FIELDS ESCAPED BY "" LINES TERMINATED BY ""; 
DELETE FROM tmp; 
LOAD DATA INFILE "./other_db/x.ISD" INTO TABLE tmp 
     FIELDS ESCAPED BY "" LINES TERMINATED BY ""; 
SELECT * FROM tmp INTO OUTFILE "y.ISD" 
     FIELDS ESCAPED BY "" LINES TERMINATED BY ""; 
DELETE FROM tmp; 
LOAD DATA INFILE "./other_db/x.ISM" INTO TABLE tmp 
     FIELDS ESCAPED BY "" LINES TERMINATED BY ""; 
SELECT * FROM tmp INTO OUTFILE "y.ISM" 
現在你擁有了一個新表y,它包含other_db.x的內容并且你有全權訪問它。 
為避免讓人以同樣的方式攻擊,根據“第一部分 內部安全性-保護你的數據目錄”中的指令設置你的數據目錄上的權限。你也可以在你啟動服務器時使用--skip-show-database選項限制用戶對于他們沒用訪問權限的數據庫使用SHOW DATABASES和SHOW TABLES。這有助于防止用戶找到關于它們不能訪問的數據庫和表的信息。 

ALTER權限能以不希望的方式使用。假定你想讓user1可以訪問table1但不能訪問tables2。一個擁有ALTER權限的用戶可以通過使用ALTER TABLE將table2改名為table1來偷梁換柱。 

當心GRANT權限。兩個由不同權限但都有GRANT權限的用戶可以使彼此的權利更強大。 

2.4 不用GRANT設置用戶 
如果你有一個早于3.22.11的MySQL版本,你不能使用GRANT(或REVOKE)語句設置用戶及其訪問權限,但你可以直接修改授權表的內容。如果你理解GRANT語句如何修改授權表,這很容易。那么你通過手工發出INSERT語句就能自己做同樣的事情。 

當你發出一條GRANT語句時,你指定一個用戶名和主機名,可能還有口令。對該用戶生成一個user表記錄,并且這些值記錄在User、Host和Password列中。如果你在GRANT語句中指定全局權限,這些權限記錄在記錄的權限列中。其中要留神的是GRANT語句為你加密口令,而INSERT不是,你需要在INSERT中使用PASSWORD()函數加密口令。 

如果你指定數據庫級權限,用戶名和主機名被記錄在db表的User和Host列。你為其授權的數據庫記錄在Db列中,你授予的權限記錄在權限列中。 

對于表級和列級權限,效果是類似的。在tables_priv和columns_priv表中創建記錄以記錄用戶名、主機名和數據庫,還有相關的表和列。授予的權限記錄在權限列中。 

如果你還記得前面的介紹,你應該能即使不用GRANT語句也能做GRANT做的事情。記住在你直接修改授權表時,你將通知服務器重載授權表,否則他不知道你的改變。你可以執行一個mysqladmin flush-privileges或mysqladmin reload命令強迫一個重載。如果你忘記做這個,你會疑惑為什么服務器不做你想做的事情。 

下列GRANT語句創建一個擁有所有權的超級用戶。包括授權給別人的能力: 

GRANT ALL ON *.* TO anyname@localhost IDENTIFIED BY "passwd" 
    WITH GRANT OPTION 
該語句將在user表中為anyname@localhost創建一個記錄,打開所有權限,因為這里是超級用戶(全局)權限存儲的地方,要用INSERT語句做同樣的事情,語句是: 

INSERT INTO user  VALUES("localhost","anyname",PASSWORD("passwd"), 
    "Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y") 
你可能發現它不工作,這要看你的MySQL版本。授權表的結構已經改變而且你在你的user表可能沒有14個權限列。用SHOW COLUMNS找出你的授權表包含的每個權限列,相應地調整你的INSERT語句。 下列GRANT語句也創建一個擁有超級用戶身份的用戶,但是只有一個單個的權限: 

GRANT RELOAD ON *.* TO flush@localhost IDENTIFIED BY "flushpass" 
本例的INSERT語句比前一個簡單,它很容易列出列名并只指定一個權限列。所有其它列將設置為缺省的"N": 

INSERT INTO user (Host,Password,Reload) VALUES("localhost","flush",PASSWORD("flushpass"),"Y") 
數據庫級權限用一個ON db_name.*子句而不是ON *.*進行授權: 

GRANT ALL ON sample.* TO boris@localhost IDENTIFIED BY "ruby" 
這些權限不是全局的,所以它們不存儲在user表中,我們仍然需要在user表中創建一條記錄(使得用戶能連接),但我們也需要創建一個db表記錄記錄數據庫集權限: 

INSERT INTO user (Host,User,Password) VALUES("localhost","boris",PASSWORD("ruby")) 

INSERT INTO db VALUES("localhost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y","Y","Y") 

"N"列是為GRANT權限;對末尾的一個數據庫級具有WITH GRANT OPTION的GRANT語句,你要設置該列為"Y"。 

要設置表級或列級權限,你對tables_priv或columns_priv使用INSERT語句。當然,如果你沒有GRANT語句,你將沒有這些表,因為它們在MySQL中同時出現。如果你確實有這些表并且為了某些原因想要手工操作它們,要知道你不能用單獨的列啟用權限。 

你設置tables_priv.Table_priv或columns_priv.Column_priv列來設置包含你想啟用的權限值。例如,要對一個表啟用SELECT和INSERT權限,你要在相關的tables_priv的記錄中設置Table_priv為"Select,Insert"。 

如果你想對一個擁有MySQL賬號的用戶修改權限,使用UPDATE而不是INSERT,不管你增加或撤銷權限都是這樣。要完全刪除一個用戶,從用戶使用的每個表中刪除記錄。 

如果你愿意避免發一個查詢來直接修改全權表,你可以看一下MySQL自帶的mysqlaccess和mysql_setpermissions腳本。 

附錄1 小測驗 
在你剛剛新安裝了一個MySQL服務器,在你增加了一個允許連接MySQL的用戶,用下列語句: 

GRANT ALL ON samp_db.* TO fred@*.snake.net IDENTIFIED "cocoa" 

而fred碰巧在服務器主機上有個賬號,所以他試圖連接服務器: 

%mysql -u fred -pcocoa samp_db 
ERROR 1045: Access denied for user: ’fred@localhost’ (Using password: YES) 

為什么? 

原因是: 

先考慮一下mysql_install_db如何建立初始權限表和服務器如何使用user表記錄匹配客戶連接。在你用mysql_install_db初始化你的數據庫時,它創建類似這樣的user表: 

Host User 
localhost 
pit.snake.net 
localhost 
pit.snake.net root 
root 

頭兩個記錄允許root指定localhost或主機名連接本地服務器,后兩個允許匿名用戶從本地連接。當增加fred用戶后, 

Host User 
localhost 
pit.snake.net 
localhost 
pit.snake.net 
%.snake.net root 
root 

fred 

在服務器啟動時,它讀取記錄并排序它們(首先按主機,然后按主機上的用戶),越具體越排在前面: 

Host User 
localhost 
localhost 
pit.snake.net 
pit.snake.net 
%.snake.net root 

root 

fred 

有localhost的兩個記錄排在一起,而對root的記錄排在第一,因為它比空值更具體。pit.snake.net的記錄也類似。所有這些均是沒有任何通配符的字面上的Host值,所以它們排在對fred記錄的前面,特別是匿名用戶排在fred之前。 

結果是在fred試圖從localhost連接時,Host列中的一個空用戶名的記錄在包含%.snake.net的記錄前匹配。該記錄的口令是空的,因為缺省的匿名用戶沒有口令。因為在fred連接時指定了一個口令,由一個錯配且連接失敗。 

這里要記住的是,雖然用通配符指定用戶可以從其連接的主機是很方便。但你從本地主機連接時會有問題,只要你在table表中保留匿名用戶記錄。 

一般地,建議你刪除匿名用戶記錄: 

mysql> DELETE FROM user WHERE User=""; 

更進一步,同時刪除其他授權表中的任何匿名用戶,有User列的表有db、tables_priv和columns_priv。 

附錄2 使一個新的MySQL安裝更安全 
在你自己安裝了一個新的MySQL服務器后,你需要為MySQL的root用戶指定一個目錄(缺省無口令),否則如果你忘記這點,你將你的MySQL處于極不安全的狀態(至少在一段時間內)。 

在Unix(Linux)上,在按照手冊的指令安裝好MySQL后,你必須運行mysql_install_db腳本建立包含授權表的mysql數據庫和初始權限。在Windows上,運行分發中的Setup程序初始化數據目錄和mysql數據庫。假定服務器也在運行。 

當你第一次在機器上安裝MySQL時,mysql數據庫中的授權表是這樣初始化的: 

你可以從本地主機(localhost)上以root連接而不指定口令。root用戶擁有所有權限(包括管理權限)并可做任何事情。(順便說明,MySQL超級用戶與Unix超級用戶有相同的名字,他們彼此毫無關系。) 
匿名訪問被授予用戶可從本地連接名為test和任何名字以test_開始的數據庫。匿名用戶可對數據庫做任何事情,但無管理權限。 
從本地主機多服務器的連接是允許的,不管連接的用戶使用一個localhost主機名或真實主機名。如: 

% mysql -h localhost test 

% mysql -h pit.snake.net test 

你以root連接MySQL甚至不指定口令的事實只是意味著初始安裝不安全,所以作為管理員的你首先要做的應該是設置root口令,然后根據你設置口令使用的方法,你也可以告訴服務器重載授權表是它知道這個改變。(在服務器啟動時,它重載表到內存中而可能不知道你已經修改了它們。) 

對MySQL 3.22和以上版本,你可以用mysqladmin設置口令: 

% mysqladmin -u root password yourpassword 

對于MySQL的任何版本,你可以用mysql程序并直接修改mysql數據庫中的user授權表: 

% mysql -u root mysql 
mysql>UPDATE user SET password=PASSWORD("yourpassword") WHERE User="root"; 

如果你有MySQL的老版本,使用mysql和UPDATE。 

在你設置完口令后,通過運行下列命令檢查你是否需要告訴服務器重載授權表: 

% mysqladmin -u root status 

如果服務器仍然讓你以root而不指定口令而連接服務器,重載授權表: 

% mysqladmin -u root reload 

在你設置了root的口令后(并且如果需要重載了授權表),你將需要在任何時候以root連接服務器時指定口令。 

全新的路由器不僅讓你更穩定快速地連接無線網絡,更可以讓家中的智能設備連接在一起。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • xxxxxx在线观看| 一女被多男玩喷潮视频| 男人舔女人下面高潮视频| 日韩一级免费看| 国产日产欧美一区二区| 国产无色aaa| 色呦色呦色精品| 亚洲色图欧美自拍| 成人高清在线观看视频| 午夜视频在线观| 超碰超碰超碰超碰超碰| 欧美日韩一级在线| 久久手机在线视频| 国产网站免费在线观看| 别急慢慢来1978如如2| 久久黄色免费看| 亚洲怡红院在线| 国产5g成人5g天天爽| 久久香蕉视频网站| 免费看一级大黄情大片| 超碰97人人射妻| 成年人网站av| 国产手机免费视频| 波多野结衣xxxx| 成人av在线播放观看| 久久久亚洲国产精品| 另类小说第一页| 国产盗摄视频在线观看| 免费观看美女裸体网站| 色国产在线视频| 欧美一级视频在线播放| 91av俱乐部| 亚洲高潮无码久久| 宅男噜噜噜66国产免费观看| 一区二区三区一级片| 日本三级免费网站| 麻豆传媒网站在线观看| 别急慢慢来1978如如2| 国产对白在线播放| 爱情岛论坛成人| 欧美午夜小视频| 成年人免费观看的视频| 欧美国产日韩在线播放| 免费在线黄网站| 亚洲综合123| 亚洲精品一二三四五区| 国产一二三区在线播放| 亚洲午夜精品一区| 日本成人在线免费视频| 日b视频免费观看| 一区二区三区日韩视频| 中日韩av在线播放| 国产熟人av一二三区| 天天夜碰日日摸日日澡性色av| 超碰中文字幕在线观看| 亚洲国产精品三区| av五月天在线| 免费无遮挡无码永久视频| 菠萝蜜视频在线观看入口| 涩多多在线观看| 日本网站在线看| 亚洲一区二区福利视频| 国产成人美女视频| 色乱码一区二区三区在线| 91蝌蚪视频在线观看| 四虎永久在线精品无码视频| 欧美精品99久久| 国产成人黄色片| 99999精品视频| 免费观看成人网| 亚洲综合色在线观看| 香蕉视频禁止18| 色乱码一区二区三区在线| 亚洲xxx在线观看| 亚洲一二三av| 日本三级中文字幕在线观看| 青春草在线视频免费观看| 九九九九九九九九| 一区二区三区四区免费观看| 香蕉视频免费版| 欧美 丝袜 自拍 制服 另类| 亚洲色成人一区二区三区小说| 北条麻妃在线一区| 小明看看成人免费视频| 国产日韩欧美大片| 亚洲中文字幕无码中文字| 日韩精品无码一区二区三区免费| 亚洲黄色a v| 中文字幕55页| 99久久久无码国产精品6| 三年中国国语在线播放免费| aaaaaaaa毛片| 免费在线观看的av网站| 伊人影院综合在线| 大伊香蕉精品视频在线| 9久久婷婷国产综合精品性色| 婷婷视频在线播放| 黄色大片中文字幕| 粉色视频免费看| 欧美三级一级片| 亚洲av综合色区| xxxx一级片| 日韩日韩日韩日韩日韩| 五月天开心婷婷| 欧美 国产 小说 另类| 成年人三级视频| 中文字幕天天干| 日本成年人网址| 亚洲国产精品无码av| 久久久久xxxx| 91n.com在线观看| 精品一区二区中文字幕| 美女av免费观看| 中文字幕剧情在线观看| 日本熟妇人妻中出| 色欲av无码一区二区人妻| 最新av网址在线观看| 免费网站在线观看黄| 一区二区三区网址| 久草精品在线播放| 人妻av中文系列| 成人免费在线网| 国产人妻人伦精品| 日本美女久久久| 天天摸天天舔天天操| 日韩一级免费片| 亚洲欧美视频二区| 天美星空大象mv在线观看视频| av免费观看网| 凹凸国产熟女精品视频| 亚洲熟妇无码一区二区三区| 日本国产中文字幕| 蜜桃网站在线观看| 日本精品福利视频| 91麻豆天美传媒在线| 男女爱爱视频网站| 国产 欧美 日本| 国产www免费| 自拍日韩亚洲一区在线| 成人黄色av片| 热久久精品免费视频| 久久久久久蜜桃一区二区| 婷婷激情5月天| 日韩 欧美 自拍| 日韩一级片免费视频| 日韩精品―中文字幕| 国产美女三级视频| 在线视频日韩一区| 亚洲成人手机在线观看| 伊人成人免费视频| 欧美午夜性视频| 久久无码高潮喷水| 岛国毛片在线播放| 日本精品免费视频| 日韩精品 欧美| 黄色aaa级片| 久久久99精品视频| 国产a级一级片| www.桃色.com| 精品成在人线av无码免费看| 黑人糟蹋人妻hd中文字幕 | 一区二区三区四区免费观看| www.xxx麻豆| 亚洲欧美视频二区| 免费拍拍拍网站| 国产成人精品免费看在线播放 | www.中文字幕在线| 免费涩涩18网站入口| 欧美激情国内自拍| 激情五月宗合网| 国产美女18xxxx免费视频| 激情五月婷婷六月| 国产九九在线观看| 日日碰狠狠添天天爽超碰97| 999这里有精品| 久久婷婷五月综合色国产香蕉| xxxx在线免费观看| 少妇高清精品毛片在线视频| 在线无限看免费粉色视频| 欧美日韩激情视频在线观看| 小说区视频区图片区| 日本成人中文字幕在线| www精品久久| 超薄肉色丝袜足j调教99| 亚洲中文字幕久久精品无码喷水| 国产一线二线三线女| 精品综合久久久久| 那种视频在线观看| 国产不卡一区二区视频| 亚洲在线观看网站| 亚洲欧美手机在线| jizz欧美激情18| 玩弄japan白嫩少妇hd| 免费不卡av在线| 免费看欧美黑人毛片| 8x8x华人在线| 久久免费一级片| 亚洲五码在线观看视频| 麻豆传媒网站在线观看| 一区二区三区国产好的精华液|