上一节学习了如何为Pulsar开启基于JWT的身份认证。 Pulsar使用身份认证提供者(Authentication Provider)识别客户端,但如果只启用身份认证,那么只要客户端通过认证就可以访问集群中的所有资源,因此在启用身份认证的基础上,还必须为Pulsar开启授权以进行权限管理。 其实上一节在学习JWT身份认证时,已经开启了授权。本节将详细学习一下Pulsar的授权和权限管理。

开启授权

授权操作发生在客户端认证成功,需要确定其是否有足够的权限访问Topic时。在Pulsar中使用角色定义一组权限,例如访问特定Topic的权限,Pulsar使用可配置的身份认证提供者来建立客户端的身份以及与角色的关联。

在Pulsar中拥有最高权限的角色是超级用户角色(superUserRoles),超级用户可以创建和删除租户,拥有对所有租户的所有资源的完全访问权限。上一节,我们创建了名称为admin的用户,并在broker.conf中配置superUserRoles=admin来使其成为超级用户。

为Pulsar Broker开启授权的同时需要同时指定超级用户角色(superUserRoles):

1
2
authorizationEnabled=true
superUserRoles=admin

这样就有了admin这一个超级用户,对于普通用户可以使用pulsar-admin进行授权,Pulsar的权限统一在命名空间级别进行管理(即在租户和集群内):

1
bin/pulsar-admin namespaces grant-permission my-tenant/my-namespace --role test-user --actions produce,consume

通常,pulsar-admin客户端到Broker的授权使用超级用户角色,Broker到Broker的授权使用超级用户角色,使用跨区域复制时,每个Broker要具有向其他集群所有Topic发布的权限。

也可以在Pulsar Proxy上开启授权,通过在proxy.conf中配置,如果在Pulsar Proxy上开启了授权,Proxy将在将请求转发给Broker之前进行授权检查。

角色的层次结构

Pulsar的角色在层次结构上可以分为三类: 超级管理员、租户管理员、客户端普通用户

超级管理员

超级管理员即前面说的超级用户角色,超级用户拥有对所有租户的所有资源的完全访问权限,是超级管理员。超级用户一般主要用来创建租户使用。

下面命令中的pulsar-admin配置了使用超级管理用户,该命令创建了一个名称为tenant-name的租户,并设置其租户管理员tenant-admin-role,指定该租户位于standalone集群上。

1
2
3
bin/pulsar-admin tenants create tenant-name \
   --admin-roles tenant-admin-role \
   --allowed-clusters standalone 

超级用户主要关注的是集群范围内的管理任务,例如集群的创建、管理Broker、管理租户以及租户级别的资源配额、跨地域复制等。

租户管理员

超级管理员在创建租户时,可以为租户指定一个租户管理员。 租户管理员主要关注租户内命名空间级别的资源管理。一个命名空间内的Topic是具有相同策略需求的Topic的逻辑上的集合。命名空间级别的策略会被应用到命名空间中的每个Topic上,例如命名空间级别的资源配额、数据保留策略、Backlog配额等等,另外还支持Topic级别上的配置。

客户端普通用户

Pulsar的客户端可以是任何程序,这些程序被授权使用Pulsar中的Topic,例如Procude和Consume的权限,这些权限是由租户管理员分配的。 客户端普通用户只能访问特定命名空间中的某些Topic。

权限管理

前面提到了Pulsar的权限统一在命名空间级别进行管理,下面来看一下如何使用pulsar-admin进行权限管理:

对角色进行授权:

1
2
3
pulsar-admin namespaces grant-permission test-tenant/ns1 \
  --actions produce,consume \
  --role admin10

broker.conf中的authorizationAllowWildcardsMatching=true时,可以使用通配符授权。

1
2
3
pulsar-admin namespaces grant-permission test-tenant/ns1 \
                        --actions produce,consume \
                        --role 'my.role.*'

查看命名空间被授给了哪些角色及权限:

1
2
3
4
5
6
7
pulsar-admin namespaces permissions test-tenant/ns1
{
  "admin10": [
    "produce",
    "consume"
  ]
}  

取消权限:

1
2
pulsar-admin namespaces revoke-permission test-tenant/ns1 \
  --role admin10

取消某些角色的权限后,这些角色将不再可以访问指定的命名空间。

参考