Keycloak授权服务指南
本⽂译⾃Keycloak官⽅⽂档,。对应版本为5.0。
概述
Keycloak⽀持细粒度的授权策略,并可以对这些策略进⼀步组合,如:
基于属性(ABAC)
基于⾓⾊(RBAC)
基于⽤户(UBAC)
基于上下⽂(CABC)
基于规则(Rule-based)
通过JavaScript
使⽤Jboss Drools
基于时间(Time-based)
通过SPI⾃定义访问控制策略(ACM)
Keycloak提供了⼀组管理界⾯和RESTful API,⽤于创建权限、关联权限与授权策略,以及在应⽤程序中执⾏授权决策。
资源服务器需要依据⼀些信息才能判断权限。对于REST的资源服务器来说这些信息通常来⾃于⼀个加密的token,如在每个访问请求中携带bearer token。对于依赖于session的Web应⽤来说,这些信息就来⾃于每个request对应的⽤户session。
资源服务器通常执⾏的是基于⾓⾊的访问控制(RBAC)策略,即检查⽤户所拥有的⾓⾊是否关联了要访问的资源。虽然这种⽅式⾮常有⽤,但是它们也有⼀些限制:
资源和⾓⾊紧耦合,⾓⾊的更改(如添加、删除或更改访问上下⽂)可能影响多个资源。
基于RBAC的应⽤程序⽆法很好地响应安全性需求的调整。
web后端是指什么项⽬规模扩⼤时,复杂的⾓⾊管理会很困难⽽且容易出错。
不够灵活。⾓⾊并不能有效代表⽤户⾝份,即缺乏上下⽂信息。客观上来说被授予了⾓⾊的⽤户,⾄少会拥有某些访问权限。
当下的项⽬中,我们需要考虑不同地区、不同本地策略、使⽤不同设备、以及对信息共享有较⾼需求的异构环境。Keycloak授权服务可以通过以下⽅式帮助您提⾼应⽤程序和服务的授权能⼒:
不同的访问控制机制以及细粒度的授权策略。
中⼼化的资源、权限以及策略管理。
中⼼化的策略决策。
REST风格的授权服务。
授权⼯作流以及⽤户访问管理。
可作为快速响应您项⽬中安全需求的基础设施。
架构
从设计的⾓度来看,授权服务基于⼀组授权模式,提供了以下功能:
策略管理点(PAP)
在Keycloak Admin的基础上提供了UI界⾯来管理资源服务器、资源、范围、权限以及策略。其中的部分功能也可以通过来实现。
策略决策点(PDP)
为和权限请求相应的授权请求以及策略评估,提供了分布式的策略决策点。更多信息请查看章节。
策略执⾏点(PEP)
为资源服务器端实际执⾏授权决策,Keycloak提供了⽤于不同环境的⼀些内置策略执⾏器。
策略信息点(PIP)
基于Keycloak的认证服务器,可以在策略评估时从⾝份认证信息以及上下⽂环境中获取⼀些其它属性。
授权过程
Keycloak的细粒度授权主要有三个必要步骤:
资源管理
权限及策略管理
执⾏策略
资源管理
资源管理定义了什么是被保护的对象。
⾸先,需要定义被保护的资源服务器,通常是⼀个web应⽤或⼀组服务。有关资源服务器的更多信息请参考。
资源服务器可以使⽤Keycloak管理员控制台来管理。在那⾥,您可以将任何已注册的客户端启⽤为资源服务器,并管理其资源和范围。
资源可以是web页⾯、Rest资源、⽂件系统上的⼀个⽂件、⼀个EJB等等。它们可以是⼀组资源(如Java中的⼀个Class),也可以是⼀个特定的资源。
举例来说,你可以⽤Bank Account来代表所有的银⾏账户,并且⽤它来定义对全部银⾏账户的通⽤授权。但同时你也可以为Alice的私有账户来单独设置权限,使得只有Alice本⼈能够对其账户进⾏某些操作。
资源可以通过Keycloak控制台或者Protection API来管理。利⽤Protection API的⽅式,资源服务器可以远程管理资源。
范围(Scope)通常⽤来表⽰在资源上执⾏的动作,还可以使⽤范围来代表资源中的⼀个或者多个属性。
权限及策略管理
定义好了资源服务器和其上的资源,下⼀步就是定义权限和策略。
定义策略的步骤图⽰如下:
策略定义了在资源或者范围上执⾏某些动作的先决条件,但是请记住它们并不和被保护的资源直接绑定。策略是通⽤的,可以通过再次组合来构造更复杂的权限及策略。
举例来说,要获取“User Premium”⾓⾊下的资源组访问权限,你可以使⽤RBAC策略。
Keycloak为常⽤场景提供了⼀些内置的策略类型。你可以使⽤JavaScript或者JBoss的Drools来编写⾃⼰的策略。
定义了策略之后就可以来定义权限了。权限与被保护的资源紧耦合,它们由被保护对象及策略组合⽽成。
执⾏策略
策略的执⾏包含了对资源服务器实际实施授权决策的必要步骤。实现⽅式是在资源服务器上启⽤策略执⾏点(PEP),PEP能够与授权服务器通信,请求授权数据,并根据服务器返回的决策来控制对受保护资源的访问。
Keycloak提供了⼀些内置的PEP实现,你可以根据项⽬运⾏平台来⾃由选择。
授权服务
授权服务包括下列三种REST端点:
Token Endpoint
Resource Management Endpoint
Permission Managerment Endpoint
上边的各个端点涵盖了授权服务的各个步骤。
Token Endpoint
Oauth2客户端(如前端应⽤)可以通过token endpoint获取访问令牌(access token),然后使⽤这些令牌来获取资源服务器(如后端应⽤)上被保护的资源。同样,Keycloak授权服务扩展了OAuth2,允许基于配置好的策略发放访问令牌。这意味着资源服务器可以利⽤关联了权限的令牌来对资源进⾏保护。在Keycloak中,带有权限的访问令牌被称作请求⽅令牌(Requesting Party Token),或者缩写为RPT。
更多的信息请查看章节。
保护API
保护API指提供的⼀系列的操作,⽤来帮助资源服务器管理资源、范围、权限及相关策略。只有资源服务器才能被允许访问这些API,前提是资源服务器有内置的uma_protection范围。
提供给资源服务器的API可以分为两组:
资源管理
创建资源、删除资源、根据ID查询、其他查询
权限管理
发放权限Ticket
远程管理资源的功能默认是开启的。可以通过Keycloak管理员控制台来关闭此功能。
如果使⽤了UMA协议,Protection API对权限Ticket的发放是整个授权流程的重要组成部分。后⾯会讲到,它们表⽰着在整个授权过程中客户端所申请的权限及向服务器申请包含着权限的最终令牌。
更多信息请查看章节。
名词解释
在深⼊到Keycloak前我们需要解释⼀下Keycloak授权服务中所⽤到的专有名词。
资源服务器(Resource Server)
如前所述,资源服务器通常依赖某种信息来决定是否授权。该授权信息通常包含在安全令牌或⽤户会话中。
任何可信的Keycloak客户端都可以作为资源服务器。这些客户端的资源及范围由⼀系列的授权策略保护。
资源
资源是应⽤或者组织的资产。它们可以是⼀些列的端点、⼀个典型的HTML页⾯等等。在授权策略语境中,资源指的就是被保护的对象。
每个资源或者每组资源都有着唯⼀标识。请回想上⽂的Bank例⼦。
范围
资源的范围扩展了资源的访问界限。在授权语义中,范围是可以应⽤在资源上的许多动词之⼀。
它通常表⽰对指定资源可施加的动作。如查看、编辑、删除等等。但是范围也可以表⽰资源的其它关联信息。如⼯程资源和造价范围,这⾥的造价范围被⽤来定义⽤户访问⼯程造价的特定策略及权限。
权限
权限将被保护的对象与必须评估的策略关联起来,以确定是否允许访问。
X 可以在资源 Z 上施加 Y
这⾥X指可以是⽤户、⾓⾊、⽤户组,或者其组合。在这⾥你可以使⽤声明和上下⽂。
Y指代⼀个动作,如写、读等等。
Z指代被保护的资源,如 "/accounts"。
Keycloak提供了丰富的平台⽤于构建从简单到复杂的权限策略,如基于规则的权限控制。使⽤Keycloak可以带来:
减少代码重构和权限管理成本。
⽀持灵活的安全模型,⽤以应对安全模型可能的变化。
⽀持运⾏时变化。应⽤系统只需要关⼼资源和范围,Keycloak隐藏了它们如何被保护的细节
策略
策略定义了授予对象访问权时必须满⾜的条件。与权限不同,策略不指定受保护的对象,⽽是指定访问制定对象(如资源、范围或两者)时必须满⾜的条件。策略与⽤来保护资源的访问控制机制(ACMs)密切相关。使⽤策略可以实现基于属性的访问控制(ABAC)、基于⾓⾊的访问控制(RBAC)、基于上下⽂的访问控制以及其任何组合。
Keycloak还提供了聚合策略,即“策略的策略”。在构造复杂的访问控制条件时,Keycloak授权服务遵循了分⽽治之的原则。你可以创建独⽴的策略,并在不同的权限中使⽤它们,然后通过组合它们来构造更复杂的策略。
策略提供者(Policy Provider)
策略提供者是特定策略类型的具体实现。Keycloak提供的内置策略都是由不同的提供者来⽀持的。Keycloak允许添加⾃定义的策略类型。
Keyclaok提供了SPI(Service Provider Interface),你可以使⽤SPI来添加⾃定义策略提供者。
权限许可(Permission Ticket)
权限许可(权限ticket)是由UMA定义的特殊token类型,它的不透明结构由授权服务器所决定。这种结构代表了客户端请求的资源或者范围、访问上下⽂,以及要执⾏的策略。
在UMA中,权限许可是⼈与⼈、⼈与组织之间共享的关键。在授权⼯作流中使⽤权限ticket可以⽀持⼀系列从简单到复杂的场景,让资源所有者和资源服务器细粒度地控制资源访问。
在UMA⼯作流中,授权服务器向资源服务器发出权限ticket,资源服务器将ticket返回给试图访问受保护资源的客户端。客户端拿到ticket 就可以通过将它发送回授权服务器来请求RPT(最终的包含授权数据的令牌)。
更多授权许可的信息请查看及。
开始
在使⽤本教程之前,请确保正确安装了Keycloak并已经。注意,你必须在Keycloak同⼀台主机上运⾏独⽴的WildFly实例。这个独⽴的实例将⽤来运⾏你的Java Servlet应⽤。你可以在启动命令中使⽤jboss.socket.binding.port-offset来避免端⼝冲突。
可以⽤如下命令来启动Keycloak服务(Linux版):
$ .../bin/standalone.sh -Djboss.socket.binding.port-offset=100
Windows版:
> ...\bin\standalone.bat -Djboss.socket.binding.port-offset=100
更多安装配置WildFly的细节请查看。
保护Servlet应⽤
本⼊门指南旨在让您尽快启动、运⾏及测试Keycloak提供的各种授权特性。它主要依赖于默认的数据库和服务器配置,并不涉及复杂的部署选项。有关特性或配置选项的更多信息,请参阅本⽂档中的相关部分。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。