MYSQL 網頁設計 技巧

MySQL伺服器通過權限表黎控制用戶對數據庫既訪問,權限表存放在mysql數據庫裡,由mysql_install_db腳本初始化。呢d權限表分別user,db,table_priv,columns_priv和host。下面分別介紹一下呢d表既結構同內容:

  • user權限表:記錄允許連接到伺服器既用戶帳號資訊,裡面既權限係全局級。

  • db權限表:記錄各個帳號在各個數據庫上既操作權限。

  • table_priv權限表:記錄數據表級既操作權限。

  • columns_priv權限表:記錄數據列級既操作權限。

  • host權限表:配合db權限表對給定主機上數據庫級操作權限作更細緻既控制。呢個權限表唔受GRANT和REVOKE語句既影響。

大家注意到,以上權限冇限制到數據行級既設置。在MySQL只要實現數據行級控制就要通過編寫程式(使用GET-LOCK()函數)黎實現。

MySQL既版本好多,所以權限表既結構在唔同版本間會有唔同。如果出現呢種情況,可用mysql_fix_privilege_tables腳本來修正。運行方式如下:

% mysql_fix_privilege_tables rootpassword            #這裡要給出MySQL的root用戶密碼

最好一下子升級到MySQL 4.0.4版本,因為4.0.2和4.0.3既db表冇Create_tmp_table_priv和Lock_tables_priv權限。

 

MySQL既權限表定義左兩部份內容,一個部份定義權限既範圍,即誰(帳戶)可以從哪裡(客戶端主機)訪問什麼(數據庫、數據表、數據列);另一部份定義權限,即控制用戶可以進行的操作。下面係一d常用既權限介紹,可直接在GRANT語句中使用。

  • CREATE TEMPORARY TABLES,允許創建臨時表的權限。

  • EXECUTE,允許執行存儲過程既權限,存儲過程在MySQL既當前版本中還沒實現。

  • FILE,允許你通過MySQL伺服器去讀寫伺服器主機上既文件。但有一定限制,只能訪問對任何用戶可讀既文件,通過伺服器寫既文件必須係尚未存在,以防止伺服器寫既文件覆蓋重要既系統文件。儘管有呢d限制,但為左安全,儘量唔好比權限予普通用戶。並且唔好以root用戶來運行MySQL伺服器,因為root用戶可在系統任何地方創建文件。

  • GRANT OPTION,允許把你自已所擁有的權限再轉授給其他用戶。

  • LOCK TABLES,可以使用LOCK TABLES語句來鎖定數據表

  • PROCESS,允許你查看和終止任何客戶線程。SHOW PROCESSLIST語句或mysqladmin processlist命令可查看線程,KILL語句或mysqladmin kill命令可終止線程。在4.0.2版及以後的版本中,PROCESS權限只剩下查看線程的能力,終止線程的能力由SUPER權限控制。

  • RELOAD,允許你進行一些數據庫管理操作,如FLUSH,RESET等。它還允許你執行mysqladmin命令:reload,refresh,flush-hosts,flush-logs,flush-privileges,flush-status,flush-tables和flush-threads。

  • REPLICATION CLIENT,允許查詢鏡像機制中主伺服器和從伺服器的位置。

  • REPLICATION SLAVE,允許某個客戶連接到鏡像機制中的主伺服器並請求發送二進製變更日誌。該權限應授予從伺服器用來連接主伺服器的帳號。在4.0.2版這前,從伺服器是用FILE權限來連接的。

  • SHOW DATABASES,控制用戶執行SHOW DATABASES語句的權限。

  • SUPER,允許終止線程,使用mysqladmin debug命令,使用CHANGE MASTER,PURGE MASTER LOGS以及修改全局級變量的SET語句。SUPER還允許你根據存放在DES密鑰文件裡的密鑰進行DES解密的工作。

user權限表中有一個ssl_type數據列,用來說明連接是否使用加密連接以及使用哪種類型的連接,它是一個ENUM類型的數據列,可能的取值有:

  • NONE,默認值,表示不需加密連接。

  • ANY,表示需要加密連接,可以是任何一種加密連接。由GRANT的REQUIRE SSL子句設置。

  • X509,表示需要加密連接,並要求客戶提供一份有效的X509證書。由GRANT的REQUIRE X509子句設置。

  • SPECIFIED,表示加密連接需滿足一定要求,由REQUIRE子句的ISSUER,SUBJECT或CIPHER的值進行設置。只要ssl_type列的值為SPECIFIED,則MySQL會去檢查ssl_cipher(加密演算法)、x509_issuer(證書簽發者)和x509_subject(證書主題)列的值。這幾列的列類型是BLOB類型的。

user權限表裡還有幾列是設置帳戶資源使用情況的,如果以下數據列中的數全為零,則表示沒有限制:

  • max_connections,每小時可連接伺服器的次數。

  • max_questions,每小時可發出查詢命令數。

  • max_updates,每小時可以發出的數據修改類查詢命令數。

設置權限表應注意的事項:

  • 刪除所有匿名用戶。

  • 查出所有沒有口令用戶,重新設置口令。可用以下命令查詢空口令用戶:

    mysql> SELECT host,user FROM user WHERE password = '';
    
  • 儘量不要在host中使用通配符。

  • 最好不要用user權限表進行授權,因為該表的權限都是全局級的。

  • 不要把mysql數據庫的權限授予他人,因為該數據庫包含權限表。

  • 使用GRANT OPTION權限時不要濫用。

  • FILE權限可訪問文件系統中的文件,所以授權時也要注意。一個具有FILE權限的用戶執行以下語句就可查看伺服器上全體可讀的文件:

    mysql> CREATE TABLE etc_passwd(pwd_entry TEXT);
    mysql> LOAD DATA INFILE '/etc/passwd' INTO TABLE etc_passwd;
    mysql> SELECT * FROM etc_passwd;
    

    如果MySQL伺服器數據目錄上的訪問權限設置得不好,就會留下讓具有FILE權限的用戶進入別人數據庫的安全漏洞。所以建議把數據目錄設置成只能由MySQL伺服器讀取。下面演示一個利用具有FILE權限的用戶讀取數據目錄中文件權限設置不嚴密的數據庫數據的過程:

    mysql> use test;
    mysql> create table temp(b longblob);
    mysql> show databases                   #顯示數據庫名清單,--skip-show-database可禁止該功能
    mysql> load data infile './db/xxx.frm' into table temp fields escaped by '' lines terminated by '';
    mysql> select * from temp into outfile 'xxx.frm' fields escaped by '' lines terminated by '';
    mysql> delete from temp;
    mysql> load data infile './db/xxx.MYD' into table temp fields escaped by '' lines terminated by '';
    mysql> select * from temp into outfile 'xxx.MYD' fields escaped by '' lines terminated by '';
    mysql> delete from temp;
    mysql> load data infile './db/xxx.MYI' into table temp fields escaped by '' lines terminated by '';
    mysql> select * from temp into outfile 'xxx.MYI' fields escaped by '' lines terminated by '';
    mysql> delete from temp;
    

    這樣,你的數據庫就給人拷貝到本地了。如果伺服器是運行在root用戶下,那危害就更大了,因為root可在伺服器上做任何的操作。所以儘量不要用root用戶來運行伺服器。

  • 只把PROCESS權限授予可信用戶,該用戶可查詢其他用戶的線程資訊。

  • 不要把RELOAD權限授予無關用戶,因為該權限可發出FLUSH或RESET語句,這些是數據庫管理工具,如果用戶不當使用會使數據庫管理出現問題。

  • ALTER權限也不要授予一般用戶,因為該權限可更改數據表。

GRANT語句對權限表的修改過程:

當你發送一條GRANT語句時,伺服器會在user權限表裡創建一個記錄項並把你用戶名、主機名和口令記錄在User、Host和Password列中。如果設置了全局權限,由把該設置記錄在相在的權限列中。

  • 如果在GRANT裡設置了數據庫級權限,你給出的用戶名和主機名就會記錄到db權限表的User和Host列中,數據庫名記錄在Db列中,權限記錄到相關的權限列中。

  • 接著是到數據表和數據列級的權限設置,設置方法和上面的一樣。伺服器會把用戶名、主機名、數據庫名以及相應的數據表名和數據列名記錄到數據表中。

刪除用戶權限其實就是把這些權限表中相應的帳號記錄全部刪除即可

arrow
arrow
    全站熱搜

    dettori 發表在 痞客邦 留言(0) 人氣()