每个业务系统都需要实现自己的登录、权限管理和日志审计等功能模块,如果能把一些基础模块提炼出来,形成一个企业内部通用的web系统应用网关,那将会减少很多重复工作,大大提高业务系统研发效率。
01
简介
随着企业内部业务的发展,内部web管理系统越来越多,如果每个管理系统都实现自己的登录、权限和日志审计等功能模块,导致内部开发工作重复,系统维护成本增加。为了提高内部研发效率,减少新系统搭建成本和运维成本,我们把一些基础模块提炼出来,形成一个通用的企业内部web系统的应用网关。本文主要介绍专业的企业内部应用网关的技术要点。
02
部署架构
首先我们看一个比较早期的企业内部web系统的部署架构。
从上图可以看出,如果系统增多,会存在以下几个问题:
域名映射和网络安全问题。每个系统都需要管理域名和站点之间的关系,以及网络安全策略制定和维护。
新系统搭建效率。新的系统搭建速度慢,每个系统都需要考虑实现登录、权限、日志审计等功能模块,包括权限分配管理页面,导致开发工作重复,没有统一维护平台,增加研发成本和维护成本。
前端Nginx配置问题。面对前后端分离的开发模式,Nginx配置还需要维护一套独立的路由配置,导致业务开发维护成本高。
为了提高企业内部web系统研发效率和运维效率,我们把一些基础模块提炼出来,形成一个通用应用网关,如下图所示:
从架构部署图中可以看出,应用网关主要包含以下几个服务:
代理网关节点:主要负责转发所有接入应用网关请求、验证请求是否登录 、支持路由配置、etcd服务发现和白名单验证等功能模块。
代理网关后台:这里主要负责一些数据层访问,例如redis存储等操作,主要是因为网络分为app层、服务层、数据层,app层不能跨层访问数据层,因此提供相关接口服务来进行操作。
认证中心:主要负责用户身份验证,目前支持outlook认证、PIN+TOKEN和企业微信OAuth2.0认证,完成认证后跳转回原站点访问。
权限api服务:主要给接入的web系统提供权限相关的API接口,应用网关提供统一权限管理平台,业务系统管理员维护好权限之后,业务系统通过提供的鉴权接口来控制系统的功能权限。
下面我们看看应用网关是如何解决上面三个问题。
1、域名映射和网络安全问题
所有内部web系统都把域名解析到代理网关,收拢了办公网到生产网的入口,提高运维效率和减少生产网的安全风险。
2、新系统搭建效率
在接入应用网关之后,业务系统前端只需要接入获取菜单栏、获取当前登陆用户和注销接口,后台只需要接入鉴权接口即可完成新系统搭建,无需关注登录、权限和日志审计等功能模块,提高研发效率,降低运维成本。
3、前端Nginx配置问题
应用网关支持路由负载和etcd服务发现,所有后端路由可以统一在网关进行维护,从而使得前端Nginx配置可以统一维护,降低前端部署复杂度和维护成本。
03
应用网关处理请求的时序图
下面我们从一个请求的时序图来介绍应用网关各个功能模块是如何工作的。
应用网关处理请求分为以下几步:
第一步
当一个用户访问站点时,代理网关会第一时间收到用户的请求,在接受到用户的request的header时,会触发http注册的处理函数,这里首先需要判断用户是否是免登录请求,如果不是,需要获取用户cookie,看看用户是否登录过,没有登录会话时,网关利用http的重定向机制,让用户跳转至认证中心。
第二步
认证中心收到用户请求登录时会返回登录页面,用户输入账号密码进行登录,目前PC端登录支持outlook认证和PIN+TOKEN认证,认证通过之后,认证中心利用http的重定向机制重新跳转回原来的访问地址,并带上签发的临时code。
第三步
当用户再次请求至网关时,连接参数上带有code,网关会根据code去认证中心获取用户登录信息,获取成功后会设置用户cookie,再次让用户重定向至原来连接,去掉code参数。
第四步
此时用户再次访问至网关,用户cookie已经存在,网关判断此用户已经登录,然后根据业务系统配置的白名单来判断用户是否有权限访问该系统。
第五步
白名单校验通过后,需要根据系统设置的路由配置信息,进行路由选择,路由的目标可以是IP地址列表或者etcd服务名,最后在请求头部加上访问用户账号信息并转发到业务服务中。
第六步
在收到业务服务回复后,网关记录下用户访问的request和response的请求信息,异步写入es服务中,供日志审计使用。
04
应用网关实现的基础模块
上面大概介绍了应用网关是如何工作的,下面我们来介绍一下代理网关可以实现的一些基础功能。
身份认证
网关可以实现统一的身份登录认证,用户登录会话可以由代理网关托管,代理网关收到用户请求之后可以检测用户是否登录,利用http的302跳转机制实现身份认证,应用网关也可以实现多种登录方式,避免每个业务系统需要去管理用户登录方式和用户登录会话的功能,代理网关节点在确认用户登录之后会在头部加上用户身份标识,业务只需要解析请求是否有用户身份的标识即可。
路由转发和负载
代理节点在处理完用户身份识别之后,网关需要识别此次请求转发的目标路径,这里需要支持路由转发和负载功能,应用网关现有的实现只采用了最长正则匹配方式来转发用户请求,负载采用轮询的方式来计算每次需要转发的目标IP,为了满足各个企业内部业务需求,这里也可以自己实现服务发现,最终实现路由转发功能。上图中针对前后端分离的开发模式,避免业务在前端Nginx还需要维护一份路由配置,降低业务的维护成本。
统一水印
对于企业内部系统来说,系统的安全方面要求比较高,对于水印的需要也比较多,那么我们可以统一在代理网关来加水印,避免各业务端自己开发。对于应用网关来说,在代理网关中拦截用户的返回包,拼接上统一的水印代码是最好的选择,因此,代理网关在收到业务返回包时,golang标准库中(net/http/httputil)ReverseProxy反向代理实现在收到用户回复包的头部时,会提供一个ModifyResponse回调,利用这个回调函数,我们可以判断出哪些是标准的html页面,拦截这些页面,加入我们准备好的水印代码,最后实现统一的水印展示。水印的展示方式也有很多种,比如暗水印、半透明水印等。最常见并且不会影响业务前端代码展示的方式是半透明水印,为了避免用户在前端直接删除水印代码,造成水印消失,我们实现的水印代码中加入检测机制,防止用户删除水印代码。
日志审计
上一节水印中讲到我们使用标准库中ReverseProxy反向代理,其中在代理网关完全收到回复包的头部时,会立即回调ModifyResponse函数,在这个函数里面我们可以一边接收包数据,一边记录下面包的详情内容,因此日志传输过程如下图所示:
05
总结
应用网关核心是利用反向代理方式和http 302跳转机制,拦截用户请求之后来管理用户身份验证和用户权限,这样我们可以统一针对企业内部系统进行安全控制和访问日志分析,也可以实现一些通用基础功能,例如统一增加水印、统一验证websocket鉴权等功能,接入应用网关之后,业务系统无需关心这些基础模块,从而提高业务系统研发效率。
后台留言功能已开启,欢迎留言吐槽哦~


搜索公众号关注:微保技术
or
长按扫码可关注
▼请长按二维码,可加入我们哦!▼
