暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

应用程序安全(Application Security)

零君聊软件 2018-03-17
590

随着网络及云的普及,应用程序的安全也越来越重要。本文从基本概念以及基本原理出发,对应用程序安全做了一个简要清晰的总结。总的来说,应用程序的安全性从三个方面来保证:Authentication、Authorization以及Audit。


1、Authentication

应用程序安全首先要解决的就是身份验证的问题。一般我们在使用一个应用程序之前,需要先登录,证明自己的身份之后才能使用应用程序。直白的说,就是向别人证明“我就是我”


证明的方式有很多,最简单的就是HTTP basic认证,其实也就是username+password的方式。一般在客户端身份验证之后,服务器端就会给该客户分配一个token,保存在cookie中,以后每次请求带上该token即可。


客户端采用REST接口请求时也可以直接带上username和password,例如下面URL中username和password分别是benjamin和changme:

curl -X POST -u benjamin:changeme http://localhost:9200/_cat/indices?v

注:这是查询elasticsearch中索引列表的REST请求


身份验证必然涉及到用户管理的问题。应用程序自己管理用户自然没什么问题。例如我们要使用QQ,要先注册一个帐号(也就是QQ号)并设置好密码。该账户的信息存储在腾讯的后台数据库中,也就是说腾讯是自己管理用户的帐号信息。


但对于很多应用来说,由应用自己管理用户账户信息不太现实(这并不是说技术上不可行)。如果每个应用都自己管理用户账户,而你手机上安装了十几个应用,那你岂不是要注册十几个帐号?而且注册和登录本身就是比较繁琐的操作,很多用户很可能一看到需要注册就直接关闭甚至卸载应用了。所以比较常见的解决方案是使用可信第三方的身份验证。比如直接使用QQ号就可以登录一个应用,由腾讯为该用户的身份及信用背书。


Authentication的另一个典型的场景就是SSO(Single Sign On),也就是单点登陆。当一个公司内有很多应用的时候,SSO就很有用。这里就不展开说了。


JWT(JSON Web Token)也是很常见的一种身份验证的方式。通常的场景是通过已有的帐户(userid+password)获取一个token。以后每次访问就带上这个token。而这个token一般是有时效限制的。例如下面请求中,token就在http header中。这里也不展开说了。

curl -H "Authorization: Bearer eyJhbGciOiJIUzI1N......kpXVCJ9" -X POST -d @data.json http://localhost:8090/res/


身份验证的方式还有很多,比如指纹识别等,这些都不是本文的重点。不管是什么方式,Authentication要解决的问题都是相同的,都是要证明“我就是我”。


在云时代,很多大公司都有自己的Authentication服务,也就是IDaaS(Identity as a Service)。


2、Authorization

Authentication的作用是验证用户的身份,而Authorization要解决的问题则是评估用户的权限。比如一个用户通过了身份验证,但该用户只允许读操作,那么任何写操作的请求都会被拒绝。


Authorization涉及到两方面,首先是定义policy,也就是定义允许哪些用户干什么,不允许哪些用户干什么。其次就是权限评估,也就是当一个用户请求对某个资源做某个操作时,根据定义好的policy来评估是否允许此次操作。


Authorization的核心是Policy Model的设计。Policy Model的设计直接决定了Authorization的易用性。首先看一个policy的例子:

允许 benjamin 在9:00~17:00之间 阅读 计算机书籍


通过上面的例子,可以抽象出一条Policy涉及到的几个方面:

(1) 主体

    主体就是定义“谁”。而每个主体可能包含很多身份标示,比如一个人的姓名、头衔都是这个人的标示。上面例子中的benjamin就是主体的身份标示。用JDK里面的概念来说,主体就对应Subject,身份标示则对应Principal,

javax.security.auth.Subject

java.security.Principal

(2) 资源

    资源就是操作的对象,上面的例子中就是“计算机书籍”。

(3) 操作

   操作就是执行的动作,上面的例子就是“阅读”。

(4) 条件

   条件就是对Policy生效的限制。上面的例子就是在“9:00~17:00”这个范围内,policy才有效。

(5) 允许/拒绝

    当以上都符合时,是允许还是拒绝执行操作。只有两个选项:允许、拒绝。


这就是一个高度抽象的Policy Model。如果实现得足够灵活的话,基本可以用来解决所有的权限管理的应用场景。


虽然这里说的都是应用层的权限管理,但这套模型对于网络安全的权限控制似乎也适用。通常网络安全的规则无非是对IP和Port访问的各种限制,如果将source IP和source port理解成主体,destination IP和Port理解成resource,而将协议(TCP/UDP)看成是操作,那么各种规则完全可以用上面的policy Model来定义。当然,具体实现的时候,需要将定义的Policy转换成实际工作的规则,比如iptables等。


今年会有一个Authorization相关的开源项目推出,到时候我会再详细介绍。


同样有很多大公司在云上提供Authorization服务,如AWS、阿里等。不过感觉阿里基本就是照抄AWS的设计,因为各种概念以及接口的定义几乎与AWS一模一样。


3、Audit

Audit就是审计。所有的操作都应该被记录下来,以备审查。


--END--




文章转载自零君聊软件,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论