近一年来,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

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

探针连接确认:



应用启动确认:



现在所有准备工作就绪,可以按照webgoat的教程,攻击webgoat,来测试探针是否生效。

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



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

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



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

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

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

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

本文转自 OneAPM 官方博客

你的 Docker 应用是安全的吗?的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  5. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  8. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  9. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

  10. 微服务与Docker介绍

    什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...

随机推荐

  1. java多线程样例

    这里我们做一个完整的样例来说明线程产生的方式不同而生成的线程的差别: package debug; import java.io.*;import java.lang.Thread; class My ...

  2. Load Balance Tomcat with Nginx and Store Sessions in Redis--reference

    An awkward title, but that’s exactly what we’re going to do. For some time, I was looking for a way ...

  3. PHP+jQuery+Ajax实现用户登录与退…

    用户登录与退出功能应用在很多地方,而在有些项目中,我们需要使用Ajax方式进行登录,登录成功后只刷新页面局部,从而提升了用户体验度.本文将使用PHP和jQuery来实现登录和退出功能. 查看演示DEM ...

  4. NHibernate动态加载资源文件

    最近做项目,又用到了以前做过的ORM框架--NHibernate. 此次想要实现的目标: 1.简单SQL用NHibernate的Session的CRUD方法实现 2.复杂SQL用Native SQL实 ...

  5. mysql 链接数据库

    一.MySQL 连接本地数据库,用户名为“root”,密码“root”(注意:“-p”和“root” 之间不能有空格) C:\>mysql -h localhost -u root -proot ...

  6. C++的函数重载 转

    ——每个现象后面都隐藏一个本质,关键在于我们是否去挖掘 写在前面: 函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的) ...

  7. Mindjet MindManager 2012 从模板创建出现“Runtime Error pure virtual function call” 解决方法

    我的Mindjet MindManager 2012 Pro也就是MindManager10 在应用模板之后总会显示 Microsoft Visual C++ Runtime Library Runt ...

  8. Linux 特殊权限位

    特殊权限位 LINUX 基本权限有9位但是还有三位特殊权限. suid s(有x权限) S(没有x权限) 4 在用户权限的第三位 sgid s(有x权限) S(没有x权限) 2 在用户组权限的第三位 ...

  9. CentOS 6.4 64位 安装 mysql 5.6.24

    下载安装包 由于官网访问及版本选择下载不太方便,使用 suho 的源进行下载 http://mirrors.sohu.com/mysql/MySQL-5.6/ 下载如下三个安装包: MySQL-ser ...

  10. 【算法】快速排序-Java版

    说在前面的话 平常码砖的时候,对于一个数组进行排序更多的是起泡排序,起泡排序对于一般不是很长的数组进行操作没什么问题,一旦数组过大,很明显效率低. 而快排是对起泡排序的一种改进,效率明显优高. 快排思 ...