你的 Docker 应用是安全的吗?

无人久伴 提交于 2020-03-25 09:26:11

近一年来,Docker 已经逐渐成为 container 界的事实标准,成为技术人员不可或缺的技能之一,就像 Docker 宣称的那样,「Build,Ship,and Run Any App,Anywhere」,容器极大简化了环境部署的步骤,并且很好的保证了环境的一致性。

Docker 的轻量级给云市场也注入了活力,国内已经有厂商发布了基于 Docker 的公有云服务,例如:灵雀云DaoCloud

作为国内早期 Docker 的爱好者,笔者对 Docker 走向公有云的领域还是有些疑问的,熟悉 Docker 的人都知道,Docker 底层是共享内核的,没有物理隔离内核,会造成很大的安全问题,不知道国内的厂商是如何规避这个问题,做了哪些安全防护;但是国内有一支队伍,推出了自己的轻量级的虚拟化服务 Hyper,一种类似 Docker 的方式,但是解决的 Docker 共享内核的问题,并且在2015的东京举办的 OpenStack 大会上,带去了自己的 Hypernetes ,一个真正多租户的 Kubernetes Distro,有兴趣的朋友可以进一步了解。

笔者觉得 Docker 共享内核级别的安全,用到的人毕竟是少数,作为应用开发者,我们更关心的是跑在 Docker 中的应用是否安全,是否受到 XSS 攻击,SQL 注入攻击之类,OneAPM 公司的 OneRASP 就解决了这个安全问题,它无需改动任何代码,通过 java instrument,实现应用受到攻击的检测和防护功能。

使用 OneRASP 产品之前,要先弄清楚什么叫 RASP?很多人只听过 WAF 防护的概念,对这个了解并不多。

  1. 关于 RASP,Gartner 定义为"Runtime application self-protection (RASP) is a security technology that is built or linked into an application or application runtime environment, and is capable of controlling application execution and detecting and preventing real-time attacks",实时的应用安全防护,它在应用程序里实时对安全威胁进行监控,告警和拦截。

  2. "Web Application Firewall",Web应用防火墙,它放置在Web应用程序外层,拦截所有它认为可疑的输入而并不分析这些输入是如何被应用程序处理的,它依赖于网络流量分析,处理不同协议的方式也不同。

在知道 RASP 这个概念前,WAF 在安全领域被广泛推广,是对应用很好的防护措施。但 RASP 会精确分析用户输入在应用程序里的行为,根据分析结果区分合法行为还是攻击行为,然后对攻击行为进行拦截。 RASP 不依赖于网络流量分析,因此避免了字符解码,复杂的正则表达式匹配以及基于签名的威胁鉴别等麻烦。

如果想使用 OneRASP ,首先需要在 OneRASP 官网注册了自己的账号,然后登录。


单击管理按钮,选择添加探针,对探针进行命名,可以把探针直接下载下来:


探针目前只能通过浏览器下载,未来还将会提供命令行的安装工具,点开探针配置,发现探针有监听和保护两种状态,仅仅为了测试,然后选择监听状态:


下面进行探针的安装,在探针设置和下载页未有明确的探针安装的链接地址,退回到首页找到帮助,进入文档页才找到,这里是安装文档

看了下文档,并未提供官方的 Docker 镜像,看来只能自己打镜像了,目前 OneRASP 官方文档使用 tomcat 作为Web 容器,笔者使用 Docker 官方提供的 tomcat 镜像作为 base image,Dockerfile 如下:

FROM tomcat:7-jre8
MAINTAINER demo<demo@demo.com>
    
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH

WORKDIR $CATALINA_HOME

ADD OneRASP ./OneRASP

RUN sed -i '234 a CATALINA_OPTS="-javaagent:/usr/local/tomcat/OneRASP/lib/RaspAgent.jar     $CATALINA_OPTS"' $CATALINA_HOME/bin/catalina.sh

CMD ["catalina.sh", "run"]

下面我们开始build镜像

docker build -t="docker.test.com/onerasp/demo" .
启动镜像:

docker run -p 9999:8080 -d --name rasptest docker.test.com/onerasp/demo

查看进程,确认带有探针的tomcat启动成功

docker top rasptest

日志

/usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -javaagent:/usr/local/tomcat/OneRASP/lib/RaspAgent.jar -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

启动成功。

如果要验证 RASP 是否可以防御攻击,我们还要准备一个待攻击的应用,相应的攻击脚本,最后验证我们的攻击是否有效。

待攻击应用以 webgoat 为例,如果有人不了解可以看看Github上 webgoat的介绍。

在 docker hub 可以搜到 webgoat 的镜像,实验也以 pandrew/webgoat 的 Dockerfile 基础镜像,稍作修改。

笔者的目录结构:


修改后的Dockerfile如下:
FROM java:8u40-b22-jre

RUN curl -fL https://github.com/WebGoat/WebGoat-Legacy/releases/download/v6.0.1/WebGoat-6.0.1-war-exec.jar -o /webgoat.jar

RUN mkdir -p /webgoat_agent/OneRASP

ADD OneRASP /webgoat_agent/OneRASP

EXPOSE 8080

CMD ["java", "-jar","-javaagent:/webgoat_agent/OneRASP/lib/RaspAgent.jar", "/webgoat.jar"]

在当前目录下构建webgoat镜像:

sudo docker build -t="webgoat_agent_test" .

启动镜像:

sudo docker run -d --name webgoat -p 8080:8080 webgoat_agent_test

启动后,要确认两点:第一,观察控制台,确认探针连接是否正常;第二,确认应用是否正常启动。

探针连接确认:


应用启动确认:
你的 Docker 应用是安全的吗?
现在所有准备工作就绪,可以按照webgoat的教程,攻击webgoat,来测试探针是否生效。

测试以 Injection Flaws 中的 XPATH Injection 为例,按照教程输入攻击脚本:


攻击成功后,会有提示,如上图。

在 OneRASP 平台查看攻击的防护日志:


点开 XPath 查看攻击详情,确认此攻击和之前攻击脚本是否一致:

由此可见,OneRASP 确实检测到了我们之前发起的那次 XPath Injection 攻击,在之后笔者又尝试了几种常见的攻击类型,例如 SQL Injection、CSRF、XSS 等,OneRASP 都监听到了攻击请求,并且定位到攻击的相关位置,试验到此结束。

对于容器内的应用,OneRASP也能起到一定的防护效果,目前安装较为繁琐。本次试验以 webgoat 作为测试应用的原因是 webgoat 易于攻击,如果放到自家的应用还需要具体的测试,而且笔者觉得试验测试的攻击集比较有限,但是对于一个无任何安全防护的裸奔的应用,肯定能起到一定的效果。

本文系 OneASP 前端工程师陈亮原创文章。如今,多样化的攻击手段层出不穷,传统安全解决方案越来越难以应对网络安全攻击。OneASP 自适应安全平台集成了预测、预防、检测和响应的能力,为您提供精准、持续、可视化的安全防护。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!