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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文讲的是如何加固你的微服务容器——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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
Kubernetes 开发者 Docker
基于容器技术的微服务架构
基于容器技术的微服务架构
32 0
|
1月前
|
运维 应用服务中间件 调度
微服务容器化的运维
【2月更文挑战第27天】
|
1月前
|
运维 API Docker
深入浅出:微服务架构与容器化技术的完美融合
【2月更文挑战第13天】 在现代软件开发领域,微服务架构和容器化技术已成为推动企业快速发展的两大核心力量。本文将从微服务的基本概念出发,深入探讨其与容器化技术结合的必然性与优势,进而分析如何在实践中有效地实现二者的完美融合。通过对微服务架构的细致解析及容器化技术的应用展示,旨在为读者提供一种全新的视角,理解并掌握这一前沿技术趋势,以指导实际工作中的技术选择与架构设计。
|
2月前
|
运维 Java Docker
微服务容器化实践
【2月更文挑战第6天】
|
2月前
|
开发者 Docker 微服务
深入浅出:使用Docker容器化部署微服务架构
在当今快速迭代的软件开发环境中,微服务架构因其高度解耦和独立性而成为企业首选。然而,微服务的管理和部署可能会变得复杂和繁琐。本文将探讨如何利用Docker,一个轻量级的容器化技术,来简化和加速微服务的部署。我们将从Docker的基础概念入手,详细介绍如何创建、配置和运行微服务容器,最后讨论Docker在微服务架构中的优势和挑战。本文旨在为开发者提供一条清晰的路径,通过容器化技术实现微服务架构的高效部署和管理。
87 0
|
2月前
|
Kubernetes 开发者 Docker
深入浅出:使用Docker容器化部署微服务架构
在当今快速演进的软件开发领域,微服务架构因其高度的模块化和可伸缩性而受到广泛欢迎。然而,微服务的部署和管理也带来了新的挑战。本文旨在通过深入浅出的方式,探讨如何利用Docker容器技术有效地部署和管理微服务架构。我们将从Docker的基本概念出发,逐步深入到如何构建、部署微服务,并讨论在此过程中可能遇到的常见问题及其解决策略。本文不仅适合刚接触Docker和微服务的新手,也为有经验的开发者提供了实用的参考。
56 1
|
2月前
|
JSON JavaScript Docker
深入浅出:使用Docker容器化部署微服务架构
本文旨在向读者展示如何利用Docker技术高效地构建和部署微服务架构。通过深入浅出的方式,我们将探索Docker的基本概念、容器化的优势以及如何将其应用于微服务架构中。此外,文章还将提供一个简单的示例,指导读者实践如何使用Docker将一个现有的后端应用容器化,并部署到本地开发环境中。不同于传统的摘要,这里我们强调实践操作的重要性,鼓励读者通过实际操作来加深对Docker和微服务架构的理解。
52 1
|
2月前
|
Kubernetes 负载均衡 Docker
深入浅出:使用Docker容器化部署微服务
在当今快速变化的软件开发领域,微服务架构因其高度的模块化和可伸缩性而受到广泛欢迎。然而,微服务的部署和管理带来了新的挑战。本文将探讨如何利用Docker容器技术,简化和加速微服务应用的部署过程。我们将从Docker的基础知识入手,逐步深入到如何构建、部署和管理微服务容器。通过本文,读者将获得一套实用的工具和方法论,以便在自己的项目中高效地应用Docker和微服务技术。
|
2月前
|
Java 开发者 Docker
深入浅出:使用Docker容器化部署微服务架构
在本文中,我们将探索Docker容器技术如何革新微服务架构的部署方式,提高开发效率和应用的可扩展性。不同于传统摘要的概述风格,我们将通过一个实际案例,步骤明晰地展示如何将一个简单的微服务应用容器化,并在Docker环境中部署运行。本文旨在为开发者提供一个清晰、易懂的指南,帮助他们理解容器化技术的基本原理和操作流程,无论是初学者还是有经验的开发人员都能从中获益。
|
2月前
|
存储 Kubernetes Docker
深入浅出:使用Docker容器化部署微服务架构
在当今快速迭代的软件开发周期中,微服务架构凭借其高度的模块化和灵活性成为了众多企业的首选。然而,随之而来的是对环境一致性和服务部署效率的挑战。本文将探讨如何利用Docker这一轻量级容器技术,实现微服务的快速、一致和可靠部署。通过深入浅出的方式,我们将介绍Docker的基本概念、容器化微服务的优势以及步骤详解,旨在为读者提供一个清晰的实践指南,帮助他们在微服务架构的部署过程中提升效率和可靠性。
66 0