故事背景
前陣子,有位朋友在微信上問我資料被刪了能不能恢復,我問了下原因,居然是因為一個配置項惹的禍。
故事細節
在 Spring Boot 中使用 jpa 來運算元據庫,jpa 就不做詳細的介紹了,相信大家都有所瞭解或者也用過。
在 jpa 中有一個配置項,可以讓程式在啟動的時候自動初始化表結構或者更新表結構的功能。聽上去很不錯,非常實用。
其實這是一個非常危險的功能,個人覺得不應該提供這種功能,只要留了口子就有可能會出問題。
這個配置就是:spring.jpa.hibernate.ddl-auto
- create(危險係數 2 顆星)
應用啟動的時候,如果資料庫中沒有對應的表,就會自動根據實體類的結構建立一個表結構。如果表已經存在了就會將表中的資料清空。
- create-drop(危險係數 3 顆星)
應用啟動的時候,如果資料庫中沒有對應的表,就會自動根據實體類的結構建立一個表結構。如果表已經存在了就會將表中的資料清空。
程式停止的時候會將資料庫中所有表刪除掉。
- update(危險係數 1 顆星)
應用啟動的時候,如果資料庫中沒有對應的表,就會自動根據實體類的結構建立一個表結構。如果表已經存在了就會判斷有沒有新增欄位或者修改長度之類的,如果有則會更新表結構,不會影響資料。
- validate(危險係數 0 顆星)
validate 不會更新和刪除表或者資料,只會做驗證邏輯。
- none (危險係數 0 顆星)
禁用 ddl 操作。
如何防範
這種問題歸根到底還是技術負責人沒重視線上安全問題,主要有下面幾點:
- 資料沒備份
線上資料一定要有備份,而且備份得放在不同的機器上,降低風險值。
- 資料庫賬號許可權細分,不給刪除許可權,業務做邏輯刪除
如果公司有 DBA 那麼可能會好點,對資料庫相關的安全會管控的比較嚴。如果沒有 DBA,基本上都是開發自己管理,技術負責人應該去做這件事情。
一般的開發人員可以給只讀賬號就行了,偶爾線上查查資料之類的。
另外需要有一個讀寫的賬號,用於程式中。
像刪除,DDL 操作這種許可權就留給管理員賬號就行了,不然很容易出事。
- 應用中的框架有 DDL 操作的功能,一律禁止使用
這次的問題,除了開發人員的大意,最主要就是框架中自帶了 DDL 的功能。像這種功能就應該禁止使用。
所有的表結構應該在上線之前確認好,最好手動執行,像 DDL 這種操作本身就會鎖表,應該在業務低峰期去做。交給程式自動做不靠譜。
我記得我們之前在程式碼中也有去自動建立表的邏輯,在 code review 的時候被指了出來,然後就去掉了。雖然說是為了使用更方便,但是增加了線上資料庫的風險。像一些開源框架中也有類似的邏輯,當表不存在時會自動給你建立好表。
關於作者:尹吉歡,簡單的技術愛好者,《Spring Cloud 微服務-全棧技術與案例解析》, 《Spring Cloud 微服務 入門 實戰與進階》作者, 公眾號 猿天地 發起人。