伺服器重新啟動的情況
當mysqld啟動時,所有的授權表內容被讀進儲存空間並且從那時開始生效。
被伺服器立即應用的情況
用GRANT、REVOKE或SET PASSWORD對授權表施行的修改會立即被伺服器注意到。
直接修改授權表的情況
如果你手工地修改授權表(使用INSERT、UPDATE等等),你應該執行一個FLUSH PRIVILEGES語句或運行mysqladmin flush-privileges告訴伺服器再裝載授權表,否則你的改變將不生效,除非你重啟伺服器。
對現有客戶串連的影響情況
當伺服器注意到授權表被改變了時,現存的客戶串連有如下影響:
·表和列許可權在客戶的下一次請求時生效。
·資料庫許可權改變在下一個USE db_name命令生效。
·全域許可權的改變和口令改變在下一次客戶串連時生效。
授權原則
無論怎麼小心都難免在給使用者授權時留有漏洞,希望下面的內容能給你一些協助,你一般應該遵守這些規則。
只有root使用者擁有授權表的改寫權
不要把授權表的改寫權授予除root使用者之外的其它使用者(當然,如果你可以用另一個使用者代替root使用者進行管理,以增加安全性)。因為這樣,使用者可以通過改寫授權表而推翻現有的許可權。產生安全性漏洞。
一般情況下,你可能不會犯這個錯誤,但是在安裝新的分發, 初始授權表之後。這個漏洞是存在的,如果你不瞭解這時授權表的內容你可能會犯錯誤。
在Unix(Linux)上,在按照手冊的指令安裝好MySQL後,你必須運行mysql_install_db指令碼建立包含授權表的mysql資料庫和初始許可權。在Windows上,運行分發中的Setup程式初始化資料目錄和mysql資料庫。假定伺服器也在運行。
當你第一次在機器上安裝MySQL時,mysql資料庫中的授權表是這樣初始化的:
·你可以從本地主機(localhost)上以root串連而不指定口令。root使用者擁有所有許可權(包括系統管理權限)並可做任何事情。(順便說明,MySQL超級使用者與Unix超級使用者有相同的名字,他們彼此毫無關係。)
·匿名訪問被授予使用者可從本地串連名為test和任何名字以test_開始的資料庫。匿名使用者可對資料庫做任何事情,但無系統管理權限。
一般地,建議你刪除匿名使用者記錄:
mysql> DELETE FROM user WHERE User="";
更進一步,同時刪除其他授權表中的任何匿名使用者,有User列的表有db、tables_priv和columns_priv。
另外要給root使用者佈建密碼。
關於使用者、口令及主機的設定
·對所有MySQL使用者使用口令。
記住,如果other_user沒有口令,任何人能簡單地用mysql -u other_user db_name作為任何其它的人登入。對客戶機/伺服器應用程式,客戶可以指定任何使用者名稱是常見的做法。在你運行它以前,你可以通過編輯mysql_install_db指令碼改變所有使用者的口令,或僅僅MySQL root的口令,象這樣:
以下為引用的內容: shell> mysql -u root mysql mysql> update user SET Password=PASSWORD('new_password') -> WHERE user='root'; mysql> FLUSH PRIVILEGES; |
·刪除匿名使用者
匿名使用者的存在不僅不僅容易引起存取拒絕錯誤,更會產生嚴重的安全性漏洞,安裝授權表後,自動安裝匿名使用者。預設時你可以用任何使用者名稱串連,不要求輸入密碼,並且具有修改授權表許可權。
你可以這樣刪除匿名使用者:
以下為引用的內容: shell>mysql –u root –p mysql mysql>delete from user where User=””; |
·留意使用萬用字元的主機名稱,盡量縮小主機名稱的範圍,適合使用者的主機就足夠了,不要讓使用者不使用的主機留在授權表裡。
·如果你不信任你的DNS,你應該在授權表中使用IP數字而不是主機名稱。原則上講,--secure選項對mysqld應該使主機名稱更安全。在任何情況下,你應該非常小心地使用包含萬用字元的主機名稱!
授予使用者合適的許可權
·授權使用者足夠使用的許可權,不要賦予額外的許可權。
例如,對於使用者只需要檢索資料表的需求,賦予SELECT許可權即可,不可賦予UPDATE、INSERT等寫入權限,不要怕被說成時吝嗇鬼。
·可能會產生安全性漏洞的許可權
grant許可權允許使用者放棄他們的許可權給其他使用者。2個有不同的許可權並有grant許可權的使用者可以合并許可權。
alter許可權可以用於通過重新命名表來推翻許可權系統。 因為ALTER許可權可能以你沒有設想的任何方法被使用。例如,一個使用者user1能訪問table1,但不能訪問table2。但是如果使用者user1帶有ALTER許可權可能通過使用ALTER TABLE將table2重新命名為table1來打亂你的設想。
shutdown許可權通過終止伺服器可以被濫用完全拒絕為其他使用者服務 。
·可能會產生嚴重安全性漏洞的許可權
不要把PROCESS許可權給所有使用者。mysqladmin processlist的輸出顯示出當前執行的查詢本文,如果另外的使用者發出一個UPDATE user SET password=PASSWORD('not_secure')查詢,被允許執行那個命令的任何使用者可能看得到。mysqld為有process許可權的使用者保留一個額外的串連, 以便一個MySQL root使用者能登入並檢查,即使所有的正常串連在使用。
不要把FILE許可權給所有的使用者。有這許可權的任何使用者能在擁有mysqld守護進程許可權的檔案系統那裡寫一個檔案!為了使這更安全一些,用SELECT ... INTO OUTFILE產生的所有檔案對每個人是可讀的,並且你不能覆蓋已經存在的檔案。
FILE許可權也可以被用來讀取任何作為運行伺服器的Unix使用者可存取的檔案。這可能被濫用,因為不僅有該伺服器主機帳號的使用者可以讀取它們,而且有FILE許可權的任何客戶機也可以通過網路讀取它們。你的資料庫目錄和系統的各種檔案可能成為全球範圍共用的檔案!例如,通過使用LOAD DATA裝載“/etc/passwd”進一個資料庫表,然後它能用SELECT被讀入。
下面的過程說明如何進行此項操作:
1、建具有LONGBLOB列的表:
mysql> USE test;
mysql> CREATE TABLE temp (b LONGBLOB);
2、用此表讀取你要竊取的檔案的內容:
mysql>LOAD DATA INFILE “/etc/passwd” INTO TABLE temp
->FIELDS ESCAPED BY “” LINES TERMINATED BY “”;
mysql>SELECT * FROM temp;
3、可以這樣竊取你的資料表data:
以下為引用的內容: mysql>LOAD DATA INFILE“./other_db/data.frm” INTO TABLE temp ->FIELDS ESCAPED BY“”LINES TERMINATED BY“”; mysql>SELECT * FROM temp INTO OUTFILE“./another_db/data.frm” ->FIELDS ESCAPED BY“”LINES TERMINATED BY“”; mysql>DELETE FROM temp; mysql>LOAD DATA INFILE“./other_db/data.MYD” INTO TABLE temp ->FIELDS ESCAPED BY“”LINES TERMINATED BY“”; mysql>SELECT * FROM temp INTO OUTFILE“./another_db/data.MYD” ->FIELDS ESCAPED BY“”LINES TERMINATED BY“”; mysql>DELETE FROM temp; mysql>LOAD DATA INFILE“./other_db/data.MYI” INTO TABLE temp ->FIELDS ESCAPED BY“”LINES TERMINATED BY“”; mysql>SELECT * FROM temp INTO OUTFILE“./another_db/data.MYI” ->FIELDS ESCAPED BY“”LINES TERMINATED BY“”; mysql>DELETE FROM temp; |
然後使用者就擁有的一個新表another.data,可以對它進行完全訪問。
MySQL許可權系統無法完成的任務
有一些事情你不能用MySQL許可權系統做到:
你不能明顯地指定一個給定使用者應該被拒絕存取。即,你不能明顯地匹配一個使用者並且然後拒絕串連。
你不能指定一個使用者有權建立立或拋棄一個資料庫中的表,也不能建立或拋棄資料庫本身。