文
章
目
录
章
目
录
一、为啥要聊SSO认证
前段时间做测试的时候,碰到一个公司的所有应用都用SSO登录。当时我就琢磨,这SSO到底是咋回事儿?有没有啥安全问题呢?今天就来和大家唠唠。
二、SSO认证是啥?能干啥?
咱们平常上网,经常会遇到这种情况:在一个网站登录后,去它旗下的其他网站就不用再登录了,像淘宝和天猫、新浪微博和新浪博客就是这样。这背后的技术就是单点登录(SSO)。简单来说,SSO能让用户在多个相互信任的应用系统里,只登录一次,就能访问所有的保护资源。要是在某个应用里注销了,其他应用也不能直接访问保护资源了。
三、SSO认证的原理详解
SSO认证有个独立的认证中心,就像小区的保安室。只有它能验证用户的用户名和密码,其他系统没有登录入口,只能接受认证中心给的间接授权。这个授权靠的是令牌,下面给大家详细讲讲。如下图:
- 用户首次登录流程:假如你想去系统1看一些受保护的内容,系统1发现你没登录,就会把你送到SSO认证中心。认证中心一看,你还没登录呢,就给你展示登录页面。你输入用户名和密码后,认证中心会检查这些信息。要是没问题,它就创建一个和你相关的全局会话(可以理解为给你发了一张小区的长期通行证,过期了就得重新登录),同时生成一个授权令牌(相当于临时的小纸条,上面写着你可以去哪些地方)。接着,认证中心带着令牌把你送回系统1。系统1拿到令牌后,会去认证中心确认令牌是不是真的有效。确认没问题后,系统1就给你创建一个局部会话(类似给你在系统1这个“房间”里安排了一个座位),然后你就能看到想看的内容啦。
- 已认证用户访问其他系统流程:当你已经在认证中心认证过了,再去访问系统2的保护资源。系统2发现你没登录(它不知道你已经在别的地方登录过了),又把你送到认证中心。认证中心一看,你已经登录过了呀,就带着令牌把你送回系统2。系统2拿到令牌后,同样去认证中心验证,确认有效后,给你创建局部会话,你就能访问系统2的资源了。
- 局部会话存在时的访问流程:要是系统1的局部会话还在(说明你没离开这个“房间”太久),你再去访问系统1的保护资源,就不用再去认证中心验证了,直接就能看到内容。
- 单点注销原理:单点注销也不难理解。你在一个子系统里注销,就相当于把你的长期通行证给收了,全局会话被注销,所有子系统里和你的会话也都没了,你就不能再随便访问那些保护资源了。
四、SSO认证中的客户端与服务器端
SSO认证涉及认证中心和多个子系统。子系统里有SSO的客户端,认证中心就是服务端。它们之间通过httpClient、web service、rpc、restful api(url是其中一种)这些方式来交流,比如交换令牌、校验令牌,还有发起注销请求等。
- 客户端的工作:客户端就像子系统的小管家,主要负责这些事儿:拦住那些没登录就想访问子系统的用户,把他们送到认证中心;接收并保存认证中心发来的令牌;和服务端通信,检查令牌是不是真的;给用户建立局部会话;用户要注销的时候,它把注销请求发给认证中心;收到认证中心的注销请求后,把局部会话销毁。
- 服务器端的工作:服务端就像大管家,要验证用户的登录信息;创建全局会话和授权令牌;把令牌发给客户端;检查客户端发来的令牌有没有效;把子系统注册到自己这里;接收客户端的注销请求,然后把所有相关的会话都注销掉。
五、SSO认证存在的安全风险
很多人觉得SSO认证比普通的单系统登录安全,其实不是这样。越复杂的登录系统,越可能藏着安全隐患。下面咱们从认证和会话管理这两方面来看看。
- 认证阶段的问题
- 弱密码和暴力破解:有些系统对密码没啥限制,大家设置的密码很容易被猜到,比如太短、用常用词、和用户名一样,或者还用默认密码。就算密码看起来复杂,像Passw0rd,也可能在攻击者的密码库里,他们能通过自动工具,利用带宽和处理能力,每分钟尝试数千次登录。
- 详细的失败信息:有些应用在登录失败时,会直接告诉用户是用户名不对还是密码错误。这可就给攻击者提供了方便,他们能批量获取用户名,降低攻击成本。
- 忘记密码功能的隐患:很多SSO系统都有忘记密码的功能,但要是校验不严格,就会出大问题。比如输入账号信息时,系统返回具体错误信息,这就能让攻击者爆破用户名;密保问题太简单,像母亲的娘家姓、纪念日这些,试几次可能就猜对了;忘记密码功能一般分好几步,要是下一步不检查上一步是否完成,攻击者就可能直接跳到修改密码阶段;还有重置邮件里的token要是能被预测,攻击者就能修改其他人的密码。
- 绑定第三方登录的风险:现在很多系统都能绑定第三方登录,像微信。但有可能出现能绑定任意账号微信的情况,测试的时候一定要注意。
- 可预测的初始密码:有些应用会一次性或大批量创建用户,还自动指定初始密码。要是这些密码有规律,比如所有用户密码一样,或者和用户名、工作职能有关,攻击者就能猜到其他用户的密码。
- 会话管理阶段的问题
- 会话令牌可预测:要是生成令牌的过程不安全,攻击者就能知道其他用户的令牌。比如令牌有特定含义,像简单用base64编码,解码就能看到内容,或者加密方式太简单,直接用用户名的MD5值当令牌。
- 网络中泄露令牌:有时候令牌会不小心出现在日志、url里,暴露在网络上,被攻击者发现利用。
六、打造安全的SSO认证,要这么做
- 强制用户使用强密码,别让密码太容易被猜到。
- 采取措施防止暴力破解,让攻击者无机可乘。
- 设计多阶段流程的时候,一定要保证下一步严格校验上一步是否完成,别留逻辑漏洞。
- SSO生成的令牌必须随机,不能被猜测,增加安全性。
- 完善日志记录,做好监控,有异常情况能及时发出警报。
- 用安全的方式传送令牌,别让令牌轻易泄露。
SSO认证虽然方便,但也有不少安全问题。大家在使用或者开发相关系统的时候,一定要多留个心眼儿,做好安全防护。