PostgreSQL 访问和权限,咱们捋一捋

2019-08-01 11:04:09 浏览数 (1)

在PostgreSQL中的访问和权限,在学习的初期是很容易搞不清楚的,而由于这方面的事情也浪费很不少的时间,所以本期捋一捋,这方面的问题和知识。

和其他众多的数据库不同,PostgreSQL 的访问如果是精通其他数据库的DBER 们也容易在阴沟里面帆船。PostgreSQL 的访问分为两个部分,

1 你的用户能不能进入到服务器

2 你的用户的权限能不能访问指定的东西

如果非要举一个例子找一个雷同的数据库,我只能想到 SQL SERVER ,因为SQL SERVER的 用户也分为 登录用户和数据库用户,这是因为SQL SERVER 原来在WINDOWS 上的域账号之类引起的与其他数据库用户不同的地方。

话归正传,我们先来假设你有PG的数据库的权限,无论大小但你至少应该能登录进来吧。但很多时候你连接和登录都报错类似下面的

下面已经提及了一个文件 pg_hba.conf 文件,下图中提示到 pg_hba.conf 没有我现在输入账号访问数据库的进入的权利。

OK ,我们就先从 pg_hba.conf 来开始

pg_hba.conf 他是一个客户端的认证的文件,如果要理解的话可以理解为 mysql 创建账号后的 @ 后面的东西,是 % (全都可以访问),还是 IP 等等,他限制的并不是权限,而是你是来自于哪里的问题,这属于的是一个安全性的问题。

那么下面就的看看 怎么设置能让我连接到数据库,相关的PG_HBA.CONF的格式如下

TYPE DATABASE USER ADDRESS METHOD

主要是由 type database user address method 组成的

type 是访问数据库节点的方式,介绍两种,在数据库服务器所在位置进行访问,也叫 local 也可以理解是通过socket的方式访问, 另一种是通过TCP/IP协议进行访问,也就是非本地的方式,这样的也叫host 的方式。

而我们目前的访问的方法(通过PG ADMIN)显然是后者。

DATABASE 是你限定这个访问你数据库的账户,只能访问你数据库实例的中的某一个数据库,如果你写成 all 则是可以运行访问所有的数据库(当然仅仅是允许访问,能不能访问还要看你数据库内部的权限授予情况)

User 就是你访问数据库实例到底是用的那个账户来进行访问的,如看门大爷的问你是谁,不是随随便便的阿猫阿狗都可以放进来,当然如果你写了all 那就相当于把看门问谁来的大爷职位 fired 了

Address 更好理解,就是问你那里来的,这里有一个误区,例如我实际访问这台机器的地址是 10开头的网段的,但经过无数的网关到这里已经被转换了,所以需要和服务器一致的网段的地址,如果你不知道,看一下上面 pg_admin 提供给你的错误信息就一目了然,你应该写那个IP 了。

最后method 有不少可以选择的选择项,这里不会说那么多,只会提及两个md5 和 trust ,为啥,因为常用。这两个选择项大致的意思就是我信任你,给妃嫔出门证,你呢只要符合是哪位“妃嫔”,那个宫里出来的,就直接进入,那如果你是那位皇上,你就给人家一个 trust 信任人家呗。

反过来,你要是想刁难一下 ,md5 也是可以的,就告诉来者,必须输入密码,不输入密码,别想进,发送过来的密码也是要加密的。

当然上面的介绍比较单纯,其实选择项很多,如果你有更深层次的需求,还请看官方文档,例如来着必须是 SSL 连接来的,来者的身份验证方式不是上面两种的,要pam 的方式等等。

这里看上图,上面已经设置了

host (远程访问方式) all (可以访问所有的数据库,但能不能访问还的看你的权限) 用户 (admin) 从哪里来的 (从192.168.198.1 )来的 ,通过加密的密码来访问的,可以进入。

在保存了这些信息后,需要将数据库进行reload ,就是将信息重新加载到数据库的缓冲中,然后我们在进行数据库的访问。

OK 已经可以访问到了数据库了。

但这里需要说明的是,如果我在此将他的权限禁止掉,并且重新reload 信息到缓冲,你的当前已经进入的连接也是不受影响的。(基本上所有的数据库都是这样),你千万不要认为,我修改了配置,reload 就OK 了。要不你重启动数据服务,要不你清理掉现有的连接。

这里有一个问题需要搞清楚,就是读取pg_hba.conf 的顺序问题,不正当的次序的设置可能会造成你的设置和你预想的不同,我们看上图,

我允许了 192.168.198.1 进入的以admin 账户开始的连接,而下面又设置了拒绝全部的远程连接。到底哪个会生效?

我们创建另一个账户test ,并且拥有最大的权限

而结果是,访问被拒绝了,而继续使用admin账户来进行访问是可以的,及时有0.0.0.0 禁止全网段访问的设置,这就推出一个结论,pg_hba.conf 的执行顺序是从上到下的。

那我们在更改pg_hba.conf 的位置

结果就是原先能访问的admin的账户也不能访问了,所以pg_hba.conf的设置也应该是

1 从小到大进行设置,也就是权限的设置应该是从细致到粗放,从允许到拒绝这么一个思路来进行

2 对于现有的连接,即使reload 也对目前已经建立的连接无效。

下面的一个问题就是涉及到数据库本身的权限问题了。

在PG 里面是有默认的role的,

SELECT rolname FROM pg_roles where rolname like 'pg%';

而每建立一个用户,其实就相当于建立一个角色,而role 和 user 的区别

很多时候由是否可以登录数据库服务器作为区别之一。

而如果我们需要一个用户仅仅对所有的数据库有select 的权限可以这样做

创建一个用户 select_only 密码是 select_only

create user select_only with password 'select_only';

赋予这个用户 登录数据库的权限

alter user select_only login;

赋予这个select_only 用户 读取所有数据库的 public schema 的权限

grant select ON ALL TABLES IN SCHEMA public to select_only;

估计这个时候会有同学问,哎,你到底是给那个数据库进行赋值的,当前数据库,你执行命令当前所在的数据库将允许这个用户对数据库进行访问。

而如果你想拥有超级权限也很简单

alter user username superuser; 就可以获得你要的所有权限,为所欲为。

至于更深层次的为各种 object 进行赋值等,各位看官还是去看官方文档比较合适快速。

另如果想快速获得数据库里面的表中到底有多少用户可以访问这个表并且有什么权限可以键入 dp 将当前数据库的信息展示,重要的地方在于 access privileges ,同时也可以搞清楚到底有多少用户对这个表有权限

下面就是access privileges 中 权限简写

代码语言:javascript复制
            r -- SELECT ("read")
            w -- UPDATE ("write")
            a -- INSERT ("append")
            d -- DELETE
            D -- TRUNCATE
            x -- REFERENCES
            t -- TRIGGER
            X -- EXECUTE
            U -- USAGE
            C -- CREATE
            c -- CONNECT
            T -- TEMPORARY
      arwdDxt -- ALL PRIVILEGES (for tables, varies for other objects)

最后,修改权限后是立即生效。

0 人点赞