SAML 服务器:安全认证的重要保障 (saml 服务器)

作为现代网络应用的重要组成部分,安全认证始终是我们需要考虑的问题。为了保证传统验证方式的安全性,SAML (Security Assertion Markup Language)技术应运而生。SAML是一种可以通过安全信任建立并提供安全认证的技术,被广泛应用于企业身份认证授权解决方案中。在这篇文章中,我们将介绍SAML服务器的定义及其在安全认证中的重要作用。

SAML服务器:定义和概述

SAML服务器是一个用于维护和检查用户身份和权限的认证服务器,通常与其他系统一起使用。它是基于标准的SAML协议来实现单点登录(SSO)的,即一次登录即可获得访问不同应用系统的权限。SAML服务器通过提供Secure Token Service (STS)来生成安全令牌,从而实现单点登录。安全令牌是包含用户身份信息的数据集,可用于验证用户身份和请求授权。SAML服务器还可以用来突出用户任何可能存在的网络攻击,手动设置权限以及管理安全令牌过期。

SAML服务器:重要作用

SAML服务器在安全认证中发挥着至关重要的作用,它可以得到如下几个方面的保障:

1. 用户身份认证

SAML服务器通过将身份认证信息存储在安全令牌中来满足用户身份认证的要求。一旦用户完成登录后,SAML服务器将验证用户的身份并生成安全令牌,以便进行所有其他应用程序的授权请求。

2. 风险跟踪和网络攻击应对

SAML服务器可以突出任何可能存在的网络攻击。例如,它可以在安全令牌中记录任何未经授权的访问尝试。SAML服务器还可以启用日志记录功能,以便IT管理员可以更容易地跟踪入侵尝试,从而使可能存在的风险得到及时解决。

3. 管理访问权限

SAML服务器也可以手动设置用户权限等级。它可以提供灵活的权限编制,以适应不同的工作流程。此外,管理者还可以更改某些用户的特定权限,以便适应组织变化和特定任务的要求。

4. 安全令牌过期

SAML服务器还通过创建安全令牌时对其进行操作,确保令牌的时效性。这是指在令牌过期前,令牌只能用于授权请求,以避免未经授权的访问并保护用户信息的安全。

结论

SAML服务器是企业保护网络应用安全的重要组成部分。它可以用于用户身份认证,风险跟踪和网络攻击应对,管理访问权限以及安全令牌过期。企业需要掌握SAML服务器的实现方法,并持续加强网络安全意识,同时为员工提供足够的网络安全教育,以确保企业网络应用的安全。

相关问题拓展阅读:

深入理解Spring Cloud Security OAuth2及JWT

OAuth2是一个关于授权的开放标准,核心思路是通过各类认证手段(具体什么手段OAuth2不关心)认证用户身份,并颁发token(令牌),使得第三方应用可以使用该令牌在

限定时间

限定范围

访问指定资源。主要涉及的RFC规范有 RFC6749 (整体授权框架), RFC6750 (令牌使用), RFC6819 (威胁模型)这几个,一般我们需要了解的就是 RFC6749 。获取令牌的方式主要有四种,分别是 授权码模式 , 简单模式 , 密码模式 和 客户端模式 ,如何获取token不在本篇文章的讨论范围,我们这里假定客户端已经通过某种方式获取到了access_token,孝唯启想了解具体的oauth2授权步骤可以移步阮一峰老师的 理解OAuth 2.0 ,里面有非常详细的说明。

这里要先明确几个OAuth2中的几个重要概念:

明确概念后,就可以看OAuth2的协议握手流程,摘自RFC6749

Spring Security是一套安全框架,可以基于RBAC(基于角山信色的权限控制)对用户的访问权限进行控制,核心思想是通过一系列的filter chain来进行拦截过滤,以下是ss中默认的内置过滤器列表,当然你也可以通过 custom-filter 来自定义扩展filter chain列表

这里面最核心的就是 FILTER_SECURITY_INTERCEPTOR ,通过 FilterInvocationSecurityMetadataSource 来进行资源权限的匹配, AccessDecisionManager 来执行访问策略。

一般意义来说的应用访问安全性,都是围绕认证(Authentication)和授权(Authorization)这两个核心概念来展开的。即首先需要确定用户身份,在确定这个用户是否有访问指定资源的权限。认证这块的解决方案很多,主流的有 CAS 、 SAML2 、 OAUTH2 等(不巧这几个都用过-_-),我们常说的单点登录方案(SSO)说的就是这块,授权的话主流的就是spring security和shiro。shiro我没用过,据说是比较轻量级,相比较而言spring security确实架构比较复杂。

将OAuth2和Spring Security集成,就可以得到一套完整的安全解决方案。

为了便于理解,现在假设有一个名叫“脸盆网”的社交网站,用户在首次登陆时会要求导入用户在facebook的好友列表,以便于快速建立社交关系。具体的授权流程如下:

不难看出,这个假设的场景中,脸盆网就是第三方应用(client),而facebook既充巧如当了认证服务器,又充当了资源服务器。这个流程里面有几个比较重要的关键点,我需要重点说一下,而这也是其他的涉及spring security与OAuth2整合的文章中很少提及的,很容易云里雾里的地方。

细心的同学应该发现了,其实在标准的OAuth2授权过程中,5、6、8这几步都不是必须的,从上面贴的 RFC6749 规范来看,只要有1、2、3、4、7这几步,就完成了被保护资源访问的整个过程。事实上, RFC6749 协议规范本身也并不关心用户身份的部分,它只关心token如何颁发,如何续签,如何用token访问被保护资源(facebook只要保证返回给脸盆网的就是当前用户的好友,至于当前用户是谁脸盆网不需要关心)。那为什么spring security还要做5、6这两步呢?这是因为spring security是一套完整的安全框架,它必须关心用户身份!在实际的使用场景中,OAuth2一般不仅仅用来进行被保护资源的访问,还会被用来做单点登陆(SSO)。在SSO的场景中,用户身份无疑就是核心,而token本身是不携带用户信息的,这样client就没法知道认证服务器发的token到底对应的是哪个用户。设想一下这个场景,脸盆网不想自建用户体系了,想直接用facebook的用户体系,facebook的用户和脸盆网的用户一一对应(其实在很多中小网站现在都是这种模式,可以选择使用微信、QQ、微博等网站的用户直接登陆),这种情况下,脸盆网在通过OAuth2的认证后,就希望拿到用户信息了。所以现在一般主流的OAuth2认证实现,都会预留一个用户信息获取接口,就是上面提到的 (虽然这不是OAuth2授权流程中必须的),这样client在拿到token后,就可以携带token通过这个接口获取用户信息,完成SSO的整个过程。另外从用户体验的角度来说,如果获取不到用户信息,则意味者每次要从脸盆网访问facebook的资源,都需要重定向一次进行认证,用户体验也不好。

首先要明确一点,

OAuth2并不是一个SSO框架,但可以实现SSO功能

。以下是一个使用github作为OAuth2认证服务器的配置文件

可以看到 accessTokenUri 和 userAuthorizationUri 都是为了完成OAuth2的授权流程所必须的配置,而 userInfoUri 则是spring security框架为了完成SSO所必须要的。所以总结一下就是:

通过将用户信息这个资源设置为被保护资源,可以使用OAuth2技术实现单点登陆(SSO),而Spring Security OAuth2就是这种OAuth2 SSO方案的一个实现。

Spring Security在调用user接口成功后,会构造一个 OAuth2Authentication 对象,这个对象是我们通常使用的 UsernamePasswordAuthenticationToken 对象的一个超集,里面封装了一个标准的 UsernamePasswordAuthenticationToken ,同时在 detail 中还携带了OAuth2认证中需要用到的一些关键信息(比如 tokenValue , tokenType 等),这时候就完成了SSO的登陆认证过程。后续用户如果再想访问被保护资源,spring security只需要从principal中取出这个用户的token,再去访问资源服务器就行了,而不需要每次进行用户授权。这里要注意的一点是

此时浏览器与client之间仍然是通过传统的cookie-session机制来保持会话,而非通过token。实际上在SSO的过程中,使用到token访问的只有client与resource server之间获取user信息那一次,token的信息是保存在client的session中的,而不是在用户本地

。这也是之前我没搞清楚的地方,以为浏览器和client之间也是使用token,绕了不少弯路,对于Spring Security来说,

不管是用cas、saml2还是Oauth2来实现SSO,最后和用户建立会话保持的方式都是一样的

根据前面所说,大家不难看出,OAuth2的SSO方案和CAS、SAML2这样的纯SSO框架是有本质区别的。在CAS和SAML2中,没有资源服务器的概念,只有认证客户端(需要验证客户信息的应用)和认证服务器(提供认证服务的应用)的概念。在CAS中这叫做 cas-client 和 cas-server ,SAML2中这叫做 Service Providers 和 Identity Provider ,可以看出CAS、SAML2规范天生就是为SSO设计的,在报文结构上都考虑到了用户信息的问题(SAML2规范甚至还带了权限信息),而OAuth2本身不是专门为SSO设计的,主要是为了解决资源第三方授权访问的问题,所以在用户信息方面,还需要额外提供一个接口。

脸盆网的这个例子中,我们看到资源服务器和认证服务器是在一起的(都是facebook),在互联网场景下一般你很难找到一个独立的、权威的、第三方的认证中心(你很难想像腾讯的QQ空间通过支付宝的认证中心去授权,也很难想像使用谷歌服务要通过亚马逊去授权)。但是如果是在公司内部,这种场景其实是很多的,尤其在微服务架构下,有大量服务会对外提供资源访问,他们都需要做权限控制。那么最合理的当然就是建立一个统一的认证中心,而不是每个服务都做一个认证中心。我们前面也介绍了,token本身是不携带用户信息的,在分离后resouce server在收到请求后,如何检验token的真实性?又如何从token中获取对应的用户信息?这部分的介绍网上其实非常少,幸好我们可以直接从官方文档获取相关的蛛丝马迹,官方文档对于resouce server的配置是这样描述的:

寥寥数语,但已经足够我们分析了。从这个配置可以看出,client在访问resource server的被保护资源时,如果没有携带token,则资源服务器直接返回一个401未认证的错误

如果携带了token,则资源服务器会使用这个token向认证服务器发起一个用户查询的请求,若token错误或已经失效,则会返回

若token验证成功,则认证服务器向资源服务器返回对应的用户信息,此时resource server的spring security安全框架就可以按照标准的授权流程进行访问权限控制了。

从这个流程中我们可以看出,通过OAuth2进行SSO认证,有一个好处是做到了

认证与授权的解耦

。从日常的使用场景来说,认证比较容易做到统一和抽象,毕竟你就是你,走到哪里都是你,但是你在不同系统里面的角色,却可能千差万别(家里你是父亲,单位里你是员工,父母那里你是子女)。同时角色的设计,又是和资源服务器的设计强相关的。从前面的配置中不难发现,如果希望获得为不同资源服务器设计的角色,你只需要替换 这个配置就行了,这为我们的权限控制带来了更大的灵活性,而这是传统的比如SAML2这样的SSO框架做不到的。

终于来到了著名的JWT部分了,JWT全称为Json Web Token,最近随着微服务架构的流行而越来越火,号称新一代的认证技术。今天我们就来看一下,jwt的本质到底是什么。

我们先来看一下OAuth2的token技术有没有什么痛点,相信从之前的介绍中你也发现了,token技术更大的问题是

不携带用户信息

,且资源服务器无法进行本地验证,每次对于资源的访问,资源服务器都需要向认证服务器发起请求,一是验证token的有效性,二是获取token对应的用户信息。如果有大量的此类请求,无疑处理效率是很低的,且认证服务器会变成一个中心节点,对于SLA和处理性能等均有很高的要求,这在分布式架构下是很要命的。

JWT就是在这样的背景下诞生的,从本质上来说,jwt就是一种

特殊格式

的token。普通的oauth2颁发的就是一串随机hash字符串,本身无意义,而jwt格式的token是有特定含义的,分为三部分:

这三部分均用base64进行编码,当中用 . 进行分隔,一个典型的jwt格式的token类似 xx.yyyyy.zzzzz 。关于jwt格式的更多具体说明,不是本文讨论的重点,大家可以直接去官网查看 官方文档 ,这里不过多赘述。

相信看到签名大家都很熟悉了,没错,jwt其实并不是什么高深莫测的技术,相反非常简单。认证服务器通过对称或非对称的加密方式利用 payload 生成 signature ,并在 header 中申明签名方式,仅此而已。通过这种本质上极其传统的方式,jwt可以实现

分布式的token验证功能

,即资源服务器通过事先维护好的对称或者非对称密钥(非对称的话就是认证服务器提供的公钥),直接在本地验证token,这种去中心化的验证机制无疑很对现在分布式架构的胃口。jwt相对于传统的token来说,解决以下两个痛点:

在上面的那个资源服务器和认证服务器分离的例子中,如果认证服务器颁发的是jwt格式的token,那么资源服务器就可以直接自己验证token的有效性并绑定用户,这无疑大大提升了处理效率且减少了单点隐患。

就像布鲁克斯在《人月神话》中所说的名言一样:“没有银弹”。JWT的使用上现在也有一种误区,认为传统的认证方式都应该被jwt取代。事实上,jwt也不能解决一切问题,它也有适用场景和不适用场景。

适用场景:

这些场景能充分发挥jwt无状态以及分布式验证的优势

不适用的场景:

不要试图用jwt去代替session。

这种模式下其实传统的session+cookie机制工作的更好,jwt因为其无状态和分布式,事实上只要在有效期内,是无法作废的,用户的签退更多是一个客户端的签退,服务端token仍然有效,你只要使用这个token,仍然可以登陆系统。另外一个问题是续签问题,使用token,无疑令续签变得十分麻烦,当然你也可以通过redis去记录token状态,并在用户访问后更新这个状态,但这就是硬生生把jwt的无状态搞成有状态了,而这些在传统的session+cookie机制中都是不需要去考虑的。这种场景下,考虑高可用,我更加推荐采用分布式的session机制,现在已经有很多的成熟框架可供选择了(比如spring session)。

系统之间怎么实现单点登录?

在不同的场景下,单点登录采用不同的实现方式。应用系统是同一域名下的不同站点时,通常采汪清用验证cookie的方式,应用系统在同一域名下但是数据不同子域时,采用cookie与sessionID相结合的方式,应用系统困仿前分属不同域时,采用站点间传递cookie和重定向的方式。玉符科技对不同场景,单点登录方式也不同。目前市场上主流的做单点登录的公司比如玉符科技,深耕单点登录SSO领域,可以满足客户遇到的如何实现单点登大嫌录?企业如何实现统一认证?的难题,通过玉符单点登录可以快速的帮助企业实现云认证,像SAML、OIDC、CAS、Ouath等主流协议全部支持,可以实现快速部署,交付周期短,适合各行业企业。

其实就是我们日常提到的SaaS、ERP、OA等各种软件,通过单点登茄谨录实现统一认证,一次登录就可全部查看操作,省去了一个个系统登录的繁杂,同时也给IT运维人员提陪罩高了工作效率,节约人力成本。玉符科技可以让系统之间实现单点登录,通过玉符科颤乱基技单点登录SSO实现统一认证,一次登录就可全部查看操作,省去了一个个系统登录的繁杂,同时也给IT运维人员提高了工作效率,节约人力成本。

主要实现方式有:

1、 共享 cookies

基于共享同域的 cookie 是 Web 刚开始阶段时使用的一种方式,它利用浏览同域名之间自动传递 cookies 机制,实现两个域名之间系统令牌传递问题;另外,关于跨域问题,虽然 cookies本身不跨域,但可以利用它实现跨域的 SSO 。如:代理、暴露 SSO 令牌值等。

缺点:不灵活而且有不少安全隐患,已经被抛弃。

2、 Broker-based( 基于经纪人 )

这种技术的特点就是,有一个集中的认旅并证和用户帐号管理的服务器。经纪人给被用于进一步请求的电子身份存取。中央数据库的使用减少了管理的代价,并为认证提供一个公共和独立的 “第三方 ” 。例如 Kerberos 、 Sesame 、 IBM KryptoKnight (凭证库思想 ) 等。 Kerberos是由麻省理工大学发明的安全认证服务,已经被 UNIX 和 Windows 作为默认的安全认证服务集成进操作系判做统。

3、 Agent-based (基于代理人)

在这种解决方案中,有一个自动地为不同的应用程序认证用户身份的代理拆冲迹程序。这个代理程序需要设计有不同的功能。比如,它可以使用口令表或加密密钥来自动地将认证的负担从用户移开。代理人被放在服务器上面,在服务器的认证系统和客户端认证方法之间充当一个 ” 翻译 “。例如 SSH 等。

4、 Token-based

例如 SecureID,WebID ,现在被广泛使用的口令认证,比如 FTP 、邮件服务器的登录认证,这是一种简单易用的方式,实现一个口令在多种应用当中使用。

5、 基于网关

6、 基于 SAML

SAML(Security Assertion Markup Language ,安全断言标记语言)的出现大大简化了 SSO ,并被 OASIS 批准为 SSO 的执行标准 。开源组织 OpenSAML 实现了 SAML 规范。

saml 服务器的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于saml 服务器,SAML 服务器:安全认证的重要保障,深入理解Spring Cloud Security OAuth2及JWT,系统之间怎么实现单点登录?的信息别忘了在本站进行查找喔。


数据运维技术 » SAML 服务器:安全认证的重要保障 (saml 服务器)