1. 程式人生 > >我猜你一定達不到滿分的《MySQL安全策略》

我猜你一定達不到滿分的《MySQL安全策略》

導讀

除了MySQL自身的賬號密碼安全管理,系統層面、應用層面的安全策略你注意到了嗎?

資料是企業核心資產,資料對企業而言是最重要的工作之一。稍有不慎,極有可能發生資料無意洩露,甚至被黑客惡意竊取的風險。每年業界都會傳出幾起大事件,某知名或不知名的公司被脫褲(拖庫的諧音,意思是整個資料庫被黑客盜取)之類的。

從資料安全上也可以分為外網安全及內部操作安全,下面分別討論一下。

內部操作安全策略

1. 是否回收DBA全部許可權

試想,如果DBA沒許可權了,日常DB運維的活,以及緊急故障處理,該怎麼實施呢?因此,建議在沒有成熟的自動化運維平臺前,不應該粗暴的回收DBA的太多許可權,否則可能會導致工作效率降低的,甚至DBA有一種不被信任的負面情緒。

2. MySQL層安全策略

  • 業務帳號最多隻可以通過內網遠端登入,而不能通過公網遠端連線。
  • 增加運維平臺賬號,該賬號允許從專用的管理平臺伺服器遠端連線。當然了,要對管理平臺部署所在伺服器做好安全措施以及必要的安全審計策略。
  • 建議啟用資料庫審計功能。這需要使用MySQL企業版,或者Percona/MariaDB分支版本,MySQL社群版本不支援該功能。
  • 啟用 safe-update 選項,避免沒有 WHERE 條件的全表資料被修改;
  • 在應用中儘量不直接DELETE刪除資料,而是設定一個標誌位就好了。需要真正刪除時,交由DBA先備份後再物理刪除,避免誤操作刪除全部資料。
  • 還可以採用觸發器來做一些輔助功能,比如防止黑客惡意篡改資料。

3. MySQL賬號許可權規則

  • 業務帳號,許可權最小化,堅決不允許DROP、TRUNCATE許可權。
  • 業務賬號預設只授予普通的DML所需許可權,也就是select、update、insert、delete、execute等幾個許可權,其餘不給。
  • MySQL初始化後,先行刪除無用賬號,刪除匿名test資料庫
mysql> delete from mysql.user where user!='root' or host!='localhost'; flush privileges;

mysql> drop database test;
  • 建立備份專用賬號,只有SELECT許可權,且只允許本機可登入。
  • 設定MySQL賬號的密碼安全策略,包括長度、複雜性。

4. 關於資料備份

記住,做好資料全量備份是系統崩潰無法修復時的最後一概救命稻草
備份資料還可以用來做資料審計或是用於資料倉庫的資料來源拉取之用
一般來說,備份策略是這樣的:每天一次全備,並且定期對binlog做增備,或者直接利用binlog server機制將binlog傳輸到其他遠端主機上。有了全備+binlog,就可以按需恢復到任何時間點。
特別提醒:當採用xtrabackup的流式備份時,考慮採用加密傳輸,避免備份資料被惡意擷取。

外網安全策略

事實上,作業系統安及應用安全要比資料庫自身的安全策略更重要。同理,應用程式及其所在的伺服器端的系統安全也很重要,很多資料安全事件,都是通過程式碼漏洞入侵到應用伺服器,再去探測資料庫,最後成功拖庫。

1. 作業系統安全建議

  • 執行MySQL的Linux必須只執行在內部網路,不允許直接對公網暴露,實在有需要從公網連線的話,再通過跳板機做埠轉發,並且如上面所述,要嚴格限制資料庫賬號許可權級別。
  • 系統賬號都改成基於ssh key認證,不允許遠端密碼登入,且ssh key的演算法、長度有要求以確保相對安全。這樣就沒有密碼丟失的風險,除非個人的私鑰被盜。
  • 進一步的話,甚至可以對全部伺服器啟用PAM認證,做到賬號的統一管理,也更方便、安全。
  • 關閉不必要的系統服務,只開必須的程序,例如 mysqld、sshd、networking、crond、syslogd 等服務,其它的都關閉。
  • 禁止root賬號遠端登入。
  • 禁止用root賬號啟動mysqld等普通業務服務程序。
  • sshd服務的埠號建議修改成10000以上。
  • 在不影響效能的前提下,儘可能啟用對MySQL服務埠的防火牆策略(高併發時,採用iptables可能影響效能,建議改用ip route策略)。
  • GRUB必須設定密碼,物理伺服器的Idrac/imm/ilo等賬號預設密碼也要修改。
  • 每個需要登入系統的員工,都使用每個人私有帳號,而不是使用公共賬號。
  • 應該啟用系統層的操作審計,記錄所有ssh日誌,或利bash記錄相應的操作命令併發送到遠端伺服器,然後進行相應的安全審計,及時發現不安全操作。
  • 正確設定MySQL及其他資料庫服務相關目錄許可權,不要全是755,一般750就夠了。
  • 可以考慮部署堡壘機,所有連線遠端伺服器都需要先通過堡壘機,堡壘機上就可以實現所有操作記錄以及審計功能了。
  • 指令碼加密對安全性提升其實沒太大幫助。對有經驗的黑客來說,只要有系統登入許可權,就可以通過提權等方式輕鬆獲得root。

2. 應用安全建議

  • 禁用web server的autoindex配置。
  • 從制度層面,杜絕員工將程式碼上傳到外部github上,因為很可能存在內部IP、賬號密碼洩露的風險,真的要上傳必須先經過安全稽核。
  • 儘量不要在公網上使用開源的cms、blog、論壇等系統,除非做過程式碼安全審計,或者事先做好安全策略。這類系統一般都是黑客重點研究物件,很容易被搞;
  • 在web server層,可以用一些安全模組,比如nginx的WAF模組;
  • 在app server層,可以做好程式碼安全審計、安全掃描,防止XSS攻擊、CSRF攻擊、SQL注入、檔案上傳攻擊、繞過cookie檢測等安全漏洞;
  • 應用程式中涉及賬號密碼的地方例如JDBC連線串配置,儘量把明文密碼採用加密方式儲存,再利用內部私有的解密工具進行反解密後再使用。或者可以讓應用程式先用中間賬號連線proxy層,再由proxy連線MySQL,避免應用層直連MySQL;

最後我們想說,任何高明的安全策略,都不如內部員工的安全意識來的重要。以前發生過一起案例,公司內有位員工的PC不慎中毒,結果導致內網資料被盜。

安全無小事,每個人都應銘記於心。在資料安全面前,可以適當犧牲一些便利性,當然也不能太過,否則可能得不償失。

原文來自微信公眾號:雲DB