PG的安全管理

PG的安全管理

1 PG的不安全因素

不安全因素
1、自然災害
2、網絡攻擊(SQL注入腳本攻擊DoS攻擊)
3、數據不安全(沒有對數據加密)

2 PG的安全概念要素

PostgreSQL中的一些概念
監聽相關的文件
pg_hba.conf
postgresql. conf
綁定地址 postgresql. conf文件中的 listen_addresses參數
基於主機的訪問控制: pg_hba. conf文件中
實例級別的權限 Users, Roles,數據庫創建,登錄,複製
數據庫級別的權限數據庫是否可以連接,模式是否可以創建
模式級別的權限如何使用 schema,如何創建 schema內的對象
表級別的權限 SELECT,DML關鍵詞的訪問控制
列級別的權限:允許如何訪問列和控制列

3 pg_hba.conf文件

pg_hba.conf文件的一般格式是一組記錄,每行一個。空行和任何註釋字符#之後的文本會被忽略。第一個匹配行會被用來認證。在第一個匹配之後,後續的記錄不會被考慮。如果客戶端不能用第一個匹配記錄中指定的方法認證,該連接會被拒絕。一個記錄由多個被空格或者製表符分隔的域組成。如果域值被加上引號,域可以包含空格。記錄不能跨越多行。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oZH1xqTX-1590053184427)(D:\SYBASE&informix&DB2\2 Postgresql\3 markdown筆記\體系架構\晟數體系架構7天之旅\6 PG的安全管理.assets\image-20200423231530187.png)]

每一個遠程客戶端訪問記錄具有如下的格式:

host   database   role   CIDR-address   authentication-method

每一個UNIX-域套接字記錄具有如下的格式:

local   database   role   authentication-method

下面的表格描述了每個域的含義。

描述
local 匹配嘗試使用UNIX-域套接字的連接。如果沒有這種類型的記錄,則UNIX-域套接字連接不被允許。
host 匹配嘗試使用TCP/IP的連接。除非用合適的listen_addresses服務器配置參數值啓動,就不能進行遠程TCP/IP連接。
hostssl 匹配嘗試使用TCP/IP建立的連接,但只有用SSL加密建立該連接時才允許。必須通過設置ssl配置參數在服務器啓動時啓用SSL
hostnossl 匹配在不使用SSL的TCP/IP上建立的連接嘗試。
database 指定這一記錄匹配的數據庫名。值all指定它匹配所有數據庫。可以提供多個數據庫名,用逗號分隔它們。在文件名前面放一個@,可以指定一個含有數據庫名的單獨的文件。
role 指定這一記錄匹配的數據庫角色名。值all指定它匹配所有角色。如果指定的角色是一個組並且希望該組中的所有成員都被包括在內,在該角色名前面放一個+。可以提供多個角色名,用逗號分隔它們。在文件名前面放一個@,可以指定一個含有角色名的單獨的文件。
CIDR-address 指定這一記錄匹配的客戶端機器的IP地址範圍。它包含一個標準點分十進制表示的IP地址和一個CIDR掩碼長度。IP地址只能用數字指定,不能寫成域或者主機名。掩碼長度指示客戶端IP地址必須匹配的高位位數。給定IP地址中,在這些位的右邊必須是零。IP地址、/和CIDR掩碼長度之間不能有任何空格。典型的CIDR地址例子是:192.0.2.89/32是一個單一主機,192.0.2.0/24是一個小網絡,10.6.0.0/16是一個大網絡。要指定一個單一主機,對IPv4使用一個CIDR掩碼32,對IPv6使用128。在一個網絡地址中,不要省略拖尾的零。
IP-addressIP-mask 這些域可以被用作CIDR地址記號的一種替代。實際的掩碼在一個單獨的列中指定,而不是指定掩碼長度。例如,255.255.255.255表示CIDR掩碼長度32。這些域只適用於host、hostssl和hostnossl記錄。
authentication-method 指定連接時使用的認證方法。PostgreSQL支持PostgreSQL 9.0支持的認證方法

重新裝載pg_hba.conf配置文件來讓更改生效:

$ pg_ctl reload
或者
select pg_reload_conf();
host    all     gpadmin 10.102.254.27/32        trust
host    replication     gpadmin 10.102.254.27/32        trust
host    all     gpadmin 10.102.254.26/32        trust
host    replication     gpadmin 10.102.254.26/32        trust
local    all         gpadmin         ident
host     all         gpadmin         127.0.0.1/28    trust
host     all         gpadmin         10.102.254.27/32       trust
host     all         gpadmin         ::1/128       trust
host     all         gpadmin         fe80::5b53:4d81:e39f:856c/128       trust
local    replication gpadmin         ident
host     replication gpadmin         samenet       trust

pg_hba.conf文件的一般格式是一組記錄,每行一個。一個記錄由多個被空格或者製表符分隔的域組成。如果域值被加上引號,域可以包含空格。記錄不能跨越多行。
每一行的格式爲:

連接方式 連接的數據庫 連接的用戶 連接的主機IP 認證方式

每一個遠程客戶端訪問記錄具有如下的格式:

host database role CIDR-address authentication-method

每一個UNIX-域套接字記錄具有如下的格式:

local database role authentication-method

連接方式
連接方式有四種:local 、host、hostssl、hostnossl

local
這條記錄匹配通過 Unix 域套接字進行的聯接企圖, 沒有這種類型的記錄,就不允許 Unix 域套接字的聯接。

host
這條記錄匹配通過TCP/IP網絡進行的聯接嘗試。他既匹配通過ssl方式的連接,也匹配通過非ssl方式的連接。

注意:要使用該選項你要在postgresql.conf文件裏設置listen_address選項,不在listen_address裏的IP地址是無法匹配到的。因爲默認的行爲是隻在localhost上監聽本地連接。

hostssl
這條記錄匹配通過在TCP/IP上進行的SSL聯接企圖。

要使用該選項,服務器編譯時必須使用–with-openssl選項,並且在服務器啓動時ssl設置是打開的,具體內容可見這裏。

hostnossl
這個和上面的hostssl相反,只匹配通過在TCP/IP上進行的非SSL聯接企圖。

數據庫
指定這一記錄匹配的數據庫名。值all指定它匹配所有數據庫。可以提供多個數據庫名,用逗號分隔它們。在文件名前面放一個@,可以指定一個含有數據庫名的單獨的文件。

用戶名
指定這一記錄匹配的數據庫角色名。值all指定它匹配所有角色。如果指定的角色是一個組並且希望該組中的所有成員都被包括在內,在該角色名前面放一個+。可以提供多個角色名,用逗號分隔它們。在文件名前面放一個@,可以指定一個含有角色名的單獨的文件。

主機IP
指定這一記錄匹配的客戶端機器的IP地址範圍。它包含一個標準點分十進制表示的IP地址和一個CIDR掩碼長度。IP地址只能用數字指定,不能寫成域或者主機名。掩碼長度指示客戶端IP地址必須匹配的高位位數。給定IP地址中,在這些位的右邊必須是零。IP地址、/和CIDR掩碼長度之間不能有任何空格。
典型的CIDR地址例子是:192.0.2.89/32是一個單一主機,192.0.2.0/24是一個小網絡,10.6.0.0/16是一個大網絡。要指定一個單一主機,對IPv4使用一個CIDR掩碼32,對IPv6使用128。在一個網絡地址中,不要省略拖尾的零。

ip地址(ip-address)、子網掩碼(ip-mask)
這兩個字段包含可以看成是標準點分十進制表示的 IP地址/掩碼值的一個替代。
例如,使用255.255.255.0 代表一個24位的子網掩碼。它們倆放在一起,聲明瞭這條記錄匹配的客戶機的 IP 地址或者一個IP地址範圍。本選項只能在連接方式是host,hostssl或者hostnossl的時候指定。

認證方法
常用的認證方法有:
trust
無條件地允許聯接,這個方法允許任何可以與PostgreSQL 數據庫聯接的用戶以他們期望的任意 PostgreSQL 數據庫用戶身份進行聯接,而不需要口令。

reject
聯接無條件拒絕,常用於從一個組中"過濾"某些主機。

md5
要求客戶端提供一個 MD5 加密的口令進行認證,這個方法是允許加密口令存儲在pg_shadow裏的唯一的一個方法。

password
和"md5"一樣,但是口令是以明文形式在網絡上傳遞的,我們不應該在不安全的網絡上使用這個方式。

scram-sha256-md5升級版本(推薦的加密方式)
ident|peer通過 Linux操作系統用戶和數據庫用戶名
maping的方式,訪問數據庫

特別強調一點:在PostgreSQL數據庫中,Master實例的pg_hba.conf文件控制對PostgreSQL數據庫系統的客戶端訪問及認證。PostgreSQL數據庫的Segment也有pg_hba.conf文件,它們被配置來只允許來自Master主機的客戶端連接並且永不接受客戶端連接。不要在Segment上更改pg_hba.conf文件。

4 監聽配置

1.修改pg_hba.conf文件,配置用戶的訪問權限:

配置 pg_hba.conf文件對基於本地或者主機的客戶端訪問
cat pg_hba.conf | grep 192. 168.43
host all 192.168.43.0/24 trust

2.修改postgresql.conf文件,將數據庫服務器的監聽模式修改爲監聽所有主機發出的連接請求。

配置 postgresql.conf文件對數據庫服務器的監聽

cat postgresql.conf | grep listen_addresses | tail-1
 listen_addresses='localhost,192.168.43.105' what IP address(es) to listen on


定配置的服務器的p地址定位到#listen_addresses=’localhost’。PostgreSQL安裝完成後,默認是隻接受來在本機localhost的連接請 求,通過將改行內容修改爲listen_addresses=’*'來允許數據庫服務器監聽來自任何主機的連接請求:

3.重新加載

pg hba. conf文件
pg_ctl reload
或者
select pg_reload_conf();

5 連接的參數配置

1.查詢最大連接數(默認是100):

show max_connections;

2.最大連接數在postgresql.conf中設置(合適的最大連接數 used_connections/max_connections在85%左右):

max_connections = 500

如果不知道postgresql.conf在哪裏,可以搜索一下:

find / -name postgresql.conf

6 sha-256加密

不同的基於密碼的身份驗證方法的可用性取決於用戶的密碼在服務器上是如何加密的 (或更準確地說是哈希)。

這是在設置密碼時由配置參數 password_encryption控制的。

如果使用 scram-sha-256設置對密碼進行了加密, 那麼它可以用於身份驗證方法scram-sha-256和password (但在後一種情況下密碼傳輸將以純文本形式)。如上所述, 認證方法規範md5會自動切換到使用scram-sha-256方法, 所以它也可以工作。

如果密碼是使用md5設置加密的, 那麼它只能用於md5和password認證方法規範 (同樣,在後一種情況下用明文傳輸密碼)。

(以前的PostgreSQL版本支持以純文本格式在服務器上存儲密碼,這已不再可行。) 要查看當前存儲的密碼哈希值,請查看系統目錄pg_authid。

在確保所有正在使用的客戶端庫足夠新以支持SCRAM後, 要將現有安裝從md5升級到scram-sha-256, 在postgresql.conf中設置 password_encryption = ‘scram-sha-256’, 讓所有用戶設置新密碼,並將pg_hba.conf 中的認證方法聲明更改爲scram-sha-256。

postgres=# create user u7 password ‘Password@app’;

CREATE ROLE

postgres=# select * from pg_authid where rolname=‘u7’;

rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls |

rolconnlimit | rolpassword | rolvaliduntil

---------±---------±-----------±--------------±------------±------------±---------------±-------------±

-------------±------------------------------------±--------------

u7 | f | t | f | f | t | f | f |

      -1 | md52ff22216c0d97fc881437cea333277c9 |

#會話級別修改用戶角色密碼加密算法

postgres=# set password_encryption to “scram-sha-256”;

SET

postgres=# show password_encryption ;

password_encryption


scram-sha-256

(1 row)

postgres=# create user u8 password ‘Password@app’;

CREATE ROLE

postgres=# select * from pg_authid where rolname=‘u8’;

rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls |

rolconnlimit | rolpassword

                                  | rolvaliduntil

---------±---------±-----------±--------------±------------±------------±---------------±-------------±

-------------±------------------------------------------------------------------------------------------------

--------------------------------------±--------------

u8 | f | t | f | f | t | f | f |

      -1 | SCRAM-SHA-256$4096:TZbsCC/eQxS2Iso+g/lTcg==$OLz+2ysTOp6yTxJ3GWciRyu5ktbRNP3gOM4tiHFFEaM=:7z9pTYY

DQsMh5LTJtPCIZm7bPhuWejVjDECe/LRdVzA= |

#修改pg_hba.conf 本地連接的method方法爲md5

TYPE DATABASE USER ADDRESS METHOD

“local” is for Unix domain socket connections only

local all all md5

#執行以下指令使修改生效

pg_ctl reload

分別用u7 u8用戶連接數據庫測試,結果是可以正常連接!

#修改pg_hba.conf 本地連接的method方法爲scram-sha-256

TYPE DATABASE USER ADDRESS METHOD

“local” is for Unix domain socket connections only

local all all scram-sha-256

#執行以下指令使修改生效

pg_ctl reload

分別用u7、 u8用戶連接數據庫測試,測試結果爲u7不能連接;u8用戶連接正常。

[postgres@db1 data]$ psql -U u7

Password for user u7:

psql: FATAL: password authentication failed for user “u7”

[postgres@db1 data]$ psql -U u8

Password for user u8:

psql (10.3)

Type “help” for help.

postgres=>

證明了用戶密碼用md5加密存儲,如果用連接認證使用scram-sha-256,將會連接受限。

解決方法是重新修改密碼用md5加密的用戶的密碼,使用新的認證加密算法scram-sha-256。

#修改pg_hba.conf 本地連接的method方法爲scram-sha-256

TYPE DATABASE USER ADDRESS trust

#執行以下指令使修改生效

pg_ctl reload

postgres=# show password_encryption

postgres-# ;

password_encryption


scram-sha-256

(1 row)

postgres=# alter user u7 password ‘Password@app’;

ALTER ROLE

postgres=# select * from pg_authid where rolname =‘u7’;

rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypassrls |

rolconnlimit | rolpassword

​ | rolvaliduntil

---------±---------±-----------±--------------±------------±------------±---------------±-------------±

-------------±------------------------------------------------------------------------------------------------

--------------------------------------±--------------

u7 | f | t | f | f | t | f | f |

​ -1 | SCRAM-SHA-256$4096:ulZwjxU4EwJ/hE2ymuoXXA==$4lEaJUNg4e5WabH+jRu0LBo97UFjCjWtuu0IKpoJyjg=:SK9jv1Z

+1QCgl2EAWtL0LN2xAYpRyWBAYYvU5wA+Agw= |

(1 row)

postgres=#

再次通過修改pg_hba.conf的認證方法爲SCRAM-SHA-256後,u7用戶連接數據庫正常。

#修改pg_hba.conf 本地連接的method方法爲scram-sha-256

TYPE DATABASE USER ADDRESS METHOD

“local” is for Unix domain socket connections only

local all all scram-sha-256

#執行以下指令使修改生效

pg_ctl reload

[postgres@db1 data]$ pg_ctl reload

server signaled

[postgres@db1 data]$

[postgres@db1 data]$ psql -U u7

Password for user u7: #手動輸入密碼Password@app

psql (10.3)

Type “help” for help.

postgres=>

7 ident驗證

pg_hba.conf裏面講到ident認證方式,需要建立映射用戶或具備同名用戶。

同名用戶好辦,各新建一個同名的操作系統用戶和數據庫用戶,兩個用戶密碼不必相同,但名字必須相同。用該用戶登錄到操作系統或su到該用戶後,即可$ psql dbname。

如果不想新建同名用戶,也可以配置pg_ident.conf文件。pg_ident.conf用來配置哪些操作系統用戶可以映射爲數據庫用戶。本文以PostgreSQL 9.5.7爲例。

pg_ident.conf的格式如下:

MAPNAME SYSTEM-USERNAME PG-USERNAME

usermap username dbuser
1
2
usermap爲映射名,要在pg_hba.conf中用到,多個映射可以共用同一個映射名,username爲操作系統用戶名,dbuser爲映射到的數據庫用戶。

例:操作系統用戶userhg,使用數據庫用戶highgo連接數據庫,而操作系統用戶usergp,使用數據庫用戶gpadmin連接數據庫。

pg_ident.conf如下:

MAPNAME SYSTEM-USERNAME PG-USERNAME

maphg    userhg        highgo
maphg    usergp        gpadmin
1
2
3
pg_hba.conf如下:

TYPE DATABASE USER CIDR-ADDRESS METHOD

local all all ident map=maphg
1
2
map爲pg_hba.conf的auth-options項,map=mapzy指示該認證條件使用mapzy映射。指定映射後原本的同名操作系統用戶就不能連接數據庫了。

8 SSL配置

1.3

使用SSL進行安全的TCP/IP連接

從CA認證中心申請到正式的服務器、客戶端的證書和密鑰。(假設服務器的私鑰爲server.key,證書爲server.crt,客戶端的私鑰爲client.key,證書爲client.crt,CA根證書名稱爲cacert.pem。)

此處以OPENSSL生成的認證爲基礎:

1)部署CA環境

登陸postgres用戶執行

[postgres@PGServer2 ~]$ mkdir -p security

拷貝openssl.cnf到security目錄下

[postgres@PGServer2 ~]$ cp /etc/pki/tls/openssl.cnf ~/security/

創建CA環境並授權private爲777權限

[postgres@PGServer2 ~]$ mkdir -p security/CA/{certs,private}[postgres@PGServer2 ~]$ chmod 777 security/CA/private/

驗證CA環境目錄

[postgres@PGServer2 ~]$ tree security/security/├── CA│   ├── certs│   └── private└── openssl.cnf

創建serial文件,並寫入01

[postgres@PGServer2 ~]$ echo '01' > security/CA/serial

創建index.txt索引文件

[postgres@PGServer2 ~]$ touch security/CA/index.txt

修改openssl.cnf文件中的參數

[postgres@PGServer2 ~]$ vi security/openssl.cnf[postgres@PGServer2 ~]$ cat security/openssl.cnf  | egrep "security|default_md|new_certs_dir" | awk '{print $1,$2,$3}'dir = /home/postgres/security/CAnew_certs_dir = $dir/certsdefault_md = sha256

2)生成根私鑰

生成2048位的CA私鑰:輸入密碼test

[postgres@PGServer2 ~]$ openssl  genrsa -aes256 -out security/CA/private/cakey.pem 2048Generating RSA private key, 2048 bit long modulus.+++....+++e is 65537 (0x10001)Enter pass phrase for security/CA/private/cakey.pem:Verifying - Enter pass phrase for security/CA/private/cakey.pem:

3)生成根證書請求文件

根證書文件名稱爲server.req

輸入cakey.pem的口令test。

輸入國家名稱:CN

輸入省份:Jiangsu

輸入城市:NanJing

輸入組織名稱:gs

其中有些可以省略不填

[postgres@PGServer2 ~]$ openssl req -config security/openssl.cnf -new -key security/CA/private/cakey.pem -out security/CA/careq.pemEnter pass phrase for security/CA/private/cakey.pem:You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [XX]:CNState or Province Name (full name) []:JiangsuLocality Name (eg, city) [Default City]:NanjingOrganization Name (eg, company) [Default Company Ltd]:gsOrganizational Unit Name (eg, section) []:gsCommon Name (eg, your name or your server's hostname) []:shaohuaEmail Address []: 
Please enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:Postgres@DBAn optional company name []:[postgres@PGServer2 ~]$

4)生成自簽名根證書

使用openssl.cnf中的配置

輸入cakey.pem的口令,

檢查輸出的請求與簽名是否匹配

[postgres@PGServer2 ~]$ openssl ca -config security/openssl.cnf -out security/CA/cacert.pem -keyfile security/CA/private/cakey.pem  -selfsign -infiles security/CA/careq.pemUsing configuration from security/openssl.cnfEnter pass phrase for security/CA/private/cakey.pem:Check that the request matches the signatureSignature okCertificate Details:        Serial Number: 1 (0x1)        Validity            Not Before: Mar 30 07:16:21 2020 GMT            Not After : Mar 30 07:16:21 2021 GMT        Subject:            countryName               = CN            stateOrProvinceName       = Jiangsu            organizationName          = gs            organizationalUnitName    = gs            commonName                = shaohua        X509v3 extensions:            X509v3 Basic Constraints:                 CA:FALSE            Netscape Comment:                 OpenSSL Generated Certificate            X509v3 Subject Key Identifier:                 B2:5E:02:8B:7E:8C:19:56:D3:00:17:71:9C:BF:B5:DA:33:C3:21:4F            X509v3 Authority Key Identifier:                 keyid:B2:5E:02:8B:7E:8C:19:56:D3:00:17:71:9C:BF:B5:DA:33:C3:21:4F
Certificate is to be certified until Mar 30 07:16:21 2021 GMT (365 days)Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]yWrite out database with 1 new entriesData Base Updated

已下發名爲cacert.pem的CA根證書

5)生成服務器證書私鑰

[postgres@PGServer2 security]$ openssl genrsa -aes256 -out server.key 2048Generating RSA private key, 2048 bit long modulus..................................................................................................................................+++.......................................................+++e is 65537 (0x10001)Enter pass phrase for server.key:Verifying - Enter pass phrase for server.key:

6)生成服務器證書請求文件

輸入server.key的口令

輸入系統要求的一些信息

其中一些字段可以不填,確保和創建CA時的內容一致

[postgres@PGServer2 security]$ openssl req -config openssl.cnf -new -key server.key -out server.reqEnter pass phrase for server.key:You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [XX]:CNState or Province Name (full name) []:JiangsuLocality Name (eg, city) [Default City]:NanjingOrganization Name (eg, company) [Default Company Ltd]:gsOrganizational Unit Name (eg, section) []:gsCommon Name (eg, your name or your server's hostname) []:shaohuaEmail Address []:
Please enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:Postgres@DBAn optional company name []:

7)生成服務器證書

修改CA/index.txt.attr中的屬性爲no

[postgres@PGServer2 security]$ vi CA/index.txt.attr [postgres@PGServer2 security]$ cat CA/index.txt.attr unique_subject = no

下發生成的服務器證書請求文件,下發成功後,會生成一個正式的服務器證書server.crt

使用openssl.cnf中的配置,輸入cakey.pem中的口令

檢查請求與簽名是否匹配

[postgres@PGServer2 security]$ openssl ca -config openssl.cnf -in server.req -out server.crt -days 3650 -md sha256Using configuration from openssl.cnfEnter pass phrase for /home/postgres/security/CA/private/cakey.pem:Check that the request matches the signatureSignature okCertificate Details:        Serial Number: 2 (0x2)        Validity            Not Before: Mar 30 07:26:57 2020 GMT            Not After : Mar 28 07:26:57 2030 GMT        Subject:            countryName               = CN            stateOrProvinceName       = Jiangsu            organizationName          = gs            organizationalUnitName    = gs            commonName                = shaohua        X509v3 extensions:            X509v3 Basic Constraints:                 CA:FALSE            Netscape Comment:                 OpenSSL Generated Certificate            X509v3 Subject Key Identifier:                 64:96:2B:B7:1E:CC:DD:22:D9:0D:07:79:A7:22:FC:23:FB:66:86:FC            X509v3 Authority Key Identifier:                 keyid:B2:5E:02:8B:7E:8C:19:56:D3:00:17:71:9C:BF:B5:DA:33:C3:21:4F
Certificate is to be certified until Mar 28 07:26:57 2030 GMT (3650 days)Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]yWrite out database with 1 new entriesData Base Updated

1.4

PostgreSQL服務器使用ssl認證連接

1)啓動PostgreSQL服務器

將ssl認證功能啓用

[postgres@PGServer2 ~]$ pg_ctl  start -D $PGDATA -l /tmp/logfilewaiting for server to start.... doneserver started[postgres@PGServer2 security]$ psqlpsql (12.2)Type "help" for help.
postgres=# show ssl; ssl ----- off(1 row)
postgres=# alter system set ssl = on;ALTER SYSTEM

2)配置server.key和server.crt文件的位置

[postgres@PGServer2 ~]$ cat $PGDATA/postgresql.conf  | egrep -v "^#" | egrep "ssl_key_file|ssl_cert_file"ssl_cert_file = '/home/postgres/security/server.crt'ssl_key_file = '/home/postgres/security/server.key'

3)重新啓動PostgreSQL服務器

輸入之前ssl認證文件配置的密碼後,數據庫即能啓動

[postgres@PGServer2 ~]$ pg_ctl  start -D $PGDATA -l /tmp/logfilewaiting for server to start....Enter PEM pass phrase:. doneserver started

9 實例級別的安全

實例級別的安全

CREATE USER
ROLE和USER區別
ROLE沒有登錄權限USER具有登錄權限

具體的設置可以參照create user中的項目

postgre=# \h create user
Command:     CREATE USER
Description: define a new database role
Syntax:
CREATE USER name [ [ WITH ] option [ ... ] ]

where option can be:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'
    | IN ROLE role_name [, ...]
    | IN GROUP role_name [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | USER role_name [, ...]
    | SYSID uid

postgre=# \h create role
Command:     CREATE ROLE
Description: define a new database role
Syntax:
CREATE ROLE name [ [ WITH ] option [ ... ] ]

where option can be:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'
    | IN ROLE role_name [, ...]
    | IN GROUP role_name [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | USER role_name [, ...]
    | SYSID uid

postgre=#

10 數據庫安全

數據庫級別的安全
create database層面

CREATE DATABASE name
    [ [ WITH ] [ OWNER [=] user_name ]
           [ TEMPLATE [=] template ]
           [ ENCODING [=] encoding ]
           [ LC_COLLATE [=] lc_collate ]
           [ LC_CTYPE [=] lc_ctype ]
           [ TABLESPACE [=] tablespace_name ]
           [ ALLOW_CONNECTIONS [=] allowconn ]
           [ CONNECTION LIMIT [=] connlimit ]
           [ IS_TEMPLATE [=] istemplate ] ]

11 Schema權限

schema級別的權限主要體現在
schema和用戶分離

除了select的權限之外,還需要給uasge 的權限

GRANT usage on schema sdedu to sdedu
postgres=# \c postgres sdedu
u are now connected to database "postgres"as user " sdedupostgres=-> select*from sdedu t;id
1 row)

12 表和列 行級別的安全

SELECT DML關鍵詞控制等對象權限

列級別的安全
grant select(column )on table sdedu test to sdedu

控制行安全ROW- LEVEL- SECURITY

除了通過GRANT提供的SQL標準特權系統之外,表還可以具有行安全策略,以每個用戶爲基礎限制哪些行可以通過常規查詢返回,或者通過數據修改命令插入、更新或刪除。此功能也稱爲行級安全性。默認情況下,表沒有任何策略,因此,如果用戶根據SQL特權系統對錶具有訪問權限,則表中的所有行都同樣可用於查詢或更新。

當對錶啓用行安全性時(ALTER TABLE … ENABLE ROW LEVEL SECURITY),行安全策略必須允許對錶的所有常規訪問(用於選擇行或修改行)。(但是,表的所有者通常不受行安全策略的約束。)如果該表不存在任何策略,則使用默認的拒絕策略,這意味着沒有可見或可以修改的行。應用於整個表的操作(如截斷和引用)不受行安全性的約束。

行安全策略可以特定於命令、角色或兩者。可以指定策略來應用於 ALL,SELECT, INSERT, UPDATE, DELETE。可以將多個角色分配給給定的策略,並應用常規角色成員資格和繼承規則。

使用create policy命令創建策略,使用alter policy命令更改策略,並使用drop policy命令刪除策略。要啓用和禁用給定表的行安全性,請使用alter table命令。

每個策略都有一個名稱,可以爲一個表定義多個策略。由於策略是表特定的,因此表的每個策略必須具有唯一的名稱。不同的表可能具有相同名稱的策略。

當多個策略應用於一個給定的查詢時,它們將使用或(對於允許策略,爲默認)或使用和(對於限制策略)進行組合。這類似於一個給定角色擁有其所屬所有角色的特權的規則。許可政策和限制政策將在下面進一步討論。

CREATE POLICY account_managers ON accounts TO managers USING (manager = current_user);

上面的策略隱式地提供了一個與它的using子句相同的with check子句,這樣約束既適用於命令選擇的行(因此管理器無法選擇、更新或刪除屬於不同管理器的現有行),也適用於命令修改的行(因此不能通過中的插入或更新)。

如果沒有指定角色,或者使用了特殊的用戶名public,那麼該策略將應用於系統上的所有用戶。要允許所有用戶僅訪問用戶表中自己的行,可以使用簡單策略:

CREATE POLICY user_policy ON users USING (user_name = current_user);

要對添加到表中的行使用與可見行不同的策略,可以組合多個策略。這對策略將允許所有用戶查看用戶表中的所有行,但只修改自己的行:

CREATE POLICY user_sel_policy ON users FOR SELECT USING (true); CREATE POLICY user_mod_policy ON users USING (user_name = current_user);

13 其他

透明數據加密技術
對數據庫底層塊進行加密AES128 3DES
阿里雲 for RDS 華爲 -for RDS

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章