题目很新颖,PostgreSQL 是怎么把我给关到数据库里面出不来,登不进去,最后是怎么解决的,咱们且听这回分解。
上回咱们说了,怎么安全配置PostgreSQL的自建数据库产品,但在配置的时候如果忘记一件事请,就会让PostgreSQL把你关到门外面去。
我们演示一下这个过程,实际上我也真的被关到门外一次。具体怎么关到外面的我来演示一次。
在安装完数据库,为了安全和保证阿里云安全策略的扫描过关,PostgreSQL 的postgres账号必须关闭登录,有人可能问加密码不就完了吗?
那这个你就太单纯了,黑客攻击是不怕贼偷,就怕贼惦记着,你给PostgreSQL设置密码,黑客程序可以进行暴力破解,到时你的PG错误日志一堆登录密码错误的提示,他要是给破解开呢? 这锅不还是你的吗?
既然如此,那么就必须将数据库的Postgres账号禁用,在新安装的数据库中,应该先建立一个superuser账号,然后在设置postgres 账号登录的权限取消,工作完毕。但人的脑子有的时候是会出错的,我就一次将 postgres 的账号给设置后,突然清晰,我变成的 "户外人士"
postgres=#
postgres=# alter user postgres nologin;
ALTER ROLE
postgres=#
postgres=#
postgres=#
postgres=# exit
postgres@pg16:~$ psql
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL: role "postgres" is not permitted to log in
postgres@pg16:~$
此时新的数据库,也没有设置任何的superuser 那么这时我就妥妥的"户外人士"。这事情要事放到 MySQL 8 那么此时你连 skip-grant的机会都没有,但咱们这是PostgreSQL,不怕咱们有办法.
这里使用的办法就是PostgreSQL的单机模式,将用户的登录权限找回, 操作方法也很简单
1 关闭现在的数据库服务
postgres@pg16:~$ pg_ctl -D /pgdata/data/ stop
waiting for server to shut down.... done
server stopped
postgres@pg16:~$
2 启动PostgreSQL的单机模式
postgres@pg16:~$ postgres --single -D /pgdata/data/ postgres
PostgreSQL stand-alone backend 16.0
backend>
在进入到单用户模式,此时可以对数据库进行任何操作,但需要注意单用户模式的问题
1 单用户模式,只能有一个用户访问PG数据库
2 数据库此时并没有那些子进程工作,PG 此时可以进行的是修复工作,不是正常工作
3 单用户模式会绕过身份验证,给你最大的用户权限去处理任务
4 数据库在单用户模式是单进程模式工作,没有并发支持
5 虽然单用户模式还可以进行WAL的写入,但此时如vacuum checkpoint bgwrite等进程都不工作,如果要对数据进行了修改,需要进行手动的 checkpoint; 的命令操作,让数据刷到数据库中,作为一个完整的修改数据库数据后的动作。
6 尽量不要在单用户模式修改大量数据,数据库无法进行崩溃的恢复操作。
后面的事情就简单了,直接在单用模式,执行
alter user postgres login;
然后关闭单用户模式,后面在重新启动数据库,登录到数据库,做该做的工作,任务完成。PostgreSQL 数据库本身,在不少情况下都考虑到一些实际的问题,比如保留3个 superuser登录的SESSION ,单用户模式,这点 SQL SERVER 本身也有类似的功能,所以才有 PostgreSQL是最像商业数据库的开源数据库的美誉。
本文分享自 AustinDatabases 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!