【新手向】不应该在PostgreSQL中做的事情
作为一个PostgreSQL初学者的作者,由于犯了一个错误,我变得非常冷汗淋漓。因此,我将其作为备忘录写下来。希望对刚开始学习PostgreSQL的人有所帮助。
这篇文章的受众
・对于PostgreSQL来说还是个新手的人
・正在考虑安装PostgreSQL的人
・想要了解在PostgreSQL中不应该做的事情的人
・删除了超级用户权限后感到后悔的人
行动背景
・Windows 10 -> Windows十
・PostgreSQL 12 -> PostgreSQL 12
・SQL Shell(psql) -> SQL Shell(psql)
安装PostgreSQL12时的初始状态。
模式名称:postgres
数据库名称:postgres
用户(角色):postgres
在PostgreSQL中不应该做的事情。
默认用户并具有超级用户权限的“postgres”用户,不应该删除超级用户权限。
请勿轻率地从当前状态尝试执行以下命令。
postgres=# ALTER ROLE postgres NOSUPERUSER;
在详细阐述的过程中,将加入术语解释来描述内容。
默认用户是在安装时从初始状态创建的用户。在这里,默认用户是指“postgres”用户。
此外,“postgres”也是超级用户和数据库管理用户。
※关于数据库管理用户的说明,我们将不做详述。
超级用户是指具有管理员权限的用户,简单来说,就是拥有可以做任何事情的权限的用户。反过来说,如果不是超级用户,则可能会受到操作的一部分限制。
「postgres=#」的意思是,「#」表示超级用户,如果不是超级用户,则表示为「>」(例如「postgres=>」)。
因此,「postgres=#」表示以数据库「postgres」的超级用户「postgres」身份登录。
关于命令「ALTER ROLE postgres NOSUPERUSER;」,
使用「ALTER ROLE 角色名称 属性」来修改角色的属性。
该命令的意思是将角色「postgres」的属性修改为非超级用户(NOSUPERUSER)。
「角色」和「使用者」这两个词出现了,可以统一考虑。原因是因为在PostgreSQL 9.5.4文档中有这样的规定。
“用户”和”群组”的概念已经被整合到”角色”中
PostgreSQL 9.5.4文档
我想你已经理解了刚才所得出的结论。
请不要从这个状态(超级用户postgres)轻易地执行以下命令(以更改为非超级用户权限)。
postgres=# ALTER ROLE postgres NOSUPERUSER;
我将解释为何不能随意敲击的原因。
只有超级用户才能授予超级用户权限。
只有超级用户才能被授予权限,我们可以通过以下步骤进行确认。
使用超级用户“postgres”登录,并创建非超级用户“test”用户。
postgres=# CREATE ROLE test LOGIN PASSWORD 'test';
CREATE ROLE
使用\dg指令来显示角色列表,并确认角色属性。
postgres=# \dg
ロール一覧
ロール名 | 属性 | 所属グループ
-----------+--------------------------------------------------------------------------+--------------
postgres | スーパユーザ, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス | {}
test | | {}
确认了「postgres」处于超级用户状态,而「test」则不是超级用户状态。
3. 登录PostgreSQL,使用用户名”test”。
postgres=# \c - test
从用户“test”处,向用户“test”授予超级用户权限的命令。
postgres=> ALTER ROLE test NOSUPERUSER;
ERROR: スーパユーザを更新するにはスーパユーザである必要があります
然后,会发生上述错误。
通过这样验证,我们确认只有超级用户才能赋予超级用户权限。
考虑到这一点,如果从超级用户“postgres”中删除超级用户权限,可以想象会发生什么。
是的,失去了将“postgres”恢复为超级用户权限的途径。
请注意,即使是通过pgAdmin也无法恢复。pgAdmin是一种可以使用图形用户界面(GUI)来管理PostgreSQL数据库和用户的工具。
SuperUser postgres的恢复方法
如果可以的话,让我们重新安装吧。
那会很快。
通过这样做,您可以获得超级用户权限,并且可以使用默认用户postgres。
以下是关于恢复方法的额外讨论。
除了重新安装外,我搜索了其他的恢复方法,发现了一些恢复超级用户的方法。
例如,以下是一篇相关文章。
-
- PostgreSQLでpostgresを回復する
- 誤まってPostgreSQLユーザーの権限を削除した場合の対応方法
无论笔者尝试了哪种方法,都无法成功。
这是关于在文章中看到的在使用-D选项执行postges命令的方法,但在PostgreSQL 12.4文档中没有找到相关说明,所以不清楚它是否适用于PostgreSQL 12。
如果有任何方法能够恢复超级用户,我会再次写一篇文章。
应对措施
我认为为了防止这种事情发生,需要以下预防措施。
-
- 必ずpostgres以外のユーザを作成する(例:test、test_userなど)。
-
- デフォルトユーザーであり、且つスーパーユーザーの権限をもつpostgresでは、動作確認は行わない。
- ロール属性を変更するALTER ROLEや、権限を付与する「GRANT」、権限を削除する「REVOKE」コマンドを打つ前に、 現在のユーザ(ロール)を確認する(select current_user;)。
写在最后
由于我在本地环境中获得了超级用户权限,所以还有一点救济的机会。
如果这种情况发生在生产环境中,想想就很可怕…。
不仅仅是限于PostgreSQL,删除超级用户(管理员权限)是一件理所当然的事情,但由于粗心大意,我不小心做了这件事,所以我将其留作备忘录和自我警示。
如果能帮助到与我有相同想法的人或者 PostgreSQL 初学者,那就非常幸运了。
仅需要一种选项,请将以下内容以中文进行直接改写:
- [PostgreSQL] よく使うコマンドまとめ
本文中包含有关数据库、表、用户权限和架构的命令。
- PostgresSQLの初期設定
本文中还提到了关于GRANT和REVOKE命令的详细说明。