不安全因素
1、自然灾害
2、网络攻击(SQL注入脚本攻击DoS攻击)
3、数据不安全(没有对数据加密)
PostgreSQL中的一些概念
监听相关的文件
pg_hba.conf
postgresql. conf
绑定地址 postgresql. conf文件中的 listen_addresses参数
基于主机的访问控制: pg_hba. conf文件中
实例级别的权限 Users, Roles,数据库创建,登录,复制
数据库级别的权限数据库是否可以连接,模式是否可以创建
模式级别的权限如何使用 schema,如何创建 schema内的对象
表级别的权限 SELECT,DML关键词的访问控制
列级别的权限:允许如何访问列和控制列
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文件。
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();
1.查询最大连接数(默认是100):
show max_connections;
2.最大连接数在postgresql.conf中设置(合适的最大连接数 used_connections/max_connections在85%左右):
max_connections = 500
如果不知道postgresql.conf在哪里,可以搜索一下:
find / -name postgresql.conf
不同的基于密码的身份验证方法的可用性取决于用户的密码在服务器上是如何加密的 (或更准确地说是哈希)。
这是在设置密码时由配置参数 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=>
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映射。指定映射后原本的同名操作系统用户就不能连接数据库了。
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
实例级别的安全
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=#
数据库级别的安全
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 ] ]
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)
表
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);
透明数据加密技术
对数据库底层块进行加密AES128 3DES
阿里云 for RDS 华为 -for RDS