如何加固你的微服务容器——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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
9月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
10月前
|
Kubernetes Cloud Native 持续交付
容器化、Kubernetes与微服务架构的融合
容器化、Kubernetes与微服务架构的融合
350 82
|
7月前
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
7月前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
|
9月前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
493 24
|
9月前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
525 6
|
9月前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器化到微服务
本文将带领读者踏上云原生的旅程,深入探讨容器化和微服务架构的概念、优势以及它们如何共同推动现代软件的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务应用,并解释相关的配置和操作。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供有价值的见解和实操指南。
|
10月前
|
Kubernetes Cloud Native 开发者
云原生入门:从容器到微服务
本文将带你走进云原生的世界,从容器技术开始,逐步深入到微服务架构。我们将通过实际代码示例,展示如何利用云原生技术构建和部署应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和启示。
|
10月前
|
弹性计算 运维 开发者
后端架构优化:微服务与容器化的协同进化
在现代软件开发中,后端架构的优化是提高系统性能和可维护性的关键。本文探讨了微服务架构与容器化技术如何相辅相成,共同推动后端系统的高效运行。通过分析两者的优势和挑战,我们提出了一系列最佳实践策略,旨在帮助开发者构建更加灵活、可扩展的后端服务。
|
10月前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
644 1