數(shù)據(jù)庫(kù)被刪之反思
一、數(shù)據(jù)庫(kù)為什么會(huì)被刪?
同事小L最近負(fù)責(zé)整理數(shù)據(jù)庫(kù)初始化腳本,在導(dǎo)出演示環(huán)境的數(shù)據(jù)庫(kù)腳本后,在另外的服務(wù)器上執(zhí)行該數(shù)據(jù)庫(kù)腳本,最后由于操作的時(shí)候打開(kāi)的窗口過(guò)多,沒(méi)有注意到環(huán)境,當(dāng)時(shí)他打開(kāi)了很多窗口,有演示環(huán)境,也有自己試驗(yàn)環(huán)境,也有開(kāi)發(fā)環(huán)境,一堆窗口,最后執(zhí)行的時(shí)候發(fā)現(xiàn)執(zhí)行錯(cuò)了,將演示環(huán)境給干掉了,演示環(huán)境有我們大量的數(shù)據(jù),主要用于給客戶(hù)演示用的,數(shù)據(jù)非常重要。
二、數(shù)據(jù)庫(kù)被刪后,第一時(shí)間采取的措施是什么?
數(shù)據(jù)庫(kù)被刪后,第一時(shí)間采取的措施是想辦法恢復(fù),但由于binlog未開(kāi)啟以及定時(shí)備份數(shù)據(jù)庫(kù)腳本也沒(méi)有,最后無(wú)法恢復(fù),只得經(jīng)理采取一些措施來(lái)解決這個(gè)問(wèn)題了。
三、我的反思以及從中發(fā)現(xiàn)存在哪些問(wèn)題?
雖然說(shuō)直接責(zé)任人并不是我,但我對(duì)此也有一定的責(zé)任。
這次刪庫(kù)事件我發(fā)現(xiàn)最大的問(wèn)題就是數(shù)據(jù)庫(kù)安全策略做的不夠全面。數(shù)據(jù)庫(kù)安全策略包含物理安全、訪(fǎng)問(wèn)控制、數(shù)據(jù)備份等。
1.物理安全
物理安全是安全防范的基本,主要是指保證數(shù)據(jù)庫(kù)服務(wù)器、數(shù)據(jù)庫(kù)所在環(huán)境、相關(guān)網(wǎng)絡(luò)的物理安全性。
2.訪(fǎng)問(wèn)控制
訪(fǎng)問(wèn)控制是基本安全性的核心。它包括了帳號(hào)管理、密碼策略、權(quán)限控制、用戶(hù)認(rèn)證等方面,主要是從與帳號(hào)相關(guān)的方面來(lái)維護(hù)數(shù)據(jù)庫(kù)的安全性。
3.數(shù)據(jù)備份
定期的進(jìn)行數(shù)據(jù)備份是減少數(shù)據(jù)損失的有效手段,能讓數(shù)據(jù)庫(kù)遭到破壞(惡意或者誤操作)后,恢復(fù)數(shù)據(jù)資源。這也是數(shù)據(jù)庫(kù)安全策略的一個(gè)重要部分。
這次問(wèn)題主要出在訪(fǎng)問(wèn)控制和數(shù)據(jù)備份上面。訪(fǎng)問(wèn)控制沒(méi)有做好,導(dǎo)致開(kāi)發(fā)人員人人都能對(duì)演示環(huán)境(演示環(huán)境等同于生產(chǎn)環(huán)境)、測(cè)試環(huán)境、開(kāi)發(fā)環(huán)境的數(shù)據(jù)庫(kù)進(jìn)行庫(kù)的CRUD以及庫(kù)中的表CRUD等。通常來(lái)說(shuō),數(shù)據(jù)庫(kù)以及數(shù)據(jù)庫(kù)中的表以及具體字段不能隨意進(jìn)行添加、刪除、修改等,特別是對(duì)于等同于生產(chǎn)環(huán)境的演示環(huán)境。
訪(fǎng)問(wèn)控制只是數(shù)據(jù)庫(kù)安全策略的一種手段,但這種手段還需與數(shù)據(jù)備份相結(jié)合,才能稱(chēng)的上是雙重保障。
四、針對(duì)發(fā)現(xiàn)的問(wèn)題我的解決辦法是什么?
針對(duì)訪(fǎng)問(wèn)控制層面,我的解決辦法是:
以演示環(huán)境(等同于生產(chǎn)環(huán)境)為例, 限制數(shù)據(jù)庫(kù)為內(nèi)網(wǎng)訪(fǎng)問(wèn)且對(duì)應(yīng)的用戶(hù)只能訪(fǎng)問(wèn)所授權(quán)的數(shù)據(jù)庫(kù) ,命令如下:
- GRANT ALL PRIVILEGES ON 數(shù)據(jù)庫(kù)名稱(chēng).* TO '數(shù)據(jù)庫(kù)特定用戶(hù)'@'192.168.52.317' IDENTIFIED BY '數(shù)據(jù)庫(kù)特定用戶(hù)密碼' WITH GRANT OPTION;
- FLUSH PRIVILEGES;
- EXIT;
如果其它微服務(wù)需要連接該數(shù)據(jù)庫(kù)但又處于不同的服務(wù)器環(huán)境下,也可通過(guò)上面ip進(jìn)行控制,只不過(guò)需要新建對(duì)應(yīng)的用戶(hù)。
因?yàn)橐恍┬枨罂赡苄枰W(wǎng)訪(fǎng)問(wèn)該數(shù)據(jù)庫(kù),也可以采取上面的措施進(jìn)行,目的是為了更精細(xì)化的控制權(quán)限。
也許有人覺(jué)得敲命令來(lái)控制似乎很麻煩,別擔(dān)心,有一個(gè)工具就已經(jīng)替我們解決了這個(gè)問(wèn)題(數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)控制),那就是phpmyadmin。
針對(duì)數(shù)據(jù)備份層面,我的解決辦法是兩個(gè):
第一個(gè), 定期備份 ,腳本自動(dòng)化備份(需結(jié)合定時(shí)任務(wù))
第二個(gè), 實(shí)時(shí)備份 ,從數(shù)據(jù)庫(kù)本身入手,開(kāi)啟binlog。
在my.conf配置如下即可:
- [mysqld]
- # 開(kāi)啟binlog
- log-bin=mysql-bin
- server-id=1
- binlog_format=ROW
修改完配置記得重啟mysql。
登錄mysql查看binlog是否開(kāi)啟,執(zhí)行如下命令即可:
- show variables like 'log_%';
效果圖如下(說(shuō)明binlog已開(kāi)啟):
就目前來(lái)說(shuō),我已經(jīng)落地了兩個(gè),一個(gè)是實(shí)時(shí)備份(開(kāi)啟binlog),另外一個(gè)是定時(shí)備份(結(jié)合腳本和定時(shí)任務(wù))。
五、總結(jié)
不經(jīng)意間想起了歐陽(yáng)修寫(xiě)的《五代史伶官傳序》其中有一句我印象很深刻,”夫禍患常積于忽微,而智勇多困于所溺”。在此之前已經(jīng)就有了一個(gè)前車(chē)之鑒,一位Java同事的阿里云服務(wù)器因數(shù)據(jù)庫(kù)密碼過(guò)于簡(jiǎn)單被黑客綁架(需要花比特幣才能贖回),當(dāng)時(shí)針對(duì)此我采取了一些措施,但措施并不全面,這次刪庫(kù)事件或許就是來(lái)自之前的警告。