你的 Docker 应用是安全的吗?
近一年来,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 防护的概念,对这个了解并不多。
关于 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",实时的应用安全防护,它在应用程序里实时对安全威胁进行监控,告警和拦截。
"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 应用是安全的吗?的更多相关文章
- docker——容器安装tomcat
写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- Docker 第一篇--初识docker
已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...
- 在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 ...
- docker for mac 学习记录
docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...
- scrapy爬虫docker部署
spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...
- [原][Docker]特性与原理解析
Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...
- 开发者的利器:Docker 理解与使用
困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
随机推荐
- Linux 内核使用的 GNU C 扩展
gcc核心扩展linuxforum(转)=========================== Linux 内核使用的 GNU C 扩展 =========================== GNC ...
- Qemu下安装Sun Solairs8简明教程 转
http://blog.csdn.net/stonesharp/article/details/8928393 Qemu下安装Sun Solairs8简明教程(Centos6. / Win7) 作者: ...
- VC++ 响应回车键的2种方法
众所周知,VC++响应回车键经常用的方法是利用 BOOL PreTranslateMessage(MSG* pMsg) 截取回车键消息,如: if (pMsg->message == WM_KE ...
- FAQs: 我们可以在那里来为我的没有提升管理权限的应用程序存储用户数据?
如果你正在写一个不需要管理员权限的应用程序,如写一个业务线应用(Line of Business,LOB),用户应用程序如游戏,你总是要把应用程序的数据写到一个标准用可以访问的目录.下面列出一些所推荐 ...
- Bootstrap后台使用问题汇总(一)
第一次自己汇总写博客啊,不懂规矩,大家包涵~~ 最近进行的项目中需要一个后台,于是在网上Down了许多Bootstrap后台源码.精挑细选决定用“ACE后台管理系统”(因为是中文的,英文三级狗的小鹿还 ...
- php 的一个pg_fetch_assoc的怪问题
遇到过一种问题 . if($row=pg_fetch_assoc($result)){ while($row=pg_fetch_assoc($result)){ echo '3333'; $koCd ...
- mybatis中几种typeHandler的定义使用
1.存储到数据库, 将LONG数组转换成字符串;从数据库获取数据, 将字符串转为LONG数组 package com.winturn.utils.handler; import java.sql.Ca ...
- 一个实例明白AutoResetEvent和 ManulResetEvent的用法
先看一段代码: public class WaitHandlerExample { public static AutoResetEvent waitHandler; ...
- 使用微软企业库5.0提供的unity配置解藕系统demo(源码)
最近公司集50多号开发人员的人力围绕一个系统做开发,框架是免不了要统一的,公司提供的架构,利于分工合作,便于维护,扩展,升级,其中使用了到微软的企业库来解藕系统,只是因为框架封装,于是在网上学习了一个 ...
- oracle 定位热块和热链的方法
定位热链的方法 declare v_num number;begin for i in 1..1000000 loop sele ...