自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Oracle最佳替代者PostgreSQL數(shù)據(jù)庫(kù)的整體安全性

安全 數(shù)據(jù)安全 PostgreSQL
在傳統(tǒng)的 UNIX 中,PostgreSQL 被進(jìn)行了重新設(shè)計(jì)來(lái)補(bǔ)充它所依附的操作系統(tǒng)。要最大限度地發(fā)掘 PostgreSQL 的價(jià)值,所需要的知識(shí)超過(guò)了一般數(shù)據(jù)庫(kù)管理員(DBA)所要求具備的技能。

數(shù)據(jù)庫(kù)安全性是如今基于 Web 的應(yīng)用程序面對(duì)的最大挑戰(zhàn)。如果不加以控制,您將面臨公司敏感信息被曝光的風(fēng)險(xiǎn),更糟糕的是,珍貴的客戶(hù)信息也將面臨被泄露的風(fēng)險(xiǎn)。在本文中,了解可以用來(lái)保護(hù)您的 PostgreSQL 數(shù)據(jù)庫(kù)的安全措施。

簡(jiǎn)介

報(bào)紙上經(jīng)常出現(xiàn)黑客襲擊企業(yè)數(shù)據(jù)庫(kù)的報(bào)道。大多數(shù)攻擊由叛逆的未成年人發(fā)起的日子已經(jīng)一去不復(fù)返。如今,數(shù)據(jù)收集成為了一項(xiàng)重要的事業(yè),并且由在企業(yè)基礎(chǔ)設(shè)施中工作的專(zhuān)家專(zhuān)門(mén)負(fù)責(zé)。問(wèn)題已經(jīng)不再是您如何 阻止未授權(quán)的訪(fǎng)問(wèn)企圖 — 您無(wú)法阻止 — 而在于您在發(fā)生這種情況時(shí)如何降低 影響。

本文討論了在保護(hù)您的 PostgreSQL(也稱(chēng)為 Postgres)數(shù)據(jù)庫(kù)服務(wù)器時(shí)遇到的挑戰(zhàn)。PostgreSQL 是一款強(qiáng)大的開(kāi)源對(duì)象-關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。它擁有一個(gè)可靠的架構(gòu)并以可靠性、數(shù)據(jù)完整性和準(zhǔn)確性著稱(chēng)。它運(yùn)行在所有主流操作系統(tǒng)之上,包括 Linux®、UNIX® 和 Windows®。它與 ACID 完全兼容,并且充分支持外鍵、連接、視圖、觸發(fā)器和存儲(chǔ)過(guò)程(支持多種語(yǔ)言)。

理想的管理員

在傳統(tǒng)的 UNIX 中,PostgreSQL 被進(jìn)行了重新設(shè)計(jì)來(lái)補(bǔ)充它所依附的操作系統(tǒng)。要最大限度地發(fā)掘 PostgreSQL 的價(jià)值,所需要的知識(shí)超過(guò)了一般數(shù)據(jù)庫(kù)管理員(DBA)所要求具備的技能。

簡(jiǎn)單來(lái)說(shuō),一名合格的 PostgreSQL DBA 需要具備以下背景:

•了解關(guān)系理論并熟悉 SQL'92, '99, 和 2003。
•知道如何閱讀源代碼,特別是 C 代碼,并且能夠在 Linux 上編譯源代碼。
•能夠管理系統(tǒng)并熟悉 system-V UNIX 或 Linux。
•能夠維護(hù)(如果需要的話(huà))IT 組織中出現(xiàn)的各種典型硬件項(xiàng)目。理解 TCP OS 層,能夠?qū)⒕W(wǎng)絡(luò)分為子網(wǎng),調(diào)優(yōu)防火墻,等等。
許 多 DBA 只具備管理、監(jiān)控和調(diào)優(yōu)數(shù)據(jù)庫(kù)本身的技能。然而,PostgreSQL 在構(gòu)建時(shí)也考慮了 OS 工具。當(dāng)然,很少有 DBA 精通所有學(xué)科的知識(shí),但是擁有這些知識(shí)使 PostgreSQL DBA 能夠用更少的時(shí)間完成更多的工作,而通過(guò)其他方式是無(wú)法辦到的。

訪(fǎng)問(wèn)權(quán)限回顧

如果您要了解可能的攻擊媒介(attack vector),那么了解數(shù)據(jù)庫(kù)角色的作用是非常重要的。首先,您需要通過(guò)授予和撤銷(xiāo)權(quán)限來(lái)控制對(duì)數(shù)據(jù)的訪(fǎng)問(wèn)。

角色、授予權(quán)限和特權(quán)

一個(gè)具有默認(rèn)權(quán)限和特權(quán)的普通角色的安全性究竟如何?用戶(hù)帳戶(hù)可以通過(guò)以下命令的其中之一創(chuàng)建:

•SQL 語(yǔ)句 CREATE USER
•SQL 語(yǔ)句 CREATE ROLE
•Postgres 命令行實(shí)用程序 createuser
這三種創(chuàng)建用戶(hù)帳戶(hù)的方法表現(xiàn)出不同的行為,并導(dǎo)致產(chǎn)生截然不同的默認(rèn)權(quán)限和特權(quán)。

對(duì)于一個(gè)普通角色,典型的用戶(hù)可以執(zhí)行下面的操作:

•如果數(shù)據(jù)集群使用如 pg_hba.conf 中描述的默認(rèn)身份驗(yàn)證策略,那么用戶(hù)可以訪(fǎng)問(wèn)任何數(shù)據(jù)庫(kù)。
•在用戶(hù)可以訪(fǎng)問(wèn)的任何數(shù)據(jù)庫(kù)的 PUBLIC 模式中創(chuàng)建對(duì)象。
•在臨時(shí)會(huì)話(huà)中創(chuàng)建會(huì)話(huà)(臨時(shí))對(duì)象,比如模式 pg_temp_?
•修改運(yùn)行時(shí)參數(shù)。
•創(chuàng)建用戶(hù)定義函數(shù)
•執(zhí)行在 PUBLIC 模式中由其他用戶(hù)創(chuàng)建的用戶(hù)定義函數(shù)(只要處理的是用戶(hù)有權(quán)訪(fǎng)問(wèn)的對(duì)象 。
一定要清楚用戶(hù)所具有的權(quán)限,但是,了解普通用戶(hù)在默認(rèn)情況下不可以做什么也同樣重要。普通用戶(hù)無(wú)權(quán)執(zhí)行以下操作:

•創(chuàng)建數(shù)據(jù)庫(kù)或模式。
•創(chuàng)建其他用戶(hù)。
•訪(fǎng)問(wèn)由其他用戶(hù)創(chuàng)建的對(duì)象。
•登錄(只適合語(yǔ)句 CREATE ROLE)。
超級(jí)用戶(hù)權(quán)限和特權(quán)

盡管普通用戶(hù)無(wú)權(quán)執(zhí)行被定義為超級(jí)用戶(hù)功能的權(quán)限和特權(quán),但是普通用戶(hù)仍然會(huì)引起一些與默認(rèn)權(quán)限和特權(quán)有關(guān)的問(wèn)題。

本文將討論一些可由普通用戶(hù)操作的攻擊媒介。

訪(fǎng)問(wèn)對(duì)象

一項(xiàng)極其常見(jiàn)且不太安全的實(shí)踐發(fā)生在將 PostgreSQL 用作 Web 服務(wù)器的后端時(shí)。開(kāi)發(fā)人員創(chuàng)建普通用戶(hù)的目的只是讓其使用 INSERT、UPDATE 和 DELETE 命令來(lái)執(zhí)行數(shù)據(jù)操作命令。然而,未經(jīng)授權(quán)的操作也可能會(huì)被執(zhí)行,因?yàn)?PUBLIC 模式是公開(kāi)給所有人的。例如,用戶(hù)可以對(duì)這些表進(jìn)行數(shù)據(jù)挖掘。甚至還可以對(duì)表進(jìn)行修改:添加規(guī)則和觸發(fā)器、將數(shù)據(jù)保存到 PUBLIC 模式中的表,隨后這些數(shù)據(jù)就會(huì)被收集。

記住,一個(gè)被盜用的用戶(hù)帳戶(hù)可以對(duì)它所擁有的對(duì)象做任何事情。

#p#

對(duì)這類(lèi)威脅的反擊很簡(jiǎn)單:不要讓普通用戶(hù)訪(fǎng)問(wèn)或創(chuàng)建任何內(nèi)容。清單 1 展示了如何對(duì)一個(gè)表提供保護(hù)。


清單 1. 對(duì)表提供保護(hù)

    postgres=# SET SESSION AUTHORIZATION postgres;SETpostgres=# CREATE ROLE user1 WITH LOGIN UNENCRYPTED PASSWORD '123';CREATE ROLEpostgres=# CREATE SCHEMA user1 CREATE TABLE t1(i int);CREATE SCHEMApostgres=# INSERT INTO user1.t1 VALUES(1);INSERT 0 1postgres=# GRANT USAGE ON SCHEMA user1 TO user1;GRANTpostgres=# SELECT I FROM user1.t1; i--- 2(1 row)postgres=# SET SESSION AUTHORIZATION user1;SETpostgres=> SELECT I FROM user1.t1;ERROR:  permission denied for relation t1postgres=> SET SESSION AUTHORIZATION postgres;SETpostgres=# GRANT SELECT ON user1.t1 TO user1;GRANTpostgres=# SET SESSION AUTHORIZATION user1;SETpostgres=> SELECT I FROM user1.t1; i--- 2(1 row)            

 

清單 2 演示了對(duì) PUBLIC 模式的訪(fǎng)問(wèn)被禁止。


清單 2. 禁止角色 user1 創(chuàng)建任何實(shí)體

    postgres=> SET SESSION AUTHORIZATION postgres;SETpostgres=# REVOKE ALL PRIVILEGES ON SCHEMA PUBLIC FROM user1;REVOKEpostgres=# SET SESSION AUTHORIZATION user1;SETThe error message of "ERROR:  permission denied for schema user1" means that this    defensive measure works:postgres=> CREATE TABLE X;ERROR:  permission denied for schema user1

 

訪(fǎng)問(wèn)由其他用戶(hù)控制的對(duì)象

如下面清單 3 所示的攻擊媒介假設(shè)用戶(hù)可以訪(fǎng)問(wèn) PUBLIC 模式;例如,GRANT USAGE ON SCHEMA PUBLIC TO user1。它以下面的假設(shè)作為前提:

•所有用戶(hù)在默認(rèn)情況下都有權(quán)訪(fǎng)問(wèn)集群中的任何數(shù)據(jù)庫(kù)。
•假設(shè)集群允許用戶(hù)創(chuàng)建并操作 PUBLIC 模式中的所有實(shí)體。
•一個(gè)普通用戶(hù)帳戶(hù)有權(quán)訪(fǎng)問(wèn)系統(tǒng)目錄。否則,用戶(hù)帳戶(hù)不能正常工作(固有的 PostgreSQL 服務(wù)器行為)。

清單 3. 收集有關(guān)表的信息

    postgres=> SELECT * FROM user1.t2;ERROR:  permission denied for relation t2postgres=> insert into user1.t2 values(10);ERROR:  permission denied for relation t2postgres=>postgres=> \d        List of relations Schema | Name | Type  |  Owner--------+------+-------+---------- user1  | t1   | table | postgres user1  | t2   | table | postgres(2 rows)postgres=> \d t?        Table "user1.t1" Column |  Type   | Modifiers--------+---------+----------- i      | integer |        Table "user1.t2" Column |  Type   | Modifiers--------+---------+----------- i      | integer |            

 

盡管可能無(wú)法訪(fǎng)問(wèn)表,但是用戶(hù)仍然可以收集有關(guān)表的信息。

清單 4 展示了用戶(hù)帳戶(hù) user1 獲取了一組用戶(hù)帳戶(hù)及其各自的屬性。普通用戶(hù)自己無(wú)法訪(fǎng)問(wèn)密碼。


清單 4. 獲取用戶(hù)帳戶(hù)的屬性

    postgres=> select * from pg_user; usename | usesysid | usecreatedb | usesuper | usecatupd | passwd | valuntil | useconfig----------+----------+-------------+----------+-----------+----------+----------postgres | 10 | t | t | t | ******** | | user1 | 18770 | f | f | f | ******** | |(2 rows)

 

所有用戶(hù)默認(rèn)情況下都能夠獲得集群的定義和模式。

清單 5 展示了一個(gè)可以獲得有關(guān)集群完整定義模式的信息的腳本,方法就是查詢(xún)系統(tǒng)目錄。系統(tǒng)目錄可以被超級(jí)用戶(hù)修改或解密,從而減輕了這一威脅。


清單 5. 提取集群范圍內(nèi)的定義

    #!/bin/bashpsql mydatabase << _eof_set search_path=public,information_schema,pg_catalog,pg_toast;\t\o list.txtSELECT n.nspname||'.'||c.relname as "Table Name"FROM pg_catalog.pg_class c JOIN pg_catalog.pg_roles r ON r.oid = c.relowner LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespaceWHERE c.relkind IN ('r','')ORDER BY 1;\q_eof_for i in $( cat list.txt ); do psql -c "\d $i"done            

 

創(chuàng)建和訪(fǎng)問(wèn)由用戶(hù)定義的函數(shù)

函數(shù)也分為可信的或不可信的??尚诺?過(guò)程語(yǔ)言在數(shù)據(jù)庫(kù)上下文內(nèi)執(zhí)行指令,比如創(chuàng)建表、索引,添加或移除數(shù)據(jù),等等。不可信的 過(guò)程語(yǔ)言(除了可信的特性外)也能夠影響真實(shí)的世界,比如列出目錄的內(nèi)容,創(chuàng)建或刪除文件,調(diào)用系統(tǒng)進(jìn)程,甚至是創(chuàng)建與其他主機(jī)的套接字連接。


清單 6. 向數(shù)據(jù)庫(kù)添加過(guò)程語(yǔ)言并恢復(fù)對(duì) user1 的訪(fǎng)問(wèn)

    postgres=# create language plpgsql;CREATE LANGUAGEpostgres=# create language plperlu;CREATE LANGUAGEpostgres=# create language plperl;CREATE LANGUAGEpostgres=> SET SESSION AUTHORIZATION postgres;SETpostgres=# GRANT USAGE ON SCHEMA PUBLIC TO user1;GRANT            

 

清單 7. 可信 vs. 不可信過(guò)程語(yǔ)言

    postgres=# select lanname as language, lanpltrusted as trusted from pg_language; language | trusted----------+--------- internal | f c        | f sql      | t plperlu  | f plperl   | t(5 rows)            

 

與表不同的是,普通用戶(hù)帳戶(hù)在調(diào)用某些用戶(hù)的函數(shù)時(shí)不需要特殊權(quán)限,即使是由超級(jí)用戶(hù)創(chuàng)建的函數(shù)也是如此。


清單 8. 調(diào)用超級(jí)用戶(hù)的函數(shù)

    postgres=# SET SESSION AUTHORIZATION postgres;SETpostgres=# CREATE OR REPLACE FUNCTION public.f1 (postgres(# OUT x textpostgres(# ) ASpostgres-# $body$postgres$# select 'hello from f1'::text;postgres$# $body$postgres-# LANGUAGE SQL;CREATE FUNCTIONpostgres=# SET SESSION AUTHORIZATION user1;SETpostgres=>postgres=> SELECT * FROM f1; x----------------- hello from f1(1 row)

 

下面清單 9 中的函數(shù)由超級(jí)用戶(hù)通過(guò) plperlu 創(chuàng)建。它返回目錄的內(nèi)容;user1 可以調(diào)用這個(gè)函數(shù)。一個(gè)普通用戶(hù)可以同時(shí)調(diào)用可信函數(shù)和不可信函數(shù)。要應(yīng)對(duì)這種威脅,最好的方法是通過(guò)撤銷(xiāo)權(quán)限來(lái)拒絕對(duì)函數(shù)的訪(fǎng)問(wèn)。


清單 9. 函數(shù)被未授權(quán)的用戶(hù)利用

    postgres=> SET SESSION AUTHORIZATION postgres;SETpostgres=# CREATE OR REPLACE FUNCTION public.f2 (postgres(# OUT x textpostgres(# ) ASpostgres-# $body$postgres$# # output the root directory contents into standard outputpostgres$# # notice the use of the single back tickspostgres$# $a = `ls -l / 2>/dev/null`;postgres$# $message = "\nHere is the directory listing\n".$a;postgres$# return $message;postgres$# $body$postgres-# LANGUAGE PLPERLU;CREATE FUNCTIONpostgres=# SET SESSION AUTHORIZATION user1;SETpostgres=> SELECT * FROM f2; x---------------------------------------------------------------------------- Here is the directory listing total 120 drwxr-xr-x 2 root root 4096 Aug 29 07:03 bin drwxr-xr-x 3 root root 4096 Oct 11 05:17 boot drwxr-xr-x 3 root root 4096 Nov 26 2006 build lrwxrwxrwx 1 root root 11 Aug 22 2006 cdrom -> media/cdrom drwxr-xr-x 15 root root 14960 Oct 12 07:35 dev drwxr-xr-x 118 root root 8192 Oct 12 07:36 etc(1 row)            

 

清單 10. 針對(duì) user1 和組 PUBLIC 提供保護(hù)

    postgres=# SET SESSION AUTHORIZATION postgres;SETpostgres=# REVOKE ALL ON FUNCTION f2 FROM user1, GROUP PUBLIC;REVOKEpostgres=# SET SESSION AUTHORIZATION user1;SETpostgres=> SELECT * FROM f2;ERROR: permission denied for function f2postgres=>

 

清單 11 展示了信息收集。


清單 11. 獲取函數(shù)的源代碼

    postgres=> SET SESSION AUTHORIZATION user1;SETpostgres=> select prosrc as "function f3" from pg_proc where proname='f3'; function f3---------------# output the root directory contents into standard output# notice the use of the single back ticks $a = `ls -l / 2>/dev/null`; $message = "\nHere is the directory listing\n".$a; return $message;(1 row)

#p#

要隱藏這些源代碼:

•使用原生語(yǔ)言環(huán)境(C、Perl、Python 等)將函數(shù)編寫(xiě)為一個(gè)模塊并存儲(chǔ)到主機(jī)的硬盤(pán)中。隨后在 PostgreSQL 中創(chuàng)建一個(gè)抽象的用戶(hù)定義函數(shù)來(lái)調(diào)用該模塊。
•考慮在一個(gè)表中編寫(xiě)源代碼并在需要時(shí)動(dòng)態(tài)創(chuàng)建函數(shù)。
•在集群的另一個(gè)數(shù)據(jù)庫(kù)中編寫(xiě)您的用戶(hù)定義函數(shù),該函數(shù)將由另一個(gè)已授權(quán)用戶(hù)帳戶(hù)通過(guò) dblink 模塊調(diào)用。
使用 security definer

security definer 使用創(chuàng)建函數(shù)的用戶(hù)所擁有的特權(quán)執(zhí)行函數(shù)。因此,用戶(hù)可以訪(fǎng)問(wèn)在平常狀態(tài)下不可用的表。

例如,如清單 12 所示,一個(gè)包含兩個(gè)列的表在模式 Postgres 中由超級(jí)用戶(hù) postgres 創(chuàng)建。普通用戶(hù) user1 將使用 security definer 參數(shù)調(diào)用該函數(shù)并根據(jù)輸入值獲得一個(gè)值。


清單 12. 創(chuàng)建一個(gè)表和函數(shù)

    postgres=# SET SESSION AUTHORIZATION postgres;SETpostgres=# CREATE TABLE postgres.t4(x serial,y numeric);NOTICE: CREATE TABLE will create implicit sequence "t4_x_seq" for serial column "t4.x"CREATE TABLEpostgres=# INSERT INTO postgres.t4(y) VALUES (random::numeric(4,3));INSERT 0 1postgres=# INSERT INTO postgres.t4(y) VALUES (random::numeric(4,3));INSERT 0 1postgres=# INSERT INTO postgres.t4(y) VALUES (random::numeric(4,3));INSERT 0 1postgres=# INSERT INTO postgres.t4(y) VALUES (random::numeric(4,3));INSERT 0 1postgres=# INSERT INTO postgres.t4(y) VALUES (random::numeric(4,3));INSERT 0 1postgres=# CREATE OR REPLACE FUNCTION public.f4 (postgres(# IN a int,postgres(# OUT b numericpostgres(# ) RETURNS SETOF numeric ASpostgres-# $body$postgres$# select y from postgres.t4 where x=$1 limit 1;postgres$# $body$postgres-# LANGUAGE SQL SECURITY DEFINER;CREATE FUNCTION            

 

清單 13 表明用戶(hù)帳戶(hù) user1 現(xiàn)在可以訪(fǎng)問(wèn)所需的信息。


清單 13. 未授權(quán)角色通過(guò)一個(gè)函數(shù)調(diào)用訪(fǎng)問(wèn)表

    postgres=# SET SESSION AUTHORIZATION user1;SETpostgres=> SELECT b as "my first record" FROM f4(1); my first record----------------- 0.379(1 row)postgres=> SELECT b as "my second record" FROM f4(2); my second record------------------ 0.200(1 row)            破解 PostgreSQL 密碼

有效的密碼管理是保證 DBMS 安全性的關(guān)鍵。DBA 的職責(zé)就是實(shí)施一項(xiàng)獲得認(rèn)可的密碼策略。密碼應(yīng)當(dāng)由隨機(jī)選擇的字符組成,這些字符不具備可識(shí)別的模式。常見(jiàn)實(shí)踐表明密碼至少應(yīng)有 6 個(gè)字符并且需要經(jīng)常更換。

PostgreSQL 用戶(hù)帳戶(hù)和密碼

PostgreSQL 用戶(hù)帳戶(hù)安全策略主要與創(chuàng)建和管理用戶(hù)帳戶(hù)的 SQL 命令有關(guān):

•CREATE ROLE
•ALTER ROLE
•DROP ROLE
下面的 SQL 語(yǔ)句屬于比較舊的用戶(hù)帳戶(hù)管理(盡管有效,您仍然應(yīng)當(dāng)使用較新的技術(shù)管理用戶(hù)角色):

•CREATE GROUP
•ALTER GROUP
•DROP GROUP
•CREATE USER
•ALTER USER
•DROP USER
密碼可以以加密或非加密形式保存。非加密 密碼以明文形式存儲(chǔ),并且可以被超級(jí)用戶(hù)讀取。密碼的加密 包括生成并存儲(chǔ)其 MD5 散列,MD5 散列是無(wú)法讀取的。要在登錄時(shí)對(duì)密碼進(jìn)行驗(yàn)證,需要對(duì)密碼進(jìn)行散列化并將其與已經(jīng)存儲(chǔ)在數(shù)據(jù)集群中的密碼進(jìn)行比較。

下面是一些創(chuàng)建和管理密碼的示例方法:

•未使用密碼創(chuàng)建帳戶(hù): CREATE ROLE user1 WITH LOGIN;

•使用未加密密碼創(chuàng)建帳戶(hù): CREATE ROLE roger WITH LOGIN UNENCRYPTED PASSWORD '123'

•修改帳戶(hù)并分配一個(gè)加密過(guò)的密碼: ALTER ROLE user1 WITH ENCRYPTED PASSWORD '123'

由超級(jí)用戶(hù)對(duì)目錄表 pg_shadow 執(zhí)行一個(gè) SQL 查詢(xún),結(jié)果返回用戶(hù)帳戶(hù)名及其密碼。清單 4 展示了代碼。


清單 14. 從目錄獲得用戶(hù)的密碼

    postgres=# select usename as useraccount,passwd as "password" from pg_shadow wherelength(passwd)>1 order by usename; useraccount | password-------------+------------------------------------- user1 | md5173ca5050c91b538b6bf1f685b262b35 roger | 123(2 rows)            

 

清單 15 展示了如何為使用密碼 123 的 user1 生成 MD5 散列。


清單 15. 生成 MD5 密碼

    postgres=# select 'md5'||md5('123user1') as "my own generated hash",                   passwd as "stored hash for user1"             from pg_shadow where usename='user1'; my own generated hash | stored hash for user1-------------------------------------+------------------------------------- md5173ca5050c91b538b6bf1f685b262b35 | md5173ca5050c91b538b6bf1f685b262b35(1 row)

 

準(zhǔn)備好再受一次驚嚇了嗎?PostgreSQL 幾乎沒(méi)有提供任何機(jī)制以實(shí)施可靠的密碼策略。

可能的安全局限性包括:

•超級(jí)用戶(hù)無(wú)法對(duì)將用于密碼的字符限制最小字符數(shù)。
•盡管針對(duì)如何保存密碼(未加密的或已加密的 MD5 散列)的配置設(shè)置提供了一個(gè)默認(rèn)參數(shù),超級(jí)用戶(hù)無(wú)法強(qiáng)制用戶(hù)使用特定的存儲(chǔ)方法。
•不存在對(duì)用戶(hù)帳戶(hù)施加生命周期的機(jī)制。
•在集群的客戶(hù)機(jī)身份驗(yàn)證配置文件 pg_hba.conf 中,當(dāng)連接方法不是 PASSWORD 或 MD5 時(shí),控制用戶(hù)帳戶(hù)的有效生命周期的機(jī)制將變得無(wú)關(guān)緊要。
•由 ALTER ROLE 語(yǔ)句修改的用戶(hù)運(yùn)行時(shí)參數(shù),以及由超級(jí)用戶(hù)或文件 postgresql.conf 中的默認(rèn)配置設(shè)置的參數(shù),都可以由用戶(hù)帳戶(hù)的所有者隨意修改。
•重命名一個(gè)用戶(hù)帳戶(hù)將清除該帳戶(hù)的密碼,如果已被加密的話(huà)。
•無(wú)法跟蹤誰(shuí)對(duì)用戶(hù)帳戶(hù)做了修改或何時(shí)做了修改。
一個(gè)具有精心系統(tǒng)目錄設(shè)計(jì)的強(qiáng)有力的架構(gòu)可以為隨時(shí)保持警惕的 DBA 帶來(lái)回報(bào)。

由于存在各種各樣的危害,因此有關(guān)用戶(hù)帳戶(hù)和密碼的安全局限性需要用另一篇文章單獨(dú)詳細(xì)介紹。

#p#

破解密碼

實(shí)施一個(gè)強(qiáng)類(lèi)型的密碼是值得的,但是沒(méi)有辦法去判斷它的強(qiáng)度,除非有人破解它。破解實(shí)用程序主要基于兩種方法,如下所示。

蠻力攻擊(Brute force)
針對(duì)散列的系統(tǒng)化測(cè)試。它以一些字母為起點(diǎn),隨著攻擊的繼續(xù)不斷增加字母的長(zhǎng)度。這種方法被建議用于測(cè)試較短的密碼。
字典攻擊(Dictionary attack)
使 用一種社會(huì)工程(social-engineering)方法。破解程序使用一個(gè)單詞字典作為起點(diǎn)。此后,不斷組合這些單詞并針對(duì)捕捉到的散列進(jìn)行測(cè)試。 這種攻擊利用了一種錯(cuò)誤的觀(guān)念,即由有助于記憶的字符串和字符組合組成的長(zhǎng)字符串要比由隨機(jī)字符組成的稍微短一些的字符串更加安全。
根據(jù)密碼的強(qiáng)度以及使用的硬件,用于解密的時(shí)間可能從幾秒到幾個(gè)月不等。

DBA 對(duì)識(shí)別長(zhǎng)度小于 6 個(gè)字符的密碼比較感興趣。

命令行實(shí)用工具 MDCrack 使用蠻力攻擊法測(cè)試密碼。這個(gè) Windows 二進(jìn)制工具在 Linux under Wine 上也可以很好地工作。

輸入 wine MDCrack-sse.exe --help 將返回配置參數(shù)(switch)。其中一些如下面所示:

Usage: MDCrack [options...] --test-hash|hash       MDCrack [options...] --bench[=PASS]       MDCrack [options...] --resume[=FILENAME]|--delete[=FILENAME]       MDCrack [options...] --help|--about            

 

最簡(jiǎn)單的命令行調(diào)用是 wine MDCrack-sse.exe --algorithm=MD5 --append=$USERNAME $MD5_HASH,其中 $USERNAME 為用戶(hù)名,而 $MD5_HASH 是 pg_shadow 目錄文件中的 MD5 散列。

如下所示,MDCrack 可以在會(huì)話(huà)模式下運(yùn)行,因此您可以停止一個(gè)解密操作并在稍后繼續(xù)執(zhí)行。


清單 16. 在會(huì)話(huà)模式下運(yùn)行的 MDCrack

    # start sessionwine MDCrack-sse.exe --algorithm=MD5 --append=$USERNAME $MD5_HASH\ --session=mysessionfile.txt# resume using the last session modewine MDCrack-sse.exe --algorithm=MD5 --append=$USERNAME $MD5_HASH\ --resume=mysessionfile.txt            

 

默 認(rèn)字符集為 abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ。如果要測(cè)試的密碼包 含了不屬于默認(rèn)字符集的字符,那么您可以中止進(jìn)程。您可以將其修改為由字母和數(shù)字字符組成的任意組合。例如,您可能希望包含控制字符和標(biāo)點(diǎn)符號(hào)。

調(diào)整字符集是在命令行中完成的。變量 $CHARSET 表示將要使用的實(shí)際字符集:

wine MDCrack-sse.exe --algorithm=MD5 --append=$USERNAME $MD5_HASH --charset=$CHARSET            

 

下面的示例將修改 Postgres 密碼 123。如果忽略前三個(gè)字符,那么將得到 MD5 散列值 md5173ca5050c91b538b6bf1f685b262b35。您可以通過(guò)以下調(diào)用確定密碼(提示:對(duì)字符串 Collision found 執(zhí)行 grep 命令)。這次解密用了大約 0.32 秒:

wine MDCrack-sse.exe --algorithm=MD5 --append=user1 173ca5050c91b538b6bf1f685b262b35\| grep "Collision found"            

 

清單 17 演示了在系統(tǒng)目錄 pg_shadow 中解密密碼。


清單 17. 解密密碼

    wine MDCrack-sse.exe --algorithm=MD5 --append=user1 \`psql -t -c "select substring(passwd,4) from pg_shadow where usename='user1';"` \| grep "Collision found"            身份驗(yàn)證模型

您已經(jīng)知道了哪些部分會(huì)出現(xiàn)問(wèn)題,現(xiàn)在讓我們看看采取哪些措施來(lái)糾正錯(cuò)誤。身份驗(yàn)證是一個(gè)龐大的主題,因此這里只涉及一些基本的知識(shí)。

在 “身份驗(yàn)證” 這一龐大主題下,可以用許多種方法控制對(duì) Postgres 集群的訪(fǎng)問(wèn):

•UNIX 域套接字
•Ident 服務(wù)器身份驗(yàn)證
•LDAP 服務(wù)器身份驗(yàn)證
•PAM
•Kerberos
•SSL
UNIX 域套接字

一個(gè) UNIX 域套接字就是一個(gè)雙向通信管道,它在許多方面與文件相似。服務(wù)器創(chuàng)建域套接字,域套接字等待客戶(hù)機(jī)通過(guò)文件系統(tǒng)打開(kāi)文件。一個(gè)典型的 PostgreSQL 域套接字如下所示。

#p#


清單 18. 典型的域套接字

    robert@wolf:~$ ls -la /tmp|grep PGSQLsrwxrwxrwx 1 robert robert 0 2007-10-15 12:47 .s.PGSQL.5432-rw-------  1 robert robert   33 2007-10-15 12:47 .s.PGSQL.5432.lock            

 

注意,端口號(hào)被附加到文件名的末尾。將服務(wù)器重新配置為使用一個(gè)不同的 TCP/IP 端口也將改變域套接字的名稱(chēng)。

postgresql.conf 配置文件中的三個(gè)參數(shù)將控制對(duì)域套接字的權(quán)限:

•unix_socket_directory(文件 PATH)
•unix_socket_group(用戶(hù)組)
•unix_socket_permissions(默認(rèn)為 0777)
域套接字的位置因 Linux 發(fā)行版而異:

•PostgreSQL 源代碼安裝并將套接字放到 /tmp 目錄。
•BSD 將套接字放到 /tmp 目錄。
•RedHat 衍生系統(tǒng)將套接字放到 /tmp 目錄。
•Debian 衍生系統(tǒng)將套接字放到 /var/run/postgresql 且只具有對(duì) postgresqlaccount 的權(quán)限。
域套接字有一些比較特別的方面??紤]下面這個(gè)例子。

在 robert(超級(jí)用戶(hù))的主目錄中創(chuàng)建一個(gè)集群,并對(duì)可信性進(jìn)行了驗(yàn)證。但是,在服務(wù)器啟動(dòng)時(shí),域套接字的權(quán)限只允許除 robert 以外的用戶(hù)登錄。用戶(hù) robert 使用 TCP 登錄,但是被域套接字拒絕。然而,robert 在對(duì) nobody 執(zhí)行 sudo 后,他就可以通過(guò)域套接字登錄。

這個(gè)例子展示了文件權(quán)限的多樣性,從而減輕由于駭客成為超級(jí)用戶(hù)而引起的破壞。


清單 19. 權(quán)限

    robert@wolf:~$ initdb -A trust -U postgres ~/datarobert@wolf:~$ pg_ctl -D ~/data/ -l ~/logfile.txt \-o "-c unix_socket_permissions=007 -c unix_socket_directory=/tmp" startserver startingrobert@wolf:~$ psql -h localhost -U postgres -c "select 'superuser:this works' as msg"         msg---------------------- superuser:this works(1 row)robert@wolf:~$ psql -h /tmp -U postgres -c "select 'superuser:this fails' as msg"psql: could not connect to server: Permission denied        Is the server running locally and accepting        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?robert@wolf:~$ sudo su nobody[sudo] password for robert:$ psql -h localhost -U postgres -c "select 'nobody:this works' as msg"        msg------------------- nobody:this works(1 row)$ psql -h /tmp -U postgres -c "select 'nobody:this still works' as msg"           msg------------------------- nobody:this still works(1 row)            

 

#p#

Ident

Ident 服務(wù)器回答了一個(gè)簡(jiǎn)單的問(wèn)題:哪些用戶(hù)從您的端口 X 發(fā)起連接并連接到我的端口 Y? 在 PostgreSQL 服務(wù)器的環(huán)境下,它將通知正在嘗試登錄的用戶(hù)帳戶(hù)的 Identity 所在的 DBMS。PostgreSQL 隨后獲得這個(gè)問(wèn)題的答案,并根據(jù)由 DBA 在相應(yīng)配置文件中配置的規(guī)則集允許或拒絕登錄。

PostgreSQL Ident 服務(wù)器身份驗(yàn)證機(jī)制的工作原理是使用主機(jī)自己的 Ident 服務(wù)器,將 PostgreSQL 用戶(hù)帳戶(hù)映射到 UNIX 用戶(hù)帳戶(hù)。

下 面的例子假設(shè)所有 UNIX 用戶(hù)帳戶(hù)都已經(jīng)被映射到 PostgreSQL 中,能夠登錄到任何數(shù)據(jù)庫(kù),前提是它們?cè)?PostgreSQL 中使用相同的帳戶(hù)名。如果 UNIX 用戶(hù)名在 PostgreSQL 服務(wù)器中不存在對(duì)應(yīng)的用戶(hù)名,或者如果嘗試使用另一個(gè) 用戶(hù)帳戶(hù)名登錄,那么登錄將失敗。

假設(shè)您已經(jīng)通過(guò) SSH 連接到主機(jī):ssh -l robert wolf。


清單 20. 失敗的和成功的登錄

    robert@wolf:~$ psql -U robert robertWelcome to psql 8.2.4, the PostgreSQL interactive terminal.Type:  \copyright for distribution terms       \h for help with SQL commands       \? for help with psql commands       \g or terminate with semicolon to execute query       \q to quitrobert@wolf:~$ psql -U postgres robertpsql: FATAL:  Ident authentication failed for user "postgres"-- This works, su to become the UNIX user account postgres            

 

PostgreSQL 使用兩個(gè)文件管理并控制已通過(guò) Ident 服務(wù)器身份驗(yàn)證的用戶(hù)的所有登錄會(huì)話(huà):

pg_hba.conf
通過(guò)一個(gè)文件中定義的記錄控制訪(fǎng)問(wèn)。
pg_Ident.conf
當(dāng) Ident 服務(wù)被用作用戶(hù)帳戶(hù)的認(rèn)證者(authenticator)時(shí)發(fā)揮作用。比如,METHOD 在 pg_hba.conf 文件中被識(shí)別為 Ident。

清單 21. 簡(jiǎn)單配置示例

    Example 1: A LOCALHOST connection enforces unix account robert to access database robert exclusively.  There is no authentication on UNIX domain sockets.(pg_hba.conf)# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD    OPTION  host    all         all         127.0.0.1/32        Ident     mymap  local   all         all                             trust(pg_Ident.conf)# MAPNAME     Ident-USERNAME    PG-USERNAME  mymap       robert            robertExample 2: A domain socket connection enforces unix account robert to access any database as pg account robert; unix account postgres can access any database as user robert.(pg_hba.conf)# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD    OPTION  local   all         all                             Ident     mymap  host    all         all         127.0.0.1/32        trust(pg_Ident.conf)# MAPNAME     Ident-USERNAME    PG-USERNAME  mymap       robert            robert  mymap       postgres          robertExample 3: A domain socket connection enforces that unix account can connect to any database with its postgres database namesake using thekeyword "sameuser".  pg_Ident.conf is not necessary here. Local host connections via TCP-IP are rejected.(pg_hba.conf)# TYPE  DATABASE                USER        CIDR-ADDRESS          METHOD    OPTION  local   template0,template1    all                             Ident     sameuser  host    all                    all         127.0.0.1/32        rejectEx4: (all users can connect with their own user names only to the databases postgres and robert)(pg_hba.conf)# TYPE  DATABASE                USER        CIDR-ADDRESS          METHOD    OPTION  local   template0,template1    all                             Ident     sameuser            

 

牢記下面的注意事項(xiàng):

•配置修改在您重新加載文件后立即生效,比如重新加載 pg_ctl -D mycluster。
•不同的配置設(shè)置會(huì)引起奇怪的行為。在日志中查看失敗的配置消息。
•當(dāng)機(jī)器本身被認(rèn)為是安全的時(shí),將設(shè)計(jì)并實(shí)現(xiàn) Ident。任何試圖進(jìn)行身份驗(yàn)證的遠(yuǎn)程服務(wù)器都應(yīng)當(dāng)被認(rèn)為是可疑對(duì)象。
•Ident 服務(wù)器只用于對(duì)本地主機(jī)連接進(jìn)行身份驗(yàn)證。
數(shù)據(jù)加密

有許多種方式會(huì)使您不經(jīng)意地將自己暴露給 intranet 內(nèi)部的駭客。

讓我們來(lái)執(zhí)行一次嗅探(sniff)。假設(shè)您在自己的本地主機(jī) 192.168.2.64 上執(zhí)行以下命令:tcpdump -i eth0 -X -s 3000 host 192.168.2.100 and port 5432。

在一個(gè)遠(yuǎn)程主機(jī) 192.168.2.100 上,您連接到您的本地主機(jī)的 PostgreSQL 服務(wù)器,后者已經(jīng)在偵聽(tīng)端口 5432:psql -h 192.168.2.64 -p 5432 -U postgres postgres。注意修改您的超級(jí)用戶(hù)帳戶(hù) postgres 的密碼:ALTER USER postgres WITH ENCRYPTED PASSWORD 'my_new_password';。


清單 22. 在被嗅探的數(shù)據(jù)轉(zhuǎn)儲(chǔ)中識(shí)別密碼

    16:39:17.323806 IP wolf.56336 > laptop.postgresql: P 598:666(68) ack 470 win 3068 0x0000: 4500 0078 4703 4000 4006 6d88 c0a8 0264 E..xG.@.@.m....d 0x0010: c0a8 0240 dc10 1538 6a4f 7ada 6a71 e77c ...@...8jOz.jq.| 0x0020: 8018 0bfc 1a9d 0000 0101 080a 0094 a187 ................ 0x0030: 0092 53a2 5100 0000 4341 4c54 4552 2055 ..S.Q...CALTER.U 0x0040: 5345 5220 706f 7374 6772 6573 2057 4954 SER.postgres.WIT 0x0050: 4820 454e 4352 5950 5445 4420 5041 5353 H.ENCRYPTED.PASS 0x0060: 574f 5244 2027 6d79 5f6e 6577 5f70 6173 WORD.'my_new_pas        0x0070:  7377 6f72 6427 3b00                      sword';.            

 

#p#

SSH 隧道使用端口轉(zhuǎn)發(fā)

IP 轉(zhuǎn)發(fā)是一項(xiàng)隧道(tunneling)技術(shù),它可以將 Internet 包從一臺(tái)主機(jī)轉(zhuǎn)發(fā)到另一臺(tái)主機(jī)。它允許您的 PostgreSQL 客戶(hù)機(jī),比如 psql、pgadmin 甚至 openoffice,通過(guò)一個(gè) SSH 連接與遠(yuǎn)程 Postgres 服務(wù)器建立聯(lián)系。

考慮下面的問(wèn)題:

•如果遠(yuǎn)程 PostgreSQL 服務(wù)器上不存在 psql 客戶(hù)機(jī),會(huì)發(fā)生什么?
•如果需要在您的工作站和遠(yuǎn)程主機(jī)之間上傳或下載數(shù)據(jù),會(huì)發(fā)生什么?
•如果需要使用數(shù)據(jù)庫(kù)客戶(hù)機(jī)來(lái)執(zhí)行 psql 客戶(hù)機(jī)無(wú)法很好地執(zhí)行或根本無(wú)法執(zhí)行的任務(wù),該怎么做?
•如何對(duì)網(wǎng)絡(luò)使用隧道,從而使您的團(tuán)隊(duì)能夠遠(yuǎn)程連接到防火墻后面的數(shù)據(jù)庫(kù)?
這個(gè)例子將一個(gè)客戶(hù)機(jī)(本地主機(jī))連接到一臺(tái)遠(yuǎn)程主機(jī)(192.168.2.100)。在工作站的端口 10000 創(chuàng)建了一個(gè)代理連接??蛻?hù)機(jī)連接到端口 10000 后,被轉(zhuǎn)發(fā)到遠(yuǎn)程主機(jī)的 PostgreSQL 服務(wù)器,后者正在偵聽(tīng)端口 5432:ssh -L 10000:localhost:5432 192.168.2.100。

添加 -g 參數(shù)(switch)允許其他主機(jī)利用您的轉(zhuǎn)發(fā)連接,這使得連接成為了專(zhuān)門(mén)用于 Postgres 連接的即時(shí)虛擬專(zhuān)有網(wǎng)(VPN):ssh -g -L 10000:localhost:5432 192.168.2.100.

有關(guān)隧道的一些注意事項(xiàng):

•數(shù)據(jù)庫(kù)客戶(hù)機(jī)和服務(wù)器都被認(rèn)為它們正在與各自的本地主機(jī)通信。
•注意要配置文件 pg_hba.conf 以使用 TCP/IP 為本地主機(jī)連接設(shè)置正確的身份驗(yàn)證。
•1024 以?xún)?nèi)的端口全部由根用戶(hù)控制。
•SSH 會(huì)話(huà)需要在 PostgreSQL/SSH 服務(wù)器上有一個(gè)已有的用戶(hù)帳戶(hù)。
由 SSL 加密的會(huì)話(huà)

PostgreSQL 中的加密會(huì)話(huà)要求服務(wù)器通過(guò) --with-openssl 參數(shù)進(jìn)行編譯。Linux 發(fā)行版二進(jìn)制文件提供了這個(gè)功能。諸如 psql 和 pgadmin 之類(lèi)的客戶(hù)機(jī)也具有這類(lèi)必需的功能。

可以使用 pg_config 命令行工具對(duì)服務(wù)器進(jìn)行檢驗(yàn),如下所示。

pg_config --configure            

 

針對(duì)加密會(huì)話(huà)配置 PostgreSQL 服務(wù)器:

1.使用 OpenSSL 命令行工具 openssl 創(chuàng)建一個(gè)自簽名的服務(wù)器密匙(server.key)和證書(shū)(server.crt)。
1.創(chuàng)建服務(wù)器密匙:openssl genrsa -des3 -out server.key 1024。
2.刪除密碼 openssl rsa -in server.key -out server.key。
3.為服務(wù)器創(chuàng)建一個(gè)自簽名的證書(shū):openssl req -new -key server.key -x509 -out server.crt。
2.將 server.key 和 server.crt 這兩個(gè)文件安裝到數(shù)據(jù)集群的目錄中。
3.編輯 postgresql.conf 文件并設(shè)置指定的對(duì):ssl = on。
4.重啟服務(wù)器。

清單 23. 成功的 SSL 加密會(huì)話(huà)連接
      robert@wolf:~$ psql -h 192.168.2.100 -U robertWelcome to psql 8.2.4, the PostgreSQL interactive terminal.Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quitSSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)robert=#            

服務(wù)器將始終針對(duì)已加密的會(huì)話(huà)請(qǐng)求測(cè)試連接。然而,通過(guò)編輯身份驗(yàn)證文件 pg_hba.conf,您可以控制服務(wù)器的行為。在客戶(hù)機(jī)端,可以通過(guò)定義環(huán)境變量 PGSSLMODE 來(lái)控制客戶(hù)機(jī)(psql)的默認(rèn)行為:是否使用加密的會(huì)話(huà)。

共有 6 種模式(其中兩種新模式特別針對(duì) V8.4)。

模式 描述
disable 將只嘗試未加密的 SSL 連接。
allow 首先嘗試未加密的連接,如果不成功,則嘗試 SSL 連接。
prefer 與 allow 模式相反;首先嘗試 SSL 連接,然后嘗試未加密連接。
require 客戶(hù)機(jī)只嘗試已加密的 SSL 連接。
verify-ca SSL 連接,并且具有由可信 CA 簽發(fā)的有效客戶(hù)機(jī)證書(shū)。
Verify-full SSL 連接,具有由可信 CA 簽發(fā)的有效客戶(hù)機(jī)證書(shū),并且服務(wù)器主機(jī)名匹配證書(shū)的主機(jī)名。

 

例如:導(dǎo)出 PGSSLMODE=prefer.

SSL 證書(shū)

SSL 身份驗(yàn)證是指客戶(hù)機(jī)和服務(wù)器交換由具有可靠憑證的第三方簽發(fā)的證書(shū)。這個(gè)第三方被稱(chēng)為證書(shū)權(quán)威(CA)。如果客戶(hù)機(jī)或服務(wù)器不能從另一方接收到合法的證書(shū),那么連接將被拒絕。

盡管涉及許多細(xì)節(jié),但是在 PostgreSQL 上使用 SSL 證書(shū)設(shè)置身份驗(yàn)證非常簡(jiǎn)單:

1.編輯 postgresql.conf,ssl=on。 服務(wù)器端身份驗(yàn)證要求下面的文件必須位于其數(shù)據(jù)集群中:

•server.key
•server.crt(必須由 CA 簽發(fā))
•root.crt(檢驗(yàn)客戶(hù)機(jī)身份驗(yàn)證)
•root.crl(證書(shū)撤銷(xiāo)列表,可選)
文件 root.crt 包含一個(gè)經(jīng)過(guò)檢驗(yàn)的證書(shū)列表。其中應(yīng)該包含可用于您的特定發(fā)行版的所有證書(shū),您也可以向該文件中添加證書(shū)。
文件 root.crl 類(lèi)似于 root.crt,因?yàn)樗唤M經(jīng)過(guò) CA 簽名的證書(shū)。然而,這些證書(shū)屬于已被撤銷(xiāo)了連接權(quán)的客戶(hù)機(jī)。一個(gè)空的 root.crl 文件不會(huì)影響身份驗(yàn)證過(guò)程。
客戶(hù)端身份驗(yàn)證要求下面的文件必須位于客戶(hù)機(jī)的主目錄 ~/.postgresql 中:

•postgresql.key
•postgresql.crt
•root.crt(檢驗(yàn)服務(wù)器身份驗(yàn)證)
•root.crl(證書(shū)撤銷(xiāo)列表,可選)
和服務(wù)器的 root.crt 一樣,客戶(hù)機(jī)的 root.crt 文件包含了由一個(gè)可信的第三方 CA 簽名的服務(wù)器證書(shū)的列表。最后一個(gè)文件 root.crl 是可選的,用于撤銷(xiāo)服務(wù)器證書(shū)。
要獲取證書(shū),需要客戶(hù)機(jī)和服務(wù)器都向 CA 提交了證書(shū)請(qǐng)求 client.csr 和 server.csr。證書(shū)只有在生成了它們的密匙后才能被創(chuàng)建,如下所示。
openssl req -new -newkey rsa:1024 -nodes -keyout client.key -out client.csropenssl req -new -newkey rsa:1024 -nodes -keyout server.key -out server.csr

可以使用多種方法執(zhí)行 openssl 實(shí)用工具來(lái)獲得證書(shū)。例如,您可以對(duì)它們施加一個(gè)生命周期,或者使用自簽名證書(shū)來(lái)生成它們,這樣就不需要涉及到 CA。

2.您現(xiàn)在可以使用三種方法生成客戶(hù)機(jī)和服務(wù)器證書(shū)。您可以:
•獲得由可信 CA 簽名的 client.csr 和 server.csr。
•通過(guò)使用 openssl perl 實(shí)用工具 CA.pl 成為 CA。
•創(chuàng)建自簽名證書(shū)并分別將它們添加到服務(wù)器和客戶(hù)機(jī)的 root.crt 文件中。
3.下面是一組用于 CA.pl 的命令,它們被進(jìn)行了縮減。查看 CA.pl 手冊(cè)頁(yè)獲得有關(guān)證書(shū)請(qǐng)求的更多信息。
•CA.pl -newca(創(chuàng)建新 CA)
•CA.pl -newreq(使用私匙創(chuàng)建一個(gè)證書(shū)請(qǐng)求)
•CA.pl -signreq (使用您創(chuàng)建的 CA 對(duì)證書(shū)請(qǐng)求簽名)
對(duì)于堅(jiān)持使用純開(kāi)源技術(shù)的人,可以在 http://www.cacert.org 找到 “免費(fèi)” 的證書(shū)。


清單 24. 一個(gè)示例證書(shū)
      -----BEGIN CERTIFICATE-----MIIC9TCCAl6gAwIBAgIJAMuhpY+o4QR+MA0GCSqGSIb3DQEBBQUAMFsxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxFDASBgNVBAMTC0NvbW1vbiBOYW1lMB4XDTA3MDIxMjEyMjExNVoXDTA3MDMxNDEyMjExNVowWzELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEUMBIGA1UEAxMLQ29tbW9uIE5hbWUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKA4nX/eBKsPJI1DmtH2wdJE9uZf+IRMUWYrAEDL4F6NEuo2+BsIoOBKS/rrV77Itet9kduJCQ6k/z2ouAVb4muXpJALDjJpYBXt9wqZf+2p1n9dqDw1rCWBjXIdhOcA3DDvu0Ig1FUfm8GS97evxM5IJBECRnK/5JZroXCRSHcpAgMBAAGjgcAwgb0wHQYDVR0OBBYEFElEWNUCV+61itXp86czrDe35vjrMIGNBgNVHSMEgYUwgYKAFElEWNUCV+61itXp86czrDe35vjroV+kXTBbMQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRQwEgYDVQQDEwtDb21tb24gTmFtZYIJAMuhpY+o4QR+MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAaFzbUmXcWVzqaVeEpZkNwF/eVh110qIUUxXGdeKZGNXIyK67GCUYSG/IFkZ/hrGLeqElLrdmU0mHd2Enq2IuvhxnsOVTTickjKospJvlHPYSumkXx0Xpzey9PhjLh1chpxNGTATKb8ET8YZvBRrDHl/EMPIjLd62iSR/ugFe8go=-----END CERTIFICATE-----

4.假設(shè)您已經(jīng)生成了自簽名證書(shū),將它們復(fù)制到正確的位置并編輯 root.crt。 客戶(hù)機(jī)證書(shū)被保存在服務(wù)器的 root.crt 中,而服務(wù)器的證書(shū)被保存在客戶(hù)機(jī)的 root.crt 中。

5.重啟服務(wù)器后監(jiān)視日志消息,確定一切配置正常。
服務(wù)器的默認(rèn)行為將仍然使用加密。這可以通過(guò)編輯 postgresql.conf 中的名稱(chēng)對(duì) ssl_ciphers='NULL' 并重啟服務(wù)器禁用。慎重考慮您的決定:將 ssl_ciphers 設(shè)置為 NULL 就可以禁用加密。

結(jié)束語(yǔ)

在 本文中,您了解了有關(guān) PostgresSQL 數(shù)據(jù)庫(kù)服務(wù)器保護(hù)的基本知識(shí)。有關(guān)這個(gè)話(huà)題還涉及到許多內(nèi)容,但是一篇文章所能介紹的內(nèi)容是有限的。目前有關(guān) PostgreSQL 的介紹還不夠豐富。也許,借助您的一點(diǎn)幫助,我們可以更深入地了解 PostgreSQL 安全性。

【編輯推薦】

  1. 專(zhuān)題:網(wǎng)站常見(jiàn)的攻擊與防御
  2. Web應(yīng)用防火墻是如何為客戶(hù)提供防護(hù)的
  3. 選擇硬件防火墻時(shí)你應(yīng)注意的十件事
  4. 深入理解防火墻 有效屏蔽外界的攻擊
  5. 防火墻功能分類(lèi)及其局限性介紹分析
  6. Windows 7 SP1緣何會(huì)在正式版之前露面?
  7. 美韓作戰(zhàn)計(jì)劃泄漏 敏感部門(mén)USB使用需謹(jǐn)慎
  8. DDoS來(lái)襲Amazon圣誕節(jié)遭殃 DNS防護(hù)不可回避 
     
責(zé)任編輯:王文文 來(lái)源: 51CTO.com
相關(guān)推薦

2009-05-14 09:20:41

關(guān)系數(shù)據(jù)庫(kù)對(duì)象關(guān)系映射Terracotta

2009-11-20 16:23:58

Oracle數(shù)據(jù)庫(kù)安全

2009-04-13 10:06:58

Oracle安全管理

2010-05-07 17:56:10

Oracle數(shù)據(jù)庫(kù)安全

2011-03-22 14:35:23

Oracle數(shù)據(jù)庫(kù)安全措施

2011-01-19 11:07:43

2010-04-29 15:33:12

Oracle數(shù)據(jù)庫(kù)

2010-04-14 17:19:51

Oracle數(shù)據(jù)庫(kù)

2011-05-25 10:37:03

Oracle數(shù)據(jù)庫(kù)安全

2009-06-25 09:46:04

2014-07-26 15:22:31

趙修湘關(guān)系型數(shù)據(jù)庫(kù)Hive數(shù)據(jù)倉(cāng)庫(kù)

2011-03-31 09:40:46

2014-10-22 14:04:50

傲游瀏覽器

2011-02-28 10:57:56

2011-03-25 09:46:16

Informix數(shù)據(jù)庫(kù)安全性安全審計(jì)

2015-03-27 13:02:17

Azure SQL D微軟云數(shù)據(jù)庫(kù)

2015-05-05 15:53:01

2021-07-21 15:05:06

數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)安全技術(shù)

2011-12-02 09:53:34

2022-08-01 07:07:05

Python人工智能機(jī)器學(xué)習(xí)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)