译者 | 刘涛
审校 | 重楼
云计算(Cloud)技术是近年来计算机科学的一个重要突破。大多数组织已经通过将自己的应用程序移入云平台而获益。不过,如何保证应用程序在第三方服务器上的安全性,是一项艰巨的挑战。
在本文中,我们将重点讨论Java,提供一些可以帮助我们保护云计算环境下的Java应用程序的有效措施和工具。
安全性是软件开发中最复杂、最广泛和最关键的方面之一。然而,软件安全性通常被忽视,或者在开发周期结束时仅仅做一些简单调整。重大数据安全漏洞列表每年总计暴露30亿条记录,其中包括一些大公司。如果这种事能发生在他们身上,也能发生在你身上。
由于云计算的分布特性,以及第三方的参与,导致应用程序向云计算平台迁移过程中存在的安全隐患日益增多。但是,我们可以采取一些措施来保证云环境下应用程序的安全性,最大限度地减少攻击。
值得庆幸的是, Java已经存在很长时间,并且有许多内置的安全机制,是开发基于云平台上应用程序的最流行的编程语言之一。Java安全组件经历了严格的模拟真实环境测试,并定期更新,以解决新出现的安全漏洞。Java生态系统中还包含了各种各样的工具来分析和报告安全性问题。
然而,即使在可靠的开发环境中,也必须保持谨慎。在复杂的应用程序开发过程中,漏洞可能潜伏在后台。在云计算环境下为Java应用提供安全保障是一件非常复杂的事情,它要求对各种安全风险进行认真地考虑,并采用最有效的措施和工具。
下面,我们将介绍如何在云计算中创建安全的Java应用程序。
我们建议在不丧失实用性的情况下尽量简化代码,因为在复杂的环境下经常会出现漏洞。用最少的信息量写代码。实现细节的隐藏使得代码更加安全和易于维护。在编写安全Java代码时,我们建议您牢记以下几点:
(1)使用Java的访问修饰符(Access Modifiers)以获得优势。如果您知道如何为类、方法及其属性指定各种访问级别,那么您的代码将得到更好地保护。凡事应密尽密。
(2)应始终定义最小API和接口表面。通过将组件彼此解耦,使组件在最小可行区域上进行交互。避免即使违规行为只影响了应用程序的一部分,其他应用程序也会受到影响。
开发人员应避免在源代码中对密码或API密钥等敏感信息进行硬编码,而是使用配置文件、环境变量或密钥存储来存储和管理这些信息。所有个人身份信息,如信用卡、社会安全号码等,均受上述密码政策的约束。您的应用程序在处理已提供给它的任何个人信息时应格外小心。
身份验证和授权是保护Java应用程序免受未经授权访问的重要安全机制。开发人员应该实施强大的身份验证和授权机制,以验证与应用程序交互的用户、服务和系统的身份。为了实现这一点,可以采取多因素身份验证、密码策略、访问控制列表和基于角色的访问控制。
输入验证是一项重要的安全措施,有助于防止SQL注入和跨网站脚本等攻击。开发人员应验证所有从用户和其他系统接收的输入数据,然后再处理它,以确保它符合预期的格式,不包含恶意代码或字符。这一点尤其适用于其他工具和系统。例如,某些字符有可能成为操作系统命令行的参数!
SQL注入:当程序员建立一个动态的数据库查询以接收用户的输入时,将会带来 SQL注入的风险。攻击者可以在任何屏幕的输入栏将SQL指令插入到输入数据中。然后,由于代码中的缺陷,该程序在数据库中会执行恶意SQL语句。因此,不要使用动态SQL,而是使用准备好的语句(带有参数化查询)。否则,永远不要连接参数来创建SQL语句,这样会增加发生 SQL注入攻击的可能性。更好的做法是使用已保存过的语句,并始终验证白名单上的输入。
跨站点脚本:当攻击者使用Web应用程序向其他用户分发恶意代码时,通常会以浏览器端脚本的形式发生跨站点脚本(XSS)攻击。
为了防止这种情况,请使用经过验证的库对HTML上下文的输出进行HTML编码,并使用白名单允许字符过滤输入,以确保Java代码应用程序的安全。对JavaScript使用JavaScript Unicode转义。
对于Java来说,序列化就是把一个对象转换成一个二进制字节流,以便它能够在Java虚拟机之间进行移植,然后再用一个反序列化来重建它。序列化为Java类建立了一个接口,它避免了常用的字段存取控制技术,如构造器和存取修饰器。这样,远程输入就能被转换成全功能的对象。
因此,避免序列化是至关重要的,尤其是在处理安全敏感的类时。这样,所有类字段都可以被访问,因为序列化一个类会产生一个公共接口。在使用序列化之前,一定要考虑哪些字段是可访问的,因为它对应用程序来说可能本质上是不安全的。据说重载特定的构造函数和方法会影响代码。尽量避免这种情况。
加密与哈希算法是一种重要的安全手段,可以有效地保护数据的传输与休眠。开发人员应使用如AES或RSA等强加密算法对传输中的数据进行加密,并使用如SHA-256或SHA-512等安全哈希算法对密码和其他敏感数据进行加密,然后再将其存储在数据库或其他存储系统中。
生成错误消息可能会为攻击者提供大量数据。特别是堆栈跟踪,可以披露有关您正在运行的软件以及如何使用它的详细信息。应对最终用户隐藏堆栈跟踪。例如,失败登录尝试的警告,错误消息应为"登录失败”,而不是“找不到该用户”或“密码不正确”,否则用户将得到一些关于基础技术堆栈和处理的提示信息。请确保您的信息尽量保密。
监控和日志记录是实时检测和响应安全事件的重要安全措施。开发人员应该实施有力的监控和日志记录机制,以跟踪应用程序活动、检测异常情况,并在发生安全事件时生成警报。要做到这一点,可以使用诸如Log4j、Logback或者 Splunk之类的工具收集并分析应用程序日志。
以下工具可用于有效地保护云计算环境中的应用程序:
IAM是一种云计算服务,它为保护云计算资源提供了认证与授权机制。IAM有助于管理用户身份、角色和权限,使开发人员能够控制对数据库、存储系统和API等云资源的访问。AWS IAM和Google Cloud IAM是用于保护云中Java应用程序的流行IAM服务。
WAF是一种安全工具,用于保护Web应用程序免受SQL注入和跨站点脚本等常见攻击。WAF位于应用程序和用户之间,检查进入流量并阻止恶意请求。在云计算环境下,为 Java应用程序提供安全保护的常用WA包括AWS WAF, Azure WAF,以及谷歌的Cloud Armor。
漏洞扫描程序是扫描应用程序和基础设施以查找安全漏洞的工具。漏洞扫描程序可识别安全漏洞并提供修复建议。在云计算环境下,常用的漏洞扫描器包括 Qualys,Tenable以及OpenVAS。
代码分析工具可以分析源代码以识别安全漏洞和编码错误。代码分析工具使用静态代码分析和动态代码分析技术来识别安全缺陷,如缓冲区溢出、SQL注入和跨站点脚本。在云计算环境下,常用的代码分析工具有Checkmarx,Fortify,Veracode等。
DevSecOps工具可以将安全性集成到软件开发的生命周期。DevSecOps工具自动化了安全测试、代码分析和漏洞管理,使开发人员能够在开发过程的早期识别和修复安全缺陷。在云计算环境下,一些常用的保护Java应用程序的DevSecOps工具包括Jenkins、GitLab和CircleCI。
加密和密钥管理工具可以使开发人员能够对传输中和静止中的数据进行加密并管理加密密钥。加密和密钥管理工具为加密密钥提供安全存储,并确保只有授权用户才能访问这些密钥。在云计算环境下,保护Java应用程序的常用加密和密钥管理工具包括AWS KMS、Azure密钥库和谷歌云KMS。
容器安全工具可以为容器化应用程序提供安全性。容器安全工具监视容器活动,识别漏洞,并为容器提供运行时保护。在云计算环境下,为Java应用程序提供安全防护的几种常见的容器安全工具有Aquasecurity,Sysdig以及Twistlock。
保护云计算环境下的Java应用程序,需要对不同类型的安全风险和最佳措施工具的实现进行充分考虑。开发人员应该关注以下方面:
编写代码封装实现并对网络隐藏敏感信息。加密应该用于通过网络或其他方式分享敏感信息不可避免的情况。应正确实施身份验证和授权,以确保合法访问者能够获得正确的信息。
对输入数据进行验证,避免序列化处理,以保证外部输入不会注入恶意代码,从而接管系统。这包括阻止SQL注入和跨站脚本。
监控和记录应用程序活动,以便实时检测安全漏洞。
在云计算环境下,可以使用多种工具对Java应用进行安全防护,包括IAM、WAF、漏洞扫描、代码分析、 DevSecOps、加密密钥管理以及容器安全工具等。
通过遵循最佳措施并使用合适的工具,开发人员可以在云计算环境中构建安全的Java应用程序,并抵御安全威胁。
原文链接:https://hackernoon.com/securing-java-applications-in-the-cloud-best-practices-and-tools
刘涛,51CTO社区编辑,某大型央企系统上线检测管控负责人。
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www