《MySQL和PostgreSQL數據庫安全配置》要點:
本文介紹了MySQL和PostgreSQL數據庫安全配置,希望對您有用。如果有疑問,可以聯系我們。
相關主題:PostgreSQL教程
0x00 MySQL和PostgreSQL平安配置
針對開源數據庫MySQL和PostgreSQL的平安配置主要主要通過身份鑒別、訪問控制、平安審計、入侵防范、資源控制五個方面來實現.
0x01 身份辨別
MySQL和PostgreSQL均可以實現身份鑒別功能.通過設置數據庫基本上能夠實現能夠滿足《信息系統平安等級保護基本要求》第三級身份鑒別中大部分要求,但是對于“f 項應采用兩種或兩種以上組合的鑒別技術對管理用戶進行身份鑒別”,需要使用第三方的身份鑒別技術,如:口令、數字證書、生物特征等 2 .
(一)、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 = '*' 表示監聽所有端口.
線上重要數據庫禁止使用trust方式進行認證,必需使用md5方式. 重命名數據庫超級管理員賬戶為pgsqlsuper,此帳號由DBA負責人保管,禁止共用; 配置數據庫客戶端支持SSL連接的配置.客戶端認證是由一個配置文件控制的,存放在數據庫集群的數據目錄里 [3] . 用openssl生成密鑰對,創建一個自簽名的服務器密匙(server.key)和證書(server.crt); 數據庫的配置主要通過兩個配置文件pg_hba.conf和postgresql.conf來實現; 開啟TCP/IP連接:將postgresql.conf參數tcpip_socket設置為true; 開啟SSL:將postgresql.conf參數ssl設置為true; 強制局域網內的所有主機以任何PostgreSQL中存在的用戶通過TCP+SSL的方式連接到PostgreSQL; 在pg_hba.conf文件中增加記錄:hostssl all all 192.168.54.1/32 md5. postgresql中還可以通過pg_user系統表的valuntil字段實現用戶口令失效的時間(只用于口令認證).
0x02 拜訪控制
MySQL和PostgreSQL均可以實現拜訪控制功能.
(一)、MySQL數據庫
MySQL權限系統通過兩個階段進行權限認證:
對連接的用戶進行身份認證,合法的用戶通過認證,不合法的用戶拒絕連接; 對通過認證的合法用戶賦予相應的權限,用戶可以在這些權限范圍內對數據庫做相應的操作.MySQL中主要權限存儲在MySQL系統庫的user、host、db三個系統表中.這三個表中包含權限列,其中權限列包含普通權限和管理權限.普通權限主要用于數據庫的操作,比如select_priv、create_priv等;而管理權限主要用來對數據庫進行管理的操作,比如process_priv、super_priv等.表1說明了mysql權限系統表
當用戶進行連接的時候,權限表的存取進程有以下兩個階段.
先從user表中的host、user和password這三個字段中判斷連接的IP、用戶名和密碼是否存在于表中,如果存在,則通過身份驗證,否則拒絕連接. 如果通過身份驗證,則依照以權限表的順序得到數據庫權限: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原有的數據字典進行改造 [3] ,增加系統表.
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 [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] .
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%';
圖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數據庫 嚴格控制操作系統賬號和權限 鎖定mysql用戶不能登錄; 其他任何用戶都采用獨立的賬號登錄,管理員通過mysql專有用戶管理MySQL,或者通過su到mysql用戶下進行管理. mysql用戶目錄下,除了數據文件目錄,其他文件和目錄屬主都改為root. 刪除匿名賬號; 不要把file、process或super權限授予管理員以外的賬號; 進制load data local文件讀取操作的使用,避免讀取操作系統的重要文件到數據庫表中; 在已有的生產庫上建議進制使用safe-user-create參數的使用,避免用戶使用grant語句創建新用戶; 及時更新MySQL平安補丁.(二)、PostgreSQL數據庫 嚴格控制操作系統的賬號和權限,確保啟動進程具有最小的權限; 嚴格控制數據庫安裝目錄的權限,除了數據文件目錄,其他文件和目錄屬主都改為root. 及時更新數據庫bug和平安補丁.
0x05 資源節制
資源節制主要保證數據庫的資源不被非法的占用.
(一)、MySQL數據庫
MySQL中主要權限存儲在MySQL系統庫的user系統表的資源列中可以控制用戶連接數、最大哀求數、最大更新數、最大連接等信息.但最大用戶連接數為較長用的資源控制項,其他選項需更具數據的使用情況進行安全配置.
MAX_QUERIES_PER_HOUR 用來限制用戶每小時運行的查詢數量 MAX_UPDATES_PER_HOUR 用來限制用戶每小時的修改數據庫數據的數量. MAX_CONNECTIONS_PER_HOUR用來控制用戶每小時打開新連接的數量. MAX_USER_CONNECTIONS 限制有若干用戶連接MYSQL服務器.
針對每個用戶限制MAX_USER_CONNECTIONS參數,即限制用戶最大連接數. 針對每個用戶限制其來源地址限制,即每個用戶僅允許唯一的IP地址拜訪,必要時禁止遠程連接mysql ,設置skip-networking參數.(二)、PostgreSQL數據庫
PostgreSQL對于資源限制主要體現在用戶最大并發連接數的限制上.具體可以進行如下平安配置.
1)postgresql數據庫可以進行嚴格的地址限制,確保用戶來源可托.
2)配置用戶最年夜并發連接數量.
postgres=# select * from pg_authid; #查看限制其最年夜并發連接數量
3)postgresql具有默認的銜接超時策略
歡迎參與《MySQL和PostgreSQL數據庫安全配置》討論,分享您的想法,維易PHP學院為您提供專業教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/9195.html