oauth2系列3:安全讨论

oauth2协议的安全考虑。

token类型

oauth2支持2种token_type:Bearer类型和MAC类型。

bearer

Bearer Token (RFC 6750) 用于OAuth 2.0授权访问资源,任何Bearer持有者都可以无差别地用它来访问相关的资源,而无需证明持有加密key。

Bearer实现资源请求有三种方式:Authorization Header、Form-Encoded Body Parameter、URI Query Parameter,这三种方式优先级依次递减。

因为Bearer token能够直接使用,为了提高安全性,应该使用https协议,防止中间人嗅探、修改、重放。

使用Bearer token不需要对请求计算哈希。

mac

mac token除了携带授权服务器下发的token,客户端还要携带时间戳,nonce,以及在客户端计算得到的mac值等信息,并通过这些额外的信息来保证传输的可靠性。 因此client每次请求都要计算哈希,并且server用相同参数检验哈希是否正确。

client通过添加id、ts、nonce、mac字段到Authorization请求首部以发起对用户资源的请求。

server收到请求后:

重新计算mac值,并与客户端传递的值进行比较 确保(timestam, nonce, token)三个维度之前没有被请求过,以防止重放攻击 验证scope,以及token

参考资料:draft-hammer-oauth-v2-mac-token-05

redirect_uri 和 code

oauth2的授权码模式、简化模式都使用了redirect_uri,回调到请求者的服务器。 授权码模式请求:

GET http://localhost:8080/auth/realms/SpringBoot/protocol/openid-connect/auth?response_type=code&state=b85d54ce-8aba-4abf-8d35-79df50fdc3da&client_id=product-app&scope=openid&redirect_uri=https%3A%2F%2Foauth.pstmn.io%2Fv1%2Fcallback HTTP/1.1

简化模式请求:

GET http://localhost:8080/auth/realms/SpringBoot/protocol/openid-connect/auth?nonce=4c9bdcf0-37dc-47bc-82a4-36a877d4d462&response_type=token&state=b85d54ce-8aba-4abf-8d35-79df50fdc3da&client_id=product-app&scope=openid&redirect_uri=https%3A%2F%2Foauth.pstmn.io%2Fv1%2Fcallback

攻击:

  • 如果访问oauth2服务器不是使用https协议,那么攻击者很容易使用中间人攻击,篡改redirect_uri,指向恶意网站。

应对方案:

  • oauth2访问优先使用https协议
  • oauth2的实现就已经考虑到非https情况,在申请client的时候,指定合法的redirect_uri路径;并且在oauth2 server对redirect_uri进行校验。

ps. 一个小技巧。在外部oauth2服务提供商配置了外网域名作为redirect_uri,为了方便本地调试,修改本地hosts文件。

攻击:

  • 记录code,然后重放获取access token

应对方案:

  • oauth2 rfc就考虑到这个情况。code是一次性使用的。

state

state参数可以为空,但是官方推荐传入。 在oauth2流程中,state参数回由oauth2 server在redirect_uri中原样返回。 开发者可以用这个参数验证请求有效性,也可以记录用户请求授权页前的位置。这个参数可用于防止跨站请求伪造(CSRF)攻击。

对oauth2登录实施CSRF攻击条件比较苛刻,可以参见:

Built with Hugo
Theme Stack designed by Jimmy