近日服務(wù)器收到攻擊,數(shù)據(jù)庫被清空并插入了一個表,內(nèi)容如下:
| warning | bitcoin_address | |
|---|---|---|
| To recover your lost Database and avoid leaking it: Send us 0.1 Bitcoin (BTC) to our Bitcoin address 1J6jLduCXbPyxt5EMTs7iHwdafANy4ThJc and contact us by Email with your Server IP or Domain name and a Proof of Payment. If you are unsure if we have your data, contact us and we will send you a proof. Your Database is downloaded and backed up on our servers. Backups that we have right now: xxx,xxx,xxx . If we dont receive your payment in the next 10 Days, we will make your database public or use them otherwise. | 1J6jLduCXbPyxt5EMTs7iHwdafANy4ThJc | admin@yourdatabase.biz |
緊急處理
造成的原因因為mysql賬號密碼被暴力破解和允許遠(yuǎn)程訪問,需要做一些緊急處理
-
禁用遠(yuǎn)程
為了方便,開放允許遠(yuǎn)程連接,而且沒加ip限制,導(dǎo)致黑客有機可乘。所以我們現(xiàn)在要把一切遠(yuǎn)程連接關(guān)閉。
本機登陸
// 服務(wù)器中國登陸數(shù)據(jù)庫
$ mysql -u 你的賬號 -p
$ 你的密碼
查看用戶
有一個特殊的數(shù)據(jù)庫,數(shù)據(jù)庫名為mysql,表名為user,它存儲了服務(wù)器數(shù)據(jù)庫有用戶信息和訪問權(quán)限。
// 選用mysql系統(tǒng)表
$ use mysql;
// 查詢?nèi)康挠脩艉蚳ost
$ select user,host form user;
host為允許訪問的主機地址,'%代表全部允許,如果發(fā)現(xiàn)host的信息為%,那這就是問題所在了,把它全刪了。
$ delete from user where host = '%';
這時候任何遠(yuǎn)程訪問都會被禁止,無法在本機外訪問了。
刷新一下緩存,讓配置生效
$ flush privileges;
-
刪除黑客賬號
作為一個專業(yè)的黑客,自然會給自己留后路,比如偷偷加一個數(shù)據(jù)庫賬號,所以我們要還要查一下用戶表。
$ select user from user;
如果發(fā)現(xiàn)不認(rèn)識的賬號,一定要刪了,如只保留根角色
// 刪除一切非根用戶
$ delete from user where user != 'root';
除了這一步之外,我們還需要去db表相應(yīng)刪除
// 刪除一切非根用戶
$ delete from db where user != 'root';
同樣記得刷新緩存,讓配置生效
$ flush privileges;
-
修改密碼
盡管前面已經(jīng)禁用了遠(yuǎn)程,可是密碼已經(jīng)泄露了,終究不安全,所以我們還要再去改密碼。
還是在系統(tǒng)user表中,有一個password字段,它存儲著用戶的密碼,不過是加密后的,更新的時候需要用系統(tǒng)方法password()。這里已更新root賬號的為例
// 更新密碼
$ update user set password = password('你的新密碼');
新密碼一定要復(fù)雜,可以考慮閉著眼睛敲(記得復(fù)制出來,要不忘了)。
更新完后還是記得更新緩存(當(dāng)然可以最后再刷新緩存)。
-
修改端口
mysql默認(rèn)端口是3306,黑客隨便試一下就可以發(fā)現(xiàn)了,我們應(yīng)該修改一下數(shù)據(jù)庫的端口。(盡管還可以進行端口掃描,可是猜不到也沒作用)
首先我們在mysql環(huán)境下查詢一下當(dāng)前所用的端口是什么
$ show global variables like 'port';
| Variable_name | port |
|---|---|
| port | 3306 |
退出mysql命令行模式。
如果我們計劃把端口改成3305,先檢查一下端口是否被占用
netstat -tunlp |grep 3305
如果沒有任何輸出那就證明沒有被占用。
緊接著我們打開mysql的配置文件,在/etc/my.cnf。
修改3306端口為一個新的端口
vim /etc/my.cnf
[mysqld]
port=3305
如果[mysqld]下沒有port參數(shù),加一個即可。
保存退出vim。
然后我們重啟mysql服務(wù)
$ systemctl restart mysqld
是mysqld,不是mysql。
然后發(fā)現(xiàn)3306已經(jīng)連不上了,需要用新端口才可以。
-
重置數(shù)據(jù)
信息泄露了終究不安全,不過我所泄露的信息都是一些測試數(shù)據(jù),關(guān)系不大,我重置一下就可以了。
自定義
上述操作會導(dǎo)致遠(yuǎn)程無法連接,如果又想安全又想方便,可以通過限制ip的方式,首先我們創(chuàng)建一個用戶,給該用戶分配有限的權(quán)限,然后設(shè)置一個復(fù)雜的密碼,最后加上ip限制就可以了,下面是詳細(xì)做法。
-
新建用戶
使用root登錄數(shù)據(jù)庫后,進入到系統(tǒng)mysql表。假設(shè)我們創(chuàng)建zhangsan用戶,密碼是123456
$ create user zhangsan identified by '123456';
如果創(chuàng)建成功,會默認(rèn)創(chuàng)建一個%ip限制的用戶,如果創(chuàng)建失敗,先刪除用戶再創(chuàng)建即可。
-
分配權(quán)限
創(chuàng)建完zhangsan用戶后,我們還需要為其分配數(shù)據(jù)庫,處于安全考慮,一般只分配部分?jǐn)?shù)據(jù)庫,比如把ABC數(shù)據(jù)庫的全部權(quán)限都分配給zhangsan,執(zhí)行如下:
$ grant all privileges on ABC.* to zhangsan@'%' identified by '123456';
ABC.*代表ABC數(shù)據(jù)庫下的全部權(quán)限
%為默認(rèn)不限制host。
此時zhangsan用戶只能查看到ABC數(shù)據(jù)庫下的
的內(nèi)容。
-
限制ip
上兩步都提到,host還是默認(rèn)的%,不加限制,我們當(dāng)然需要添加ip限制,更新一下user即可。
$ update user set host = '你的ip' where user = 'zhangsan';
此時只允許指定ip通過。
-
刷新緩存
既然修改了數(shù)據(jù)庫配置,那就需要刷新使得配置生效。
$ flush privileges;
建議
針對此事項,建議做以下調(diào)整,以防范黑客攻擊:
1、服務(wù)器的管理員密碼具備一定復(fù)雜度,建議使用字母、數(shù)字、字符組合的密碼。
2、服務(wù)器關(guān)閉遠(yuǎn)程訪問(或關(guān)閉外網(wǎng)的遠(yuǎn)程訪問),調(diào)整遠(yuǎn)程訪問默認(rèn)的端口號。
3、mysql的root用戶密碼具備一定復(fù)雜度,建議使用字母、數(shù)字、字符組合的密碼。
4、mysql不允許任意遠(yuǎn)程端連接,建議僅對協(xié)同系統(tǒng)所在的IP地址放開連接。
5、mysql不使用默認(rèn)的3306端口,建議修改為其他端口。(mysql的配置文件:Windows為my.ini、Linux為my.cnf,修改其端口號)
6、mysql設(shè)置定時備份,并將數(shù)據(jù)備份包備份在異機(或異地)。