第 八 章 資料庫安全 本投影片(下稱教用資源)僅授權給採用教用資源相關之旗標書籍為教科書之授課老師(下稱老師)專用,老師為教學使用之目的,得摘錄、編輯、重製教用資源(但使用量不得超過各該教用資源內容之80%)以製作為輔助教學之教學投影片,並於授課時搭配旗標書籍公開播放,但不得為網際網路公開傳輸之遠距教學、網路教學等之使用;除此之外,老師不得再授權予任何第三人使用,並不得將依此授權所製作之教學投影片之相關著作物移作他用。
第 八 章 資料庫安全 本章首先介紹資料庫基本原理,使讀者了解資料庫之基本觀念;進一步介紹關聯式資料庫,以深入淺出方式介紹其操作原理,並舉例說明。接著並介紹資料庫安全的概念,以及資料庫面臨的威脅與其防範。最後介紹SQL Injection 隱碼攻擊,該種攻擊是近年來資料庫安全面臨最大的威脅;並說明其原理以及防範之道。 資料庫簡介 關聯式資料庫 資料庫安全需求 資料庫之安全威脅 SQL Injection隱碼攻擊及其防範
8.1資料庫簡介 資料庫 ( Database )是能夠進行修改、查詢與收集之資料集合。資料庫管理系統 ( Database Management System;或簡稱 DBMS ) 是專為資料庫設計的管理系統,以方便使用者定義、建構與處理此資料集合。使用者可進行各項操作,包含:定義資料型態、結構與各種限制;建構資料在硬碟或其它媒體中之儲存;以及處理資料之修改、查詢與收集等。一般提及資料庫是指資料庫系統 ( Database System ),資料庫系統包含:存取介面、資料庫管理系統、資料索引與資料庫。 資料庫依資料儲存的邏輯,有很多種模型 ( Model ),應用於大型資料儲存的有:網路資料庫 (Network Database )、關聯性資料庫 ( Relational Database )、 和物件導向式資料庫 ( Object-Oriented Database );應用於輕量級資料儲存的有:階層式資料庫 ( Hierarchical Database )。資料庫的產品很多,例如: MySQL、DB2、Oracle、MS SQL Server 等。
資料庫系統的架構 (圖 8-1)是以資料庫管理系統為核心。而資料儲存分為兩部份─資料庫索引與資料庫;資料庫索引如同一本書的目錄一般,查詢資料時,先由索引查起,了解資料存放的位置,然後再前往資料庫,以存取資料的內容。使用者透過存取介面,與資料庫管理系統作溝通;存取介面可以使用資料庫語法對資料庫下達指令,資料庫語法有許多種,如: VB 資料庫語法、ASP資料庫語法等,最常用的語法為SQL ( Structured Query Language )。 使用資料庫系統有其優缺點,如表 8-1,資料庫系統的優點,包含:減少資料重複、可整合資料、完整性高、具資料的共通性、以及可保護資料的安全及隱私;資料庫系統的缺點,包含:成本會增加、使用上較複雜、經常備份,否則意外狀況將造成重大傷害、管理人員不容易培訓、多套系統,格式有所出入、後續整合管理不易。
表8-1 資料庫系統的優缺點 圖 8-1 資料庫系統架構 資料庫系統優點 資料庫系統缺點 減少資料重複。 使用上較複雜 。 可整合資料。 意外狀況將造成重大傷害。 完整性高。 資料庫管理人員不容易培訓。 具資料的共通性。 多套系統,格式有所出入。 可保護資料的安全及隱私。 整合管理不易。 表8-1 資料庫系統的優缺點 圖 8-1 資料庫系統架構
8.2關聯式資料庫 關聯式資料庫 ( Relational Database Model )是一種資料庫模型,將資料表示成一個關連模型,是以集合論 (Set Theory) 為基礎而建立的資料庫,在 1969 年由 IBM 公司研發成功。
8.2.1關聯式資料庫術語 關聯式資料庫是一組關聯表(Relations)的集合。關聯式資料庫的結構範例如圖8-2 所示,以下介紹使用的術語。 關聯表 ( Relation) 關聯表是關聯式資料庫模型的資料結構(Data Structures),用二維資料結構表示,主要包含: (1) 關聯表綱要 ( Relation Schema ) 與 (2) 關聯表實例 ( Relation Instance )。關聯式資料庫制定資料庫資料儲存的欄位與格式,包含: (1) 關聯表名稱,圖8-2所示的關聯名稱為 『 Student 』;(2) 屬性集宣告,屬性表示同一性質資料集合,宣告屬性之名稱,圖8-2所示的屬性集有 『 ID 』、『 Name 』、和『 Address 』;(3) 屬性相對的資料型態宣告,說明資料型態,如 ID 的資料型態是整數 (Integer);(4) 主鍵 ( Primary Key ) 宣告;(5) 外來鍵 ( Foreign Key )宣告。
組值是資料實例的集合,也是二維陣列之列值所成的集合,如圖示的第一組值為 『101』、『江小魚』、和『臺北市一心路100號』。 屬性 ( Attribute ) 屬性是具有同一性質與資料型態的資料集合,定義屬性時需要給予一個唯一的名稱,在 SQL 語法上稱為『欄位』 ( Field ),圖示中所定義的三個欄位為 『ID』、『Name』、和『Address』。 組值 ( Tuple ) 組值是資料實例的集合,也是二維陣列之列值所成的集合,如圖示的第一組值為 『101』、『江小魚』、和『臺北市一心路100號』。 圖 8-2 關聯式資料庫關聯表
關聯式資料庫所用之術語與在 SQL 語法上的術語名稱有一些差異 (表 8-2),SQL 是實現關聯式存取介面的語法,其間差異對照如下: 關聯表 ( Relation ) 資料表 (Table ) 屬性 ( Attribute ) 欄位 (Field) 值組 ( Tuple ) 記錄 ( Record )
8.2.2關聯式資料庫之關連 關聯式資料庫利用集合的概念以建立其資料結構,此資料結構需要: (1) 欄位單一化,資料表中每一欄位應只代表一個資料型態,如 Integer、String 等;(2) 具有主鍵 (Primary Key),有一個主鍵欄位,以便辨別每一記錄以及與其它資料表建立關聯;(3) 功能相依 (Function Dependence),主鍵與其它欄位值必須有相關性; (4) 欄位獨立 (Field Independence),改變某一欄位值時,其它欄位值不會受影響。 現在用簡單的範例來說明關聯式資料庫之建立。假若有多位學生需要買書,書本也有很多本,每一本書皆有其出版商,學生可以選擇購買多本,也可以不購買,我們要建立一個關連性資料庫,其簡要步驟如下。
首先建立學生關聯表 (Students)、書本關聯表 (Books)、與出版商關聯表 (Publishers),每一個欄位均有其資料型態,並設定主鍵,以便識別每一紀錄與其它關聯表之關聯,分別參考 圖 8-3 、圖 8-4、與圖 8-5。 圖8-5 出版商關聯表 圖8-3 學生關聯表 接著,建立出版商關聯表與書本關聯表之關連。在書本關聯表加上一個欄位 『PID』以便與出版商關聯表建立關聯 (圖 8-6)。由書本關聯表可以知道每一本書對應之出版商,如編號 『201』的書本『資訊安全導論』,其出版商編號為 『301』,而編號『301』的書本由出版商關聯表得知是『前瞻出版社』。 圖8-4 書本關聯表
再次,可以建立書本關聯表與出版商關聯表之關聯。因為學生可以購買書本,每位學生都可以購買很多本書,每本書也可以被很多人購買,所以需要建立一個新的關聯表,假設名稱為『Buy』(購買)關聯表,將資料之關聯性建立起來。如圖8-7 建立完整關聯之關聯表 圖 8-6 書本關聯表與出版商關聯表建立關聯
由圖 8-7 可以知道學生『江小魚』購買了『資訊安全導論』與『資料庫安全』兩本書,分別由『 前瞻出版社』與『後方出版社』所出版。由以上簡易實例中,我們可以將關聯表建立起完整的關聯,將資料結合在一起以方便查詢,此即是關聯性資料庫運作的原理。 圖8-7 建立完整關聯之關聯表
8.2.3SQL語法 資料庫存放資料,應用程式可以經由存取介面以存取資料庫裡的資料,一般最常用的是 SQL 語言,利用SQL指令敘述可以進行所需之存取。當輸入SQL指令後,SQL指令會轉換成關聯式代數運算式,代數運算式經過處理之後,產生指令來執行所需之資料庫查詢 (圖 8-8)。 圖 8-8 SQL 指令查詢流程
SQL語法簡單的介紹如表 8-3。 表 8-3 SQL語法簡單介紹 CREATE DATABASE TEST 新增一個名叫TEST的資料庫 CREATE TABLE TestTable (ID int, Name char(30) ) 建立一個名叫TesetTable的資料表,內容包含編號(ID)以及名稱(Name) INSERT TestTable (ID, Name) VALUES (100, ‘test’) 在TestTable的資料表中新增一筆ID為100,名稱為test的紀錄 UPDATE TestTable SET ID = 101 WHERE Name = test 將名稱為test的編號值更新重設為101 DELETE FROM TestTable WHERE Name = test 將名稱為test的紀錄從TestTable資料表中刪除 SELECT ID, Name FROM TestTable 從TestTable資料表中顯示ID與Name欄位的紀錄
『 SELECT < 屬性 > FROM < 關聯表 > WHERE < 條件 > 』 SQL 語言可以對資料庫的資料進行新增、刪除、修改與查詢等,以下使用基本查詢指令作說明。假設延續上節8.2.2的範例,若要列出『江小魚』購買的書本與出版社,可以使用以下指令作查詢 (並參考 表 8-4): 『 SELECT < 屬性 > FROM < 關聯表 > WHERE < 條件 > 』 表 8-4 查詢指令範例 SELECT Students.ID, Books.Name Publisher.BName FROM Students, Books, Publishers, Buy WHERE Students.ID = Buy.SID AND Buy.BID = Books.ID Books.PID = Publisher.ID
8.3資料庫安全需求 資訊化作得越完善的企業,其資料庫所儲存的資料就越珍貴,例如:企業在各種商業活動上所產生的重要資料,包含產品價格、訂單、客戶資料等等。 今日,資料庫的應用已普及到各個領域,資料庫中大量儲存資料的安全問題、重要資料的偷竊和篡改問題,越來越引起管理階層高度重視,資料庫安全已經成為非常重要的研究議題。 在其它章節已經談過資訊安全的三原則,機密性 (Confidentiality)、完整性 (Integrity)、與可用性 (Availability)。機密性,具機密性質的資料需要由適當的加密方法來保護。完整性,應防範被有意或無意的使用者破壞或篡改資料。可用性,一旦資料庫遭受攻擊造成某種程度的損毀時,應有迅速恢復正常運作的能力。
在資料庫安全的原則,除上述的資訊安全三原則外,需要再要求驗證(Authentication)、授權 (Authorization)以及不可否認(Non-repudiation) 等安全需求(表 8-5),分別敘述如下。 使用資料庫系統前,需要先驗證使用者的身份。 使用者在使用資料庫系統時,被授予適當的存取權限。 使用者在下達各項存取作業之後,不能夠否認其行為。
表 8-5 資料庫安全原則 目前,一般資料庫系統的安全保護機制之重點在於: 如何保護儲存有大量資料的資料庫為重點。 性 質 說 明 機密性 具機密性質的資料需要由適當的加密方法來保護。 完整性 應防範被有意或無意的使用者破壞或篡改資料。 可用性 一旦資料庫遭受攻擊造成某種程度的損毀時,應有迅速恢復正常運作的能力。 驗證性 進入資料庫使用前,先以身份識別法證明使用者本身身份。 授權性 使用者在使用資料庫系統時,被授予合理的存取權限。 不可否認性 使用者在各項存取作業之後,不能夠加以否認。 目前,一般資料庫系統的安全保護機制之重點在於: 如何保護儲存有大量資料的資料庫為重點。 確保資料庫中的重要資料只能被授權者存取。 防止透過惡意管道來篡改與存取資料庫中所儲存的重要資料。
而資料庫的保護技術與方法,包含硬體技術與軟體技術。硬體技術,有防火牆的設置、網路安全環境的設置、以及硬體保密器。軟體技術,有資料庫管理系統本身的授權控制機制、使用密碼學對於重要資料的加密、修補資料庫所在作業系統的安全漏洞等。 另外,在管理方面的安全需要,包含:追蹤所有的操作紀錄、資料庫稽核 (Auditing) 、以及可從系統日誌 (System Log) 發現潛在問題。
8.4資料庫之安全威脅 為確保資料庫安全,所需要的安全措施包含系統安裝修正檔、防毒軟體、架設防火牆、劃定非戰區 (DMZ)等,以及其它安全措施,如防火牆與入侵偵測系統的安裝。 資料庫系統的安全,除了依賴自身的安全機制外,也需要整體安全環境之配合。資料庫系統的安全可以劃分為三個層面,(1) 網路環境、(2) 作業系統與硬體平台、(3) 資料庫管理系統。以下分項介紹。
網路環境 隨著網際網路的發展,配合各種網路應用的資料庫系統如雨後春筍般湧現出來,導致網路系統的安全成為資料庫安全的第一道屏障。於開放式的網際網路環境中,將會面臨各種可能的威脅,如:偽裝攻擊 (Masquerade)、重送攻擊 (Replay Attack)、與阻絕服務攻擊 (Deny of Service;DoS)等等。 關於網路系統層次的安全防範技術有很多種,大致上可以分為:(1) 防火牆;與 (2) 入侵偵測系統 (Intrusion Detection System;IDS)。防火牆,主要作用是監控可信任網路與不可信任網路之間的連線通道,攔截來自外部的非法連線並阻止內部資訊的外漏,但它無法阻攔來自網路內部的非法操作。入侵偵測系統,監控網路和電腦系統是否出現被入侵或濫用的徵兆。
作業系統層面 作業系統是資料庫系統運作的平台,當然也為資料庫系統提供一定程度的安全保護。 目前作業系統平台大多數集中在Microsoft Windows系列以及Linux、Unix等作業系統。作業系統對於資料庫主要的安全保護,在於作業系統提供的安全技術、安全管理策略、以及資料安全等方面。 資料庫管理系統 資料庫系統的安全性有很大的程度依賴於資料庫管理系統。由於資料庫系統在作業系統下都是以檔案形式進行儲存資料的管理,因此,入侵者可以直接利用作業系統的漏洞竊取資料庫檔案,並利用工具軟體來非法偽造、篡改資料庫檔案中的內容。
資料庫管理系統對資料庫檔案或其內容進行加密處理,有兩種可能方法:(1) DBMS (Database Management System)內核心層加密:直接透過外部加密器對資料庫檔案進行加密;(2) DBMS外層加密:加密系統做成DBMS的一個外層工具,加/解密運算可在用戶端進行。兩種方法各有優缺點,如表 8-6。 表 8-6 資料庫加密方法優缺點 DBMS內核心層加密 優點 加密功能強,不會影響DBMS的功能。 缺點 加密運算在伺服器端進行,加重了伺服器的負載且DBMS和加密器之間的介面需要DBMS開發商的支援。 DBMS外層加密 不會加重資料庫伺服器的負載並且可以實現網路上傳輸的加密。 加密功能與資料庫管理系統之間的整合比較複雜。
8.5SQL Injection隱碼攻擊及其防範 資訊隱碼攻擊技術主要是利用SQL程式撰寫上的疏忽,使得攻擊者可藉由網頁瀏覽查詢的功能,輸入「非預期性輸入格式」,便可避開SQL安全檢查,非法存取資料庫中的內容。 SQL Injection並非植入電腦病毒或利用作業系統漏洞對系統造成危害,而是利用正常查詢網站資料時,將攻擊資料庫的指令夾藏於網站查詢命令中,便可對資料庫中的資料產生莫大的危害。 只要提供給使用者輸入的介面,對於輸入資料型態沒有做到嚴密的檢查,就可以透過ASP、PHP與JSP等程式碼,攻擊與破壞各種SQL資料庫。
8.5.1SQL Injection 隱碼攻擊原理 SQL Injection隱碼攻擊所採用之攻擊方法,既非資料庫本身,亦非作業系統或網站伺服器本身之漏洞,而是一種利用未做好輸入查驗 (Input Validation) 所衍生的問題。 程式開發者所撰寫的應用程式,沒有對使用者的輸入做妥善的檢查與過濾,攻擊者便可利用此問題,將其組合成SQL指令,傳送給SQL server執行。若使用者輸入的資料中,含有某些對資料庫系統有特殊意義的符號或命令時,便可能讓有機會對資料庫系統下達指令,而能查詢或修改資料。這樣的問題並不是資料庫系統本身的錯誤,而是程式設計師或軟體開發者的疏忽所造成的。
(1) 在輸入使用者名稱的地方輸入:『admin ‘--』。 (2) 密碼欄位隨便輸入,如 『asdf』。 以下介紹一個SQL Injection隱碼攻擊的範例。一般系統管理者可能採用的使用者名稱,如:admin等,則攻擊者可用以下步驟如下: (圖8-9 、圖 8-10) (1) 在輸入使用者名稱的地方輸入:『admin ‘--』。 (2) 密碼欄位隨便輸入,如 『asdf』。 (3) 實際傳送給SQL Server的指令會變成如 表 8-8 的情況。 表 8-8 SQL Server指令 SELECT * FROM Tb1User ( 註:內部聯結之關聯表) WHERE UserName = ‘admin ‘--‘ AND Password = ‘asdf’
這個攻擊的關鍵,就是原本的 AND 子句之前出現了「‘--」,讓AND後面的SQL語法都被標示成”註解”,而無法執行;且因為「Admin」使用者確實存在於測試資料庫中,按照Login.asp程式碼的判斷方式,傳回登入成功的訊息。 圖8-9 SQL Injection隱碼攻擊測試網頁
承上範例,如果採用未知的使用者名稱登入也可以,其步驟如下 (圖 8-11、圖 8-12)。 圖 8-10測試網頁登入成功畫面 承上範例,如果採用未知的使用者名稱登入也可以,其步驟如下 (圖 8-11、圖 8-12)。 (1) 若沒有已知的使用者帳號,也可以在使用者名稱欄位輸入 『 ’ or 1=1--』。 (2) 實際傳送給SQL的指令會變成如 表 8-9 的情況。
UserName='' or 1=1--' AND Password='asdf' 表 8-9 SQL 指令 SELECT * FROM Tb1User ( 註:內部聯結之關聯表) WHERE UserName='' or 1=1--' AND Password='asdf' 這個攻擊的關鍵,就是因為加上的『or 1=1』,則不管之前的條件為何,只要某個條件為真,整個判斷式的結果就為真。
圖 8-11 SQL Injection隱碼攻擊測試網頁之二 圖8-12 測試網頁登入成功畫面之二
8.5.2SQL Injection 資料隱碼攻擊之預防 表8-10 防止資料隱碼攻擊應拒絕輸入的字元 符號 SQL 語法中轉譯的意義 『;』 查詢分割符號 『‘』 字元資料字串分隔符號 『--』 註解分隔符號 『/*…*/』
除了拒絕輸入的字元外,也要過濾可能隱含的SQL指令,輸入的資料中隱含某些可能對資料庫或是資料表中的紀錄產生威脅的SQL指令時,如:INSERT、SELECT、UPDATE等,要加以注意或者禁止該查詢指令。 此外,針對輸入條件也要作適當規範,應規範為僅接受大小寫英文字母與數字等資料格式,並且限制其輸入的資料長度。例如:輸入身分證字號的資料長度為固定十個字元;輸入學號的資料僅需要大小寫英文字母或數字等。
8.5.3SQL Injection隱碼攻擊的檢測工具 在偵測SQL Injection隱碼攻擊,可使用一些檢測工具,以檢查過濾具有 SQL Injection 攻擊之可疑字串。主要的工具有三種,(1) Remote PHP Vulnerability Scanner (RPVS ) 工具、(2) lilith工具、和 (3) absinth 工具 (表 8-11)。 表8-11 SQL Injection 隱碼攻擊檢測工具 工 具 功 能 Remote PHP Vulnerability Scanner (RPVS ) 用來檢測 php 網頁是否具有 SQL Injection 的弱點,利用標列參數將所有在資訊蒐集步驟所蒐集的網頁目錄與 URL 進行驗證。 lilith 為 perl script 所構成的檢測程式, lilith 會掃瞄目標主機目錄下的所有網頁的 < form > 及 < input > 等項目,並輸入部分的 SQL Injection 字串,以檢測該網頁是否有 SQL Injection 弱點存在,利用標列參數將所有在資訊蒐集步驟所蒐集的網頁目錄與 URL 進行驗證。 absinth 提供介面方式允許手動的輸入參數設定來製作 SQL 指令的組合,進行檢測網頁的 SQL Injection。亦可協助探知資料庫類型,並利用手動輸入各個網頁表單中輸入選項,將這些欄位的值串接起來猜測 SQL 指令來達到檢測網頁的 SQL Injection 問題。當檢測的頁面有 SQL Injection 問題時,可藉本工具進一步檢測並列舉資料庫的類型與結構。
8.5.4 輸入介面網頁檢查 防止SQL Injection隱碼攻擊的方法,主要以輸入格式化字串來作檢查,以下針對PHP 網頁以及ASP網頁,列舉常用的檢測字串(表 8-12)。 表 8-12 SQL Injection隱碼攻擊檢測表 ASP 網頁 1 「 ' or 1=1-- 」 2 「 " or 1=1-- 」 3 「 or 1=1-- 」 4 「 ' or ' ' = ' 」 5 「 ' or 'a'='a 」 6 「 " or "a"="a 」 7 「 ') or ('a'='a 」 8 「 ' or 1=1 」 9 「 ' or '1=1 」 PHP 網頁 「 '/* 」 「 '%23 // ” ‘#” 」 「 ' and password='mypass 」 「 id=-1 union select 1,1,1 」 「 id=-1 union select char(97),char(97),char(97) 」 「 id=1 union select 1,1,1 from members 」 「 id=1 union select 1,1,1 from admin 」 10 「 id=1 union select 1,1,1 from user 」