如何加固你的微服务容器——Part 1

本文讲的是如何加固你的微服务容器——Part 1【编者的话】本篇文章简要的介绍了一些容器安全方面的最佳实践,尽管这些安全措施不会对开发和测试环境产生重大影响,但对于生产环境来说,这是必不可少的,好的习惯难以养成,现在就进行改变吧!

【烧脑式Kubernetes实战训练营】本次培训理论结合实践,主要包括:Kubernetes架构和资源调度原理、Kubernetes DNS与服务发现、基于Kubernetes和Jenkins的持续部署方案 、Kubernetes网络部署实践、监控、日志、Kubernetes与云原生应用、在CentOS中部署Kubernetes集群、Kubernetes中的容器设计模式、开发Kubernetes原生应用步骤介绍等。

上周,“Using Docker”的掌舵人和作者,Adrian Mouat,举办了一个在线研讨会,主题是如何加固Docker微服务容器。Andrian和Sam Newman(“Building Microservices”的作者)将会举办一个为期2天的培训,于6月31号在阿姆斯特丹,8月30号在伦敦分别举办,而这个在线研讨会是这个培训的一个小广告。

下面我们进入正题。Adrian 谈论了太多内容,以致于我不得不将内容分为两部分。第一部分,我将会讨论如何编写安全的Dockerfile的基本内容。第二部分讨论如何安全地部署。

正确的安全是怎样的呢?

Adrian说,对用户来说,实施了正确的安全措施几乎是透明的。一个安全的网站和不安全的网站唯一的区别就是安全事故不会发生,比如说,安全网站不会沦陷,不会丢失用户的敏感数据。

我们明白你不可能做到百分之百的安全。如果你的老婆窃取了你的AWS证书,这谁能够想到呢?但是,就像Sam Newman在研讨会上说的,大多数人不需要百分百的安全。我们只需要提升自己的安全指数,使得攻克我们需要让黑客们付出很高的成本,这样他们自然而然就会放弃我们,扭头走开了。

那么差劲的安全是怎样的呢?

尽管很难去描述好的安全,但要描述差劲的安全是非常简单的。Adrian给我们演示了一个不安全的Dockerfile。具体来说,有4件事情我们经常能够在Dockerfile中看到,这些都是不安全的:

  • 没有版本数字
  • 没有新建用户(容器运行在root用户下)
  • 没有对下载进行验证
  • 没有元数据

我会逐个描述以上的行为,但我们需要认识到,目前存在很多非常棒的Docker安全特性,我们需要使用它们。不幸的是,它们并不是默认的配置。

也许你会偷偷想——也许实际上这些默认的不安全配置是个好事情呢?当存在容易被攻击的容器时,黑客们就不会来攻击我们这些更安全的容器了。当然,这是有一定道理的,只要你保证你一定不会基于这些易被攻击的容器构建新容器就好了。。。

1. 设置版本数字

“Latest”不是你的好朋友。

当你在Dockerfile中指定任何基础镜像时(FROM <image> [:<tag>] [AS <name>]),我们应该提供一个带有具体版本数字的tag(比如FROM alpine:3.4)。

这么做有两个理由:

  • 可重现。一般来说,我们希望我们的容器再每次运行时都是一样的。如果我们使用了“latest”,那么哪个版本的镜像会被下载并执行将不受我们的控制。
  • 可追踪。当我们在诊断问题时(尤其是安全问题),我们希望找到我们执行的代码是从何而来的。如果基础镜像使用了“latest” tag,想要追踪到具体的版本和源代码是非常困难的。

当然,Adrian指出,指定一个具体的版本号不是那么简单的。我们该如何决定呢?

当使用语义版本号(semantic versioning)时,我们可以为一个版本号定义3个级别:MAJOR.MINOR.PATCH。如果你指定了这三个级别的数字,那么你已经获得了很好的可重新性和可追踪性,但不能够自动获得最新的安全补丁。如果你只指定了MAJOR的数字,那么你的容器就可能由于基础镜像的变动而被破坏。(MINOR版本的变动可能会对基础代码造成较大的改动)。Adrian认为一个比较适当的解决方案是使用MAJOR.MINOR来指定版本号,在这种情况下,基础镜像的内容的变动不会对我们的容器造成破坏,我们只需要去关心那些bug的修复和安全补丁的修改就好了。

我在Google上找到的Dockerfile的案例都是没有tag信息或者使用了latest作为tag。因此,我能够推断,目前存在着非常多的不安全的容器。这对那些运行在生产环境的镜像来说是更加重要的。Latest也许对开发和测试环境来说没有那么严重,但坏的习惯是很那被改变的,我们应该尽早培养这些好习惯。

我们已经说过,可重现性非常好,但是在大多数情况下,这是几乎不可得的(当然,Google做到了,但拜托,他们几乎不是人,让我们忽略他们吧)。原因在于你不能够保证你的依赖不会改变。如果你极度追求可重现性,那么你必须维护一个镜像,你也应该去看下Google的新工具Bazel。

2. 设置一个用户

如果你不在Dockerfile中指定一个用户,那么你的容器将会运行在默认用户(root)下。这是不好的。这意味着,如果某些坏蛋控制了容器中的进程,那么他们将会拥有整个容器的root权限,更进一步,如果他们突破了容器,那么他们同样会拥有宿主机的root权限(docker用户没有使用命名空间,容器中的root用户就是宿主机上的root用户)。这是非常不好的,尤其是我们能够花费少量的成本就能修复它。

你可以通过以下指令来指定用户:

USER <user>[:<group>] or USER <UID>[:<GID>] 

仅仅设置一个比root权限更低的用户,你就能够获得成倍的安全提升。

当然,这同样也不是那么简单的。在启动容器时,你可能需要root权限,启动后就不需要了。在这种情况下,目前存在多个方法能够启动时为root用户,之后将用户权限降低。比如,你可以在Dockerfile中创建用户,但在entry point或者cmd脚本中切换到这个用户。具体可以看github上的代码

3. 验证下载

如果我们足够小心,我们能够确保我们下载的每一个镜像都是我们想要的那个,并且没有被修改过的。比如说,它们没有被攻击过或者被替换过。我们可以使用hash或者摘要来完成这件事:

FROM debian@sha256:bla...

这意味着Dockerfile总是继承自同一个基础镜像。好处是,你能够保证,每次都能够生成相同镜像。并且你能够确定基础镜像不会改动,因此也就不会破坏上层代码。当然,版本的具体化带来的坏处就是,你不能够获得任何的更新,包括重要的安全更新。

4. 使用元数据

Dockerfile对元数据(使用LABEL命令设置)有非常好的支持。你可以像git一样为你的镜像添加元数据,任何人调试容器时都能够准确定位源代码。

Dockerfile的LABEL命令能够很好的提升容器的可追踪性。它非常容易使用。具体案例可以在这里查看

后续

我们已经覆盖了Dockerfile安全的基础内容。在下一次的博客中,我们将会学习如何安全地部署Docker微服务容器。

如果你对容器和安全感兴趣,下面是一些有用的资源:

原文链接:Securing Microservices with Docker from Adrian Mouat – Part 1(翻译:杨润青)

===========================
译者介绍

杨润青,90后博士僧,研究方向是网络和信息安全。

原文发布时间为:2017-08-23

本文作者:杨润青

本文来自合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:如何加固你的微服务容器——Part 1

时间: 2024-12-29 18:32:31

如何加固你的微服务容器——Part 1的相关文章

Spring Boot与Docker(四):额外的微服务、更新容器、Docker Compose和负载均衡

本文讲的是Spring Boot与Docker(四):额外的微服务.更新容器.Docker Compose和负载均衡,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列的第四篇,本篇我们我们将添加一些额外的服务/容器,并且更新容器,采用Docker Compose以及使用HAProxy容器进行负载均衡.原文作者为3Pillar环球旗下美国Adbanced技术集团的总监Dan Greene,Dan有十八年的软件设计和开发经验,包括在电子商务.B2B集成.空间分析.S

从Docker的转变,谈容器生态与微服务的发展

更多深度文章,请关注:https://yq.aliyun.com/cloud 编者按:容器技术目前已经成为技术圈内的"常识",但是容器生态能否健康发展仍然任重道远.在收获最初的赞扬之后,领军者Docker如今身陷非议:今年执意壮大发展Swarm进军编排领域,似乎Docker公司一方面惹毛了很多强劲的编排领域玩家,另一方面也并没有收获预料之中的成果.12月14日,Docker计划将其关键容器运行模块之一Containerd贡献给开源社区.在周晖先生看来,这意味着Docker的重心将回归到

微服务和容器技术有风险,望君三思而后行

本文讲的是微服务和容器技术有风险,望君三思而后行,[编者的话]微服务和容器技术拥有令人兴奋的潜力,强烈建议客户开始研究这些技术.但是,这并不是说客户应该立即全面采用.上述技术领域的发展太快了,必须清晰地了解这些技术能干什么,不能干什么,才能够决定是否采用这些技术.毕竟,生产环境不是拿来做研发试验的竞技场. XebiaLabs是一家提供大规模持续集成和 DevOps软件的公司.我们公司经常与客户讨论新近出现的开发风格.应用架构和运行时平台,内容涉及它们的优势以及带来的挑战.最近一段时间,讨论的焦点

技术讨论:微服务和容器比虚拟机快多少?

本文讲的是技术讨论:微服务和容器比虚拟机快多少?[编者的话]本文是Microscaling Systems的联合创始人Anne Currie在微服务日伦敦站的演讲整理稿,通过阅读本文可以深入了解到当和虚拟机比较时,微服务和容器的速度和效率. Anne Currie,Microscaling Systems的联合创始人,提供了一个关于为何采用容器的很好概述.请享受她最初在微服务日伦敦站的演讲,该演讲研究了什么使得微服务和容器的结合如此强大. 希望你能和我们一样享受这个演讲. 视频 幻灯片 今天,你

微服务和容器所引发的数据中心变革

软件定义基础架构.微服务和容器正在逐渐改变数据中心的构建和运行方式,未来的数据中心将会更加高效并且易于使用. 软件定义基础架构.微服务和容器是当前IT领域最为热门的话题,这些技术对数据中心的构建和运行方式产生了颠覆式影响,并且能够提升系统性能.弹性以及易用性.数据中心正在从传统的死板架构转换为更加灵活和快速响应的全新架构,甚至成为快速资源分配的发起者. 软件定义基础架构的概念并不复杂.比如,通过软件定义数据位于存储中的哪个部分,之后创建一个全新VLAN,将代码移动到虚拟机中形成一系列微服务.这些

微服务的4大设计原则和19个解决方案

作者|郝炎峰 编辑|小智 本文将介绍微服务架构的演进.优缺点和微服务应用的设计原则,然后着重介绍作为一个"微服务应用平台"需要提供哪些能力.解决哪些问题才能更好的支撑企业应用架构. 注:本文转载自公众号 EAWorld,已获授权. 写在前面 微服务架构现在是谈到企业应用架构时必聊的话题,微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活.更能适应现在需求快速变更的大环境. 微服务平台也是我目前正在参与的,还在研发过程中的平台产品,平台是以 SpringCloud 为基础

微服务的4个设计原则和19个解决方案

微服务架构现在是谈到企业应用架构时必聊的话题,微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活.更能适应现在需求快速变更的大环境. 本文将介绍微服务架构的演进.优缺点和微服务应用的设计原则,然后着重介绍作为一个"微服务应用平台"需要提供哪些能力.解决哪些问题才能更好的支撑企业应用架构. 微服务平台也是我目前正在参与的,还在研发过程中的平台产品,平台是以SpringCloud为基础,结合了普元多年来对企业应用的理解和产品的设计经验,逐步孵化的一个微服务应用平台. 一.微

Spring Boot与Docker(二):使用Spring Boot和Docker构建微服务架构

本文讲的是Spring Boot与Docker(二):使用Spring Boot和Docker构建微服务架构,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列的第二篇,本篇我们将会利用工具进行设置,深入探讨如何使用Docker工作,然后搭建我们的第一个容器.原文作者为3Pillar环球旗下美国Adbanced技术集团的总监Dan Greene,Dan有十八年的软件设计和开发经验,包括在电子商务.B2B集成.空间分析.SOA架构.大数据以及云计算等领域的软件产品架

微服务:Java EE的掘墓人

在Java问世之初,包括IBM.BEA.Oracle在内的一些巨头公司看到了Java作为一门杰出的Web编程语言可能给他们带来的巨大商机.那么如何通过一门编程语言来赚钱呢?答案就是使用这门语言构建复杂无比的服务器,让那些大公司支付一大笔费用来购买这些服务器.于是紧接着就出现了Java EE规范.JSR规范,以及WebLogic.WebSphere等服务器中间件. 在这些服务器上面部署了大型的程序包,它们运行缓慢,消耗大量的内存.基于这些容器的开发和调试对开发人员来说简直就是噩梦,作为对他们的补偿