針對開源數據庫MySQL和PostgreSQL的安全配置主要主要通過身份鑒別、訪問控制、安全審計、入侵防范、資源控制五個方面來實現。
MySQL和PostgreSQL均可以實現身份鑒別功能。通過設置數據庫基本上能夠實現能夠滿足《信息系統安全等級保護基本要求》第三級身份鑒別中大部分要求,但是對于“f 項應采用兩種或兩種以上組合的鑒別技術對管理用戶進行身份鑒別”,需要使用第三方的身份鑒別技術,如:口令、數字證書、生物特征等2。
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重命名為madman3)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 支持豐富的認證方法:信任認證、口令認證、PAM認證等多種認證方式。PostgreSQL 默認配置只監聽本地端口,無法通過遠程TCP/IP連接數據庫。需要修改 postgresql.conf 中的 listen_address 字段修改監聽端口,使其支持遠程訪問。例如listen\_addresses = '*'
表示監聽所有端口。
MySQL和PostgreSQL均可以實現訪問控制功能。
MySQL權限系統通過兩個階段進行權限認證:
當用戶進行連接的時候,權限表的存取過程有以下兩個階段。
通過上述介紹,可知在配置權限時需要根據數據庫業務使用的情況配置合理的權限。
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原有的數據字典進行改造[3],增加系統表。
b、修改用戶認證邏輯 在sql_acl.cc中修改用戶驗證邏輯,檢查強制訪問權限管理表,是否符合用戶認證要求。
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[5]。Relacl是PostgreSQL支持的數組屬性,該數組成員是抽象的數據類型aclitem。這些aclitem作為對象訪問控制權限的ACE(ACL是存儲控制箱(Access Control Entruy,ACE)的集合,每個ACL實際上是一個由多個aclitem構成的鏈表,ACE由數據庫對象和權限列表構成,記錄著可訪問兌現的用戶或者執行單元(進程、存儲過程等))共同組成對象的ACL。
圖1:ACL權限信息。
2)根據系統提示可以查看對象的ACL列表,已確定用戶對對象的訪問權限。
postgres=# \dp pg_roles;
--\dp 后接表名或視圖名查看對象權限 3) 通過合理的權限配置進行訪問控制外,還需要將DBA管理和應用賬號嚴格分離,不同應用單獨賬號,刪除數據庫相關的歷史操作記錄,避免信息泄露。
4)對postgresql進行源代碼修改以實現強制訪問控制(MAC),SQL語句在經過DDL與DML處理時,需要進行MAC檢查,通過檢查的數據才能輸出給用戶,否則只能返回錯誤信息[5]。
商業數據庫均有安全審計功能,通過相關配置,能夠對系統的重要事件進行安全審計目前MySQL數據庫具有基本的日志功能,通過日志數據挖掘可以實現安全審計功能,但其實現起來較為復雜。PostgreSQL具備了良好的審計功能。
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%';
圖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)通過對審計日志的格式等進行分析實現審計報表的輸出。
審計是值記錄用戶的登錄退出以及登錄后在數據庫里的行為操作,可以根據安全等級不一樣設置不一樣級別的審計。默認需設置具有如下的安全配置參數:
表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)確保所有的審計記錄的權限滿足操作系統的權限要求。
針對數據庫的安全防范主要體現在數據庫補丁更新,特定函數的使用等方面。
資源控制主要保證數據庫的資源不被非法的占用。
MySQL中主要權限存儲在MySQL系統庫的user系統表的資源列中可以控制用戶連接數、最大請求數、最大更新數、最大連接等信息。但最大用戶連接數為較長用的資源控制項,其他選項需更具數據的使用情況進行安全配置。
PostgreSQL對于資源限制主要體現在用戶最大并發連接數的限制上。具體可以進行如下安全配置。
1)postgresql數據庫可以進行嚴格的地址限制,確保用戶來源可信。
2)配置用戶最大并發連接數量。
postgres=# select * from pg_authid;
#查看限制其最大并發連接數量3)postgresql具有默認的連接超時策略。