MySQL和PostgreSQL資料庫安全配置

wyzsk發表於2020-08-19
作者: shewey · 2016/05/26 16:40

0x00 MySQL和PostgreSQL安全配置


針對開源資料庫MySQL和PostgreSQL的安全配置主要主要透過身份鑑別、訪問控制、安全審計、入侵防範、資源控制五個方面來實現。

0x01 身份鑑別


MySQL和PostgreSQL均可以實現身份鑑別功能。透過設定資料庫基本上能夠實現能夠滿足《資訊系統安全等級保護基本要求》第三級身份鑑別中大部分要求,但是對於“f 項應採用兩種或兩種以上組合的鑑別技術對管理使用者進行身份鑑別”,需要使用第三方的身份鑑別技術,如:口令、數字證書、生物特徵等。

(一)、MySQL資料庫

MySQL資料庫在安裝後預設存在mysql資料庫,該資料庫為系統表所在的資料庫,所有使用者記錄在mysql資料庫的user三個許可權表的使用者列(包括host、user、password三個欄位)。

1)對於身份認證MySQL是透過IP地址和使用者名稱進行聯合確認的,[email protected]

2)安全配置時儘量避免採用預設的使用者名稱root,建議對預設使用者名稱進行重新命名,這樣增加鑑別資訊被猜測的難度;

  • mysql> update mysql.user set user ='madman' where user='root'; --將root重新命名為madman

3)mysql資料庫預設無法實現密碼更改週期和密碼複雜度要求,需要管理員定期更改口令的複雜度,可以透過如下命令設定密碼;

  • mysql>update mysql.user set password=password("[email protected]!@") where User="root" and host="localhost"; --設定密碼複雜度
  • mysql>FLUSH PRIVILEGES; --重新整理許可權表

除了密碼認證外,MySQL還支援UNIX域套接字,可以在配置檔案中指定套接字檔案的路徑,如—socket=/tmp/mysql.sock,當資料庫啟動後可以使用UNIX套接字的方式進行認證。

4)針對MySQL5以後的版本建議禁止使用old_password引數,--old-passwords選項的目的是當伺服器生成長密碼雜湊值時,允許你維持同4.1之前的客戶端的向後相容性。在MySQL4.1版本以後建議禁止使用該引數。

5)MySQL資料庫也支援SSL遠端登入,如果採用本地管理方式則不需要考慮遠端連線安全,如果採用遠端管理則需要SSL支援。

  • mysql>SHOW VARIABLES LIKE '%have\_ssl%'; --檢視是否支援ssl的連線特性,若為disabled,說明此功能沒有啟用。

6)確保所有的身份鑑別的密碼具有較強的密碼複雜度。

最後,MySQL資料庫本身不支援登入次數限制,無法實現針對使用者的鎖定,具有登入的連線超時設定。

(二)、PostgreSQL資料庫

PostgreSQL 支援豐富的認證方法:信任認證、口令認證、PAM認證等多種認證方式。PostgreSQL 預設配置只監聽本地埠,無法透過遠端TCP/IP連線資料庫。需要修改 postgresql.conf 中的 listen_address 欄位修改監聽埠,使其支援遠端訪問。例如listen\_addresses = '*'表示監聽所有埠。

  1. 線上重要資料庫禁止使用trust方式進行認證,必須使用md5方式。
  2. 重新命名資料庫超級管理員賬戶為pgsqlsuper,此帳號由DBA負責人保管,禁止共用;
  3. 配置資料庫客戶端支援SSL連線的配置。客戶端認證是由一個配置檔案控制的,存放在資料庫叢集的資料目錄裡。
    1. 用openssl生成金鑰對,建立一個自簽名的伺服器密匙(server.key)和證書(server.crt);
    2. 資料庫的配置主要透過兩個配置檔案pg_hba.conf和postgresql.conf來實現;
    3. 開啟TCP/IP連線:將postgresql.conf引數tcpip_socket設定為true;
    4. 開啟SSL:將postgresql.conf引數ssl設定為true;
    5. 強制區域網內的所有主機以任何PostgreSQL中存在的使用者透過TCP+SSL的方式連線到PostgreSQL;
    6. 在pg_hba.conf檔案中增加記錄:hostssl all all 192.168.54.1/32 md5。
  4. postgresql中還可以透過pg_user系統表的valuntil欄位實現使用者口令失效的時間(只用於口令認證)。

0x02 訪問控制


MySQL和PostgreSQL均可以實現訪問控制功能。

(一)、MySQL資料庫

MySQL許可權系統透過兩個階段進行許可權認證:

  1. 對連線的使用者進行身份認證,合法的使用者透過認證,不合法的使用者拒絕連線;
  2. 對透過認證的合法使用者賦予相應的許可權,使用者可以在這些許可權範圍內對資料庫做相應的操作。MySQL中主要許可權儲存在MySQL系統庫的user、host、db三個系統表中。這三個表中包括許可權列,其中許可權列包括普通許可權和管理許可權。普通許可權主要用於資料庫的操作,比如select_priv、create_priv等;而管理許可權主要用來對資料庫進行管理的操作,比如process_priv、super_priv等。表1說明了mysql許可權系統表

當使用者進行連線的時候,許可權表的存取過程有以下兩個階段。

  1. 先從user表中的host、user和password這三個欄位中判斷連線的IP、使用者名稱和密碼是否存在於表中,如果存在,則透過身份驗證,否則拒絕連線。
  2. 如果透過身份驗證,則按照以許可權表的順序得到資料庫許可權:userdbtable_privcolumns_priv,即先檢查全域性許可權表user,如果user中對應的許可權為Y,則此使用者對所有資料庫的許可權都為Y,將不再檢查db, tables_priv,columns_priv;如果為N,則到db表中檢查此使用者對應的具體資料庫,並得到db中為Y的許可權;如果db中為N,則檢查tables_priv中此資料庫對應的具體表,取得表中的許可權Y,以此類推。這幾個許可權表中,許可權範圍一次遞減,全域性許可權覆蓋區域性許可權。

透過上述介紹,可知在配置許可權時需要根據資料庫業務使用的情況配置合理的許可權。

1)儘量最小化許可權的配置,可以透過如下命令檢視許可權。

  • mysql> select * from mysql.user\G --檢查使用者許可權列
  • mysql> select * from mysql.db\G --檢查資料庫許可權列
  • mysql> select * from mysql.tables_priv\G --檢查使用者表許可權列
  • mysql> select * from mysql.columns_priv\G --檢查列許可權列

2)業務系統在使用時,也可以透過檢視控制對基礎表的訪問;

3)透過合理的許可權配置進行訪問控制外,還需要將DBA管理和應用賬號嚴格分離,不同應用單獨賬號,刪除資料庫相關的歷史操作記錄,避免資訊洩露。

4)對於MySQL資料庫自身不具備強制訪問控制(MAC),強制訪問控制(MAC)是系統強制主體服從訪問控制策略。與自主訪問控制(DAC)基於系統實現身份認證及其到系統資源的介入授權方式,共同保證使用者的許可權。

a、建立系統表:為了實現可定製強制訪問控制,需定義使用者的強制訪問許可權管理表,系統需要對MySQL原有的資料字典進行改造,增加系統表。

b、修改使用者認證邏輯 在sql_acl.cc中修改使用者驗證邏輯,檢查強制訪問許可權管理表,是否符合使用者認證要求。

(二)、PostgreSQL資料庫

PostgreSQL將所有的資料庫物件都存放在系統表空間,所有的系統表都以pg開頭。PostgreSQL採用基於角色的訪問控制機制,透過角色機制,簡化了使用者和許可權的關聯性。PostgreSQL系統中的許可權分為兩種:系統許可權和物件許可權。

系統許可權是指系統規定使用者使用資料庫的許可權(如連線資料庫、建立資料庫、建立使用者等),系統角色屬性有LOGIN、PASSWORD、SUPERUSER、CREATEDB、CREATEROLE、INHERIT等。

物件許可權是指在表、序列、函式等資料庫物件上執行特殊動作的許可權,其許可權型別有select、insert、update、delete、references、trigger、create、connect、temporary、execute和usage等。

有關角色屬性資訊可以在系統表pg_authid中找到。另外pg_roles是系統表pg_authid公開課度部分的檢視。系統表pa_auth_members儲存了角色之間的成員關係

1)根據最小許可權要求給使用者配置角色和許可權。

  • postgres=# select * from pg\_authid; --檢視使用者具有的角色

為了保護資料安全,當使用者對某個資料庫物件進行操作之前,必須檢查使用者在物件上的操作許可權。訪問控制列表(ACL)是物件許可權管理和許可權檢查的基礎,在PostgreSQL透過操作ACL實現物件的訪問控制管理。所有表的基本定義儲存在系統表pg_class中,除了包括表,檢視、序列和索引(與其他許多系統不同,PG的索引也被視作一個類,事實上索引項無論在邏輯組成還是物理結構上都類似一個表的元組。)等物件的基本定義外,它的relacl屬性中為每個物件維護一個ACL。Relacl是PostgreSQL支援的陣列屬性,該陣列成員是抽象的資料型別aclitem。這些aclitem作為物件訪問控制許可權的ACE(ACL是儲存控制箱(Access Control Entruy,ACE)的集合,每個ACL實際上是一個由多個aclitem構成的連結串列,ACE由資料庫物件和許可權列表構成,記錄著可訪問兌現的使用者或者執行單元(程式、儲存過程等))共同組成物件的ACL。

p1

圖1:ACL許可權資訊。

2)根據系統提示可以檢視物件的ACL列表,已確定使用者對物件的訪問許可權。

  • postgres=# \dp pg_roles; --\dp 後接表名或檢視名檢視物件許可權

3) 透過合理的許可權配置進行訪問控制外,還需要將DBA管理和應用賬號嚴格分離,不同應用單獨賬號,刪除資料庫相關的歷史操作記錄,避免資訊洩露。

4)對postgresql進行原始碼修改以實現強制訪問控制(MAC),SQL語句在經過DDL與DML處理時,需要進行MAC檢查,透過檢查的資料才能輸出給使用者,否則只能返回錯誤資訊。

0x03 安全審計


商業資料庫均有安全審計功能,透過相關配置,能夠對系統的重要事件進行安全審計目前MySQL資料庫具有基本的日誌功能,透過日誌資料探勘可以實現安全審計功能,但其實現起來較為複雜。PostgreSQL具備了良好的審計功能。

(一)、MySQL資料庫

MySQL日誌主要包含:錯誤日誌、查詢日誌、慢查詢日誌、二進位制日誌等,日誌主要功能如下:

  • 錯誤日誌:錯誤日誌主要為了實現資料庫排錯。預設情況下錯誤日誌大概記錄以下幾個方面的資訊:伺服器啟動和關閉過程中的資訊、伺服器執行過程中的錯誤資訊等跟系統錯誤有關的日誌。
  • 查詢日誌:查詢日誌主要為了實現資料庫除錯。由於查詢日誌會記錄使用者的所有操作,其中還包含增刪查改等資訊,在併發操作大的環境下會產生大量的資訊從而導致不必要的磁碟IO,會影響mysql的效能的。
  • 慢查詢日誌:慢查詢日誌是用來記錄執行時間超過指定時間的查詢語句。透過慢查詢日誌,可以查詢出哪些查詢語句的執行效率很低,以便進行最佳化。
  • 二進位制日誌:二進位制日誌也叫更新日誌,主要用於記錄修改資料或有可能引起資料改變的mysql語句,並且記錄了語句發生時間、執行時長、操作的資料等等。

透過上述描述可以看出,對於MySQL來說可以透過日誌分析來實現資料庫審計功能,但是這樣的工作量對DBA來說比較繁瑣,也不利於集中控制資料庫產生的安全審計記錄。MySQL企業級已經實現了針對MySQL的安全審計功能,但開源MySQL資料庫沒有實現安全審計功能。要實現MySQL資料庫的安全審計功能,需要對MySQL原始碼進行修改,目前已經有成熟的外掛來實現MySQL資料庫審計功能。

1)MySQL審計外掛:MariaDB資料庫管理系統是MySQL的一個分支,其server_audit審計外掛能工作在mariadb、mysql和percona server,透過安裝審計外掛來實現MySQL的審計功能。

a、安裝審計外掛,將server_audit.so 檔案複製到MySQL/MariaDB 下的 lib/plugin 目錄,並透過如下命令啟用該外掛:

#!bash
mysql> INSTALL PLUGIN server_audit SONAME 'server_audit.so';

b、修改mysql配置檔案my.cnf的審計引數

server_audit    =FORCE_PLUS_PERMANENT
server_audit_events ='CONNECT,QUERY,TABLE'
server_audit_logging    =ON
server_audit_incl_users =root
server_audit_file_rotate_size   = 1G
server_audit_file_path  = /usr/local/mysql/mysql_logs/auditlog/server_audit.log

c、檢視審計配置引數,可以透過下面的命令查詢審計引數配置情況。

#!bash
mysql> SHOW global VARIABLES LIKE '%audit%';

p2

圖1:審計配置引數

表1:PostgreSQL資料庫安全審計配置引數

配置引數 引數說明
server_audit_logging 啟動或關閉審計
server_audit_events 指定記錄事件的型別,可以用逗號分隔的多個值(connect,query,table),如果開啟了查詢快取(query cache),查詢直接從查詢快取返回資料,將沒有table記錄
server_audit_file_rotate_size 限制日誌檔案的大小
server_audit_file_rotations 指定日誌檔案的數量,如果為0日誌將從不輪轉
server_audit_incl_users 指定哪些使用者的活動將記錄,connect將不受此變數影響,該變數比server_audit_excl_users優先順序高

2)透過設定嚴格的訪問控制許可權確保審計日誌的安全性。

3)透過對審計日誌的格式等進行分析實現審計報表的輸出。

(二)、PostgreSQL資料庫

審計是值記錄使用者的登入退出以及登入後在資料庫裡的行為操作,可以根據安全等級不一樣設定不一樣級別的審計。預設需設定具有如下的安全配置引數:

表2:PostgreSQL資料庫安全審計配置引數

配置引數 引數說明
logging_collector 是否開啟日誌收集開關,預設off,開啟要重啟DB
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

PostgreSQL日誌裡分成了3類,透過引數pg_statement來控制,預設的pg_statement引數值是none,即不記錄,可以設定ddl(記錄create,drop和alter)、mod(記錄ddl+insert,delete,update和truncate)和all(mod+select)。

1)配置logging_collector、pg_statement、log_connections和 log_disconnections引數,確保登入連線、退出連線和使用者DDL、DML等行為能被記錄;

2)配置日誌檔名稱、大小、保留週期等滿足相關要求;

3)確保所有的審計記錄的許可權滿足作業系統的許可權要求。

0x04 入侵防範


針對資料庫的安全防範主要體現在資料庫補丁更新,特定函式的使用等方面。

(一)、MySQL資料庫

  1. 嚴格控制作業系統賬號和許可權
    1. 鎖定mysql使用者不能登入;
    2. 其他任何使用者都採用獨立的賬號登入,管理員透過mysql專有使用者管理MySQL,或者透過su到mysql使用者下進行管理。
    3. mysql使用者目錄下,除了資料檔案目錄,其他檔案和目錄屬主都改為root。
  2. 刪除匿名賬號;
  3. 不要把file、process或super許可權授予管理員以外的賬號;
  4. 進位制load data local檔案讀取操作的使用,避免讀取作業系統的重要檔案到資料庫表中;
  5. 在已有的生產庫上建議進位制使用safe-user-create引數的使用,避免使用者使用grant語句建立新使用者;
  6. 及時更新MySQL安全補丁。

(二)、PostgreSQL資料庫

  1. 嚴格控制作業系統的賬號和許可權,確保啟動程式具有最小的許可權;
  2. 嚴格控制資料庫安裝目錄的許可權,除了資料檔案目錄,其他檔案和目錄屬主都改為root。
  3. 及時更新資料庫bug和安全補丁。

0x05 資源控制


資源控制主要保證資料庫的資源不被非法的佔用。

(一)、MySQL資料庫

MySQL中主要許可權儲存在MySQL系統庫的user系統表的資源列中可以控制使用者連線數、最大請求數、最大更新數、最大連線等資訊。但最大使用者連線數為較長用的資源控制項,其他選項需更具資料的使用情況進行安全配置。

  • MAX_QUERIES_PER_HOUR 用來限制使用者每小時執行的查詢數量
  • MAX_UPDATES_PER_HOUR 用來限制使用者每小時的修改資料庫資料的數量。
  • MAX_CONNECTIONS_PER_HOUR用來控制使用者每小時開啟新連線的數量。
  • MAX_USER_CONNECTIONS 限制有多少使用者連線MYSQL伺服器。
  1. 針對每個使用者限制MAX_USER_CONNECTIONS引數,即限制使用者最大連線數。
  2. 針對每個使用者限制其來源地址限制,即每個使用者僅允許唯一的IP地址訪問,必要時禁止遠端連線mysql ,設定skip-networking引數。

(二)、PostgreSQL資料庫

PostgreSQL對於資源限制主要體現在使用者最大併發連線數的限制上。具體可以進行如下安全配置。

1)postgresql資料庫可以進行嚴格的地址限制,確保使用者來源可信。

2)配置使用者最大併發連線數量。

  • postgres=# select * from pg_authid;#檢視限制其最大併發連線數量

3)postgresql具有預設的連線超時策略。

0x06 參考文獻


  • 【1】 《關於應用安全可控資訊科技加強銀行業網路安全和資訊化建設的指導意見》[ON/EL].http://www.cbrc.gov.cn/govView_EE29BABB27EB4E51A4343517691438F9.html
  • 【2】 邱梓華,宋好好,張笑笑,顧健,主機安全等級保護配置指南[J].資訊網路安全,2011年增刊,112~113
  • 【3】 楊玉傑,韓昧華,王永剛,PostgreSQL的安全資料傳輸[J],聊城大學學報(自然科學版),第23卷第1期,89~90
  • 【4】 吳飛林,王曉豔,郎波,基於MySQL的可定製強制訪問控制的研究與實現[J].計算機應用研究,第24卷第11期,119
  • 【5】 張孝,PostgreSQL中基於ACL的資料訪問控制技術[J],計算機應用和軟體,第24卷第9期,68
  • 【6】 劉欣,沈昌祥,基於PostgreSQL的強制訪問控制的實現[J],計算機工程,第32卷第2期,50
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章