如何在VPS上使用角色和管理PostgreSQL中的授予权限

什么是PostgreSQL

PostgreSQL是一个使用SQL查询语言的开源数据库管理系统。 PostgreSQL是一个强大的工具,可用于管理您的VPS上的应用程序和Web数据。

在这个gude中,我们将讨论如何正确管理权限和用户授权权限。 这将允许您为应用程序提供他们需要的特权,而不允许他们自由地影响单独的数据库。

我们将在Ubuntu 12.04云服务器上使用PostgreSQL,但是安装之外的任何东西在任何现代Linux发行版上都应该是相同的。

初始PostgreSQL安装

如果您尚未在Ubuntu上安装PostgreSQL,请键入以下命令以下载并安装它:

sudo apt-get update
sudo apt-get install postgresql postgresql-contrib

在安装过程中,PostgreSQL将创建一个默认用户来操作。 我们将使用此用户进行初始步骤。 使用以下命令登录:

sudo su - postgres

我们的环境现在准备好了,我们可以开始学习PostgreSQL如何处理权限。

PostgreSQL权限概念

PostgreSQL(或简称“postgres”)通过“角色”的概念管理权限。

角色与传统的Unix风格权限不同,用户和组之间没有区别。 角色可以被操纵以类似这两个约定,但它们也更灵活。

例如,角色可以是其他角色的成员,允许其承担先前定义的角色的权限特征。 角色还可以拥有对象并控制对其他角色的这些对象的访问。

如何查看PostgreSQL中的角色

我们可以通过使用以下命令登录到提示界面来查看PostgreSQL中当前定义的角色:

psql

要获取角色列表,请键入:

\du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication | {}

可以看到,只有一个默认角色,它有许多强大的权限。

如何在PostgreSQL中创建角色

有许多不同的方法为Postgres创建角色。 可以从Postgres或命令行创建角色。

如何在PostgreSQL中创建角色

创建新角色的最基本方法是在Postgres提示界面内。

您可以使用以下语法创建新角色:

CREATE ROLE new_role_name;

让我们创建一个名为“demo_role”的新角色:

CREATE ROLE demo_role;
CREATE ROLE

如果我们再次检查已定义的用户,我们将得到以下结果:

\du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 demo_role | Cannot login                                   | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}
我们提供的唯一信息是新角色没有登录权限。 这是现在好了。

如何从命令行创建角色

创建角色的另一种方法是使用“createuser”命令。

输入以下命令,退出PostgreSQL命令提示符:

\q

使用以下命令创建名为“test_user”的角色:

createuser test_user
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n

系统将询问您将为新角色定义一些初始权限的一系列问题。 如果对所有这些提示回答“n”,则您将创建一个类似于我们创建的上一个用户的用户。

我们可以重新登录到Postgres提示符并再次发出“\ du”命令,以查看两个新角色之间的差异:

psql
\du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 demo_role | Cannot login                                   | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}
 test_user |                                                | {}

如您所见,这些命令不会产生相同的结果。 从命令行创建的用户没有作为属性列出“无法登录”。

如何在PostgreSQL中删除角色

作为练习,让我们尝试让“demo_role”具有与“test_user”相同的权限。 我们将在创建过程中首先尝试此操作,稍后将学习如何更改现有角色的权限。

在我们可以练习定义创建“demo_role”的权限之前,我们需要销毁当前角色,以便我们可以重试。

您可以使用以下语法删除角色:

DROP ROLE role_name;

通过键入以下内容删除“demo_role”角色:

DROP ROLE demo_role;
DROP ROLE

如果我们在不存在的用户上发出命令,我们将收到此错误:

DROP ROLE demo_role;
ERROR:  role "demo_role" does not exist

为了避免这种情况,并使drop命令删除用户(如果存在),并且如果用户不存在则静默执行操作,请使用以下语法:

DROP ROLE IF EXISTS role_name;

如您所见,使用指定的此选项,无论角色的有效性如何,命令都将成功完成:

DROP ROLE IF EXISTS demo_role;
NOTICE:  role "demo_role" does not exist, skipping
DROP ROLE

如何在创建角色时定义权限

现在,我们准备重新创建具有改变的权限的“demo_role”角色。 我们可以通过在main create子句后指定我们想要的权限来做到这一点:

CREATE ROLE role_name WITH optional_permissions;

您可以通过键入以下内容查看完整的选项列表:

\h CREATE ROLE

我们想给这个用户登录的能力,所以我们将键入:

CREATE ROLE demo_role WITH LOGIN;
CREATE ROLE

如果我们再次检查属性,我们可以看到两个用户现在拥有相同的权限:

\du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 demo_role |                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}
 test_user |                                                | {}

如果我们希望在每次创建角色时都不需要指定“login”属性,我们实际上可以使用以下命令而不是“CREATE ROLE”命令:

CREATE USER role_name;

两个命令之间的唯一区别是“CREATE USER”自动赋予角色登录权限。

如何在PostgreSQL中改变角色的特权

要更改已创建角色的属性,我们使用“ALTER ROLE”命令。

此命令允许我们定义权限更改,而不必删除和重新创建用户,如我们前面所示。

基本语法是:

ALTER ROLE role_name WITH attribute_options;

例如,我们可以通过发出以下命令将“demo_role”改回到之前的状态:

ALTER ROLE demo_role WITH NOLOGIN;
ALTER ROLE

我们可以看到这些权限已经恢复到其先前的状态:

\du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 demo_role | Cannot login                                   | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}
 test_user |                                                | {}

我们可以使用以下命令轻松地更改它:

ALTER ROLE demo_role WITH LOGIN;

如何在PostgreSQL中以不同的用户身份登录

默认情况下,如果系统用户名与PostgreSQL用户名匹配,则只允许用户本地登录。

我们可以通过改变登录类型,或通过指定PostgreSQL应该使用环回网络接口,这将改变连接类型为远程,即使它实际上是一个本地连接。

我们将讨论第二个选项。 首先,我们需要向用户提供我们想要连接的密码,以便我们进行身份验证。

使用以下命令给“test_user”一个密码:

\password test_user

系统将提示您输入并确认密码。 现在,退出PostgreSQL界面并退回到您的普通用户。

\q
exit

PostgreSQL假定当您登录时,您将使用与您的操作系统用户名相匹配的用户名,并且您将连接到具有相同名称的数据库。

这不是我们所展示的情况,因此我们需要明确指定我们要使用的选项。 使用以下语法:

psql -U user_name -d database_name -h 127.0.0.1 -W

“user_name”应该替换为我们想要连接的用户名。 类似地,“database_name”应该是您有权访问的现有数据库的名称。

“-h 127.0.0.1”部分是指定我们将连接到本地机器,但通过网络接口,这允许我们即使我们的系统用户名不匹配的身份验证的部分。 “-W”标志告诉PostgreSQL我们将输入密码。

要使用我们的“test_user”登录,我们可以发出以下命令:

psql -U test_user -d postgres -h 127.0.0.1 -W
Password for user test_user:

您需要输入您配置的密码。 在我们的示例中,我们使用数据库“postgres”。 这是在安装期间设置的默认数据库。

如果你试图在这个会话中执行一些操作,你会发现你没有能力做很多事情。 这是因为我们没有给予“test_user”权限来管理许多事情。

让我们退出并返回到管理会话:

\q
sudo su - postgres
psql

如何授予在PostgreSQL的权限

创建数据库或表时,通常只有创建它的角色(不包括具有超级用户状态的角色)才有修改它的权限。 我们可以通过向其他角色授予权限来更改此行为。

我们可以使用“GRANT”命令授予权限。 一般的语法如下:

GRANT permission_type ON table_name TO role_name;

创建一个简单的表来练习这些概念:

CREATE TABLE demo (
name varchar(25),
id serial,
start_date date);
NOTICE:  CREATE TABLE will create implicit sequence "demo_id_seq" for serial column "demo.id"
CREATE TABLE

我们可以看到的结果:

\d
             List of relations
 Schema |    Name     |   Type   |  Owner   
--------+-------------+----------+----------
 public | demo        | table    | postgres
 public | demo_id_seq | sequence | postgres
(2 rows)

我们现在可以授予一些特权将新的“demo”表改为“demo_role”。 使用以下命令为用户提供“UPDATE”权限:

GRANT UPDATE ON demo TO demo_role;

我们可以通过用“all”替换权限类型向用户授予完全权限:

GRANT ALL ON demo TO test_user;

如果我们要为系统上的每个用户指定权限,我们可以使用单词“public”而不是特定的用户:

GRANT INSERT ON demo TO PUBLIC;

要查看授权表,请使用以下命令:

\z
                                    Access privileges
 Schema |    Name     |   Type   |     Access privileges      | Column access privileges 
--------+-------------+----------+----------------------------+--------------------------
 public | demo        | table    | postgres=arwdDxt/postgres +| 
        |             |          | demo_role=w/postgres      +| 
        |             |          | test_user=arwdDxt/postgres+| 
        |             |          | =a/postgres                | 
 public | demo_id_seq | sequence |                            | 
(2 rows)

这显示了我们刚刚分配的所有授予权限。

如何清除PostgreSQL中的权限

您可以使用“REVOKE”命令删除权限。 revoke命令使用与grant类似的语法:

REVOKE permission_type ON table_name FROM user_name;

同样,我们可以使用相同的速记词(all和public)使命令更容易:

REVOKE INSERT ON demo FROM PUBLIC;

如何在PostgreSQL中使用组角色

角色足够灵活,允许对其他角色进行分组,以允许广泛的权限控制。

例如,我们可以创建一个名为“temporary_users”的新角色,然后将“demo_role”和“test_user”添加到该角色:

CREATE ROLE temporary_users;
GRANT temporary_users TO demo_role;
GRANT temporary_users TO test_user;

现在,这两个用户可以通过操作“temporary_users”组角色来管理其权限,而不是单独管理每个成员。

我们可以通过键入以下内容查看角色成员资格信息:

\du
                                    List of roles
    Role name    |                   Attributes                   |     Member of     
-----------------+------------------------------------------------+-------------------
 demo_role       |                                                | {temporary_users}
 postgres        | Superuser, Create role, Create DB, Replication | {}
 temporary_users | Cannot login                                   | {}
 test_user       |                                                | {temporary_users}

组角色的任何成员都可以通过使用“set role”命令充当它们所属的组角色。

由于我们登录的“postgres”用户当前有超级用户权限,我们可以使用“设置角色”,即使我们不是该组的成员:

SET ROLE temporary_users;

现在,创建的任何表都由temporary_users角色拥有:

CREATE TABLE hello (
name varchar(25),
id serial,
start_date date);

我们可以通过发出以下命令来检查表所有权:

\d
                 List of relations
 Schema |     Name     |   Type   |      Owner      
--------+--------------+----------+-----------------
 public | demo         | table    | postgres
 public | demo_id_seq  | sequence | postgres
 public | hello        | table    | temporary_users
 public | hello_id_seq | sequence | temporary_users
(4 rows)

如您所见,新表(以及与串行数据类型相关联的序列)由“temporary_users”角色拥有。

我们可以使用以下命令恢复到我们的原始角色权限:

RESET ROLE;

如果我们给用户带有“alter role”命令的“inherit”属性,那么该用户将自动拥有他们所属角色的所有权限,而无需使用“set role”命令:

ALTER ROLE test_user INHERIT;

现在,test_user将拥有它所属角色的所有权限。

我们可以使用“drop role”命令删除组角色(或任何角色):

DROP ROLE temporary_users;
ERROR:  role "temporary_users" cannot be dropped because some objects depend on it
DETAIL:  owner of table hello
owner of sequence hello_id_seq

这将给你一个错误,因为我们创建了一个由“temporary_users”拥有的表。 我们可以通过将所有权转让给不同的角色来解决这个问题:

ALTER TABLE hello OWNER TO demo_role;

如果我们检查,我们可以看到“temporary_users”不再拥有任何表:

\d
              List of relations
 Schema |     Name     |   Type   |   Owner   
--------+--------------+----------+-----------
 public | demo         | table    | postgres
 public | demo_id_seq  | sequence | postgres
 public | hello        | table    | demo_role
 public | hello_id_seq | sequence | demo_role
(4 rows)

我们现在可以通过再次发出命令成功删除“temporary_users”角色:

DROP ROLE temporary_users;

这将破坏temporary_users角色。 临时用户的前成员不被删除。

结论

您现在应该具有管理PostgreSQL数据库权限所需的基本技能。 重要的是知道如何管理权限,以便您的应用程序可以访问他们需要的数据库,而不会中断其他应用程序使用的数据。

作者:Justin Ellingwood
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏