前文中介紹了這幾年來流行的安全性攻擊方式──資料隱碼攻擊(SQL Injection)。這種手法,主要是利用系統在組成操作資料庫的SQL述句的時候,會利用使用者所提供的資料做為組成的元素,進而提供經過精心設計過的資料,使得系統所組出來的SQL述句,不但失去原先系統所預期的作用,而且反而被用來達到別有居心的用途。

由於一些針對大眾提供公共服務的系統或是網站,都可能具備這樣的安全性缺陷,這使得有心人士可以加以利用,並且進一步進行攻擊。所以,此種攻擊可以影響的範圍廣大,程式設計者不可不審慎應對。

其實,除了資料隱碼攻擊之外,我們其實可以用更廣泛的角度來探討資料庫安全的問題。在前一陣子,某一個知名的網站系統發生了異常,這種情況本是難免,但是,在該網站的錯誤頁面上,竟然是大方地顯示出原先用於程式除錯的錯誤訊息,而在這訊息中,更展示出該網站使用的資料庫帳號及密碼。這無疑是安全性上的一大漏洞。

身分遭到冒用所產生的威脅
資料庫安全性上最常發生的幾種安全性問題,首先是帳號的管理。

許多使用資料庫的應用程式,直接以預設的系統管理員帳號來存取資料庫,因為採用這種設定方式最簡單,通常毋需額外的設定,便可以使程式順利存取資料庫。但是,就和應用程式使用系統管理員或超級使用者的身份來執行一樣,一旦淪陷了,由於權限十分大,所能造成的破壞程度也就相對很高。

使用內建的系統管理員帳號,一來,由於各種資料庫的預設帳號是固定的,有心人士可以嘗試預設帳號,輕易通過一道關卡。但反之,若在設定上廢除預設的帳號,另外再建立不是那麼通俗的帳號名稱,那麼有心人士便不易猜出資料庫系統所用的帳號。當然,系統管理員所用的密碼更是必須具備足夠的強度,並且審慎地加以管理。

管制帳號的存取權限
此外,資料庫應用程式就跟任何應用程式一樣,都應該採用「最小權限原則」,也就是說,盡可能限縮應用程式所使用到的權限。有些應用程式直接使用資料庫系統管理員的權限,有了這樣的權限,可以建立新的資料庫、表格、修改資料庫schema、甚至在有些資料庫伺服器上還可以執行作業系統上的指令,其權限之大十分可怕。

你可以想像,一旦這樣的應用程式淪陷了,可以造成的傷害究竟會有多大。小則資料庫儲存結構被破壞,造成系統無法正常運作,大則被安裝惡意的攻擊程式並且執行起來,進行更深層的侵入行為。

若是能夠盡可能地限縮應用程式對資料庫的存取權限,那麼,有心人士僅能夠就該資料庫帳號被授權的有限範圍進行破壞或利用,不會影響到整個資料庫伺服器。在好的情況下,有心人士在入侵後僅能讀取資料,而在較差的情況下,也僅有局部的資料會被修改、破壞,不會擴散到全部。

如何保護帳號及密碼?
應用程式想要存取資料庫,都必須提供資料庫的帳號及密碼,才能進一步進行連線動作,那麼,這個帳號及密碼究竟要記錄在那裡呢?就和前文中提到的,資料庫應用程式也和其他的應用程式一樣,都必須妥當保護機密的資料,而資料庫的帳號及密碼當然是十分機密的資料。

有些程式設計者會將資料庫的連線帳號及密碼寫死在程式碼裡頭,這當然是很糟的情況。一旦有心人士取得了程式的原始碼,那麼資料庫的連線帳號及密碼也就一併曝了光。

再者,最理想的情況是,正式環境上的密碼僅有少數被授予權限的人員知曉,而不是讓每一個開發人員都能取得,因為這麼一來,意謂著每個開發人員都有能力存取正式環境資料庫中的資料。因此,資料庫的連線帳號及密碼必須獨立於程式碼之外(其實,任何應用程式中所用到的任何連線帳號及密碼,都必須獨立於程式碼之外)。

那麼,將資料庫的連線帳號及密碼放到設定檔裡如何呢?

這是一個可以考慮的選項,但是,必須留意設定檔被擺放的位置不能放至網站對外提供內容的檔案空間上。因為,倘若帳號設定檔被放到此種場所,便意謂著任何人都能夠透過瀏覽器檢視到此一設定檔,那麼連線帳號及密碼豈不輕易曝光?除了設定檔放置於檔案系統的位置之外必須留意之外,倘若能進行某種程度的加密處理,將會更為理想。因為這意謂著,即使檔案系統淪陷了,有心人士想要取得帳號和密碼,還得再多費一番功夫。

確實管制系統錯誤資訊的出現位置
接著,正如我在前段中所舉的例子,應用程式必須妥善地提供錯誤資訊。在除錯的程式版本中,或許必須提供較多的錯誤資訊,以供程式設計者進行除錯之用,但是,面對一般使用者的正式版本,就必須限縮錯誤資訊的內容。尤其是,不能在錯誤資訊中曝露資料庫的連線位址、帳號、密碼及資料庫的schema。因為這些資訊,對有心人士來說,都是發動攻擊時十分有用的資訊。

其實系統只需要告訴使用者目前發生了錯誤,使用者可以如何因應,就像有名的twitter網站在發生錯誤時,只會顯示一隻大鯨魚的圖像來告訴使用者目前系統的執行遭遇到了錯誤。對網站應用程式來說,其實只要在發生錯誤時,一律導向至固定的錯誤頁面即可。

善用防火牆來阻擋非必要的連線
除此之外,也應該透過像是防火牆之類的設定,來限制連線至資料庫伺服器的來源位址。

通常我們不會讓資料庫直接暴露在公開的網路上,因為這意謂著任何在公開網路上的人,都有能力連線到資料庫伺服器。如果,我們能運用防火牆之類的機制,將資料庫伺服器保護在一個受限的範圍內,那麼即使有心人士先行取得了資料庫的連線帳號及密碼,也會因為無法連線到伺服器,而無法發揮作用。這能增加額外一道關卡來阻止有心人士。我們或許可以把這個原則稱為「最小暴露原則」。不管任何的事務,能盡量不對外暴露就不要對暴露。

關閉系統預設的某些Stored Procedure
有些資料庫伺服器,提供了一些威力強大的預儲程序(stored procedure)。例如,在SQL Server最著名的xp_cmdshell。

透過這個預儲程序可以辦到什麼事呢?它可以用SQL Server的系統帳號來執行任何的應用程式,好比你能夠在命令列輸入的任何指令一樣。稍微想像一下,不難明白這究竟有多可怕。因為這意謂著倘若有心人士闖進了能夠在SQL Server執行預儲程序的階段,而他又能執行xp_cmdshell,這等於是可以讓有心人士在遠端自由自在的於資料庫伺服器之上,執行命令列指令。

他可以試著下載一些自己撰寫的程式到該主機之上,然後將它們執行起來。他當然也可替換掉該主機上的某些檔案,尤其是可以執行的檔案或是和系統運作高度相關的檔案。這光是想像就知道十分嚴重了。因此,對於此類的資料庫伺服器,想要確保安全性,最好是關閉這些根本就用不到,但是卻是功能強大無比的預儲程序。

做好了相關的資料庫安全措施之後,我們就可以稍微安心,接下來,可以看看如何因應資料隱碼攻擊。

作者簡介


Advertisement

更多 iThome相關內容