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