數(shù)據(jù)庫安全策略是涉及信息安全的高級指導(dǎo)方針,這些策略根據(jù)用戶需要、安裝環(huán)境、建立規(guī)則和法律等方面的限制來制定。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了陽西免費建站歡迎大家使用!
數(shù)據(jù)庫系統(tǒng)的基本安全性策略主要是一些基本性安全的問題,如訪問控制、偽裝數(shù)據(jù)的排除、用戶的認(rèn)證、可靠性,這些問題是整個安全性問題的基本問題。數(shù)據(jù)庫的安全策略主要包含以下幾個方面:
1.保證數(shù)據(jù)庫存在安全
數(shù)據(jù)庫是建立在主機硬件、操作系統(tǒng)和網(wǎng)絡(luò)上的系統(tǒng),因此要保證數(shù)據(jù)庫安全,首先應(yīng)該確保數(shù)據(jù)庫存在安全。預(yù)防因主機掉電或其他原因引起死機、操作系統(tǒng)內(nèi)存泄漏和網(wǎng)絡(luò)遭受攻擊等不安全因素是保證數(shù)據(jù)庫安全不受威脅的基礎(chǔ)。
一 作為最流行的開源數(shù)據(jù)庫引擎,MySQL本身是非常安全的。即便如此,你仍然需要添加額外的安全層來保護你的MySQL數(shù)據(jù)庫不受攻擊,畢竟任何經(jīng)營網(wǎng)上
在線業(yè)務(wù)的人都不想冒數(shù)據(jù)庫受到損壞的風(fēng)險。接下來,我們將介紹一些實用的辦法,你可以利用這些辦法來保護MySQL數(shù)據(jù)庫,以便加強網(wǎng)站的安全性。
二 保護操作系統(tǒng)
確保操作系統(tǒng)的安全是保護數(shù)據(jù)庫安全的前提,因為如果整個運行環(huán)境不安全,那么網(wǎng)站上所有的東西都脆弱,很容易暴露于攻擊者。為了維護操作系統(tǒng)和MySQL服務(wù)器,你可以使用以下方法:
2.1 主機數(shù)據(jù)庫服務(wù)器和web服務(wù)器分別在不同的物理機器上,如果可能,在一個單獨的服務(wù)器上運行數(shù)據(jù)庫服務(wù)器,以預(yù)防由其他應(yīng)用程序或服務(wù)的漏洞造成的服務(wù)器問題。
安裝殺毒軟件,防火墻以及所有推薦的補丁和更新,防火墻能有效地把流量過濾到MySQL服務(wù)器。為了更好的提高安全性,你還可以實行入口封鎖。
禁用所有不必要的服務(wù),而且這樣的服務(wù)越少越好。
2.2 保護所有帳戶和密碼
攻擊者侵入MySQL數(shù)據(jù)庫最常見的一種方法是竊取有安全隱患的賬戶信息。為了降低出現(xiàn)這種風(fēng)險的可能性,你不妨試一試下面的方法:
2.2.1. 給所有MySQL賬戶設(shè)置密碼
客戶程序并不是每次都能識別用戶,因此,如果用戶知道數(shù)據(jù)庫名但是沒有這個用戶名的密碼,那他可以指定任何其他用戶名連接到MySQL數(shù)據(jù)庫。讓每個MySQL用戶名都設(shè)置密碼,這樣一來,要想利用匿名賬戶建立連接將會變得很困難。
2.2.2. 不要使用根用戶運行MySQL服務(wù)器
在安裝MySQL的時候,默認(rèn)情況下創(chuàng)建了一個命名為“root”的管理用戶。每個人都知道這一點,所以攻擊者通常試圖侵入這個“root”用戶來獲取訪問權(quán)限。為了保障這個重要帳戶的安全,你需要給它重新命名,然后更改一個長并且復(fù)雜的密碼。
2.2.3你可以在MySQL控制臺使用mysql RENAME USER root TO new_username;
指令給根用戶重命名,使用mysql SET PASSWORD FOR 'username'@'%hostname' =
PASSWORD('newpassword');//這是很重要的一條命令
指令來修改密碼。
三. 減少管理員賬戶
管理員賬戶越多,風(fēng)險越大,所以你應(yīng)該保持盡可能最少的帳戶數(shù)量,只有為那些真正需要它的人創(chuàng)建賬戶。此外,記得要刪除未使用的和匿名的賬戶。如果你有很多管理員賬戶,那你需要定期檢查并清理那些不必要的賬戶。
四. 加強所有的密碼
除了管理員帳戶,你還需要加強所有其他用戶的密碼。你可以檢查所有的用戶名和密碼,必要的時候你還可以重置安全強度低的賬戶密碼。雖說這樣做會有點費時,但卻是有必要的。
五 限制數(shù)據(jù)庫權(quán)限
每個用戶都應(yīng)該被授予適當(dāng)?shù)臋?quán)限以便數(shù)據(jù)庫能夠正常運行,但這樣一來也加大了數(shù)據(jù)庫的安全隱患。就數(shù)據(jù)庫權(quán)限而言,我們有以下幾點建議:
5.1. 不要授予非管理員用戶文件/高級/程序權(quán)限
文件,高級和程序權(quán)限都不應(yīng)該被濫用。文件權(quán)限讓用戶可以在文件系統(tǒng)中的任何一個地方編寫文件,而程序權(quán)限讓用戶在任何時候都能夠查看服務(wù)器活動,終止客戶端連接甚至更改服務(wù)器操作。為了你的數(shù)據(jù)庫安全,這些權(quán)限只能授予給管理員賬戶。
5.2. 限制或禁用顯示數(shù)據(jù)庫權(quán)限
顯示數(shù)據(jù)庫特權(quán)可以用于收集數(shù)據(jù)庫信息,所以攻擊者通常利用它來竊取數(shù)據(jù)并準(zhǔn)備進(jìn)一步攻擊。你應(yīng)該把這個權(quán)限授予那些真正需要的人,或者直接禁用這個權(quán)
限,你只需要把skip-show-database添加到MySQL數(shù)據(jù)庫中的/etc/my.cnf配置文件中。對于Windows操作系統(tǒng)來說,則
需要添加到my.ini文件中。
5.3. 限制管理員和所有其他用戶的權(quán)限
即使是管理員,也不要在同一賬戶中授予所有權(quán)限。因此我們建議你最好降低管理員賬戶訪問數(shù)據(jù)的權(quán)限。至于其他的用戶,你最好檢查所有他們擁有的權(quán)限,以確保一切都是合適的。
六 刪除風(fēng)險組件
MySQL數(shù)據(jù)庫的默認(rèn)配置有一些不必要的組件,你可以考慮以下建議:
6.1. 禁用LOAD DATA LOCAL INFILE指令
這個命令允許用戶讀取本地文件甚至訪問其他操作系統(tǒng)上的文件,這可能幫助攻擊者收集重要的信息并利用應(yīng)用程序的漏洞侵入你的數(shù)據(jù)庫。你需要做的是把set-variable=local-infile=0插入到MySQL數(shù)據(jù)庫的my.cnf文件中,來禁用這個指令。
6.2. 刪除測試數(shù)據(jù)庫
有一個默認(rèn)的“測試”數(shù)據(jù)庫用于測試目的。由于這個數(shù)據(jù)庫有安全風(fēng)險,匿名用戶也可以訪問,你應(yīng)該使用mysql DROP database test;指令盡快把它清除掉。
6.3. 刪除歷史文件
MySQL服務(wù)器有一個歷史文件,它可以幫助你在安裝出錯的時候找到問題所在。歷史文件包含敏感信息,比如說密碼,如果這些信息被攻擊者獲得,那么將會給
你的數(shù)據(jù)庫帶來巨大的安全隱患。在安裝成功后,歷史文件并沒有什么用,因此你可以使用cat /dev/null
~/.mysql_history指令來刪除文件當(dāng)中的內(nèi)容。
七 限制遠(yuǎn)程訪問MySQL服務(wù)器
對于大多數(shù)用戶來說,不需要通過不安全的開放網(wǎng)絡(luò)來訪問MySQL服務(wù)器。你可以通過配置防火墻或硬件,或者迫使MySQL只聽從localhost來限制主機。此外,需要SSH隧道才能進(jìn)行遠(yuǎn)程訪問。
八 如果你想僅僅從本地主機來限制用戶建立連接,你需要在在配置文件中添加bind-address=127.0.0.1。
8.1利用日志記錄
啟用日志記錄讓你可以檢測服務(wù)器上的活動,這樣你就可以分析失敗的登錄嘗試和敏感文件的訪問記錄,以便了解是否存在向你的服務(wù)器和數(shù)據(jù)庫發(fā)起的惡意活動。
你只需要把log =/var/log/mylogfile指令添加到MySQL配置文件中,就可以手動啟用日志記錄功能。
8.2至于日志記錄,需要注意以下兩點:
8.2.1日志記錄僅適用于查詢數(shù)量有限的數(shù)據(jù)庫服務(wù)器。對于信息量大的服務(wù)器,這可能會導(dǎo)致高過載。
8.2.2由于“hostname.err”文件包含敏感數(shù)據(jù)表名和密碼,只有“root”和“mysql”才有訪問和記錄這個文件的權(quán)限。
你可以這樣操作。
如果MYSQL客戶端和服務(wù)器端的連接需要跨越并通過不可信任的網(wǎng)絡(luò),那么需要使用ssh隧道來加密該連接的通信。
使用set?password語句來修改用戶的密碼,先“mysql?-u?root”登陸數(shù)據(jù)庫系統(tǒng),然后“mysql?update?mysql.user?set?password=password(‘newpwd’)”,最后執(zhí)行“flush?privileges”就可以了。
Mysql需要提防的攻擊有,防偷聽、篡改、回放、拒絕服務(wù)等,不涉及可用性和容錯方面。對所有的連接、查詢、其他操作使用基于acl即訪問控制列表的安全措施來完成。也有一些對ssl連接的支持。
設(shè)置除了root用戶外的其他任何用戶不允許訪問mysql主數(shù)據(jù)庫中的user表;加密后存放在user表中的加密后的用戶密碼一旦泄露,其他人可以隨意用該用戶名/密碼相應(yīng)的數(shù)據(jù)庫;
使用grant和revoke語句來進(jìn)行用戶訪問控制的工作;
不要使用明文密碼,而是使用md5()和sha1()等單向的哈系函數(shù)來設(shè)置密碼;
不要選用字典中的字來做密碼;
采用防火墻可以去掉50%的外部危險,讓數(shù)據(jù)庫系統(tǒng)躲在防火墻后面工作,或放置在dmz區(qū)域中;
從因特網(wǎng)上用nmap來掃描3306端口,也可用telnet?server_host?3306的方法測試,不允許從非信任網(wǎng)絡(luò)中訪問數(shù)據(jù)庫服務(wù)器的3306號tcp端口,需要在防火墻或路由器上做設(shè)定;
為了防止被惡意傳入非法參數(shù),例如where?id=234,別人卻輸入where?id=234?or?1=1導(dǎo)致全部顯示,所以在web的表單中使用”或”"來用字符串,在動態(tài)url中加入%22代表雙引號、%23代表井號、%27代表單引號;傳遞未檢查過的值給mysql數(shù)據(jù)庫是非常危險的;
在傳遞數(shù)據(jù)給mysql時檢查一下大小;
應(yīng)用程序需要連接到數(shù)據(jù)庫應(yīng)該使用一般的用戶帳號,開放少數(shù)必要的權(quán)限給該用戶;
在各編程接口(c?c++?php?perl?java?jdbc等)中使用特定‘逃脫字符’函數(shù);在因特網(wǎng)上使用mysql數(shù)據(jù)庫時一定少用傳輸明文的數(shù)據(jù),而用ssl和ssh的加密方式數(shù)據(jù)來傳輸;
學(xué)會使用tcpdump和strings工具來查看傳輸數(shù)據(jù)的安全性,例如tcpdump?-l?-i?eth0?-w?-src?or?dst?port?3306?strings。以普通用戶來啟動mysql數(shù)據(jù)庫服務(wù);
不使用到表的聯(lián)結(jié)符號,選用的參數(shù)?–skip-symbolic-links;
確信在mysql目錄中只有啟動數(shù)據(jù)庫服務(wù)的用戶才可以對文件有讀和寫的權(quán)限;
不許將process或super權(quán)限付給非管理用戶,該mysqladmin?processlist可以列舉出當(dāng)前執(zhí)行的查詢文本;super權(quán)限可用于切斷客戶端連接、改變服務(wù)器運行參數(shù)狀態(tài)、控制拷貝復(fù)制數(shù)據(jù)庫的服務(wù)器;
file權(quán)限不付給管理員以外的用戶,防止出現(xiàn)load?data?‘/etc/passwd’到表中再用select?顯示出來的問題;
如果不相信dns服務(wù)公司的服務(wù),可以在主機名稱允許表中只設(shè)置ip數(shù)字地址;
使用max_user_connections變量來使mysqld服務(wù)進(jìn)程,對一個指定帳戶限定連接數(shù);
grant語句也支持資源控制選項;
啟動mysqld服務(wù)進(jìn)程的安全選項開關(guān),–local-infile=0或1?若是0則客戶端程序就無法使用local?load?data了,賦權(quán)的一個例子grant?insert(user)?on?mysql.user?to?‘user_name’@'host_name’;若使用–skip-grant-tables系統(tǒng)將對任何用戶的訪問不做任何訪問控制,但可以用?mysqladmin?flush-privileges或mysqladmin?reload來開啟訪問控制;默認(rèn)情況是show?databases語句對所有用戶開放,可以用–skip-show-databases來關(guān)閉掉。
碰到error?1045(28000)?access?denied?for?user?‘root’@'localhost’?(using?password:no)錯誤時,你需要重新設(shè)置密碼,具體方法是:先用–skip-grant-tables參數(shù)啟動mysqld,然后執(zhí)行?mysql?-u?root?mysql,mysqlupdate?user?set?password=password(‘newpassword’)?where?user=’root’;mysqlflush?privileges;,最后重新啟動mysql就可以了。