背景:
nextcloud的mysql資料庫被黑,刪庫勒索。參考:記一次mysql資料庫被勒索(上)
mysql資料庫恢復成功,nextcloud還是無法連線。參考:記一次mysql資料庫被勒索(中)
正文:
經過一番研究,發現nextcloud在第一次資料庫配置成功後,會建立一個oc_root的帳號,之後就會使用oc_root帳號來連線資料庫。
而oc_root的密碼,並不是在配置的時候設定的管理員root的密碼,貌似是nextcloud自己生成的。
加密演算法應該跟這裡面的passwordsalt 有關係,重新配置資料庫,這個鹽值就會變化。
而之前手賤,想通過配置新資料庫,來恢復nextcloud,又沒有把config.php檔案備份下來。
結果,現在的nextcloud所用的密碼,無法連線原來的mysql資料庫了。。T_T
以上結論是經過反覆試驗得出的,不一定嚴謹~~
於是,就想到一個方法:
1, 使用nextcloud連線新的資料庫,重新生成oc_root帳號和config.php檔案;
2,從新的資料庫裡面,獲取oc_root建立的SQL,匯入到舊資料庫裡面;
3,手動修改config.php檔案,將dbhost指向舊資料庫;
※ 這個方法能行的通,前提就是加鹽演算法,只用於oc_root連線資料庫,其他資料表裡面沒有使用這個鹽,賭一把了~~
試驗過程:
1,啟動新mysql的docker容器;
2,刪除nextcloud的config.php檔案,並在configh目錄下touch CAN_INSTALL 檔案;
3,瀏覽器重新整理nextcloud,輸入新的mysql容器IP,其他配置保持與舊資料庫一致;
※ 需要提前將nextcloud管理員帳號對應的目錄重新命名,否則會提示使用者名稱已經存在。
4,等nextcloud的資料庫配置完成,檢視建立oc_root使用者的SQL文:
還是通過binlog來:
# mysqlbinlog /var/lib/mysql/binlog.000002 > /var/lib/mysql/2.sql
找到建立帳號、設定許可權的SQL語句
5, 在舊的資料庫中執行以下操作
刪除原來的oc_root帳號:delete from user where user='oc_root';
建立新的oc_root帳號:
在建立oc_root@%時,會報 ERROR 1396 (HY000): Operation CREATE USER failed for 'oc_root'@'%' 的錯誤。
需要,先進行drop user 操作:
mysql> drop user 'oc_root'@'%';
Query OK, 0 rows affected (0.14 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)
再進行許可權設定(也是從binlog裡面拷貝出來的):
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `nextcloud`.* TO 'oc_root'@'%';
改完許可權,記得要flush privileges,才可以生效。
6,修改nextcloud 的config.php檔案,將dbhost改為舊資料的IP
瀏覽器中重新整理一下nextcloud頁面,終於出現久違的登陸框。
用之前的帳號登陸,也可以顯示之前的檔案內容了,大功告成!
========================================================================
這次勒索事件,給我上了很重要一課:
1,公網是很危險的地方,隨時有各種人用各種工具在掃描你的機器;
2,密碼設定複雜一些,防火牆不能關閉,埠能不開放就不開放;
3,資料庫、重要檔案,及時做備份;