模拟一个面试的场景:
面试官:黄金法则的认证(Authentication)部分不就是账号密码吗?这么简单的东西,有必要考虑得那么复杂吗?
应试者:认证,也就是身份识别与认证(通常来说,识别和认证是一体的)。毫无疑问,对于一个安全的应用来说,身份认证是第一道门槛,它为后续所有的安全措施提供“身份”这样一个关键信息。
面试官:现在我们公司有好几个应用,每一个应用都有独立的账号体系,管理起来十分复杂。而且,内部员工的账号体系也没有建设起来,如果是你,你会怎么解决这些问题?
一、身份认证包括哪些东西?
身份认证不仅仅是一个输入账号密码的登录页面而已,应用的各个部分都需要涉及身份认证。身份认证可以分为两部分:对外认证和对内认证。
对外认证,就是应用的登录注册模块,它面向用户进行认证。对外认证的入口比较集中,一个应用通常只有一个登录入口。因此,可以在登录这个功能上,实现很多认证的方式。
对内认证,应用的各种内部系统同样需要涉及登录认证的功能,比如,服务器的登录、数据库的登录、Git的登录、各种内部管理后台的登录等等。
对外认证和对内认证有什么区别呢?
最主要的区别在于认证场景的复杂程度。对外认证是单一场景下的认证,对内认证是多种场景下的认证。
目前行业的现状是,各个公司的对内认证都比较薄弱。主要原因在于,内部的认证场景过于分散,很难进行统一管理。尤其是服务器、数据库等认证,目前还无法做到统一。因此,对内认证是一个长期治理的过程,需要投入较大的精力。
二、身份认证主要面临哪些威胁?
身份认证面临的威胁主要包括无认证、弱密码、认证信息泄露。
没有认证环节是所有应用和公司存在的最普遍的问题,处于裸奔状态;
认证信息泄露,就是指黑客通过各种手段,拿到了用户的密码信息和身份凭证这样的认证信息。常见的手段包括钓鱼、拖库等。更可怕的是,很多攻击对于用户来说都是无感知的。
总之,身份认证面临的威胁其实都是认证信息的泄露。
三、身份认证的安全怎么保证?
解决安全问题,不只是在解决一个技术问题,还要培养外部用户和内部员工的安全意识。也就是说,认证安全并没有什么完善的技术解决方案,更多的是通过一些规章制度去强化用户的安全意识。
单点登录是一个非常有效的解决方案。
四、单点登录如何解决身份认证问题?
单点登录(Single SIgn On,SSO),用户只需要进行一次认证,就可以访问所有的网页、应用和其他产品。随着互联网产品形式的不断发展,单点登录的实现方式也经历了多次的升级革新。几种典型的单点登录方式分别是CAS流程、JWT、OAuth和OpenID。
1、CAS(Central Authentication Service,集中式认证服务)流程
CAS是一个开源的单点登录框架,它不属于某一种单点登录的实现方式,而是提供了一整套完整的落地方案。整体流程如下:
流程说明如下:
1、假如用户现在要访问某个应用;
2、应用需要进行认证,但应用本身不具备认证功能。因此,应用将用户重定向到认证中心的页面。比如,在登录一个应用的时候,它显示可以选择微信、QQ、微博账号进行登录,点击微信登录,就跳转至微信的登录页面了;
3、用户在认证中心页面进行认证操作。如果用户之前已经在其他认证进行过认证了,那么认证中心可以直接识别用户身份,免去用户再次认证的过程;
4、认证完成后,认证中心将认证的凭据,有时会加上用户的一些信息,一起返回给客户端;
5、客户端将凭据和其他信息发送给应用;
6、应用收到凭据后,可以通过签名的方式,验证凭据的有效性。或者,应用也可以直接和认证中心通信,验证凭据并获取用户信息;
7、用户完成认证。
2、JWT(JSON Web Token)
JWT是一种非常轻量级的单点登录流程。它会在客户端保存一个凭证信息,之后在你每一次登录的请求中都带上这个凭证,将其作为登录状态的依据。
JWT的好处在于,不需要应用服务器去额外维护Cookie或者Session。
但是,正是因为它将登录状态落到了客户端,所以我们无法进行注销等操作。
3、OAuth(Open Authorization)
OAuth的主要特点是授权,我们通常用QQ、微信登录其他应用时所采用的的协议。通过OAuth,用户在完成了认证中心的登录之后,应用只能够验证用户确实在第三方登录了。但是,想要维持应用内的登录状态,应用还是得颁发自己的登录凭证。这也就是为什么QQ授权后,应用还需要绑定你的手机号码。这也就意味着,应用是基于QQ的信息创建了一个自身的账号。
4、OpenID(Open Identity Document)
OpenID和OAuth的功能基本一致。但是,OpenID不提供授权的功能。最常见的,当我们需要在应用中使用微信支付的时候,应用只需要收集支付相关的信息即可,并不需要获取用户的微信头像。
在实际情况下,基于各种业务需求的考虑,很多公司都倾向于自己去实现一套SSO的认证体系,它的认证流程如下:
在以上流程中,应用的服务器直接接收用户的认证信息,并转发给认证中心。对于用户来说,这个认证中心是完全透明的。这个流程给予了应用过多的信任,从安全性方面考量的话,是不合理的。在这个过程中,应用直接获取到了用户的认证信息,但应用能否保护好这些信息呢?并没有有效的办法去确认。
五、总结
多花一些功夫去接入成熟的单点登录体系,而不是自己去实现一个简化版的。JWT适用范围广,在单点登录的选取上面,如果想要将用户信息做统一管理,选择它最为简单;如果认证中心知识被用来维护账号密码,由业务去维护用户所绑定的其他手机等信息,那么,采用OAuth更合适。