安全性並非功能,而是設計中不可或缺的一部分,與國際化或無障礙設計並無不同。良好的安全性設計會讓入侵系統的每個步驟變得困難,而在資料庫世界中,這通常稱為「強化」資料庫。
其中的某些步驟包括即時更新軟體、限制可存取系統的位置、強化密碼,以及定期稽核存取權,以及其他許多措施。雖然這些秘訣廣泛適用,但我們將探討如何使用這些技術,讓 MySQL 適用的 Cloud SQL 資料庫執行個體盡可能難以入侵。
不可否認,有些攻擊者只要幾分鐘,就能輕易掃描整個網際網路,並在幾秒內破解密碼。雖然有時候需要讓資料庫能夠透過公開 IP 網路存取,但這會導致資料庫容易出現安全漏洞的風險。如要降低公開 IP 的風險,其中一種方法就是限制資料庫存取一組有限的 IP 位址。
也就是說,更好的解決方案是只允許在虛擬私有雲 (VPC) 內部進行存取,並且僅允許堡壘主機內的運算子連線。在 Google Cloud 中,這項解決方案稱為私人 IP。如果您的 MySQL 執行個體只能在虛擬私有雲內存取,那麼攻擊者必須先入侵虛擬私有雲,才能嘗試入侵您的執行個體。
每個 MySQL 子版本都有版本資訊,幾乎總是包含有關安全性更新的部分。如果執行個體未進行多個版本的更新,則資料庫就會缺乏這些安全性修正的版本。
除了隨著時間修正安全性問題外,MySQL 也會定期推出多項新的安全防護功能。舉例來說,MySQL 8.0 推出了數個可強化 MySQL 結構定義和使用者的方法,例如角色、失敗登入追蹤和隨機密碼產生等。
假設您在咖啡廳工作,而且想要執行一些查詢,所以您是透過商店的免費 Wi-Fi 網路連線至 MySQL。如果您並未使用 TLS (傳輸層安全標準),無異於透過 TCP (網際網路主要通訊協定之一的傳輸控制通訊協定) 公開洩漏使用者名稱和密碼。在 MySQL 執行個體上強制執行傳輸層安全標準 (TLS),您就可以放心一邊享用咖啡,一邊工作,不必擔心其他人在網路中窺探。
SQL 插入
最容易遭受攻擊通常不是資料庫,而是應用程式。許多應用程式都受到 SQL 注入的攻擊,而攻擊者會插入惡意輸入內容,讓您的應用程式誤認為是有效的 SQL 陳述式。如要防止這些攻擊,最好的方法就是在建立 SQL 陳述式時使用預先準備好的陳述式,而不要將使用者輸入內容與 SQL 陳述式串連。
存放區中的密鑰
有無數資料庫因爲開發人員無意間將使用者名稱和密碼推送至原始碼存放區,而遭到入侵。請改用 Google Cloud 的 Secret Manager 這類工具,管理所有類型的密鑰,包括資料庫密碼。
記錄密碼
最後,請使用記錄架構的篩選工具,從應用程式記錄中篩選資料庫的密碼。例如 Log4j 篩選器或 Rails ParameterFilter,但多數記錄架構應該有對等的設定。否則,您必須確保應用程式記錄安全無虞,以確保資料庫安全。
建議您使用密碼驗證來確保資料庫中的所有密碼都夠複雜。為應用程式設定長一點、複雜且經常輪替的密碼。Secret Manager 尤其實用,可讓您不必記住複雜且經常變動的密碼。
如果有人 (而非應用程式) 使用資料庫使用者,請遵循 NIST 的標準,並以長度為優先。密碼到期日和過於複雜的密碼要求經常會導致使用者將記憶體委派給純文字檔案和便利貼,進而破壞這些規則的完整用途。
更理想的做法是為非應用程式使用者採用 IAM 驗證。IAM 驗證會將連線建立作業委派給 Google Cloud 的 IAM 服務;也就是說,將風險降低到只有 IAM 使用者 (而非 IAM 使用者和資料庫使用者)。
最後,MySQL 會預設為您的資料庫密碼進行雜湊,而非修飾。也就是說,相同密碼的使用者會使用相同的驗證字串,系統會利用彩虹表攻擊,將低強度密碼破解瑣碎化。請注意下列兩個 MySQL 使用者如何使用相同的 authentication_string。
建議將標記 default_authentication_plugin 設為 caching_sha2_password。這樣做可確保使用相同密碼的兩位使用者有不同的雜湊。請注意,在下列範例中,兩位使用者有不同的 authentication_string 值。
限制存取權不代表將存取權與外部隔離;這也意味著定期稽核內部員工的存取權。
稽核應用程式:如果應用程式只從帳單、產品和客戶資料表讀取資料,是否需要存取其他內容?如果維持資料庫的根層級存取權,攻擊者就可能會對資料庫造成嚴重損害。請改為考慮執行個體的所有要求,逐一列出執行個體所需的權限,然後為每個執行個體建立資料庫使用者。如果攻擊者利用了您其中一位資料庫使用者入侵您的資料庫,您可以限制損害範圍。
稽核使用者:有多少資料庫使用者真正需要執行個體的管理員權限?這些使用者中有多少人仍在貴機構內,或者已連結至閒置專案,或使用者本身為閒置狀態?存取權杖可能會外洩,而且對大多數系統來說,內部威脅是長期存在的問題。盡可能減少使用者數量,可協助執行個體防範這類問題。
稽核「admin」:請考慮移除或重新命名使用者,例如「root」或「admin」。這些目標很容易受到攻擊,但如果目標不存在,您的系統就變得越來越難入侵。這稱為隱匿式安全防護,雖然不該是第一道防線,但它可以在您的 MySQL 資料庫中增加一道安全機制。
完成上述所有操作後,即準備就緒並受到妥善的保護。換句話說,如果未持續提高警覺執行資料庫稽核,您將無法完成任何安全性設計。MySQL 適用的 Cloud SQL 稽核外掛程式可協助您在發生入侵事件時追蹤異常行為。
完成上述事項後,攻擊者就更難以入侵資料庫。攻擊者必須入侵您的應用程式,並希望應用程式的資料庫使用者具備足夠的權限用於攻擊,或者他們必須入侵您的虛擬私有雲、找出現有的使用者名稱、破解密碼,並希望使用者有足夠的權限可以用來發動攻擊。在此期間,您可以查看 MySQL 資料庫記錄或稽核記錄,監控資料庫中的任何常見行為並據以做出回應。
這就是融入安全考量的設計。攻擊者將持續嘗試破解機器的方法。因此,請務必採用多層防護機制來設計系統,以確保資料庫安全無虞。