Java应用程序安全框架

1,507 阅读8分钟

《从零打造项目》系列文章

工具

ORM框架选型

数据库变更管理

定时任务框架

缓存

安全框架

开发规范

Java应用安全框架

在构建应用程序时,必须首先考虑其安全性。每个应用程序都是通过网络发布的,随之而来的是安全、隐私和完整性风险的威胁。

根据开放 Web 应用程序安全项目 (OWASP),最重要的安全风险是:

Java 安全框架

大致定义如下:

  • SQL 注入。
  • 损坏的身份验证和会话管理。
  • 跨站点脚本 (XSS)。
  • 不安全的直接对象引用。
  • 安全配置错误。
  • 敏感数据暴露。
  • 缺少功能级别访问控制。
  • 跨站点请求伪造 (CSRF)。
  • 使用具有已知漏洞的组件。
  • 未经验证的重定向和转发。

访问OWASP Top Ten以了解有关这些漏洞的更多信息。

Java 框架提供代码重用能力,同时消除了构建样板代码任务的需要。让我们来看看一些优秀的基于 Java 的框架,以提高应用程序的安全性并加速您的业务增长。

Java 安全框架

JAAS(Java 认证和授权服务)

JAAS 用作保护 Java 应用程序的 API。它包括许多为身份验证和授权而设计的 Java 包。JAAS 是 Java SE 1.3 中的一个可选包,之后,它从 1.4 版开始成为 JDK 的一部分。

JAAS 可用于两个目的:

  • 用于用户身份验证,以可靠且安全地确定当前正在执行 Java 代码的人员,无论该代码是作为应用程序、applet、bean 还是 servlet 运行的;
  • 用于授权用户,以确保它们具有执行所执行操作所需的访问控制权限。

JAAS 中的身份验证以可插入的方式执行。它允许应用程序摆脱基本的身份验证技术。

查看 API 和示例的参考指南

Spring Security

Spring Security 是一个可以根据企业应用需求进行修改的框架。它克服了身份验证和访问控制的困难。

身份验证是设置主要是他们声明的人(可能是用户、设备或一些可以为您的应用程序执行操作的不同机器)的过程。授权是确定专业是否可以在您的应用程序内执行操作的系统。

详细学习参考官方文档

Apache Shiro

Apache Shiro 被认为是一个非常有效的 Java 安全框架,它在所有类型的 Java 应用程序上进行加密、授权和会话管理,无论它们的大小如何。

Shiro 被设计成一个直观且易于使用的框架,同时提供强大的安全功能。它是框架中立的,因此可以与任何 Java 支持的框架无缝协作。

有关详细文档,参阅官方网站

HDIV

HDIV 是一个 Java Web 应用程序安全框架。它通过添加安全功能并维护 API 和框架规范来扩展 Web 应用程序的行为。

它广泛用于基于 Struts、Spring MVC、Grails、JSTL 等构建的应用程序,因为它为开发人员提供了急需的透明度,而不会增加应用程序开发的任何复杂性。

查看官方文档以获取更多详细信息。

OACC

OACC 是用于 Java 的应用程序安全框架,专为细粒度(对象级)访问控制而设计。它专门为每个实施和控制实用程序的身份验证和授权需求提供功能齐全的 API - 它是有效且灵活的安全模型的完整实现。

OACC 利用抽象的援助来保护实用项目。这一关键抽象允许 OACC 提供丰富的 API,包括授予、撤销和查询功能,用于存储和处理应用程序的安全关系。

查看官方文档以获取更多详细信息。

如何选择安全框架

上述有五种安全框架,实际应用中该如何选择呢?首先声明,本人对 Spring Security 和 Apache Shiro 有所了解,具体使用过 Spring Security,其他三种首次听说。

JAAS(Java 认证和授权服务)

JAAS 虽然作为 JDK 的一部分,但我对它知之甚少,详细介绍可以参考官方文档,如何使用可以参考这篇文章

为什么企业级应用不使用 JAAS,我也没找到专业解释,自己琢磨了一番,发现了点门道。

先对 JAAS API 中常用的一些类和接口做个简单的说明。

  • LoginModule :确认用户的合法性(使用CallbackHandler或者其他类方法),并分配访问权限principal给subject;

  • LoginContext:为了实现用户鉴别,建立相应的环境,从配置文件中导入规则;

  • CallbackHandler:回调处理器,负责与用户(代码拥有者和执行者)交互,确认其身份的合法性;

  • Subject:表示登陆处理的目标,即一个被鉴别的用户。并可关联一个或多个pirncipal;

  • Principal:表示具有访问权限的一个实体,可以看作是可以执行某种操作的证件。

这些类和接口的关系有个生动的比喻:一个学校,入学的时候校方(LoginModule)根据学生(Subject)的入学通知来确定其合法 性,这个过程交由某工作人员(CallbackHandler)执行,(CallbackHandler)确认后,(LoginModule)给不同 (Subject)根据其身份发给相关的证件(Principal),有了该证件就可以访问对应的资源,(Subject)根据自己的 (Principal)的级别可以使用和访问学校不同资源。

而上述这些 JAAS 的核心类,在 Spring Security 中有类似存在,Spring Security 提供了一个包来将身份验证请求委托给 Java 身份验证和授权服务 (JAAS)。比如说抽象类 AbstractJaasAuthenticationProvider 和 接口 JaasAuthenticationCallbackHandler

package org.springframework.security.authentication.jaas;

import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.springframework.security.core.Authentication;

public interface JaasAuthenticationCallbackHandler {
  void handle(Callback callback, Authentication auth) throws IOException, UnsupportedCallbackException;
}

对比 JAAS 中的 CallbackHandler

package javax.security.auth.callback;
public interface CallbackHandler {
  void handle(Callback[] callbacks)
    throws java.io.IOException, UnsupportedCallbackException;
}

更多介绍推荐阅读官方文档

由上可知,我们出于某些原因,没有直接使用 JAAS,但是如果使用了 Spring Security,也算是间接地使用 JAAS。

Spring Security

Spring Security 最早不叫 Spring Security ,叫 Acegi Security,叫 Acegi Security 并不是说它和 Spring 就没有关系了,它依然是为 Spring 框架提供安全支持的。事实上,Java 领域的框架,很少有框架能够脱离 Spring 框架独立存在。

Acegi Security 基于 Spring,可以帮助我们为项目建立丰富的角色与权限管理,但是最广为人诟病的则是它臃肿繁琐的配置,这一问题最终也遗传给了 Spring Security。

但是和 Shiro 相比,人们对 Spring Security 的评价依然中重量级、配置繁琐,对于初学者来说比较难。直到 Spring Boot 横空出世,这些问题统统都得到缓解。在 Spring Boot 或者 Spring Cloud 中,如果想选择一个权限管理框架,几乎毫无疑问的选择 Spring Security,Shiro 在这个环境下已经不具备优势了。

综上,如果你所接触的项目多是 SpringBoot 或者 SpringCloud,那么推荐学习使用 Spring Security。

Apache Shiro

无论是 Shiro 还是 Spring Security,最最核心的功能,无非就是两方面:

  • 认证
  • 授权

其功能特点如下图所示:

Shiro核心功能

Shiro 比 Spring 更容易使用,功能强大、且 简单、灵活。是 Apache 下的项目比较可靠,且不跟任何的框架或者容器绑定,可以独立运行。如果是 Spring 项目,不建议使用 Shiro。

HDIV

HDIV 之前根本没有听说过,官网介绍写的比较厉害:Hdiv 抵御了 OWASP 前 10 名中包含的 90% 的应用程序安全风险——对最关键的 Web 应用程序安全漏洞的广泛共识——例如 SQL 注入、跨站点脚本、跨站点请求伪造、数据篡改和暴力攻击. Hdiv 提供了比当前任何可用的解决 Web 应用程序安全风险的解决方案更高的有效性。

同时还为一些知名企业提供安全服务,如下图所示:

人类免疫缺陷病毒

而且在 Github 介绍中提到已与 SpringMVC 集成,相较于 Spring Security 功能不够完整,且学习成本较大,以及适用范围不够广,所以不推荐使用。

OACC

OACC (读音 Oak)是 Object Access Control serviCe 的缩写。它是一个高级的 Java™ 应用安全框架. OACC 提供高性能 API ,为 Java应用程序提供了基于权限的授权服务。简而言之,OACC 可以让你的应用通过发出问题来保证安全:“实体 ‘A’ 是否被允许在实体 ‘B’ 上进行操作 ‘p’。

在官网可以看到,OACC 很早就不再更新了。

OACC版本更新

此外,如果你想使用 OACC,还需要在对应的数据库中执行必要的脚本,比如说 MySQL 数据库。

OACC MySQL执行脚本

OACC表结构

这意味着你需要按照 OACC 的要求来设计表结构,这是不能容忍的。理所当然,我们不考虑该框架。

小结

综上,Spring Security 和 Shiro 是目前最受欢迎的两款安全框架,但因为 SpringBoot 和 SpringCloud 的火热,让同为 Spring 家族的 Spring Security 也变得火热起来,所以推荐学习使用 Spring Security。

参考文献

Java 安全框架

构建安全应用程序的前 5 个 Java 应用程序安全框架