正在看的ORACLE教程是:MySQL安全性指南 (1)(轉)。 MySQL安全性指南
作 者: 晏子
作為一個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
[1] [2] 下一頁
正在看的ORACLE教程是:MySQL安全性指南 (1)(轉)。 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()函數做到。
授權表包含兩種列:決定一個許可權何時運用的範圍列和決定授予哪種許可權的許可權列。
2.1.1 授權表範圍列
授權表範圍列指定表中的許可權何時運用。每個授權表條目包含User和Host列來指定許可權何時運用於一個給定使用者從給定主機的串連。其他表包含附加的範圍列,如db表包含一個Db列指出許可權運用於哪個資料庫。類似地,tables_priv和columns_priv表包含範圍欄位,縮小範圍到一個資料庫中的特定表或一個表的特定列。
2.1.2 授權表許可權列
授權表還包含許可權列,他們指出在範圍列中指定的使用者擁有何種許可權。由MySQL支援的許可權如下表所示。該表使用GRANT語句的許可權名稱。對於絕大多數在user、db和host表中的許可權列的名稱與GRANT語句中有明顯的聯絡。如Select_priv對應於SELECT許可權。
上一頁 [1] [2]