4.2 常見數據庫系統
目前常見的數據庫系統有Oracle、DB2、SQL Server、MySQL、PostgreSQL和SQLite等。
4.2.1 Oracle
20世紀70年代一家名為Ampex的軟件公司,為中央情報局設計一套名叫Oracle的數據庫,埃里森是程序員之一。
1977年埃里森與同事Robert Miner創立“軟件開發實驗室”(Software Development Labs),當時IBM發表“關系數據庫”的論文,埃里森以此開發出新數據庫,名為甲骨文。
1978年公司遷往硅谷,更名為“關系式軟件公司”(RSI)。RSI在1979年的夏季發布了可用于DEC公司的PDP-11計算機上的商用Oracle產品,這個數據庫產品整合了比較完整的SQL實現,其中包括子查詢、連接及其他特性。美國中央情報局想買一套這樣的軟件來滿足他們的需求,但在咨詢IBM公司之后發現IBM沒有可用的商用產品,于是他們聯系了RSI,RSI有了第一個客戶。1982年再更名為甲骨文(Oracle)。
Oracle安全加固主要涉及以下幾個方面。
(1)安全補丁的更新
及時更新數據庫的安全補丁,減少數據庫系統可能受到的安全攻擊。參考Oracle廠商建議,僅對已發現的特定漏洞或缺陷安裝相應補丁。
(2)$ORACLE_HOME/bin目錄權限保護
確保對$ORACLE_HOME/bin目錄的訪問權限盡可能少,運行命令:

驗證ls-l $ORACLE_HOME/bin,確保該目錄下的文件屬主為oracle用戶,且其他用戶沒有寫權限。
(3)Oracle數據字典的保護
設置保護后,可防止其他用戶(具有'ANY'system privileges)使用數據字典時,具有相同的'ANY'權限。使用文本的方式,打開數據庫的配置文件init<sid>.ora,更改以下參數O7_DICTIONARY_ACCESSIBILITY=。
● Oracle 9i、10g:默認值是False。
● Oracle 8i:默認值是True,需要改成False。
● 如果用戶必須需要該權限,賦予其權限SELECT ANY DICTIONARY。
驗證:SQL> show parameter O7_DICTIONARY_ACCESSIBILITY。

(4)加強訪問控制
設置正確識別客戶端用戶,并限制操作系統用戶數量(包括管理員權限、root權限和普通用戶權限等)。
● 使用文本的方式,打開數據庫配置文件init<sid>.ora,設置參數REMOTE_OS_AUTHENT,值為FALSE(SAP系統不可設置為False)。
● 在數據庫的賬戶管理中刪除不必要的操作系統賬號。
設置(需重啟數據庫):alter system set remote_os_authent=false scope=spfile;。
驗證:SQL>show parameter remote_os_authent。

(5)密碼文件管理
配置密碼文件的使用方式,使用文本的方式,打開數據庫配置文件init<sid>.ora,設置參數REMOTE_LOGIN_PASSWORD_FILE=NONE。
● None:使得Oracle不使用密碼文件,只能使用OS認證,不允許通過不安全網絡進行遠程管理。
● Exclusive:可以使用唯一的密碼文件,但只限一個數據庫。密碼文件中可以包括除了sys用戶的其他用戶。
● Shared:可以在多個數據庫上使用共享的密碼文件。但是密碼文件中只能包含sys用戶。
設置:(需重啟數據庫)alter system set remote_login_passwordfile=none scope=spfile;。
驗證:SQL>show parameter remote_login_passwordfile。

(6)用戶賬號管理
為了安全考慮,應該鎖定Oracle中不需要的用戶或改變默認用戶的密碼。鎖定不需要的用戶,使用SQL語句ALTER USER user PASSWORD EXPIRE;。
注意要鎖定MGMT_VIEW、DBSNMP、SYSMAN賬號或修改密碼(如果要使用DBConsole、DBSNMP、SYSMAN則不能鎖定賬戶,需請修改密碼)。
(7)最小權限使用規則
● 應該只提供最小權限給用戶(包括SYSTEM和OBJECT權限)。
● 從PUBLIC組中撤回不必要的權限或角色(如UTL_SMTP、UTL_TCP、UTL_HTTP、UTL_FILE、DBMS_RANDON、DBMS_SQL、DBMS_SYS_SQL和DBMS_BACKUP_RESTORE)。
撤銷不需要的權限和角色,使用SQL語句:

(8)sys用戶的處理
Oracle數據庫系統安裝后,自動創建一個數據庫管理員用戶sys,當該用戶以sysdba方式連接數據庫時,便具有全部系統權限,因而對它的保護尤為重要。
加固方法:更換sys用戶的密碼,符合密碼復雜度要求;新建一個DBA用戶,作為日常管理使用。
(9)密碼策略
在Oracle中,可以通過修改用戶概要文件來設置密碼的安全策略,可以自定義密碼的復雜度。以下參數和密碼安全有關。
FAILED_LOGIN_ATTEMPTS:最大錯誤登錄次數。
PASSWORD_GRACE_TIME:口令失效后的鎖定時間。
PASSWORD_LIFE_TIME:口令有效時間。
PASSWORD_LOCK_TIME:登錄超過有效次數的鎖定時間。
PASSWORD_REUSE_MAX:口令歷史記錄的保留次數。
PASSWORD_REUSE_TIME:口令歷史記錄的保留時間。
PASSWORD_VERIFY_FUNCTION:口令復雜度審計函數。
(10)數據庫操作審計
Oracle數據庫具有對其內部所有發生的活動的審計能力,審計日志一般放在sys.aud$表中,也可以寫入操作系統的審計跟蹤文件中。可審計的活動有三種類型:登錄嘗試、數據庫活動和對象存取。默認情況下,數據庫不啟動審計,要求管理員配置數據庫后才能啟動審計。
使用文本方式,打開數據庫配置文件init<sid>.ora,更改以下參數配置AUDIT_TRAIL=True。

默認為False,當設置為True時,所有sys用戶(包括以sysdba,sysoper身份登錄的用戶)的操作都會被記錄。
驗證:SQL>show parameter audit。

(11)本地緩存區溢出防護
'oracle'程序存在本地緩沖區溢出。在傳遞命令行參數給'oracle'程序時,缺少充分的邊界緩沖區檢查,可導致以'oracle'進程權限在系統上執行任意代碼,需要進行有效加固。
以系統管理員權限登錄操作系統,進入Oracle安裝目錄。
運行chmod o-x oracle,加強對Oracle文件的可執行控制,這樣非Oracle賬號對該文件沒有讀取、運行的權限。
4.2.2 DB2
IBM DB2是美國IBM公司開發的一套關系型數據庫管理系統,它主要的運行環境為UNIX(包括IBM的AIX)、Linux,以及Windows服務器版本。
DB2主要用于大型應用系統,可以支持從大型機到單用戶環境具有良好的可擴展性。適用于所有常見的服務器操作系統平臺。DB2提供了高級別的數據利用性、完整性、安全性和可恢復性,并且具有獨立于平臺的基本功能和SQL命令。DB2采用了數據分級技術,可以方便地將主機數據下載到LAN數據庫服務器,使得客戶機/服務器用戶和基于LAN的應用程序可以訪問大型機數據,并使數據庫本地化及遠程連接透明化。DB2以擁有一個非常完備的查詢優化器而著稱,其外部連接提高了查詢性能,并支持多任務并行查詢。DB2具有良好的網絡支持能力,每個子系統可以連接成千上萬的分布式用戶,可同時激活數千個活動線程,特別適用于大型分布式應用系統。
DB2數據庫安全加固主要涉及以下幾個方面。
(1)最小化權限設置
在數據庫權限配置功能中,根據用戶的業務需要配置所需的最低權限。防止濫用數據庫權限,降低安全風險。
若要對用戶roy撤銷staff表上的alter特權,可以使用以下語句:

若要對用戶roy撤銷staff表上的所有特權,可以使用以下語句:

(2)啟用日志記錄并設置為存檔日志模式
實現在線備份和恢復,日志的默認模式是循環日志。默認情況下,只能實現數據庫的離線備份和恢復。

注意:
更改為on后,當查看數據庫配置參數logretain的值時,實際顯示的是recovery。更改此參數后,再次連接到數據庫將顯示數據庫處于備份掛起狀態。此時,需要對數據庫進行離線備份(DB2 backup dB),以使數據庫狀態正常。
注意:
確保將內存中仍然緩沖的所有審計記錄寫入磁盤db2audit flush。
(3)用戶身份驗證失敗鎖定
對于采用靜態口令認證技術的數據庫,應在用戶連續認證失敗次數超過6次(不含6次)時鎖定。
修改/etc/login.defs,代碼如下:

4.2.3 SQL Server
SQL Server是微軟公司開發的關系型數據庫管理系統。
Microsoft SQL Server是一個綜合性的數據庫平臺,它通過集成的商業智能(BI)工具提供了企業級的數據管理。Microsoft SQL Server數據庫引擎為關系型數據和結構化數據提供了更安全、可靠的存儲功能,并且可以為業務構建和管理高可用和高性能的數據應用程序。
SQL Server只在Windows上運行,Microsoft這種專有策略的目標是將客戶鎖定到Windows環境中,從而限制客戶選擇其他更開放的、基于標準解決方案的數據庫系統以獲得更多的革新和價格競爭帶來的好處。但Windows平臺本身的可靠性、安全性和可伸縮性有限。
SQL Server安全加固主要涉及以下幾個方面。
(1)安裝安全補丁
在補丁安裝之前建議先對數據庫進行備份,停止SQL Server服務,然后在Microsoft SQL Server Download Web Site下載補丁進行安裝。
(2)禁用不必要的服務
在SQL Server安裝時,默認安裝MSSQLSERVER、QLSERVERAGENT、SSQLServerADHelper和Microsoft Search這4個服務,除了MSSQLSERVER外,其他服務如果不需要,建議禁用。
(3)限制SQL Server使用的協議
在Microsoft SQL Server程序組,運行服務網絡實用工具,建議只使用TCP/IP協議,禁用其他協議。
4.2.4 MySQL
MySQL是一個關系型數據庫管理系統(Relational Database Management System,RDBMS),由瑞典MySQL AB公司開發。MySQL是流行的關系型數據庫管理系統之一,在Web應用方面,MySQL是最好的RDBMS應用軟件之一。關系數據庫將數據存儲在不同的表中,而不是將所有數據放在一個大倉庫中,這樣提高了速度和靈活性。
MySQL所使用的SQL語言是訪問數據庫最常用的標準化語言。MySQL軟件采用了雙授權策略,分為社區版和商業版,由于其體積小、速度快、總體擁有成本低,尤其是開源等特點,一般中小型網站的開發都選擇MySQL作為網站數據庫。
與其他的大型數據庫(如Oracle、DB2、SQL Server等)相比,MySQL也有它的不足之處,但是這絲毫沒有減少它受歡迎的程度。對于一般的個人使用者和中小型企業來說,MySQL提供的功能已經綽綽有余,而且由于MySQL是開源軟件,可以大大降低總體擁有的成本。
選擇Linux作為操作系統,Apache或Nginx作為Web服務器,MySQL作為數據庫,PHP/Perl/Python作為服務器端腳本解釋器,由于這4個軟件都是免費或開源軟件,使用這種方式就可以建立起一個穩定、免費的網站系統,業界稱為“LAMP”或“LNMP”組合。
MySQL數據庫安全加固主要涉及以下幾個方面。
(1)安裝完MySQL后需要做的工作
安裝完MySQL后需要安裝mysql-client。運行mysql_secure_installation會執行幾個設置:

1)為root用戶設置密碼。
2)刪除匿名賬號。
3)取消root用戶遠程登錄。
4)刪除test庫和對test庫的訪問權限。
5)刷新授權表使修改生效。
通過這幾項的設置能夠提高MySQL庫的安全性。
(2)禁止遠程連接數據庫
在命令行netstat -ant下看到,默認的3306端口是打開的,此時打開了mysqld的網絡監聽,允許用戶遠程通過賬號和密碼連接本地數據庫,默認情況是允許遠程連接數據庫的。為了禁止該功能,啟動skip-networking,不監聽SQL的任何TCP/IP連接,切斷遠程訪問的權利,保證安全性。如果需要遠程管理數據庫,可通過安裝PhpMyadmin來實現。如果確實需要遠程連接數據庫,至少修改默認的監聽端口,同時添加防火墻規則,只允許可信任網絡的MySQL監聽端口的數據通過。

將#skip-networking注釋刪除。

(3)限制連接用戶的數量
數據庫的某用戶多次遠程連接,會導致性能的下降和影響其他用戶的操作,有必要對其進行限制。可以通過限制單個賬戶允許的連接數量來實現,即設置my.cnf文件mysqld中的max_user_connections變量來完成。GRANT語句也可以支持資源控制選項來限制服務器對一個賬戶允許的使用范圍。

(4)用戶目錄權限限制
默認的MySQL安裝在/usr/local/mysql目錄下,而對應的數據庫文件在/usr/local/mysql/var目錄下,因此,必須保證該目錄不能讓未經授權的用戶訪問,所以要限制對該目錄的訪問。確保mysqld運行時,只有對數據庫目錄具有讀或寫權限的Linux用戶可運行。

4.2.5 PostgreSQL
PostgreSQL是一種特性非常齊全的自由軟件的對象關系型數據庫管理系統(ORDBMS),以加州大學計算機系開發的POSTGRES為基礎。POSTGRES的許多領先概念只是在比較遲的時候才出現在商業網站數據庫中。PostgreSQL支持大部分的SQL標準并且提供了很多其他現代特性,如復雜查詢、外鍵、觸發器、視圖、事務完整性和多版本并發控制等。同樣,PostgreSQL也可以用許多方法擴展,如通過增加新的數據類型、函數、操作符、聚集函數、索引方法和過程語言等進行擴展。另外,因為許可證的靈活性,任何人都可以以任何目的免費使用、修改和分發PostgreSQL。
PostgreSQL最初設想于1986年,當時被叫作Berkley Postgres Project。該項目一直到1994年都處于演進和修改中,直到開發人員Andrew Yu和Jolly Chen在Postgres中添加了一個結構化查詢語言(Structured Query Language,SQL)翻譯程序,該版本叫作Postgres95,在開放源代碼社區發放。
1996年,再次對Postgres95做了較大的改動,并將其作為PostgresSQL6.0版發布。該版本的Postgres提高了后端的速度,包括增強型SQL92標準及重要的后端特性(包括子選擇、默認值、約束和觸發器)。
PostgreSQL數據庫安全加固主要涉及以下幾個方面。
1)PostgreSQL支持豐富的認證方法:信任認證、口令認證和PAM認證等多種認證方式。PostgreSQL默認配置只監聽本地端口,無法通過遠程TCP/IP連接數據庫。需要修改postgresql.conf中的listen_address字段修改監聽端口,使其支持遠程訪問。例如,listen_addresses=‘*’表示監聽所有端口。
2)線上重要數據庫禁止使用trust方式進行認證,必須使用MD5方式。
3)重命名數據庫超級管理員賬戶為pgsqlsuper,此賬號由DBA負責人保管,禁止共用。
4)配置數據庫客戶端支持SSL連接。客戶端認證是由一個配置文件控制的,存放在數據庫集群的數據目錄中。
5)用openssl生成密鑰對,創建一個自簽名的服務器密匙(server.key)和證書(server.crt)。
6)開啟TCP/IP連接:將postgresql.conf參數tcpip_socket設置為true。
7)開啟SSL:將postgresql.conf參數ssl設置為true。
8)根據最小權限要求給用戶配置角色和權限。

為了保護數據安全,用戶對某個數據庫對象進行操作之前,必須檢查用戶在對象上的操作權限。訪問控制列表(ACL)是對象權限管理和權限檢查的基礎,PostgreSQL通過操作ACL實現對象的訪問控制管理。
9)審計是指記錄用戶的登錄、退出,以及登錄后在數據庫中的行為操作,可以根據安全等級不同設置不同級別的審計。默認需設置如下安全配置參數。
● logging_collector:是否開啟日志收集開關,默認是off,開啟后要重啟數據庫。
● log_destination:日志記錄類型,默認是stderr,只記錄錯誤輸出。
● log_directory:日志路徑,默認是$PGDATA/pg_log。
● log_filename:日志名稱,默認是postgresql-%Y-%m-%d_%H%M%S.log。
● log_connections:用戶session登錄時是否寫入日志,默認是off。
● log_disconnections:用戶session退出時是否寫入日志,默認是off。
● log_rotation_age:保留單個文件的最大時長,默認是1d。
● log_rotation_size:保留單個文件的最大尺寸,默認是10MB。
10)嚴格控制數據庫安裝目錄的權限,除了數據文件目錄,其他文件和目錄屬主都改為root。此外,還要及時更新數據庫。
4.2.6 SQLite
SQLite是一款輕型的數據庫,是關系型數據庫管理系統,包含在一個相對較小的C庫中。SQLite是D. Richard Hipp建立的公有領域項目,其設計目標是嵌入式的,而且已經在很多嵌入式產品中使用。SQLite占用資源非常低,在嵌入式設備中,可能只需要幾百KB的內存。它能夠支持Windows/Linux/UNIX等主流的操作系統,同時能夠與很多程序語言相結合,如TCL、C#、PHP和Java等,還提供了ODBC接口,比MySQL、PostgreSQL這兩款開源的數據庫管理系統快。SQLite第一個Alpha版本誕生于2000年5月。2019年SQLite 3版本發布,這距SQLite的誕生已經有19年了。
與常見的客戶端/服務器范例不同,SQLite引擎不是程序與通信之間的獨立進程,而是連接到程序并成為其主要部分。編程語言直接在API協議中調用。這在消耗總量、延遲時間和整體簡單性上有積極的作用。整個數據庫(定義、表、索引和數據本身)在宿主主機上存儲在一個單一的文件中。SQLite的簡單的設計是通過在開始一個事務時鎖定整個數據文件而完成的。
SQLite安全加固主要涉及以下幾個方面。
(1)SQLite數據庫加密(SQLCipher)
檢查SQLite是否使用了SQLCipher開源庫。SQLCipher是對整個數據庫文件進行加密。注意,該檢測項不是警告用戶有風險,而是提醒用戶采用了SQLite對數據庫進行了加密。
檢測方法:使用了SQLCipher開源庫會產生Lnet/sqlcipher/database/SQLiteDatabase的包路徑,只需在包路徑中查找是否存在該路徑的包名即可。
(2)SQLit使用SQLite Encryption Extension(SEE)插件
SEE是一個數據庫加密擴展插件,允許App讀取和寫入加密的數據庫文件,是SQLite的加密版本(收費版),可以提供以下的加密方式:RC4、AES-128 in OFB mode、AES-128 in CCM mode和AES-256 in OFB mode。
檢測方法:使用了SEE拓展插件會產生Lorg/sqlite/database/sqlite/SQLiteDatabase的包路徑,只需在包路徑中查找是否存在該路徑的包名即可。
(3)SQLite SQL注入漏洞防護
SQLite作為Android平臺的數據庫,對于數據庫查詢,如果開發者采用字符串鏈接方式構造SQL語句,就會產生SQL注入。
防護建議如下。
● Provider不需要導出,將export屬性設置為false。
● 若導出僅為內部通信使用,則設置protectionLevel=signature。
● 不直接將傳入的查詢語句用于projection和selection,使用由query綁定的參數selectionArgs。
● 采用完備的SQL注入語句檢測邏輯,防止注入發生。
(4)Databases任意讀寫漏洞防護
APP在使用openOrCreateDatabase創建數據庫時,如果將數據庫設置了全局可讀權限,攻擊者則可以惡意讀取數據庫內容,獲取敏感信息。在設置數據庫屬性時如果設置全局可寫,攻擊者可能會篡改、偽造內容,可以能會進行詐騙等行為,造成用戶財產損失。
- Web漏洞分析與防范實戰:卷1
- CTF實戰:技術、解題與進階
- Metasploit Penetration Testing Cookbook(Second Edition)
- 網絡安全保障能力研究
- Computer Forensics with FTK
- Building a Home Security System with BeagleBone
- Falco云原生安全:Falco原理、實踐與擴展
- Instant Java Password and Authentication Security
- 網絡安全態勢感知
- 信息技術基礎:提高篇·實驗與習題
- Kali Linux高級滲透測試(原書第4版)
- 計算機網絡安全實驗指導
- 計算機系統與網絡安全研究
- 黑客攻防從入門到精通:黑客與反黑客工具篇(第2版)
- Hands-On Bug Hunting for Penetration Testers