安全是软件开发中最复杂、最广泛、最重要的方面之一。软件安全往往在开发周期开始或开发周期结束时被忽略或简化为少量调整。我们可以在年度主要数据安全漏洞清单中看到结果2019年总共有30多亿条暴露记录。扞卫java开发安全刻不容缓!
好消息是Java是一个具有许多内置安全功能的长期开发平台。Java安全包经历了许多强大的战斗测试,并经常更新新的安全漏洞。2017年9月更新的Java EE安全API解决了云和微服务架构中的漏洞。Java安全生态系统还包括各种工具来分析和报告安全问题。
然而,即使有一个可靠的开发平台,我们也应该保持警惕。应用程序开发是一项复杂的工作,漏洞可能隐藏在背景噪声中。从类语言功能到API终端授权,我们应该始终把Java开发的安全放在应用程序开发的每个阶段。以下基本规则为构建更安全的Java应用奠定了良好的基础:
1.编写简单而强大的Java代码
漏洞喜欢隐藏在复杂性中,所以代码应该尽可能简单,而不牺牲功能。使用验证的设计原则(例如 DRY)它将帮助我们编写更容易查看问题的代码。
始终在代码中披露尽可能少的信息。隐藏实施细节,支持可维护和安全的代码。这三种技能将极大地有助于编写安全性Java代码:充分利用Java访问修改符。知道如何分类,方法和属性声明不同的访问级别将大大保护代码。所有可以设置为私有的内容都应该是私有的。
避免反思和内省。在某些情况下,你应该使用这种先进的技术,但在大多数情况下,你应该避免使用它们。反射消除了强类型化,强类型化可能会给代码带来弱点和不稳定性。名称和字符串容易出错,容易导致名称空间冲突。
尽可能小地定义它API和接口表面。解耦组件并在尽可能小的区域内交互。即使应用程序的某个区域感染了漏洞,其他区域也是安全的。
2.避免序列化
这是另一种编码技巧,但重要的是要成为一个规则。序列化接受远程输入,并将其转换为完全赋值的对象。它节省了构建函数和访问修改符,允许未知数据流成为JVM中的操作代码。因此,Java序列化从根本上是不安全的。
3.永远不要披露未加密的凭证或PII
很难相信,但这种不可避免的错误会导致年复一年的痛苦。当用户在浏览器中输入密码时,密码将以纯文本格式发送到服务器。这应该是你最后一次见到它。您必须先通过单向密码加密密码,然后将密码保存到数据库中,然后在每次与值进行比较时再次加密。
密码规则适用于所有个人身份信息(PII):信用卡、社会保险号等。任何委托给您的应用程序的个人信息都应得到最大程度的保护。
4.使用已知和测试的库
专注于滚动自己的安全算法的问答。尽可能使用已知的可靠库和框架。从密码哈希到REST 适用于整个范围的API授权。
幸运的是,支持Java及其生态系统。应用程序安全,Spring Security这实际上是一个标准。它提供了适应任何应用程序系统结构的广泛选择和灵活性,并集成了各种安全方法。
解决安全问题的第一个本能应该是研究。研究最佳实践,然后研究哪个图书馆将为您实施这些实践。例如,如果你想使用它JSON Web令牌管理身份验证和授权,需要查看包装JWT的Java库,然后学习如何将其集成到Spring中 在Security中。即使使用可靠的工具,也很容易捆绑授权和身份验证。确保移动缓慢,并仔细检查所有操作。
5.怀疑外部输入
无论是来自用户输入表,数据存储区还是远程存储区API,不要相信外部输入。
SQL注入和跨站脚本(XSS)最常见的攻击只是由处理外部输入错误引起的。一个鲜为人知的例子(其中许多例子)是“ 十亿笑声攻击 ”,XML实体扩展将导致拒绝服务攻击。
每当收到输入时,都应进行完整性检查和消毒。特别是任何可能呈现给另一个工具或系统的东西。例如,如果有些事情可能会变成请注意OS命令行的参数:SQL注入是一个特殊的例子,它将在下一条规则中介绍。
6.始终使用准备好的句子来处理SQL参数
每当你构建一个在SQL语句中,有可能插入一段可执行代码。
知道这一点后,它总是被使用java.sql.PreparedStatement创建SQL是个好习惯。NoSQL存储(如MongoDB)也有类似的功能。如果使用ORM层,将在后台使用PreparedStatements。
7.不要通过错误的信息揭示来实现
生产中的错误信息可以为攻击者提供丰富的信息来源。堆栈跟踪特别可以揭示您正在使用的技术及其使用方法。避免向最终用户显示堆栈跟踪。
登录失败报警也属于这一类。通常接受的错误消息应该是“登录失败”与“没有找到用户”或“密码不正确”。尽可能少地帮助潜在的恶意用户。
在理想情况下,错误的信息不应泄露应用程序的基本技术堆栈。使信息尽可能不透明。
8.保持最新的安全发布
截至2019年,Oracle Java实施了新的许可计划和发布时间表。不幸的是,对于开发人员来说,新的发布节奏并没有让事情变得更容易。然而,仍然需要经常检查安全更新,并将其应用于JRE和JDK。
定期检查Oracle主页获取安全报警,确保知道重要的可用补丁程序。每个季度,Oracle都会为Java当前的LTS(长期支持)版本提供自动补丁更新。问题是,补丁只能在购买Java支持许可证时使用。
如果您的公司正在为此类许可证付费,请遵循自动更新路线。如果没有,您可能正在使用它OpenJDK,必须自己修理。在这种情况下,可以使用二进制补丁,也可以简单地用最新版本替换现有的OpenJDK安装。或者,可以使用商业支持的OpenJDK,如Azul的Zulu Enterprise。
查找项漏洞/span>
有许多工具可以自动扫描您的代码库和依赖项是否有漏洞。你所要做的就是使用它们。
OWASP(开放式Web应用程序安全项目)是一个致力于提高代码安全性的组织。OWASP可靠的高质量自动代码扫描工具列表,包括多个Java工具。
定期检查您的代码库,但也要注意第三方的依赖性。攻击者还开放源代码库和封闭源代码库。监控依赖项的更新,并在发布新的安全修复程序时更新系统。
10.监视和记录用户活动
如果不积极监控应用程序,即使是简单的暴力攻击也可能成功。使用监控和日志记录工具来监控应用程序的运行状态。
如果你想确认为什么监控如此重要,你只需要坐在应用程序侦听端口上观看TCP数据包。除了简单的用户交互,你还会看到各种各样的活动。其中一些活动将是机器人和邪恶者扫描漏洞。
您应该记录和监控失败的登录尝试,并部署对策,以防止远程客户受到攻击而不受攻击。
监控可以提醒你注意无法解释的峰值,而日志记录可以帮助你理解攻击后出了什么问题。Java生态系统包括大量用于日志记录和监控的商业和开源解决方案。
11.小心拒绝服务(DoS)攻击
在处理潜在的昂贵资源或进行潜在的昂贵操作时,应防止资源使用失控。
Oracle在其中“Java SE安全编码指南”文档的“拒绝服务”针对这类问题的潜在媒体列表维护在标题下 。
基本上,每当需要进行昂贵的操作(如解压缩文件)时,都应监控资源使用的爆炸性增长。不信任文件清单。只信任实际磁盘或内存消耗,监控其,防止服务器过度使用
同样,在某些治疗中,一定要注意事故的永久循环。如果您怀疑有一条环路,请添加一项保护措施,以确保环路正在进行中,并在环路看起来像僵尸时短路。
12.使用Java安全管理器
Java有一个安全管理器,可以用来限制在运行过程中可访问的资源。它可以根据磁盘、内存、网络和JVM访问来隔离程序。减少对应用程序的这些要求可以减少攻击可能造成的伤害。这种隔离也可能带来不便,这就是为什么SecurityManager默认不使用的原因。
13.使用外部云身份验证服务
有些应用程序必须有其用户数据。到处搜索,你会发现一系列的云身份验证程序。该服务的优点是,提供商负责保护敏感的用户数据,而不是个人数据。另一方面,增加身份验证服务将增加企业系统结构的复杂性。一些解决方案(例如FireBase Authentication)包括SDK,用于整个堆栈的集成。
这第13条规则用于开发更安全的Java应用程序。它们是反复测试的结论,但最大的规则是怀疑。软件开发始终具有谨慎和安全意识。在代码中找到漏洞,使用Java安全API和软件包,并使用第三方工具监控和记录代码中的安全问题。
千里之提,溃于蚁穴。一百英尺的房间,烧在缝烟里。我们在那里Java开发中不要忽视小的安全隐患,防患于未然,避免建筑倾倒,以严谨认真的态度采取预防措施,消除隐患。