本文分享自華爲雲社區《GaussDB(DWS) 3A安全能力》,作者:yd_281561943。
1. 前言
- 適用版本:【8.0.0 (及以上)】
數據庫安全是指保護數據庫以防止未授權用戶竊取、篡改和破壞數據庫中數據信息的技術。數據庫安全技術可以簡單分爲3個A:
- Authentication(認證):認證解決讓誰進來的問題(進門)
- Authorization(授權):授權解決能幹啥的問題(幹活)
- Audit(審計):審計解決幹了啥的問題(監控)
2. Authentication——認證
連接認證解決用戶能否登錄數據庫的問題。本產品支持如下幾種認證方式:
- 基於主機的認證:服務器端根據客戶端的IP地址、用戶名及要訪問的數據庫來查看配置文件從而判斷用戶是否通過認證。
- 口令認證:包括遠程連接的加密口令認證和本地連接的非加密口令認證。
- 證書認證:此模式需進行SSL連接配置且需要客戶端提供有效的SSL證書,不需要提供用戶密碼。
- 第三方認證:ldap、oneaccess等
這幾種方式都需要配置“pg_hba.conf”文件,pg_hba.conf文件格式,pg_hba有若干行的HBA記錄組成:
一條HBA記錄的含義是允許哪些用戶(USER),從哪些IP地址(ADDRESS),以哪種連接類型(TYPE),以哪種認證方式(METHOD),連接哪些數據庫(DATABASE)。
認證時對每個連接請求從下到下依次檢查hba文件中的記錄,如果當前記錄匹配,就返回。 HBA記錄的順序非常關鍵。hba的這種邏輯非常重要,輕易不應該變動,否則會引發非常嚴重的問題。
案例:hba邏輯變動引發的問題
ldap連接出現過一個問題,升級過程中pg_hba.conf文件中的記錄會排序,導致升級前後ldap配置行順序變化,到sha256配置行後面了。由於pg_hba.conf的順序遍歷機制,升級後ldap用戶錯誤匹配到sha256配置行,連接失敗。
爲解決順序變動引發的問題,第一版的修改方案是將ldap判斷邏輯放在循環遍歷的開始位置:先看認證類型,如果是ldap認證就判斷配置行method字段是否爲ldap,不是就跳到下一行,直到找到method是ldap的爲止。
在這版修改方案下,ldap認證方式的連接匹配到的都是ldap的hba記錄。用戶連接數據庫時,可以成功連接,但是業務卻無法進行,報錯:“Invalid username/password,login denied.”。原因是內部節點執行語句時會進行節點之間的認證,認證類型爲trust,不會提供密碼。修改之後只會匹配到ldap記錄,ldap方式需要密碼,從而報錯。
升級前後,ldap與sha256配置行位置如下:
升級前: host all @/etc/ldap/ldap_user 0.0.0.0/0 ldap ldapserver=xxx.xxx.xxx.xxx ldapport=xxx ldapprefix="CN=" ldapsuffix="OU=test_dmj_group,DC=com" host all all 0.0.0.0/0 sha256 升級後: host all all 0.0.0.0/0 sha256 host all @/etc/ldap/ldap_user 0.0.0.0/0 ldap ldapserver=xxx.xxx.xxx.xxx ldapport=xxx ldapprefix="CN=" ldapsuffix="OU=test_dmj_group,DC=com"
TYPE:type是local、host、hostssl、hostnossl四種之一。
分別表示:
local: 僅允許unix domain socket連接。
host: 允許TCP/IP連接,可以匹配SSL和非SSL的連接請求。
hostssl: 允許TCP/IP連接,僅匹配SSL的連接請求。
hostnossl: 允許TCP/IP連接,僅匹配非SSL的連接請求。
DATABASE:可以用all表示所有數據庫,也可以用逗號分隔顯式指定數據庫。
USER:可以用all表示所有用戶,也可以用逗號分隔顯式指定用戶。可以是特定數據庫用戶的名稱,也可以是前面帶有+的組名稱。+標記實際上意味着“匹配直接或間接屬於該角色的任何角色” ,而沒有+標記的名稱僅匹配該特定角色。
ADDRESS:聲明記錄所匹配且允許訪問的地址。type是local時,表示本機連接,不需要指定IP地址。
METHOD:認證方式有trust、reject、md5、sha256、ldap、cert、oneaccess等。
trust:白名單,無條件允許連接。
reject:黑名單,無條件拒絕連接。
md5: pg的password認證方式,不安全。
sha256: gaussdb的password認證。
ldap:使用LDAP進行第三方認證。
cert:客戶端證書認證模式,此模式需進行SSL連接配置且需要客戶端提供有效的SSL證書,不需要提供用戶密碼。
oneaccess:使用oneaccess進行第三方認證。3.Authorization——授權
權限表示用戶對某個數據庫對象的操作是否被允許。GaussDB(DWS)中的權限包含三種場景:系統權限、數據對象權限、用戶權限。
3.1 系統權限
3.1.1 三權分立
默認情況下擁有SYSADMIN屬性的系統管理員,具備系統最高權限。在實際業務管理中,爲了避免系統管理員擁有過度集中的權利帶來高風險,可以設置三權分立,將系統管理員的CREATEROLE屬性和AUDITADMIN屬性權限分別給安全管理員和審計管理員。
3.1.2 系統權限授權
系統權限又稱爲用戶屬性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN和LOGIN。
系統權限可以在創建、修改角色或者用戶時進行授權,CREATE/ALTER ROLE/USER user_name [WITH] option語句的option中,可以設置以下字段,來實現系統權限賦權。
SYSADMIN | NOSYSADMIN
決定一個新角色是否爲“系統管理員”,具有SYSADMIN屬性的角色擁有系統最高權限。缺省爲NOSYSADMIN。
AUDITADMIN | NOAUDITADMIN
定義角色是否有審計管理屬性。缺省爲NOAUDITADMIN。
CREATEDB | NOCREATEDB
決定一個新角色是否能創建數據庫。新角色沒有創建數據庫的權限。缺省爲NOCREATEDB。
CREATEROLE | NOCREATEROLE
決定一個角色是否可以創建新角色(也就是執行CREATE ROLE和CREATE USER)。 一個擁有CREATEROLE權限的角色也可以修改和刪除其他角色。缺省爲NOCREATEROLE。
LOGIN | NOLOGIN
具有LOGIN屬性的角色纔可以登錄數據庫。一個擁有LOGIN屬性的角色可以認爲是一個用戶。缺省爲NOLOGIN。3.2 數據對象權限
數據對象包括表和視圖、指定字段、數據庫、函數、模式等,對它們的創建、增、刪、改、查等操作就是數據對象權限。授權語法格式爲:GRANT [privileges] ON [objects] TO [users],回收權限語法格式爲REVOKE [privileges] ON [objects] FROM [users]。
3.3 用戶權限
3.3.1 用戶權限授權
將一個角色或用戶的權限授予一個或多個其他角色或用戶。被授權的角色或用戶就擁有授權的角色或用戶的權限。當聲明瞭WITH ADMIN OPTION,被授權的用戶可以將該權限再次授予其他角色或用戶,以及撤銷所有由該角色或用戶繼承到的權限。當授權的角色或用戶發生變更或被撤銷時,所有繼承該角色或用戶權限的用戶擁有的權限都會隨之發生變更。語法格式爲GRANT role TO user。
3.3.2 預置角色
GaussDB(DWS)提供了一組預置角色,以“gs_role_”開頭命名,這些預置角色具有一些固定的權限。當某些用戶需要進行相關操作,只需要把預置角色授給用戶即可。目前GaussDB(DWS)的預置角色如下表:
4.Audit——審計
審計是指記錄用戶的登陸退出以及登陸後在數據庫裏的行爲操作,使得數據庫安全管理員可以利用這些日誌信息,找出非法操作的用戶,時間和內容等。
4.1 設置審計配置項
要使數據庫能夠審計到某項功能,需要打開審計的總開關(audit_enabled)和對應的審計項開關(audit_operation_exec),二者均支持動態加載,在數據庫運行期間修改該配置項的值會立即生效,無需重啓數據庫。
有兩點需要注意,其一如果審計ddl操作,需要另外配置audit_system_object 來審計具體某個對象的ddl 操作;其二如果是審計事務,事務內部的操作是否審計需要結合其具體的配置項是否配置。審計項的參數控制:
4.2 查看審計日誌
審計查詢命令是pgxc_query_audit:
select * from pgxc_query_audit(timestamptz startime,timestamptz endtime,audit_log);
startime 和 endtime 分別表示審計記錄的開始時間和結束時間,audit_log 表示所查看的審計日誌新的所在的物理文件路徑,當不指定audit_log 時,默認查看連接當前實例的審計日誌信息。審計查詢結果如下例:
postgres=# create table t1(id int); ERROR: relation "t1" already exists postgres=# select * from pgxc_query_audit('2021-03-21','2021-03-30') order by endtime desc limit 1; -[ RECORD 1 ]---+-------------------------------- begintime | 2021-03-21 11:49:41.643+08 endtime | 2021-03-21 11:49:41.652+08 operation_type | ddl audit_type | ddl_table result | failed username | perfadm database | postgres client_conninfo | gsql@[local] object_name | t1 command_text | create table t1(id int); detail_info | relation "t1" already exists transaction_xid | 0 query_id | 1062177 node_name | cn_5001 thread_id | 139916885260032@669613657906735 local_port | 6000 remote_port |
5. 其他數據倉庫安全技術
數據安全展示:數據脫敏、行級訪問控制。
數據安全存儲:數據存儲加密、透明加密。