host|hostssl|hostnossl <database> <role> <CIDR-address>|<ip-address>,<IP-mask> <authentication-method> 本地UNIX域套接字的訪問記錄具有下面的格式:local <database> <role> <authentication-method> 表1描述了每個字段的含義。
字段 | 描述 |
local | 匹配使用UNIX域套接字的連接請求。如果沒有此種類型的記錄,則不允許UNIX域套接字連接。 |
host | 匹配使用TCP/IP的連接請求。除非在服務器啟動時使用了適當的listen_addresses服務器配置參數(缺省值為“*”,允許所有IP連接),否則不能遠程TCP/IP連接。 |
hostssl | 匹配使用TCP/IP的連接請求,但是僅當連接使用SSL加密時。服務器啟動時必須通過設置ssl配置參數啟用SSL。 |
hostnossl | 匹配不使用SSL的TCP/IP的連接請求。 |
<database> | 指定匹配此行記錄的數據庫名。值“all”指示匹配所有數據庫。多個數據庫名用逗號分隔。可以指定一個包含數據庫名的文件,在文件名前加“@”。 |
<role> | 指定匹配此行記錄的數據庫角色名。值“all”指示匹配所有角色。如果指定的角色是一個組并且希望包含所有的組成員,在角色名前面加一個“+”。多個角色名可以通過逗號分隔。可以指定一個包含角色名的文件,在文件名前加“@”。 |
<CIDR-address> | 指定此行記錄匹配的客戶端主機的IP地址范圍。它包含一個以標準點分十進制記法表示的IP地址,和一個CIDR掩碼長度。IP地址只能用數字表示,不能是域或主機名。掩碼長度標識客戶端IP地址必須匹配的高位數。在IP地址、斜杠和CIDR掩碼長度之間不能有空格。CIDR地址典型的例子有,單一主機如192.0.2.2/32,小型網絡如192.0.2.0/24,大型網絡如192.0.0.0/16。指定單一主機時,IPv4的CIDR掩碼是32,Ipv6的是128。網絡地址不要省略尾部的零。 |
<IP-address>, <IP-mask> | 這個字段是CIDR-address表示法的另一個替代表示方法。用不同列表示的掩碼替換掩碼長度。例如,255.255.255.255對應的CIDR掩碼長度是32。此字段應用于host、hostssl和hostnossl記錄。 |
<authentication-method> | 指定連接認證時使用的方法。HAWQ支持PostgreSQL 9.0所支持的認證方法(Trust、PassWord、GSSAPI、SSPI、Kerberos、Ident-based、LDAP、RADIUS、Certificate、PAM)。 |
<property> <name>max_connections</name> <value>500</value></property><property> <name>max_prepared_transactions</name> <value>1000</value></property><property> <name>seg_max_connections</name> <value>3000</value></property> 增加這些值會引起HAWQ需要更多的共享內存。為了緩解內存使用壓力,可以考慮降低其它內存相關的服務器配置參數,如gp_cached_segworkers_threshold等。 不需要手工編輯每個節點的hawq-site.xml文件設置允許的連接數。可以使用Ambari或命令行配置這些參數。 使用Ambari:通過HAWQ service Configs > Advanced > Custom hawq-site > Add Property ... 配置max_connections、seg_max_connections和 max_prepared_transactions屬性。選擇Service Actions > Restart All重載更新的配置。 使用命令行:作為管理員登錄HAWQ的master節點并設置環境:source /usr/local/hawq/greenplum_path.sh使用hawq config應用程序設置max_connections、seg_max_connections和max_prepared_transactions參數值,max_prepared_transactions的值必須大于等于max_connections。。例如:$ hawq config -c max_connections -v 100$ hawq config -c seg_max_connections -v 640$ hawq config -c max_prepared_transactions -v 200重啟HAWQ集群重載新的配置值。$ hawq restart cluster使用hawq config的-s選項顯示服務器配置參數的值,確認配置生效:$ hawq config -s max_connections$ hawq config -s seg_max_connections二、管理角色與權限1. HAWQ角色與權限概述 pg_hba.conf文件限定了允許連接HAWQ的客戶端主機、用戶名、訪問的數據庫,認證方式等。用戶名、口令,以及用戶對數據庫對象的使用權限保存在HAWQ的元數據表中(pg_authid、pg_roles、pg_class等)。 HAWQ采用基于角色的訪問控制機制,通過角色機制,簡化了用戶和權限的關聯性。HAWQ系統中的權限分為兩種:系統權限和對象權限。系統權限是指系統規定用戶使用數據庫的權限,如連接數據庫、創建數據庫、創建用戶等。對象權限是指在表、序列、函數等數據庫對象上執行特殊動作的權限,其權限類型有select、insert、update、delete、references、trigger、create、connect、temporary、execute和usage等。 與Oracle、SQLServer等數據庫中角色的概念不同,這些系統中的所謂角色,是權限的組合和抽象,創建角色最主要的目的是簡化對用戶的授權。舉一個簡單的例子,假設需要給五個用戶每個授予相同的五種權限,如果沒有角色,需要授權二十五次,而如果把五種權限定義成一種角色,只需要先進行一次角色定義,再授權五次即可。 然而HAWQ中的角色既可以代表一個數據庫用戶,又可以代表一組權限。而角色所擁有的預定義的系統權限是通過角色的屬性實現的。角色可以是數據庫對象(例如表)的屬主,也可以給其它角色賦予訪問這些對象的權限。角色可以是其它角色的成員,因此一個成員角色可以從其父角色繼承對象權限。 HAWQ系統可能包含多個數據庫角色(用戶或組)。這些角色并不是運行服務器上操作系統的用戶和組。但是為方便起見,可能希望維護操作系統用戶名和HAWQ角色名的關系,因為很多客戶端應用程序,如psql,使用當前操作系統用戶名作為缺省的角色,gpadmin就以最典型的例子。 用戶通過master實例連接HAWQ,mater通過pg_hba.conf里的條目驗證用戶的角色和訪問權限。之后master以當前登錄的角色,從后臺向segment實例發布SQL命令。系統級定義的角色對系統中所有數據庫都是有效的。為了創建更多的角色,首先需要使用超級用戶gpadmin連接HAWQ。2. 角色和權限的安全最佳實踐保證gpadmin系統用戶安全。HAWQ需要一個UNIX用戶ID安裝和初始化HAWQ系統。這個系統用戶ID在HAWQ文檔中被稱為gpadmin。gpadmin用戶是HAWQ中缺省的數據庫超級用戶,也是HAWQ安裝及其底層數據文件的文件系統屬主。這個缺省的管理員賬號是HAWQ的基礎設計。缺了這個用戶系統無法運行。并且,沒有方法能夠限制gpadmin用戶對數據庫的訪問。應該只使用gpadmin賬號執行諸如擴容和升級之類的系統維護任務。任何以這個用戶登錄HAWQ主機的人,都可以讀取、修改和刪除任何數據,尤其是系統目錄數據和數據庫訪問權力。因此,gpadmin用戶的安全非常重要,僅應該提供給關鍵的系統管理員使用。應用的數據庫用戶應該永不作為gpadmin登錄,ETL或者生產環境的應用程序也不應該以gpadmin用戶連接數據庫。賦予每個登錄用戶不同的角色。出于記錄和審核目的,每個登錄HAWQ的用戶都應該被賦予自己的數據庫角色。對于應用程序或者web服務,最好為每個應用或服務創建不同的角色。使用組管理訪問權限。限制具有超級用戶角色屬性的用戶。超級用戶角色繞過HAWQ中所有的訪問權限檢查和資源隊列,所以只應該將超級用戶權限授予系統管理員。3. 創建角色(用戶) 此時的角色指的是一個可以登錄到數據庫,并開啟一個數據庫會話的用戶。使用create role命令創建一個角色時,必須授予login系統屬性(功能類似于Oracle的connect角色),使得該角色可以連接數據庫。例如:create role jsmith with login; 一個數據庫角色有很多屬性,用以定義該角色可以在數據庫中執行的任務類型,或者具有的系統權限。表2描述了有效的角色屬性。
屬性 | 描述 |
SUPERUSER | NOSUPERUSER | 確定一個角色是否是超級用戶。只有超級用戶才能創建新的超級用戶。缺省值為NOSUPERUSER。 |
CREATEDB | NOCREATEDB | 確定角色是否被允許創建數據庫。缺省值為NOCREATEDB。 |
CREATEROLE | NOCREATEROLE | 確定角色是否被允許創建和管理其它角色。缺省值為NOCREATEROLE。 |
INHERIT | NOINHERIT | 確定角色是否從其所在的組繼承權限。具有INHERIT屬性的角色可以自動使用所屬組已經被授予的數據庫權限,無論角色是組的直接成員還是間接成員。缺省值為INHERIT。 |
LOGIN | NOLOGIN | 確定角色是否可以登錄。具有LOGIN屬性的角色可以將角色作為用戶登錄。沒有此屬性的角色被用于管理數據庫權限(即用戶組)。缺省值為NOLOGIN。 |
CONNECTION LIMIT connlimit | 如果角色能夠登錄,此屬性指定角色可以建立多少個并發連接。缺省值為-1,表示沒有限制。 |
PASSWORD ’password’ | 設置角色的口令。如果不準備使用口令認證,可以忽略此選項。如果沒有指定口令,口令將被設置為null,此時該用戶的口令認證總是失敗。一個null口令也可以顯示的寫成PASSWORD NULL。 |
ENCRYPTED | UNENCRYPTED | 控制口令是否加密存儲在系統目錄中。行為由password_encryption配置參數所決定,缺省的設置是md5,如果要改為SHA-256加密,設置此參數為password。如果給出的口令字符串已經是加密格式,那么它被原樣存儲,而不管指定ENCRYPTED還是UNENCRYPTED(因為系統不能對加密的口令字符串進行解密)。這種設計允許在dump/restore時重新導入加密的口令。 |
VALID UNTIL ’timestamp’ | 設置一個日期和時間,在該時間點后角色的口令失效。如果忽略此選項,口令將永久有效。 |
RESOURCE QUEUE queue_name | 賦予角色一個命名的資源隊列用于負載管理。角色發出的任何語句都受到該資源隊列的限制。注意,這個RESOURCE QUEUE屬性不會被繼承,必須在每個用戶級(登錄)角色設置。 |
DENY {deny_interval | deny_point} | 在此時間區間內禁止訪問。指定天或者天和時間。 |
alter role jsmith with password 'passwd123';alter role admin valid until 'infinity';alter role jsmith login;alter role jsmith resource queue adhoc;alter role jsmith deny day 'sunday';4. 角色成員 通常將多個權限合成一組,能夠簡化對權限的管理。使用這種方法,對于一個組中的用戶,其權限可以被整體授予和回收。在HAWQ中的實現方式為,創建一個表示組的角色,然后為用戶角色授予組角色的成員。 下面的SQL命令使用create role創建一個名為admin組角色,該組角色具有createrole和createdb系統權限。create role admin createrole createdb; 一旦組角色存在,就可以使用grant和revoke命令添加或刪除組成員(用戶角色)。例如:grant admin to john, sally;revoke admin from bob; 為了簡化對象權限的管理,應當只為組級別的角色授予適當的權限。成員用戶角色繼承組角色的對象權限。例如:grant all on table mytable to admin;grant all on schema myschema to admin;grant all on database mydb to admin; 角色屬性LOGIN、SUPERUSER、CREATEDB和CREATEROLE不會當做普通的數據庫對象權限被繼承。為了讓用戶成員使用這些屬性,必須執行SET ROLE指定一個具有這些屬性的角色。在上面的例子中,我們已經為admin指定了CREATEDB和CREATEROLE屬性。sally是admin的成員,當以sally連接到數據庫后,執行以下命令,使sally可以擁有父角色的CREATEDB和CREATEROLE屬性。set role admin; 有關角色屬性信息可以在系統表pg_authid中找到,pg_roles是基于系統表pg_authid的視圖。系統表pa_auth_members存儲了角色之間的成員關系。5. 管理對象權限 當一個對象(表、視圖、序列、數據庫、函數、語言、模式或表空間)被創建,它的權限被賦予屬主。屬主通常是執行create語句的角色。對于大多數類型的對象,其初始狀態是只允許屬主或超級用戶在對象上做任何操作。為了允許其它角色使用對象,必須授予適當的權限。HAWQ對每種對象類型支持的權限如表3所示。
對象類型 | 權限 |
Tables、Views、Sequences | SELECT、INSERT、RULE、ALL |
External Tables | SELECT、RULE、ALL |
Databases | CONNECT、CREATE、TEMPORARY | TEMP、ALL |
Functions | EXECUTE |
Procedural Languages | USAGE |
Schemas | CREATE、USAGE、ALL |
Custom Protocol | SELECT、INSERT、RULE、ALL |
grant insert on mytable to jsmith; 使用revoke命令回收權限。例如:revoke all privileges on mytable from jsmith; 也可以使用drop owned和reassign owned命令為一個角色刪除或重新賦予對象屬主權限。只有對象的屬主或超級用戶可以刪除或重新賦予對象的屬主權限。例如:reassign owned by sally to bob;drop owned by visitor;HAWQ不支持行級和列級的訪問控制,但是可以使用視圖限制查詢的行或列,模擬行級和列級訪問控制。此時角色被授予對視圖而不是基表的訪問權限。
對象權限,存儲在pg_class.relacl中,更多對象權限的信息,可以參考”PostgreSQL 表和列權限(ACL)解讀“
6. 口令加密 HAWQ缺省使用MD5為用戶口令加密,通過適當配置服務器參數,也能實現口令的SHA-256加密存儲。為了使用SHA-256加密,客戶端認證方法必須設置為password而不是缺省的MD5。口令雖然以加密形式存儲在系統表中,但仍然以明文在網絡間傳遞。為了避免這種情況,應該建立客戶端與服務器之間的SSL加密通道。(1)系統級啟用SHA-256加密 如果使用Ambari管理HAWQ集群:通過HAWQ service Configs > Advanced > Custom hawq-site下拉列表設置password_hash_algorithm配置屬性,有效值為SHA-256。選擇Service Actions > Restart All重載更新的配置。 如果從命令行管理HAWQ集群:作為管理員登錄HAWQ master并設置路徑:$ source /usr/local/hawq/greenplum_path.sh使用hawq config應用程序設置password_hash_algorithm為SHA-256:$ hawq config -c password_hash_algorithm -v 'SHA-256' 重載HAWQ配置:$ hawq stop cluster -u驗證設置:$ hawq config -s password_hash_algorithm(2)會話級啟用SHA-256加密 為單個數據庫會話設置password_hash_algorithm服務器參數:以超級用戶登錄HAWQ實例。設置password_hash_algorithm參數為SHA-256:set password_hash_algorithm = 'SHA-256';驗證參數設置:show password_hash_algorithm;(3)驗證口令加密方式生效 建立一個具有login權限的新角色,并設置口令:create role testdb with password 'testdb12345#' login; 修改客戶端認證方法,允許存儲SHA-256加密的口令,打開master的pg_hba.conf文件并添加下面一行:host all testdb 0.0.0.0/0 password 重啟集群:hawq restart cluster 以剛創建的testdb用戶登錄數據庫。psql -d postgres -h hdp3 -U testdb 在提示時輸入正確的口令。 驗證口令被以SHA-256哈希方式存儲,哈希后的口令存儲在pg_authid.rolpasswod字段中。作為超級用戶登錄。執行下面的查詢:select rolpassword from pg_authid where rolname = 'testdb'; 查詢結果如圖2所示。圖2三、使用psql連接HAWQ 用戶可以使用與一個PostgreSQL兼容的客戶端程序連接到HAWQ,最常用的客戶端工具就是psql。再次強調,用戶和管理員總是通過master連接到HAWQ,segment不能接受客戶端連接。 為了建立一個到master的連接,需要知道表4所示的連接信息,并在psql命令行給出相應參數或配置相關的環境變量。
連接參數 | 描述 | 環境變量 |
應用名 | 連接數據庫的應用名稱。連接參數application_name中配置的缺省值是psql。 | $PGAPPNAME |
數據庫名 | 連接的數據庫名稱。對于一個新初始化的系統,首次連接使用template1數據庫。 | $PGDATABASE |
主機名 | HAWQ master的主機名。缺省主機時localhost。 | $PGhost |
端口 | HAWQ master實例運行的端口號。缺省是5432。 | $PGPORT |
用戶名 | 連接數據庫的用戶(角色)名稱。與操作系統用戶名相同的用戶名不需要此參數。注意,每個HAWQ系統都有一個在初始化時自動創建的超級用戶賬號。這個賬號與初始化HAWQ系統的操作系統用戶同名(典型地是gpadmin)。 | $PGUSER |
psql -d mytest -h hdp3 -p 5432 -U `gpadmin`psql mytestpsql 如果一個用戶定義的數據庫還沒有創建,可以通過連接template1數據庫訪問系統。例如:psql template1 連接數據庫后,psql提供一個由當前連接的數據庫名后跟=>構成的提示符(超級用戶是=#)。例如:mytest=> 在提示符下,可以鍵入SQL命令。一個SQL命令必須以;(分號)結束,以發送到訴服務器執行。例如:select * from mytable; psql常用命令與mysql命令行的比較如表5所示。
功能描述 | psql | mysql |
聯機幫助 | help:簡要幫助 /?:psql命令幫助 /h:SQL命令幫助 | help、?、/?、/h:都是等價的簡要幫助。后面可以跟SQL命令,顯示詳細的命令語法 |
執行SQL | 分號或/g | 分號、/g或/G |
退出 | /q | /q、exit或quit |
列出所有數據庫 | /l | show databases; |
改變當前連接的數據庫 | /c DBNAME | use db_name; |
列出內部表 | /dt | show tables; |
列出外部表 | /dx | 無 |
表的描述 | /d NAME | desc tbl_name; |
列出索引 | 目前不支持索引 | show index from tbl_name; |
列出視圖 | /dv | show tables; |
列出序列 | /ds | 無 |
列出系統表 | /dtS+ | show tables from mysql; show tables from information_schema; show tables from performance_schema; |
問題 | 解決方案 |
No pg_hba.conf entry for host or user | 為了讓HAWQ接受遠程客戶端連接,必須配置HAWQ的master實例上配置位于master實例數據目錄下的pg_hba.conf文件,在該文件中增加適當的條目,允許客戶端主機和數據庫用戶連接到HAWQ。 |
HAWQ is not running | 如果HAWQ master實例宕機,用戶將不能連接。可以在HAWQ master上運行hawq state應用程序,驗證HAWQ系統正在運行。 |
Network problem Interconnect timeouts | 當用戶從遠程客戶端連接到HAWQ master時,網絡問題可能阻止連接,例如,DNS主機名解析問題,主機系統斷網等等。為了確認不是網絡問題,從遠程客戶端所在主機連接HAWQ master所在主機。例如:ping hostname。 如果系統不能解析HAWQ主機IP地址所涉及的主機名,查詢和連接將失敗。有些操作使用localhost進行連接,而另一些操作使用實際的主機名,所以兩種情況都必須能正確解析。如果碰到連接錯誤,首先核實能夠從HAWQ master所在主機連接到集群主機。在master和所有段的/etc/hosts文件中,確認有HAWQ集群中所有主機的正確的主機名和IP地址。127.0.0.1必須被解析成localhost。 |
Too many clients already | 缺省時,HAWQ master和segment允許的最大并發連接數分別是200和1280。超出此限制的連接將被拒絕。這個限制由master實例的max_connections參數和segment實例的seg_max_connections參數所控制。如果修改了master的設置,也必須在segment節點上做適當的修改。 |
Query failure | HAWQ集群網絡中必須配置DNS反向解析。如果DNS反向解析沒有配置,失敗的查詢將在HAWQ master的日志文件中產生“Failed to reverse DNS lookup for ip <ip-address>”警告消息。 |
新聞熱點
疑難解答