背景:
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,數據庫、重要文件,及時做備份;
