精华内容
下载资源
问答
  • 令牌窃取原理及利用

    2020-09-09 22:48:27
    令牌最大的特点就是随机性,不可预测,一般黑客或软件无法猜测出来,令牌有很多种,比如访问令牌表示访问控制操作主题的系统对象;密保令牌,有叫作认证令牌或者硬件令牌,是一种计算机身份效验的物理设备,会话令牌...

    原理

    在这里插入图片描述

    令牌是系统的临时密钥,相当于账户名和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的,它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌持续存在系统中,除非系统重新启动。
    令牌最大的特点就是随机性,不可预测,一般黑客或软件无法猜测出来,令牌有很多种,比如访问令牌表示访问控制操作主题的系统对象;密保令牌,有叫作认证令牌或者硬件令牌,是一种计算机身份效验的物理设备,会话令牌是交互会话中唯一的身份标识符。

    Kerberos协议

    在假冒令牌攻击中需要使用kerberos协议,所以在使用假冒令牌前,先来介绍kerberos协议。
    kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。
    在这里插入图片描述
    客户端请求证书的过程如下:

     - 客户端向认证服务器AS发送请求,要求得到服务器的证书
     - AS收到请求后,将包含客户端密钥的加密证书响应发送给客户端,该证书包括服务器ticket(包括服务器密钥加密的客户机身份和一份会话密钥)和一个临时加密密钥(又称会话密钥,session key)当然,认证服务器也会给服务器发送一份该证书,用来使服务器认证登陆客户端的身份
     - 客户端将ticket传送到服务器上,服务器确认该客户端的话,便允许它登陆服务器
     - 客户端登陆成功后,攻击者就可以通过入侵服务器获取客户端的令牌
    

    攻击利用

    此时假设我们通过一系列的前期渗透,已经成功获得了目标机的shell,首先输入getuid命令查看已经获得的权限,然后输入getsystem,发现失败

    getuid
    

    输入use incognito命令,然后输入list_tokens-u列出可用的token

    use incognito
    

    找到高权限的授权令牌然后假冒,成功即可获取权限,接下来在incognito_token命令进行攻击

    incognito_token 目标主机名和登陆用户名
    

    攻击成功就可以看到权限换了

    展开全文
  • QOS令牌原理1

    2019-09-10 10:01:20
    令牌桶算法是目前 IP QoS 中最常采用的一种流量测量方法,广泛应用于约定访问速率技术、通用流量整形技术以及物理接口总速率限制等技术中。IETF RFC 建议规范了单速率三色标记和双速率三色标记两种令牌桶算法,在桶...

    令牌桶算法是目前 IP QoS 中最常采用的一种流量测量方法,广泛应用于约定访问速率技术、通用流量整形技术以及物理接口总速率限制等技术中。IETF RFC 建议规范了单速率三色标记和双速率三色标记两种令牌桶算法,在桶的构成、令牌添加和报文处理流程方面前者较后者简单,成为目前业界比较常用的流量标记方式。在实际应用中,应针对不同的流量特征选择恰当的标记方式。

    随着因特网的发展,IP 业务不断快速增长。提高信息在 IP 网络上传输的质量是 IP 网发展中的一个关键所在。IP QoS 技术的开发,目的就是为用户业务提供端到端的服务质量保证,已成为近几年业界研究的热点。目前存在多种 IP QoS 服务模型,其中应用最广的是区分服务模型(DiffServ)。DiffServ 模型通过数据包分类、拥塞管理、拥挤避免、速率限制和流量整形技术来实现服务质量控制,在其速率限制和流量整形中,主要使用了令牌桶算法来评估流量速率是否超过规定值[1]。

    本文第一部分阐述了一下网络工程师任务小组(IETF) 请求注解(RFC)建议规范的两种令牌桶算法;第二部分简要介绍了令牌桶算法在 IP QoS 中的应用;第三部分详细说明了目前业界常用的两种实现方式,并对两种方式的实现过程进行了具体的比较分析。

    1、令牌桶算法基本原理

    令牌桶是网络设备的内部存储池,而令牌则是以给定速率填充令牌桶的虚拟信息包。每个到达的令牌都会从数据队列领出相应的数据包进行发送,发送完数据后令牌被删除。

    RFC 中定义了两种令牌桶算法——单速率三色标记算法和双速率三色标记算法,其评估结果都是为报文打上红、黄、绿三色标记。QoS 会根据报文的颜色,设置报文的丢弃优先级,其中单速率三色标记比较关心报文尺寸的突发,而双速率三色标记则关注速率上的突发,两种算法都可工作于色盲模式和非色盲模式。以下结合这两种工作模式介绍一下 RFC 中所描述的这两种算法。

    1.1 单速率三色标记算法

    IETF 的 RFC 文件[2]定义了单速率三色标记算法,评估依据以下 3 个参数:承诺访问速率(CIR),即向令牌桶中填充令牌的速率;承诺突发尺寸(CBS),即令牌桶的容量,每次突发所允许的最大流量尺寸(注:设置的突发尺寸必须大于最大报文长度);超额突发尺寸(EBS)。

    一般采用双桶结构:C 桶和 E 桶。Tc 表示 C 桶中的令牌数,Te 表示 E 桶中令牌数,两桶的总容量分别为 CBS 和 EBS。初始状态时两桶是满的,即 Tc 和 Te 初始值分别等于 CBS和EBS。令牌的产生速率是 CIR,通常是先往 C 桶中添加令牌,等 C 桶满了,再往 E 桶中添加令牌,当两桶都被填满时,新产生的令牌将会被丢弃。

    色盲模式下,假设到达的报文长度为 B。若报文长度 B 小于 C 桶中的令牌数 Tc,则报文被标记为绿色,且 C 桶中的令牌数减少 B;若 Tc<BTe,标记为红色,两桶总令牌数都不减少。

    在非色盲模式下,若报文已被标记为绿色或 B<TC,则报文被标记为绿色,TC 减少 B;若报文已被标记为黄色或 TC<B>Te,则标记为红色,Tc 和 Te 都不减少。

     

    1.2 双速率三色标记算法

    IETF 的 RFC 文件[3]定义了双速率三色算法,主要是根据 4 种流量参数来评估:CIR、CBS、峰值信息速率(PIR),峰值突发尺寸(PBS)。前两种参数与单速率三色算法中的含义相同,PIR 这个参数只在交换机上才有,路由器没有这个参数。该值必须不小于 CIR 的设置值,如果大于 CIR,则速率限制在 CIR 于 PRI 之间的一个值。

    与单速率三色标记算法不同,双速率三色标记算法的两个令牌桶 C 桶和 P 桶填充令牌的速率不同,C 桶填充速率为 CIR,P 桶为 PIR;两桶的容量分别为 CBS 和 PBS。用 Tc 和 Tp表示两桶中的令牌数目,初始状态时两桶是满的,即 Tc 和 Tp 初始值分别等于 CBS 和 PBS。

    色盲模式下,如果到达的报文速率大于 PIR,超过 Tp+Tc 部分无法得到令牌,报文被标记为红色,未超过 Tp+Tc 而从 P 桶中获取令牌的报文标记为黄色,从 C 桶中获取令牌的报文被标记为绿色;当报文速率小于 PIR,大于 CIR 时,报文不会得不到令牌,但超过 Tp 部分报文将从 P 桶中获取令牌,被标记为黄色报文,从 C 桶中获取令牌的报文被标记为绿色;当报文速率小于 CIR 时,报文所需令牌数不会超过 Tc,只从 C 桶中获取令牌,所以只会被标记为绿色报文。

    在非色盲模式下,如果报文已被标记为红色或者超过 Tp+Tc 部分无法得到令牌的报文,被标记为红色;如果标记为黄色或者超过 Tc 未超过 Tp 部分报文记为黄色;如果报文被标记为绿或未超过 Tc 部分报文,被标记为绿色。

     

    2、令牌桶算法的应用

    2.1 在流量监管中的应用

    约定访问速率(CAR)是流量监管常用技术之一,它的监管原理如图 1 所示。

    根据预设的匹配规则先对报文进行分类,不符合匹配规则的报文不需要经过令牌桶的处理,直接发送;符合匹配规则的报文,则需要令牌桶进行处理。当桶中有足够的令牌则报文可以被继续发送下去,同时令牌桶中的令牌量按报文的长度做相应的减少;当令牌桶中的令牌不足时,报文将不能被发送,只有等到桶中生成了新的令牌,报文才可以发送。这就可以限制报文的流量只能是小于等于令牌生成的速度,达到限制流量的目的。

    2.2 在通用流量整形中的应用

    通用流量整形中(GTS)[4](如图 2 所示)与 CAR 的原理稍有差别:第一,GTS 只用于出方向流量限速,CAR 出入方向均可以,但一般多用于入方向;第二,利用 CAR 进行报文流量控制时,对超过速率限制的报文直接丢弃,而 GTS 则是对超过速率限制的报文进行缓冲,即当令牌桶中的令牌少到报文不能再发送时,报文将被缓存入队列,等有了足够的令牌之后再发送,这样就减少了报文的丢弃,但是要注意的是,如果缓存队列已满,这时到达的报文仍旧会被丢弃。

     

     

     

    2.3 在端口限速中的应用

    端口限速(LR)[4](如图 3 所示)也用于出方向,但不同于 GTS 的是:第一,GTS 与 CAR 是在 IP 层实现的,所以对于不经过 IP 层处理的报文不起作用,而 LR 则能够限制在物理接口上通过的所有报文;第二,LR 不但能够对超过流量限制的报文进行缓存,并且可以利用 QoS 丰富的队列如优先级队列(PQ)、自定义队列(CQ)、加权公平对列(WFQ)等来缓存报文。

     

    3、令牌桶实现

    上面介绍了 RFC 中定义的令牌桶技术原理以及其在 IP QoS 中的应用,但是在实际应用中,令牌桶究竟是怎么实现的?令牌桶中的令牌是怎么添加的?报文的处理流程又是什么样的?下面就简单谈一谈令牌桶在业界的实现方式。

    3.1 单速率三色标记算法的实现

    3.1.1 桶的构成

    在令牌桶的构成上,目前业界有两种方式,如图 4 所示。

    可以由一个桶实现,即 C 桶是 E 桶中的一部分(图 4 上),最终桶的容量是由 EBS 决定的。不管有没有突发流量,EBS 不能为 0,必须大于或等于 CBS。这种实现方式完全按照令牌桶的定义来实现,因为 CBS 和 EBS 都是令牌桶的参数,所以放入一个相同的桶实现,通过突发计数器来进行区分。也可以由两个桶实现(图 4 下),即 C 桶和 E 桶分开实现。如果不允许有突发流量,EBS 则设置成 0。

    3.1.2 令牌添加

    令牌桶的添加完全依照 RFC 规定实现,按照恒定的速率 CIR 添加。即每隔 1/CIR 时间添加一个令牌,添加顺序为先添加 C 桶再添加 E 桶,当令牌桶添加满的时候,再产生的令牌就会被丢弃。

    实际中比较常见的有两种实现方式:(1)周期性的添加,如图 5 所示,添加的时间间隔就是令牌桶的容量与添加速率的比值:T c=CBS/CIR,每次添加的令牌数为 CBS 个;(2)一次性添加,只有当令牌桶中没有令牌时才添加令牌,如图 6 所示,添加令牌的数量是△ t×CIR(△t 是当前时间与上次添加令牌的时间之差),且是一次添加完毕,并不是按照一定速率添加。

     

    3.1.3 报文处理流程

    一般的报文处理方法如图 7 所示:当报文到来后,直接与桶中的令牌数相比较,如果有足够的令牌就转发,如果没有足够的令牌则丢弃或缓存。这种令牌桶处理方式在突发流量的处理上没有优势,也就是说当存在较大的突发流量时,令牌桶可能会由于没有足够令牌无法处理报文,而且在没有突发流量且报文到达速率较大时,报文处理流程也不连续,有时会因为令牌数量不足而造成丢包。

    为解决这种无谓的丢包问题,目前业界采用了一种借贷机制的报文处理方法,如图 8 所示。当报文到来后,只要令牌桶中有令牌,无论数量是否足够,都可以转发报文。当令牌数量小于报文长度时,就可以欠债转发,即转发后令牌桶中令牌数目为负;当下次添加令牌的时候,先还清所欠债务,再继续转发报文。这种处理方法较前者在处理突发报文时有优势,能够保证报文发送的连续性。

     

    3.1.4 实现方式比较

    假设令牌桶的总容量为 1 000 kb,CIR 为 125 kb/s,报文到达的速率为 200 kb/s,报文长度为 125 kB (1 000 kb)。

    方式一:周期性添加令牌,只有当令牌数足够时才转发报文。添加令牌的周期为 8 s,而转发一条报文的时间为 5 s。

    方式二:一次性添加令牌,当令牌数不足时采用借债机制。转发一条报文的时间是 5 s,但是添加令牌的时间是不一定的,每次添加令牌的数目为 CIR×△t。

    9 至图 11 是对这两种方式的令牌桶中令牌数、报文转发速率和令牌添加过程的比较。分析数据的处理流程得出以下结论:

    (1) 数据包丢弃率:方式二的丢包率远小于方式一。

    方式一中,由于令牌添加周期与报文发送周期的不一致,导致第 6 s 到第 8 s 由于没有令牌不能转发报文。而第 8 s 到第 16 s 虽然在不断添加令牌,但令牌数不足以转发一个报文,所以仍旧无法转发报文,那在这一段时间内到达的报文将被丢弃掉。在前 16s 的时间内丢包率达到了 10/16≈62.5%,由于添加令牌和发送报文的时间都是固定的,所以整个发送过程中的丢包率也为 62.5%。

    方式二中,第 5 s 第一条报文发送结束令牌被消耗光,但第 6 s 又立即加入了 550 kb 令牌,虽不够转发一条报文,但可以采用借债机制,直到第 10 s 第二条报文发送结束,累计欠债 250 kb。这时若有报文到达,就不能继续欠债,而要注入新的令牌才能继续转发。直到15 s 第三条报文发送完毕由于一次添加令牌不够还清所欠令牌,所以造成了短暂的丢包现象,而在前 17s 内丢包率仅为 1/17≈5.9%。

    (2)突发流量处理:方式二在突发流量处理方面优于方式一。

    由图 10 可知,对方式一来说,由于令牌桶总的容量只有 1 000 kb,发送完每条报文后桶中剩余令牌数都为 0。此时若有突发流量,则报文必然被丢弃。而方式二令牌数可为负,当突发报文到达时即使令牌数不足仍可通过欠债方式现将报文转发出去,后续再偿还债务。

    (3)大小包混合时:方式一可能会造成大包始终得不到转发,而方式二则不会。

    如果发送一长度大于 1 000 kb 的报文,方式一中则始终会由于令牌不足而丢弃报文,方式二则可以通过借债方式现转发报文后偿还债务。

    (4)数据流发送过程平缓程度:方式二数据处理的时间较长,所以趋势明显比方式一平缓。

     

    3.2 双速率三色算法的实现

    3.2.1 桶的构成

    双速率三色算法的实现,目前业界的实现基本上完全依照 RFC 的规定,用两个令牌桶来实现,两个令牌桶的容量不同,第一个是 CBS,第二个是 PBS。

     

     

    3.2.2 令牌添加

    双速率三色标记算法中两桶添加令牌的速率不同,CBS 桶添加令牌的速率是 CIR,PBS桶添加令牌的速率则是 PIR。添加令牌时先添加 CBS 桶,CBS 桶填满后再添加 PBS 桶。

    3.2.3 报文处理流程

    当发送连续流量时,先看报文速率是否超过 PIR:当报文速率大于 PIR 时,超过 PBS 部分流量无法得到令牌,被标记为红色报文;未超过 PBS 而从 PBS 桶中获取令牌的报文标记为黄色报文;从 CBS 桶中获取令牌的报文被标记为绿色报文。当报文速率小于 PIR,大CIR 时,报文不会得不到令牌,但会超过 CBS 部分报文将从 PBS 桶中获取令牌,被标记为黄色报文;其他报文将从 CBS 桶中取令牌,被标记为绿色报文;当报文速率小于 CIR 时,报文所需令牌数不会超过 CBS,所以只会被标记为绿色报文。

    当发送突发报文时,若突发流量大于 PBS,则超出部分统计为红色报文;当突发流量大CBS,但小于 PBS 时,则超过 CBS 部分标记为黄色报文;当突发流量小于 CBS 时,全部标记为绿色报文。

    在流量控制中,用户可针对不同颜色的报文设定不同行为,如;允许通过、丢弃、或重新标记优先级等。

     

    3.3 单速率三色算法与双速率三色算法的比较

     

    单、双速率三色标记算法的比较如表 1 所示。

    单速率三色标记算法采用单桶或双桶结构,令牌添加方式和报文处理流程比较简单;双速率三色记算法采用双桶结构,令牌添加方式和报文处理流程相对复杂。前者关注报文尺上的突发,后者关注速率上的突发,两者各有优点。

    结束语

    相对双速率三色标记算法而言,单速率三色标记算法由于实现简单等原因,成为目前业界比较常用流量标记方式。但不同的实现方式决定了其具有一定的性能差异,合理的采用借债方式可以弥补其在丢包率、突发流量处理性能、大小包混合转发性能、数据转发平缓程度等性能方面的不足,但当存在较大速率的突发流量时,单速率三色标记算法的借债机制将不能较好的改善性能问题,所以单速率三色标记算法不能完全取代双速率三色表算法。在实际应用中,应针对不同的流量特征选择恰当的标记方式。

     

    展开全文
  • Token令牌认证 优点: 无状态、可扩展 支持移动设备 跨程序调用 安全 存在意义: 基于服务器的验证。 我们都是知道HTTP协议是无状态的,这种无状态意味着程序需要验证每一次请求,从而辨别客户端的身份。 在这之前...

    Token令牌认证

    优点:
    1. 无状态、可扩展
    2. 支持移动设备
    3. 跨程序调用
    4. 安全
    存在意义:

    基于服务器的验证。

    我们都是知道HTTP协议是无状态的,这种无状态意味着程序需要验证每一次请求,从而辨别客户端的身份。

    在这之前,程序都是通过在服务端存储的登录信息来辨别请求的。这种方式一般都是通过存储Session来完成。

    但是,随着Web,应用程序,分布式程序,以及移动端的兴起,这种验证的方式逐渐暴露出了问题。尤其是在可扩展性方面。
    Tokenliuchen

    展开全文
  • 令牌访问控制的原理A few years ago when I was introduced to the world of microservices for the purpose of looking into token authentication, I stumbled across Keycloak. Keycloak is an open-source ...

    令牌环访问控制的原理

    A few years ago when I was introduced to the world of microservices for the purpose of looking into token authentication, I stumbled across Keycloak. Keycloak is an open-source identity and access management service maintained by JBoss, a division of Red Hat. Keycloak comes with a plethora of features that do take some time to get familiar with. Some of these features, such as OpenID Connect, RBAC, and Authorization services are very useful for the security needs of modern microservices. This 4-part series is for those who want to rapidly ramp-up their know-how of these crucial features. We’d be covering token-based authentication, authorization flow, access control, and authorization services through Keycloak with example use cases. I’m going to use python for rapid prototypes and proof of concepts.

    几年前,当我被引入微服务领域以研究令牌认证时,偶然发现了Keycloak。 Keycloak是由Red Hat的JBoss维护的一种开源身份和访问管理服务。 Keycloak附带了许多功能,这些功能确实需要一些时间来熟悉。 其中一些功能(例如OpenID Connect,RBAC和授权服务)对于现代微服务的安全需求非常有用。 本系列文章分为4部分,适用于那些希望快速掌握这些关键功能的知识的人。 我们将通过带有示例用例的Keycloak涵盖基于令牌的身份验证,授权流程,访问控制和授权服务。 我将使用python进行快速原型设计和概念验证。

    设置 (The Setup)

    You’d need a running Keycloak instance. The easiest way to bring it up is by running its docker container. To do so, first install docker and then run the following:

    您需要一个正在运行的Keycloak实例。 启动它的最简单方法是运行其docker容器。 为此,请先安装docker ,然后运行以下命令:

    docker run -d -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=password — name keycloak jboss/keycloak:10.0.2

    This runs the Keycloak version 10.0.2 in a docker container and binds it to port 8080 of your machine. Once the Keycloak service has fully booted up, it will be available at http://localhost:8080/auth/. Open up this URL in a browser and you’d see the Keycloak homepage. Click on Administration Console and use the following credentials to log in:

    这将在docker容器中运行Keycloak版本10.0.2,并将其绑定到计算机的端口8080。 一旦Keycloak服务完全启动,它将可以从http:// localhost:8080 / auth /获得。 在浏览器中打开此URL,您将看到Keycloak主页。 单击Administration Console然后使用以下凭据登录:

    Username: adminPassword: password

    We specified these credentials above as environment variables to the docker container when we ran it. Once you log in, you’re redirected to the realm administration console. A realm is like a context, a tenancy, or a container. It can represent an organization and any user, groups, or roles related to an organization can reside in a realm. A better way to explain it would be to say that normally, one realm must have users with unique usernames but two users with the same username can exist in different realms. They would be two different users. When you log in with the credentials above, you’re redirected to the administration console of the master realm. This is the central realm that manages all the other realms. You can create a new realm by hovering on the Master in the navigation panel on the left and click on Add Realm

    运行它们时,我们在上面将这些凭据指定为Docker容器的环境变量。 登录后,您将被重定向到领域管理控制台。 领域就像上下文,租约或容器。 它可以代表组织,并且与组织相关的任何用户,组或角色都可以驻留在领域中。 一种更好的解释方式是,通常,一个领域必须具有具有唯一用户名的用户,但是两个具有相同用户名的用户可以存在于不同的领域中。 他们将是两个不同的用户。 使用上面的凭据登录时,您将被重定向到master领域的管理控制台。 这是管理所有其他领域的中心领域。 您可以通过将鼠标悬停在左侧导航面板中的Master上,然后单击Add Realm来创建一个新领域。

    Image for post
    Adding a new realm
    添加新领域

    I’ll be working on a new realm called test.

    我将致力于一个名为test的新领域。

    Keycloak stores its configuration data in a JDBC supported database and when no external database is specified, runs with an embedded H2 instance which is sufficient for our use case. The H2 database is destroyed when the Keycloak docker container is deleted.

    Keycloak将其配置数据存储在JDBC支持的数据库中,并且在未指定外部数据库的情况下,将使用嵌入式H2实例运行,这足以满足我们的使用情况。 删除Keycloak泊坞窗容器后,H2数据库将被破坏。

    基于令牌的身份验证 (Token-Based Authentication)

    I’m going to start with building a REST server in python using falcon. We want the REST API to be only accessible to authenticated users from Keycloak. To achieve this, we need to create a client entity in Keycloak. We can do this by clicking on Clients and then clicking on Create button:

    我将从使用falcon在python中构建REST服务器开始。 我们希望REST API仅对Keycloak身份验证的用户可用。 为此,我们需要在Keycloak中创建一个客户端实体。 我们可以通过单击“ Clients ,然后单击“ Create按钮来做到这一点:

    Image for post
    Click on Create for new client
    点击为新客户创建

    In the Add Client view, you just need to provide the Client Id. Let's name this client my-test-client. Click on Save

    在“ Add Client视图中,您只需要提供客户端ID。 让我们将此客户端命名为my-test-client 。 点击Save

    Image for post
    Provide the Client ID and click on Save
    提供客户端ID,然后单击保存

    What we have created so far is an OAuth2 client

    到目前为止,我们创建的是一个OAuth2客户端

    We’d also need to create a new test user with which we can log in. For that, click on Users from the left panel, then click on Add User.

    我们还需要创建一个可以登录的新测试用户。为此,请从左侧面板中单击“ Users ”,然后单击“ Add User

    Image for post
    Click on Add user to create a new user
    单击添加用户以创建新用户

    Only a username is required to create a user. Let’s name this user admin and click on Save. Once saved, click on Credentials, put in a password which you can remember, and turn off the Temporary button before clicking on Set Password button.

    创建用户只需要一个用户名。 让我们将此用户命名为admin ,然后单击Save 。 保存后,单击“ Credentials ,输入一个您可以记住的密码,然后在单击“ Set Password按钮之前关闭“ Temporary按钮。

    Image for post
    Set a new password
    设定新密码

    Once the client and the user has been configured, you can perform the following POST request using curl to get an access token:

    一旦配置了客户端和用户,就可以使用curl执行以下POST请求以获取访问令牌:

    curl -X POST http://localhost:8080/auth/realms/test/protocol/openid-connect/token \
    --data "username=admin" \
    --data "password=password" \
    --data "client_id=my-test-client" \
    --data "grant_type=password"

    The response of this request would be something similar to the payload below:

    该请求的响应类似于以下有效负载:

    {
    "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJHS2pCb3lMV0lsYlNNVW1IMXhhZHFPNllaY0hvalhqZlBmMnluZ0hhajN3In0.eyJleHAiOjE1OTY1MTcwNDMsImlhdCI6MTU5NjQ4MTA0MywianRpIjoiMjQ2OTBmZDMtYmYwMC00NTBmLTg5MzctMTg5M2NlYThiZjhhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiZjMzZDc0ZDQtYTVlZC00ZGEwLTgxN2MtNTAzZTc1YTgxNDY1IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXktdGVzdC1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiZjg1MzAzNTItMjliMy00N2YwLWJmYjUtOTE0YmM4YjY1MzZlIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyIvKiJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWRtaW4ifQ.BxmcDQKHcis3DQAJE-APpGsKRn3PkIvF1JhefVWqw4IkuQBwhFvDfVZMt27CC8cZdQEE5v5R_8wvIw4Ju69EQZVw2oqeN9JOvo5Sg9TxFw7dBrmMlPddIDSvbB8L7b4GklT3M75pUjIe2rTG91ZsSCFtFVP3Qj6V5iLPNBlVQWS9sMdVHPRM_fgltTSRetf-iKWox13DXz4cn3P5ARHMAJkj5tr8CNRp5cKJzCct0bQgIULlIhzx_tNdOlr39GwFqx_vjuOdGL-x_yy1uyMFMv-yZQn8KqsbJ5E7MIGQEVGKA31l5jFTYev2kgj8ZTFFeXwxReFcEqmVgVQTxNa2BQ",
    "expires_in": 36000,
    "refresh_expires_in": 98000,
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0NDM1MDllMi1kZTRhLTQ3ZDEtYTgzYi1lOTI3ZGFlNzJjMWUifQ.eyJleHAiOjE1OTY0ODI4NDMsImlhdCI6MTU5NjQ4MTA0MywianRpIjoiYTBhZjc0OWUtYThiYy00NTQ3LWIyODYtNzAxYjQ1NTBjNjA5IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3Rlc3QiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvdGVzdCIsInN1YiI6ImYzM2Q3NGQ0LWE1ZWQtNGRhMC04MTdjLTUwM2U3NWE4MTQ2NSIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJteS10ZXN0LWNsaWVudCIsInNlc3Npb25fc3RhdGUiOiJmODUzMDM1Mi0yOWIzLTQ3ZjAtYmZiNS05MTRiYzhiNjUzNmUiLCJzY29wZSI6ImVtYWlsIHByb2ZpbGUifQ.Olm0EjyvY5b-T6_eAr9zwTzYZsegrOsuWueO_cQLtYQ",
    "token_type": "bearer",
    "not-before-policy": 0,
    "session_state": "f8530352-29b3-47f0-bfb5-914bc8b6536e",
    "scope": "email profile"
    }

    The token you need is the value of access_token from above. If you focus on this value, it's actually 3 base64 encoded strings joined together through dots (.). Such a token is called a JSON Web Token or JWT in short. The part between the two dots is the payload which contains information about the user that we just used to generate the token. We can decode it as follows:

    您需要的令牌是上面的access_token的值。 如果您关注此值,则实际上是3个通过点( . )连接在一起的base64编码的字符串。 此类令牌简称为JSON Web TokenJWT 。 两个点之间的部分是payload ,其中包含我们刚刚用来生成令牌的有关用户的信息。 我们可以将其解码如下:

    echo 'eyJleHAiOjE1OTY1MTcwNDMsImlhdCI6MTU5NjQ4MTA0MywianRpIjoiMjQ2OTBmZDMtYmYwMC00NTBmLTg5MzctMTg5M2NlYThiZjhhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiZjMzZDc0ZDQtYTVlZC00ZGEwLTgxN2MtNTAzZTc1YTgxNDY1IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXktdGVzdC1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiZjg1MzAzNTItMjliMy00N2YwLWJmYjUtOTE0YmM4YjY1MzZlIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyIvKiJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWRtaW4ifQ' | base64 -D

    Which yields:

    产生:

    {
    "exp": 1596517043,
    "iat": 1596481043,
    "jti": "24690fd3-bf00-450f-8937-1893cea8bf8a",
    "iss": "http://localhost:8080/auth/realms/test",
    "aud": "account",
    "sub": "f33d74d4-a5ed-4da0-817c-503e75a81465",
    "typ": "Bearer",
    "azp": "my-test-client",
    "session_state": "f8530352-29b3-47f0-bfb5-914bc8b6536e",
    "acr": "1",
    "allowed-origins": [
    "/*"
    ],
    "realm_access": {
    "roles": [
    "offline_access",
    "uma_authorization"
    ]
    },
    "resource_access": {
    "account": {
    "roles": [
    "manage-account",
    "manage-account-links",
    "view-profile"
    ]
    }
    },
    "scope": "email profile",
    "email_verified": false,
    "preferred_username": "admin"
    }

    As you can see, the value of preferred_username is admin and the value of azp (authorization party) is my-test-client. Normally, a JWT can have any key-value pairs, but the ones returned in this one by Keycloak are special. The keys iss, sub, aud, exp, iat, acr, and azp are part of a standard called OpenID Connect. The exp value is an attached expiration with the token after which it should be considered invalid.

    如您所见, preferred_username值为adminazp (授权方)的值为my-test-client 。 通常,JWT可以具有任何键值对,但是Keycloak在该键值对中返回的是特殊的。 密钥isssubaudexpiatacrazp是称为OpenID Connect的标准的一部分。 exp值是带有令牌的附加到期,在此之后应将其视为无效。

    Respectively, the parts at either ends of the payload are header and the signature. The signature is literally the digital signature of the whole payload generated through a private key and an algorithm. The name of the algorithm and the identifier for the key-pair used to sign the payload are specified in the header.

    payload两端的部分分别是headersignaturesignature实际上是通过私钥和算法生成的整个有效负载的数字签名。 header中指定了算法的名称和用于对有效负载进行签名的密钥对的标识符。

    The main advantage of a signed JWT is that if you have the public key and the algorithm information, you can simply verify the signature and once the signature is verified, you can trust the information in the payload to have come from a valid source (Keycloak Server). If you can trust the payload which contains information about the logged-in user, you can establish that the holder of this token is in-fact the user who's logged in.

    签名的JWT的主要优点是,如果您具有公钥和算法信息,则只需验证签名即可,一旦签名被验证,您就可以信任有效负载中的信息来自有效来源(Keycloak服务器)。 如果您可以信任包含有关已登录用户信息的有效负载,则可以确定此令牌的持有者实际上是已登录用户。

    So, in our demo REST API, all we have to do is expect the request to contain the token. If the token is there, validate its signature. Once the signature has been validated, we can establish the identity of the user who performed the request through preferred_username field.

    因此,在演示REST API中,我们要做的就是期望请求包含令牌。 如果令牌存在,请验证其签名。 签名经过验证后,我们可以通过preferred_username字段建立执行请求的用户的身份。

    Let's implement a REST endpoint /v1/self that returns the info of the logged-in user. You'd need to install the following pip packages:

    让我们实现一个REST端点/v1/self ,该端点返回已登录用户的信息。 您需要安装以下pip软件包:

    pip install openidcpy==0.8 falcon==2.0.0 bjoern==3.1.0

    You'd also need something called a Discovery URL, which can be found from the Keycloak Administration Console as the hyperlink value of OpenID Endpoint Configuration:

    您还需要一个称为Discovery URL东西,可以从Keycloak管理控制台中找到它作为OpenID Endpoint Configuration的超链接值:

    Image for post
    The URL behind OpenID Endpoint Configuration is the discovery URL
    OpenID端点配置背后的URL是发现URL

    This URL would be something like http://localhost:8080/auth/realms/test/.well-known/openid-configuration and is used to discover metadata about the Keycloak server. Incidentally, this URL can also lead us to the public key required to verify the signature. When you open this URL in the browser, you’ll see something like:

    该URL类似于http:// localhost:8080 / auth / realms / test / .well-known / openid-configuration ,用于发现有关Keycloak服务器的元数据。 顺便说一句,此URL还可将我们引向验证签名所需的公钥。 在浏览器中打开此URL时,您将看到类似以下内容的内容:

    {
    .
    .
    .
    http://localhost:8080/auth/realms/test/protocol/openid-connect/auth",
    "token_endpoint": "http://localhost:8080/auth/realms/test/protocol/openid-connect/token",
    http://localhost:8080/auth/realms/test/protocol/openid-connect/certs",
    http://localhost:8080/auth/realms/test/protocol/openid-connect/userinfo",
    .
    .
    .
    }

    Opening the URL specified against jwks_uri will give you all the public keys that this server has one of which will have the same id as specified in the header of the JWT. Other important endpoints specified here are authorization_endpoint and token_endpoint . We’ll use these endpoints later on to generate tokens.

    打开针对jwks_uri指定的URL,将为您提供该服务器具有的所有公共密钥,其中一个公共idJWT header中指定的id相同。 此处指定的其他重要端点是authorization_endpointtoken_endpoint 。 稍后我们将使用这些端点来生成令牌。

    For now, we’ll need to specify this URL as an argument to the client from openidcpy. Our implementation is as follows:

    现在,我们需要将此URL指定为openidcpy的客户端参数。 我们的实现如下:

    import falcon
    from openidcpy import OidcClient
    from json import dumps
    import bjoerndiscovery_url = 'http://localhost:8080/auth/realms/test/.well-known/openid-configuration'
    client_id = 'my-test-client'
    # Initialize the openidcpy client, this is going to validate the token signature
    client = OidcClient(discovery_uri=discovery_url, client_id=client_id)
    # A function to extract out the user information
    def get_user(claims):
    user = {'id': claims['sub']}
    if 'email' in claims:
    user['email'] = claims['email']
    if 'given_name' in claims:
    user['firstname'] = claims['given_name']
    if 'family_name' in claims:
    user['lastname'] = claims['family_name']
    if 'preferred_username' in claims:
    user['username'] = claims['preferred_username']
    return user
    class SelfApi(object): def on_get(self, req, resp):
    # If a token isn't sent, we need to unauthorize the request
    if req.auth is None:
    raise falcon.HTTPUnauthorized('Unauthorized', 'Bearer token not provided')
    try:
    # Tokens are usually sent as 'Bearer tokens' i.e. in the format
    # 'Bearer <token>' against the 'Authorization' header
    token = req.auth.split(' ')[1]
    # We need to skip the verification of 'aud' for now
    claims = client.validate_jwt(token, options={'verify_aud': False})
    resp.body = dumps(get_user(claims))
    resp.status = falcon.HTTP_200
    except Exception as e:
    raise falcon.HTTPUnauthorized('Unauthorized', e.args[0])
    if __name__ == '__main__':
    api = falcon.API()
    api.add_route('/v1/self', SelfApi())
    bjoern.run(api, '0.0.0.0', 1234)

    Pasting this code in a file and running it will expose this endpoint on http://localhost:1234/v1/self. Once this is done, we need to perform a GET request on this endpoint:

    将此代码粘贴到文件中并运行它将在http:// localhost:1234 / v1 / self上公开此终结点。 完成此操作后,我们需要在此端点上执行GET请求:

    curl -H "Authorization: Bearer <PUT JWT TOKEN HERE>" http://localhost:1234/v1/self

    Substitute the JWT token in the above call (without the <>) and press enter. This would yield:

    JWT令牌替换为上述调用(不带<> ),然后按Enter键。 这将产生:

    {
    "id": "f33d74d4-a5ed-4da0-817c-503e75a81465",
    "username": "admin"
    }

    结论 (Conclusion)

    Keycloak comes with a full-fledged OpenID Connect Authorization server implementation which may require a steep learning curve which I hope you’ve been able to cover with this story. In the next part, we’d look into the way apps and services automatically generate tokens using the standard flows of OAuth2/OpenID Connect. You can check it out by clicking here.

    Keycloak附带了完整的OpenID Connect授权服务器实现,这可能需要陡峭的学习曲线,我希望您能够涵盖这个故事。 在下一部分中,我们将研究应用程序和服务使用OAuth2 / OpenID Connect的标准流程自动生成令牌的方式。 您可以通过单击此处进行检查。

    翻译自: https://medium.com/@usmanshahid/levels-of-access-control-through-keycloak-part-1-d29e24b0ddad

    令牌环访问控制的原理

    展开全文
  • 令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,可以防止消费者绕过注册中心访问提供者,另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者。服务端启动的时候会监听注册中心的“/dubbo/...
  • 令牌桶算法原理及实现令牌桶算法的原理令牌桶算法的简单实现 令牌桶算法的原理 令牌桶算法听起来蛮牛逼,但是原理非常简单,简单说就是在一个桶中匀速放入令牌,如果桶中有令牌,就取走一个令牌,进行服务,若没有则...
  • QoS令牌桶工作原理

    2014-04-06 00:02:19
    QoS的一个重要作用就是对端口流量进行监管,也就是限制端口流量。但QoS是如何做到这点的呢?那就是QoS的令牌桶机制了。下面是在笔者刚刚出版的《Cisco/H3C交换机高级配置与... 6.3.3 QoS令牌桶工作原理  QoS中的流量
  • 一个动画看懂网络原理令牌环网的工作原理一、令牌环网的历史令牌环网络是1984年由IBM开发出,很长一段时间是IBM的网络标准,进入21世纪后这种网络比较少见。在老式的令牌环网中,数据传输速度为4Mbps或16Mbps,...
  • 令牌环的工作原理

    万次阅读 2013-10-04 21:30:42
    令牌环上,所有的工作站都通过一条公用的环形信道进行通信,因此必须解决各站点对环形信道的访问规则,即介质访问控制方法。对此,令牌环是通过令牌传递方式来控制各站点的发送权的。网中设有一张令牌,只有获得...
  • 一. 原理 ...当一个用户登录Windows系统时,它被给定一个访问令牌作为它认证会话的一部分。例如,一个入侵用户可能需要以域管理员处理一个特定任务,当它使用令牌便可假冒域管理员进行工作。 ...
  • 令牌环网中有一个令牌(Token)沿着环形总线在入网节点计算机间依次传递,令牌实际上是一个特殊格式的帧,本身并不包含信息,仅控制信道的使用,确保在同一时刻只有一个节点能够独占信道。当环上节点都空闲时,...
  • 令牌环网的基本原理 令牌环网的每一站通过电缆与环接口干线耦合器TCU相连。TCU的主要作用:传递所有经过的帧、为接入站发送和接收数据提供接口。与此对应,TCU的状态也有两个:收听状态、发送状态。数据总是在一个...
  • 消费者可以通过 OAuth 2.0 协议获取 JWT 访问令牌访问令牌被发送到 Web API 以对用户进行身份验证。 Web API 使用 java 来验证访问令牌。 有关协议在此方案和其他方案中的工作方式的详细信息,请参阅。 有关...
  • 文章目录第一章(单点登录)一、用户身份认证1、单一服务器模式2、SSO(Single Sign On)模式3、Token模式第二章(JWT令牌)一、访问令牌的类型二、JWT令牌1、什么是JWT令牌2、JWT令牌的组成3、JWT的用法三、JWT问题...
  • 漏桶、令牌桶算法原理与简单实现

    千次阅读 2019-06-01 15:55:19
    漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输...
  • 生成令牌 //生成一个jwt令牌 @Test public void testCreateJwt(){ //证书文件 ... //访问证书路径 ClassPathResource resource = new ClassPathResource(key_location); //密钥工厂 KeySto
  • :在AuthorizationServerTokenServices 实现存储访问令牌之前增强访问令牌的策略。 下面是自定义TokenEnhancer的代码(把附加信息加入oAuth2AccessToken中): public class TuckerJwtTokenEnhancer ...
  • Token原理(WEB令牌

    千次阅读 2019-04-18 20:56:11
    Token在WEB系统中相当于临时令牌的作用,一般作为验证使用。JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。Token的出现主要解决了两方面问题。 Session会话机制,可以对用户信息进行存储,方便用户再次...
  •  小菜最近接触了struts2中的令牌知识,由于该知识点比较重要,因此想弄明白些,于是满怀信心的上网查阅资料,结果让小菜很无奈,网上的资料千篇一律,总结出来就一句话:“访问页面时,在页面产生一个token id,...
  • 授权服务如何生成访问令牌访问令牌过期了而用户又不在场的情况下,又如何重新生成访问令牌? 授权服务的工作过程 在 xx让我去公众号开放平台给它授权数据时,你是否好奇?开放平台怎么知道 xx 是谁?他合法备案了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,891
精华内容 8,756
热门标签
关键字:

令牌访问原理