隨著網絡的普及基於網絡的應用也越來越多網絡數據庫就是其中之一通過一台或幾台服務器可以為很多客戶提供服務這種方式給人們帶來了很多方便但也給不法分子造成了可乘之機由於數據都是通過網絡傳輸的這就可以在傳輸的過程中被截獲或者通過非常手段進入數據庫由於以上原因數據庫安全就顯得十分重要因此本文就以上問題討論了MySQL數據庫在網絡安全方面的一些功能
帳戶安全
帳戶是MySQL最簡單的安全措施每一帳戶都由用戶名密碼以及位置(一般由服務器名IP或通配符)組成如用戶john從server進行登錄可能和john從server登錄的權限不同
MySQL的用戶結構是用戶名/密碼/位置這其中並不包括數據庫名下面的兩條命令為database和database設置了SELECT用戶權限
GRANT SELECT ON database* to abc@server IDENTIFIED BY password;
GRANT SELECT ON database* to abc@server IDENTIFIED BY password;
第一條命令設置了用戶abc在連接數據庫database時使用password第二條命令設置了用戶abc在連接數據庫database時使用password因此用戶abc在連接數據庫database和database的密碼是不一樣的
上面的設置是非常有用的如果你只想讓用戶對一個數據庫進行有限的訪問而對其它數據庫不能訪問這樣可以對同一個用戶設置不同的密碼如果不這樣做當用戶發現這個用戶名可以訪問其它數據庫時那將會造成麻煩
MySQL使用了很多授權表來跟蹤用戶和這些用戶的不同權限這些表就是在mysql數據庫中的MyISAM表將這些安全信息保存在MySQL中是非常有意義的因此我們可以使用標准的SQL來設置不同的權限
一般在MySQL數據庫中可以使用種不同類型的安全檢查
·登錄驗證
也就是最常用的用戶名和密碼驗證一但你輸入了正確的用戶名和密碼這個驗證就可通過
·授權
在登錄成功後就要求對這個用戶設置它的具體權限如是否可以刪除數據庫中的表等
·訪問控制
這個安全類型更具體它涉及到這個用戶可以對數據表進行什麼樣的操作如是否可以編輯數據庫是否可以查詢數據等等
訪問控制由一些特權組成這些特權涉及到所何使用和操作MySQL中的數據它們都是布爾型即要麼允許要麼不允許下面是這些特權的列表
·SELECT
SELECT是設定用戶是否可以使用SELECT來查詢數據如果用戶沒有這個特權那麼就只能執行一些簡單的SELECT命令如計算表達式(SELECT +)或是日期轉換(SELECT Unix_TIMESTAMP(NOW( )))等
·INSERT
·UPDATE
·INDEX
INDEX決定用戶是否可以對表的索引進行設置如果用戶沒有這個權限那麼將無法設置表中的索引
·ALTER
·CREATE
·GRANT
如果一個用戶擁有這個GRANT權限那麼他就可以將自己的權限授給別的用戶也就是說這個用戶可以和其它用戶共享自己的權限
·REFERENCES
有了REFERENCES權限用戶就可以將其它表的一個字段作為某一個表的外鍵約束
除了以上的權限外MySQL還有一些權限可以對整個MySQL進行操作
·Reload
這個權限可以使用戶有權執行各種FLUSH命令如FLUSH TABLES FLUSH STATUS等
·Shutdown
這個權限允許用戶關閉MySQL
·Process
通過這個權限用戶可以執行SHOW PROCESSLIST和KILL命令這些命令可以查看MySQL的處理進程可以通過這種方式查看SQL執行的細節
·File
這個權限決定用戶是否可以執行LOAD DATA INFILE命令給用戶這個權限要慎重因為有這個權限的用戶可以將任意的文件裝載到表中這樣對MySQL是十分危險的
·Super
這個權限允許用戶終止任何查詢(這些查詢可能並不是這個用戶執行的)
以上幾種權限是非常危險的在給用戶授權限時要非常謹慎
MySQL中的SSL
以上的帳戶安全只是以普通的Socket進行數據傳輸的這樣非常不安全因此MySQL在版以後提供了對SSL(Secure Scokets Layer)的支持MySQL使用的是免費的OpenSSL庫
由於MySQL的Linux版本一般都是隨Linux本身一起發布因此它們默認時都不使用SSL進行傳輸數據如果要打開SSL功能需要對hava_openssl變量進行設置
MySQL的Windows版本已經將OpenSSL加入了也面的命令是查看你的MySQL是否打開了SSL功能
SHOW VARIABLES LIKE have_openssl;
+++
| Variable_name | Value |
+++
| have_openssl | NO |
+++
row in set ( sec)
如果返回的是NO那麼說明你需要將OpenSSL編譯進自己的MySQL
在有時你可能需要將用戶名和密碼進行加密傳輸在這時可以使用下面GRANT命令
GRANT ALL PRIVILEGES ON ssl_only_db* to abc@% IDENTIFIED BY password! REQUIRE SSL;
還可以通過 REQUIRE x 選項進行SSL傳輸:
GRANT ALL PRIVILEGES ON ssl_only_db* to abc@% IDENTIFIED BY password! REQUIRE x;
你還可以使用REQUIRE SUBJECT來指定一個特定的客戶端證書來訪問數據庫
GRANT ALL PRIVILEGES ON ssl_only_db* to abc@%
IDENTIFIED BY password!
REQUIRE SUBJECT /C=US/ST=New York/L=Albany/O=Widgets Inc/CN=clientray
/emailAddress=;
也許你並不關心使用的是什麼客戶許可而僅僅關心的是你的證書那麼你可以使用REQUIRE ISSUER來實現
GRANT ALL PRIVILEGES ON ssl_only_db* to abc@% IDENTIFIED BY password!
REQUIRE ISSUER /C=US/ST=New+York/L=Albany/O=Widgets Inc/CN=cacertexample
com/emailAddress=;
SSL還可以直接通過密碼進行加密可以使用REQUIRE CIPHER設置密碼
GRANT ALL PRIVILEGES ON ssl_only_db* to abc@% IDENTIFIED BY password!
REQUIRE CIPHER EDHRSADESCBCSHA;
上面使用了GRANT命令對用戶權限進行設置而這些信息都是保存在授權表中這些表是安全系統的心髒在這些表中保存了每一個用戶和客戶機所具有的權限如果正確地操作這些表將會對數據庫的安全起到積極的作用而如果使用不慎將是非常危險的
下面讓我們來看看MySQL中的最要的個授權表
user
用戶表保存了用戶的權限和被加密的密碼這個表負責確定哪些用戶和客戶機可以連接到服務器上
host
這個表為每一個客戶機分配權限它並不考慮用戶的權限MySQL在確定是否接收還是拒絕一個連接時首先考慮的是user表而使用GRANT或REVOKE命令並不影響host表我們可以通過手工方式修改這個表中的內容
db
db表保存了數據庫層的權限信息
tables_priv
這個表存儲了表的權限信息
columns_priv
這個表保存了單獨列的權限信息通過這個表可以將操作某一列的權限授予一個用戶
哈希加密
如果數據庫保存了敏感的數據如銀行卡密碼客戶信息等你可能想將這些數據以加密的形式保存在數據庫中這樣即使有人進入了你的數據庫並看到了這些數據也很難獲得其中的真實信息
在應用程序的大量信息中也許你只想交很小的一部分進行加密如用戶的密碼等這些密碼不應該以明文的形式保存它們應該以加密的形式保存在數據庫中一般情況下大多數系統這其中包括MySQL本身都是使用哈希算法對敏感數據進行加密的
哈希加密是單向加密也就是說被加密的字符串是無法得到原字符串的這種方法使用很有限一般只使用在密碼驗證或其它需要驗證的地方在比較時並不是將加密字符串進行解密而是將輸入的字符串也使用同樣的方法進行加密再和數據庫中的加密字符串進行比較這樣即使知道了算法並得到了加密字符串也無法還原最初的字符串銀行卡密碼就是采用的這種方式進行加密
MySQL提供了個函數用於哈希加密PASSWORD ENCRYPT SHA和MD下面讓我們試一試這個函數看看會得到什麼結果我們以加密字符串paword為例進行說明
讓我們先來看看MD函數
SELECT MD(paword);
++
| MD(paword) |
++
| aadfdebafd |
++
row in set ( sec)
下面是PASSWORD函數
SELECT PASSWORD(paword);
++
| PASSWORD(paword) |
++
| dcbcab |
++
row in set ( sec)
下面是ENCRYPT函數
SELECT ENCRYPT(paword);
++
| ENCRYPT(paword) |
++
| upEcbHdjA |
++
row in set ( sec)
上面的每個函數都返回了一個加密後的字符串為了區分加密字符串的大小寫最好在使用ENCRYPT生成加密字符串時將這個字段定義成CHAR BINARY類型
上面列舉了種加密的方法但我認為使用MD加密是最好的這是因為這樣做可以將明文密碼顯示在處理列表中或是查詢日志中這樣便於跟蹤如下面的INSERT語句使用插入了一條記錄其中的密碼使用了MD進行加密
INSERT INTO table (user pw) VALUE (user MD(password) )
可以通過如下的語句進行密碼驗證
SELECT * FROM table WHERE user = user AND pw = MD(password)
哈希加密方法可以很好地對密碼進行加密使用了這種方法加密密碼將無法 恢復成明文
From:http://tw.wingwit.com/Article/program/MySQL/201311/29405.html