GB | BIG5
|
| 首頁 > 數據庫 > 其它 > 正文 |
 |
| PostgreSQL7.0手冊-管理員手冊-28. 安全性 |
| 編譯:何偉平 laser@zhengmai.com.cn (2001-04-21 22:45:49) |
第二十八章. 安全性
內容
用戶認証
用戶名和組
訪問控制
函數和規則
安全 TCP/IP 聯接
數據庫安全性分成幾個級別:
數據庫文件保護。所有在數據庫裡存儲的文件都受到保護,除了Postgres 超級用戶帳戶外其他用戶是不能讀取的。
缺省的時候,客戶端只能通過一個本地的 Unix 套接字聯接到數據庫服務器上來,而不是通過 TCP/IP 套接字。端必須帶 -i 選項啟動才能允許非本地的客戶端聯接上來。
可以通過在 PG_DATA 裡的 pg_hba.conf 文件來限制可聯接的客戶端 IP 地址和/或用戶名。
客戶端聯接可以通過其他外部軟件包來認証。
Postgres 裡的每個用戶都賦予了一個用戶名和一個(可選的)口令。缺省是,用戶對不是他們創建的數據庫沒有寫權限。
用戶可以賦予組,而且表的訪問權限可以以組權限為基礎設置。
用戶認証
認証是端服務器和 postmaster 認定正在請求訪問數據的用戶就是他/她自稱的那個人的過程。所有激活Postgres 的用戶都對照 pg_user 表的內容進行檢查以確保他們有這做的權限(激活數據庫)。不過,對用戶的實際身份的的核對是通過好幾種方式進行的:
從用戶 shell 來的用戶
從用戶 shell 啟動的端數據庫服務器在進行一個 setuid 調用把用戶標識轉為用戶 postgres 之前要檢查用戶的(有效的)用戶標識。有效的用戶標識被當作訪問控制檢查的基礎。不進行其他的認証。
從網絡來的用戶
如果 Postgres 系統是為分布(處理)制作的,任何人都可以訪問postmaster 進程的網際網的 TCP 端口。DBA 配置在 PGDATA 目錄裡的 pg_hba.conf 文件,根據訪問從哪個主機來和要訪問哪個數據庫聲明需要採用的認証方式。參閱 pg_hba.conf(5) 獲取一份可以使用的認証系統的描述。當然,在 Unix 裡,以主機為基礎的認証也不是無懈可擊的。有能力的入侵者也可能偽裝源主機(地址)。那些安全性問題超越了Postgres 的范疇。
以主機為基礎的訪問控制
以主機為基礎的訪問控制 是 PostgreSQL 決定哪些客戶端可以訪問數據庫以及那些客戶端上的用戶如何認証他們自己的基本控制的名稱。
每個數據庫系統都包含一個文件叫 pg_hba.conf,在其 PGDATA 目錄裡,該文件控制誰可以聯接到各自的數據庫。
每個正在訪問數據庫的客戶端必須被 pg_hba.conf 裡的其中一條記錄涵蓋。否則所有從那個客戶端發送上來的聯接請求都將被拒絕,錯誤信息為 "User authentication failed" (用戶認証失敗)。
文件 pg_hba.conf 的常用格式是一套記錄,每行一條。空白行或者雜亂符號("#")開頭的行被忽略。一條記錄是由若幹用空格和/或 tab 分隔的字段組成。
從客戶端來的聯接可以使用 Unix 域套接字或者網際網域套接字(例如:TCP/IP)建立。用 Unix 域套接字進行的聯接是用下面格式的記錄進行控制的:
local database authentication method
這裡
database 聲明記錄所應用的數據庫。值 all 表明該記錄應用所有數據庫。
authentication method 聲明一個用戶在用 Unix 域套接字與該數據庫聯接時用認証他們自身的方法。不同的方法在下面描述。
用網際網(IP)域套接字進行的聯接是用下面格式的記錄進行控制的:
host database TCP/IP address TCP/IP mask authentication method
TCP/IP address 邏輯上與聲明的 TCP/IP mask 和正在聯接的客戶端的 TCP/IP 地址分別相加。如果兩個結果相等則該記錄用這次聯接。如果一個聯接匹配多一條記錄,那使用文件裡第一條匹配的記錄。 TCP/IP address 和 TCP/IP mask 都是用點分十進制符號表示的。
如果一個聯接不能和任何記錄相匹配,則應用拒絕認証方法(見下文)。
認証方法
下面的認証方法可用 Unix 和 TCP/IP 域套接字:
trust
無條件允許聯接。
reject
無條件拒絕聯接。
crypt
客戶端被要求向用戶請求一個口令。該口令被加密(使用 crypt(3))發送,然與放在 pg_shadow 表裡的口令進行比較。如果口令匹配,則允許聯接。
password
客戶端被要求向用戶請求一個口令。該口令以明文發送,然與放在 pg_shadow 表裡的口令進行比較。如果口令匹配,則允許聯接。可以在 password 關鍵字面聲明一個可選的文件名,用提供對應的口令而不是使用 pg_shadow 表裡面的。參閱 pg_passwd。
下面的認証方式只能用 TCP/IP 域套接字:
krb4
Kerberos V4 用認証用戶。
krb5
Kerberos V5 用認証用戶。
ident
在客戶端的 ident 服務器用認証該用戶(RFC 1413)。可以在 ident 關鍵字面聲明一個可選的映射名,這樣允許 ident 用戶名映射成Postgres 用戶名。映射放在文件 $PGDATA/pg_ident.conf 裡。
例子
# Trust any connection via Unix domain sockets.
local trust
# Trust any connection via TCP/IP from this machine.
host all 127.0.0.1 255.255.255.255 trust
# We don't like this machine.
host all 192.168.0.10 255.255.255.0 reject
# This machine can't encrypt so we ask for passwords in clear.
host all 192.168.0.3 255.255.255.0 password
# The rest of this group of machines should provide encrypted passwords.
host all 192.168.0.0 255.255.255.0 crypt
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
用戶名和組
要定義一個新用戶,運行工具程序 createuser。
要把一個用戶或者一套用戶指派到一個新組,我們必須先定義該組,然分派用戶到該組中去。在Postgres 裡,這些步驟目前還不被一條 create group 命令支持(譯注:已經支持了)。代替的做法是,向 pg_group 系統表裡插入一些合適的值,然用 grant 命令給組賦予權限。
創建用戶
創建組
目前,我們還沒有簡便的方法設置用戶組。你必須顯式地插入/更新 pg_group 表。例如:
jolly=> insert into pg_group (groname, grosysid, grolist)
jolly=> values ('posthackers', '1234', '{5443, 8261}');
INSERT 548224
jolly=> grant insert on foo to group posthackers;
CHANGE
jolly=>
pg_group 裡的域是:
groname
組名稱。這個名稱應該是純數字和字母組成。不要包含下劃線和其他標點。
grosysid
組標識。這是一個 int4。這個字段應該在各個組之間唯一。
grolist
屬這個組的 pg_user id (標識)的列表。這個字段是一個 int4[]。
把用戶分派到組
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
訪問控制
Postgres 提供允許用戶限制其他用戶對他提供的數據的訪問的機制。
數據庫超級用戶
數據庫超級用戶(也就是說,擁有設置了 pg_user.usesuper 字段的用戶)超越下面描述的所有訪問控制,只有兩點例外:如果用戶沒有設置了的 pg_user.usecatupd 字段,則不允許手工更新系統表,第二點是決不允許刪除(或者更改表結構)系統表。
訪問權限
限制用戶對表的讀,寫和設置規則的的訪問權限在 grant/revoke(l) 裡描述。
表刪除和表結構修改
象 alter,drop table,和 drop index 這樣的刪除或者修改現有表的命令只能由表的所有者執行。還有上面提到的,決不允許對系統表進行這些操作。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
函數和規則
函數和規則允許用戶在其他用戶可能不知道的情況下向端服務器裡插入代碼。因此,兩種機制都允許用戶使用特洛伊木馬對付其他用戶。唯一有效的保護措施是牢牢控制誰可以定義函數(即是向關系中寫入 SQL 域)和規則。我們還建議在 pg_class,pg_user 和 pg_group 上設置跟蹤和警告器。
函數
用 SQL 以外的語言寫的在端服務器進程裡運行的函數擁有用戶 postgres 的權限(端服務器帶著設置為 postgres 的真實有效的用戶標識運行。)用戶有可能從一個被信任的函數裡面修改服務器的內部數據結構。因此,除了別的問題外,這樣的函數可以巧取任何系統訪問控制。這是一個用戶定義的 C 函數的固有毛病。
規則
就象 SQL 函數一樣,規則總是以激活端服務器的用戶的標識和權限運行。
注意事項
我們沒有計劃準備顯式地支持 Postgres 內部數據的加密(當然我們無法阻止用戶在用戶定義函數裡對數據進行加密)。我們也沒有計劃準備顯式地支持加密的網絡聯接,那樣將導致前/端協議的完全重寫。
用戶名,組名和相關系統標識(比如,pg_user.usesysid 的內容)都是假設在整個數據庫裡唯一的。如果不是這樣,會造成不可預料的結果。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
安全 TCP/IP 聯接
作者:來自一封 Gene Selkov, Jr. 的 e-mail。 1999-09-08 為回答 Eric Marsden 的一個問題而作。
我們可以使用 ssh 來對 Postgres 服務器和客戶端之間的網絡聯接進行加密。經過適當處理,這樣做可以獲得一個足夠安全的網絡聯接。
ssh 的文檔提供了前期了解所需的大多數信息。請參考 http://www.heimhardt.de/htdocs/ssh.html 獲取更多信息。
我們可以只用兩個步驟做一次分步解釋。
通過 shh 運行一個安全的通道
我們可以只用兩個步驟做一次分步解釋。
建立一個與端機器的通道,象這樣:
ssh -L 3333:wit.mcs.anl.gov:5432 postgres@wit.mcs.anl.gov
-L 參數的第一個數字 3333,是通道你這端的端口號。第二個數字,5432,是通道的遠端 -- 你的端使用的端口號。在兩個端口號之間的名稱或者地址屬服務器機器,ssh 的最一個參數也是屬服務器機器,它還包括可選的用戶名。如果沒有用戶名,ssh 將使用你登錄到客戶端機器的這個用戶名。你可以使用任何服務器機器接受的用戶名,而不一定是那些與 postgres 有關的。
既然你已經有了一個正在運行的 ssh 會話,那你就可以把一個 postgres 客戶端與你本地主機上的那個你在上一步裡聲明的端口號聯接了。如果是psql,你將需要另一個 shell,因為你在第一步裡使用的 shell 會話現在被 ssh 佔著呢。
psql -h localhost -p 3333 -d mpw
注意你必須聲明 -h 參數以便讓你的客戶端使用 TCP 套接字而不是 Unix 套接字。如果你選擇 5432 作為通道你這一端的端口,你可以省略端口參數。
--------------------------------------------------------------------------------
(http://www.fanqiang.com)
進入【UNIX論壇】
|
|
| 相關文章 |
PostgreSQL7.0手冊-附錄-文檔 (2001-04-21 23:50:44) PostgreSQL7.0手冊-附錄-日期/時間支持-CVS 倉庫 (2001-04-21 23:48:48) PostgreSQL7.0手冊-教程 -73. Postgres SQL 高級特性 (2001-04-21 23:45:36) PostgreSQL7.0手冊-教程 -72. 查詢語言 (2001-04-21 23:44:40) PostgreSQL7.0手冊-教程 -71. 開始 (2001-04-21 23:42:54) PostgreSQL7.0手冊-教程 -70. 體系結構 (2001-04-21 23:41:58) PostgreSQL7.0手冊-教程 -69. SQL (2001-04-21 23:41:23) PostgreSQL7.0手冊-開發者手冊 -68. 分頁文件 (2001-04-21 23:39:22) PostgreSQL7.0手冊-開發者手冊 -67. 端接口 (2001-04-21 23:38:34) PostgreSQL7.0手冊-開發者手冊 -66. gcc 缺省優化 (2001-04-21 23:37:20)
|
===更多相關=== |
|
|
 |
★ 樊強制作 歡迎分享 ★ |