开放数据,防止同事误删数据
允许其他同事访问
实际工作中,我们的pg数据库大多数情况下不会是只有自己使用,而是会开放给其他同事使用,或者开放给同一个局域网内的其他服务器连接访问。这个时候,如果有机器连接报错时,我们需要考虑是不是我们的数据库没有正确设置。比如,出现以下错误的时候:
psql: could not connect to server: Connection refused
Is the server running on host "192.168.1.2" and accepting
TCP/IP connections on port 5432?
如果同事在连接数据库的时候,报了以上错误,那么有可能是以下几个原因:
-
数据库没有配置监听192.168.1.2,默认postgresql只监听了127.0.0.1,即本地服务器ip。这个时候我们可以修改postgresql的配置文件
/etc/postgresql/10/main/postgresql.conf,增加对应的监听ip。比如可以使用ifconfig命令查看您的局域网ip,然后添加进去,也可以直接让服务器监听所有ip。假设用ifconfig查看了本机ip为192.168.1.2,那么我们可以这样配置。-
先使用命令
sudo vim /etc/postgresql/10/main/postgresql.conf编辑这个配置文件,找到listen_address这一行:#listen_addresses = 'localhost' # what IP address(es) to listen on; -
删除这一行前面的
#号,然后在localhost后面加上,192.168.1.2,保存后重启数据库就可以了listen_addresses = 'localhost,192.168.1.2' -
也可以直接让服务器监听所有地址,这样不管是来自哪个网络的访问都能连接数据库。
listen_addresses = '*' -
一定要记住,这个ip是我们自己机器的ip地址,不是您同事的机器ip地址。
-
一定要记住,修改完配置后,一定要重启服务,重启服务可以使用命令:
sudo systemctl restart postgresql
-
-
数据库监听的端口错误,与mysql使用默认端口3306一样,pg也有默认端口,pg的默认端口号是5432。如何确定是不是端口号的问题,有两种方法,第一种是我们查看5432端口是不是被pg占用,第二种是查看当前pg的端口号配置是不是5432。
-
查看当前5432端口是不是pg在使用
sudo netstat -nlp | grep 5432 # 统计网络端口使用情况,在结果中只查看出现了5432字符的结果行- 显示结果:
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 14265/postgres- 如果出现类似上面的结果则表示我们的5432端口是被pg占用的,并且程序名为postgres,进程PID为14265,这里我们只要看到程序名是postgres就可以判断是pg进程,PID会变化。
- 这里前面的tcp表示使用的是tcp协议,两个0分别表示Recv-Q和Send-Q,分别为接受队列数和发送队列数,两个数字都为0是正常的。127.0.0.1:5432表示是本地地址和端口号,0.0.0.0:*表示的是外部ip地址和端口号。
-
查看pg配置中的端口号,可以通过命令
sudo vim /etc/postgresql/10/main/postgresql.conf来查看对应的配置文件,找到port开头的这一行。port = 5432 # (change requires restart)- 如果配置文件里面是这样写的,则表示监听的端口号是正确的。如果不是,则可以在配置文件里面修改为5432,也可以在连接的时候改为这里配置的端口号。
-
-
防火墙的问题,比如您的主机开了防火墙,这个时候可以关闭防火墙,但是一般不建议您这么做;第二种办法是可以直接设置防火墙,允许5432端口对外开放。比如:
ufw allow 5432 -
不在同一个网络。您和您的同事可能在同一个办公室,或者同一个公司,甚至你们ip段看上去都一样,但是有可能你们不是链接在同一个路由器下,所以你们可能网络是不互通的。这个时候建议您找您公司的IT同事帮忙处理。
信任同事的IP地址,允许他无密码访问
同事在访问您的pg数据库的时候,如果出现以下错误,那表示您需要设置pg的安全认证,允许对应网络段或者对应ip的机器来进行访问。pg有一个专门的文件是用来配置pg的安全认证的。这个文件在`/etc/postgresql/10/main/pg_hba.conf```。
hba全称是Host-Based Authentication,pg_hba.conf可以配置四种链接方式:
local database user auth-method [auth-options]
host database user address auth-method [auth-options]
hostssl database user address auth-method [auth-options]
hostnossl database user address auth-method [auth-options]
-
其中第一列表示链接方式:
-
local表示通过unix-domain的socket连接,没有这一条配置则不允许通过socket进行连接。
-
host表示通过tcp/ip协议进行连接,直接使用host表示有ssl安全证书和没有ssl安全证书的链接都允许,这种链接方式是我们用的最多的。
-
hostssl顾名思义,这表示需要ssl安全证书的链接。
-
hostnossl表示不需要ssl安全证书的链接。
-
-
第二列表示数据库,即哪些数据库允许被访问,有5种写法:
-
all:表示允许链接所有数据库,注意,这个all不包括replication这种,也就是在做数据库复制的时候,不能配置all,只能配置replication。
-
sameuser:表示只有与用户名同名的数据库才会被用户访问到。
-
samegroup:表示只有与用户同组名的时候,数据库才能被正常访问。
-
replication:表示匹配一条replication连接,它不指定一个特定的数据库,一般在流复制中使用。
-
直接写数据库名称,如果有多个数据库,可以用逗号隔开,比如:
db_1,db_2这样的。
-
-
第三列表示用户名,这里有三种写法:
-
all:表示允许所有用户连接,配置all的情况比较常见。
-
单独用户名,比如:
postgres,这种是允许postgres用户进行连接。 -
在用户名前加前缀
+号表示该用户同组的用户都可以连接,比如:+postgres。
-
-
第四列表示ip地址或者ip地址段,这个是很关键的地方。
-
这里可以配置一个具体的ip地址,也可以配置一个ip地址段,记住,这里需要配置的是客户端的ip地址,也就是您同事的地址。
-
如果只需要一台电脑访问,您可以配置一个具体的ip地址,比如:192.168.1.8/32,这里的32是一个掩码值,具体怎么算我们不在这里讨论,大家只要记住,具体的ip地址,掩码值写32就可以了。
-
如果需要配置一个ip段,比如:192.168.1.0/24,这里表示一个具体的ip网段:192.168.1.0到192.168.1.254的地址都可以访问。
-
-
第五列是认证方法,这里有11种认证方法:trust、reject、md5、password、gss、sspi、peer、ldap、radius、cert、pam。其中我们常用的有:trust、reject、md5、password
-
trust:绝对信任,无条件地允许联接。如果您配置的是您同事的唯一一个ip,并且您也绝对信任他,那么您可以设置认证方法为trust,否则,不要轻易设置。
-
reject:无条件拒绝,一般用来做一些过滤设置,比如我们对某一个ip端做了密码访问的设置,但是其中有一台主机是不受信任的,比如这台机器是外部合作伙伴的机器,那么我们需要针对他进行设置,防止他意外访问。
-
md5:需要客户端提供一个md5加密的方式进行认证,这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法。
-
password:和"md5"一样,但是与md5不一样的是,密码是以明文形式在网络上传递的,我们不应该在不安全的网络上使用这个方式。
-
-
下面给几个经典配置,大家参考
-
假设同事ip为192.168.1.8,我们需要对他的所有账户无条件允许访问:
# Type Database User Address Method host all all 192.168.1.8/32 trust -
假设好几个同事都在同一个局域网内,咱们服务器的ip是192.168.1.2,那么我们可以这样设置:
# Type Database User Address Method host all all 192.168.1.0/24 trust
-
给实习生开放权限,设置只读用户防止误删数据
有的时候,我们需要把我们的数据库开放给其他同事,但是这个同事可能只需要读取数据,而且级别也不高,还特别担心他误操作,这个时候我们可以针对这个用户做一些设置,既满足他访问数据的要求,也不用担心他错误操作。
给用户设置只读权限,我们需要以下几步操作:
-
1、新增用户,设置密码
CREATE USER employee007 WITH PASSWORD 'anypassword'; -
2、设置所有表或者指定表的访问权限
-
给employee007这个用户所有表的select权限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO employee007; -
或者,我们需要设置其中一个表的读取权限,其他表,他都不需要查询。假设这个表叫:test01:
GRANT SELECT ON test01 TO employee007;
-
-
3、设置为只读权限
-
事实上,我们只给了select权限,那么这个用户是无法写入数据的。我们也可以用另外一种方式来加强这个设置:
ALTER USER employee007 SET default_transaction_read_only=on;
-
-
SELECT只是pg众多用户权限中的一种,pg还有其他的一些权限:insert、update、delete、truncate、references、triiger、create、connect、temporary、execute、usage。大多数权限大家一看名字就一目了然,我也不在这里多啰嗦了,大家有需要的可以查看一些pg的官方手册 www.postgresql.org/docs/10/sql…。