生产环境中安全运行Docker容器

在生产环境中,强化Docker容器的一种方法就是使它们不可变,也就是只读。安全地运行容器的其他方法还包括最小化受攻击面和应用Linux安全过程,标准Linux安全过程和针对容器环境的特定过程都要应用。

在启动容器时传入--read-only标记就可以 在只读模式下运行 它。这可以防止任何进程写入文件系统。任何试图写入的动作都会导致错误。 运行这种不可变的基础设施 也与其他软件部署流水线的最佳实践相吻合。

尽管不可变性可以阻止任何恶意脚本的执行,可以禁止通过在容器里运行的其他软件暴露出来的漏洞而引起的改动。但是在现实生产环境中,这种模式又是不是适用于应用程序呢?比如,要产生的日志文件和要使用数据库的应用程序就需要可写性。

写日志的一个可能的解决方案可以是使用一个集中的日志系统,比如Elasticsearch/Logstash/Kibana(ELK),这样所有的日志都被收集在一个中心节点,可能是在另一个容器中,就不是用户可以直接访问的了。另一种替代的方案是在启动容器时,通过使用--log-driver标记将日志导出到容器之外。对于那些需要对/tmp之类的临时目录有写入权限的应用程序,一种解决办法是在容器里为这些目录 加载一个临时的文件系统 。

终端用户不能直接访问数据库,所以风险较低。然而,这并不排除受到攻击的可能,除非面对用户的应用程序得到了强化。

在不可避免地要有一个可写的文件系统的情况下,Docker提供了审计和变化的回滚功能。在Docker容器里的文件系统是作为一系列层的堆叠。当创建一个新容器时,将在顶部添加一个新层,该层可以写入。Docker存储驱动程序隐藏了这些细节,并将它作为一个普通的文件系统交付给用户。对正在运行的容器的写入将写入此新层。这通常被称为写时拷贝(Copy-On-Write,COW)。

在Docker容器里很容易检测到配置漂移或预期的配置变更。“docker diff”命令可以显示对文件系统的更改——无论更改操作是文件添加、删除还是修改。

除了在可能的情况下运行一个只读容器,我们 还 提出以下 建议 ,以确保在生产环境中容器的安全:

  • 运行一个 Alpine Linux 之类的最小的镜像,Alpine Linux是基于安全思想而设计的。它的内核上打了一个grsecurity的非官方移植的补丁。 Grsecurity 是一套对Linux内核的安全增强方法,它包括权限控制以及消除基于漏洞的内存崩溃的可能,具体方法是将那些使系统可能被攻击的方法减少到最少。
  • 限制对CPU、RAM等资源的使用,以防止DoS攻击。
  • 在操作系统中配置线程和进程限制。
  • 采用sysctl之类标准的Linux内核强化程序。
  • 每个容器中只运行一个应用程序。建议这么做,是因为它减小了受攻击面,即对于一个给定的容器,可能的漏洞数量就只取决于在该容器上运行的应用程序了。
(0)

相关推荐

  • 在Docker上开始部署Python应用的教程

    几周前, Elastic Beanstalk声明在AWS云中配置和管理Docker容器.在本文中,我们通过一个简单的注册表单页面应用去理解Docker部署过程,该表单使用Elastic Beanstalk Python环境. 关于注册表单应用 几个月之前,我们就已经开发完这个应用并且发表在博客上.有4部分视频和一篇文章"Using DynamoDB and SNS with Elastic Beanstalk in any Supported AWS Region".今天,我们将在这部

  • 搭建基于Docker的PHP开发环境的详细教程

    现在很多开发者都使用Vagrant来管理他们的虚拟机开发环境,Vagrant确实很酷, 不过也有不少缺点(最主要的是它占用太多的资源).在容器技术.Docker和更多类Docker技术出现后,解决这个问题就变得简单了. 免责声明 由于boot2docker的工作方式,本文所述的方法在你的环境中可能无法正常运行.如果需要在非Linux环境下共享文件夹到Docker容器,还需要注意更多额外的细节.后续我会写篇文章专门来介绍实际遇到的问题. 怎样才算是好的开发环境 首先,我们得知道什么才是好的开发环境

  • ubuntu14.04+docker的安装及使用

    安装 官方推荐在ubuntu安装,本文选择在ubuntu14.04作为宿主系统. 系统更新 复制代码 代码如下: sudo apt-get update && apt-get upgrade -y sudo reboot     #最好重启一下  安装docker 复制代码 代码如下: curl -s https://get.docker.io/ubuntu/ | sudo sh  基础命令 复制代码 代码如下: # 下载一个ubuntu镜像 sudo docker pull ubuntu

  • 利用OpenVSwitch在多台主机上部署Docker的教程

    [编者的话]当你在一台主机上成功运行Docker容器后,信心满满地打算将其扩展到多台主机时,却发现前面的尝试只相当于写了个Hello World的入门程序,多主机的网络设置成了下一道门槛.在你尝试各种方案时不妨先看看本文,或许就会豁然开朗,发现原来也不复杂.嗯,是的,本文用到了 OpenVSwitch. 运行Docker已经不是什么新鲜事,网上有很多入门教程来帮助你在一台主机上运行容器.这台主机可以是Linux服务器,也可以是Mac(借助类似boot2docker的项目). 在多台主机上运行却是

  • Docker 清理命令集锦

    杀死所有正在运行的容器 复制代码 代码如下: docker kill $(docker ps -a -q) 删除所有已经停止的容器 复制代码 代码如下: docker rm $(docker ps -a -q) 删除所有未打 dangling 标签的镜像 复制代码 代码如下: docker rmi $(docker images -q -f dangling=true) 删除所有镜像 复制代码 代码如下: docker rmi $(docker images -q) 为这些命令创建别名 复制代码

  • 在docker中部署tomcat并且部署java应用程序的步骤详解

    先给大家简单说下Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 1.先说如何在docker中部署tomcat 第一步:root用户登录在系统根目录下创建文件夹tomcat7,命令如:mkdir tomcat7,并且切换到该目录下:cd tomcat7: 第二步:创建Dockerfile,命令如:touch Docker

  • 在Docker上部署Python的Flask框架的教程

    本文中,我将尝试展示用Docker开发python应用(主要是Web应用)的可行方法.虽然我本人专注于Python的Flask微框架,但本文目的是演示如何通过Docker更好地开发和共享应用程序,(由任何语言和框架开发的应用程序).Docker通过封装依赖项,大大减少了开发环境和正式产品的差距. 大多数Python开发人员在开发中使用virtualenv.它提供了一种易用的机制让应用程序使用自己专用的依赖项,这些依赖项可能与在其它应用程序或操作系统存在冲突(尤其是不同的Pyhton版本,还有不同

  • 再Docker中架设完整的WordPress站点全攻略

    1. 安装 Docker 在我们真正开始之前,我们需要确保在我们的 Linux 机器上已经安装了 Docker.我们使用的主机是 CentOS 7,因此我们用下面的命令使用 yum 管理器安装 docker. # yum install docker # systemctl restart docker.service 2. 创建 WordPress 的 Dockerfile 我们需要创建用于自动安装 wordpress 以及其前置需求的 Dockerfile.这个 Dockerfile 将用于

  • 在windows下的安装Docker的教程

    非官方备注:你的CPU一定要支持VT才可以,笔者的笔记本T6400不支持VT是装不上的,所以一定要支持VT,好在笔者的MAC很OK,公司电脑也给力,如果在win7系统安装需要是64的系统. 上一节我们介绍了在ubuntu和centos下的安装,当然都是基于64位系统的,在学习过程中,你可能没有这些东西,当然你可以用virtualbox或者Vmware虚拟化出来,今天我们介绍的是官网给我们提供的using vagrant! 介绍 Docker可以用虚拟主机技术运行在Windows上像virtual

  • 生产环境中安全运行Docker容器

    在生产环境中,强化Docker容器的一种方法就是使它们不可变,也就是只读.安全地运行容器的其他方法还包括最小化受攻击面和应用Linux安全过程,标准Linux安全过程和针对容器环境的特定过程都要应用. 在启动容器时传入--read-only标记就可以 在只读模式下运行 它.这可以防止任何进程写入文件系统.任何试图写入的动作都会导致错误. 运行这种不可变的基础设施 也与其他软件部署流水线的最佳实践相吻合. 尽管不可变性可以阻止任何恶意脚本的执行,可以禁止通过在容器里运行的其他软件暴露出来的漏洞而引

  • 详解将ASP.NET Core应用程序部署至生产环境中(CentOS7)

    将ASP.NET Core应用程序部署至生产环境中(CentOS7) 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7. 部署ASP.NET Core应用程序 配置Nginx 配置守护服务(Supervisor) 这段时间在使用Rabbit RPC重构公司的一套系统(微信相关),而最近相关检验(逻辑测试.压力测试)已经完成,接近部署至线上生产环境从而捣鼓了ASP.NET Core应用程序在CentOS上的部署

  • 基于在生产环境中使用php性能测试工具xhprof的详解

    xhprof 是facebook开源出来的一个php性能测试工具,也可以称之为profile工具,这个词不知道怎么翻译才比较达意.跟之前一直使用的xdebug相比,有很多类似之处.以前对xdebug有一些记录还可以供参考,但是它的缺点是对性能影响太大,即便是开启了profiler_enable_trigger参数,用在生产环境中也是惨不忍睹,cpu立刻就飙到high.而xhprof就显得很轻量,是否记录profile可以由程序控制,因此,用在生产环境中也就成为一种可能.在它的文档上可以看到这样一

  • 详解Java枚举类在生产环境中的使用方式

    目录 前言 使用 1.确定业务场景状态 2.定义枚举类 3.自定义查询方法 4.测试效果 总结 前言   Java枚举在项目中使用非常普遍,许多人在做项目时,一定会遇到要维护某些业务场景状态的时候,往往会定义一个常量类,然后添加业务场景相关的状态常量.但实际上,生产环境的项目中业务状态的定义大部分是由枚举类来完成的,因为更加清晰明确,还能自定义不同的方法来获取对应的业务状态值,十分方便. 以下代码均为生产环境已上线项目的代码片段,仅供参考. 使用 大体分为确定业务场景状态.定义枚举类.自定义查询

  • 详解spring-boot下如何满足多生产环境中个性化定制功能

    在项目的开发中,我们很难做到开发一套标准的流程来解决所有客户的需求.比如,我们当前的计量项目,分别运行于赤峰市和河北省.虽然两个区域处理的业务相同,但是对细节的实现要求却不同.前面也学习过计量检定软件,其为了解决各个定制者使用的功能需求,最后采取的方案是:将基础项目复制多份,进而满足不同的客户需求.优点当然是有的,但比起缺点来,优点便不值一提.缺点很明显,总结为一句话就是:项目变得难以维护.所以,当前让我们看到的就是,几个开发人员,每天处于解决问题当中.本文将给出一种方案,来有效的规避上述问题.

  • 详解在Docker容器中运行Spring Boot应用

    spring Boot简化了Spring应用的开发过程,遵循约定优先配置的原则提供了各类开箱即用(out-of-the-box)的框架配置.另一方面,Spring Boot还具备将代码直接构建为可执行jar包的能力,这个jar包是一个可以独立运行的部署单元.基于以上特性,现在普遍认为Spring Boot提供了一种快速构造微服务(Micro-Service)的能力. Docker与Spring Boot Docker是一种Linux容器的实现,Linux容器是基于进程的轻量级资源隔离技术,每一个

  • Docker容器的应用中,10个要不得的坏习惯

    毋庸置疑,容器已经成为企业IT基础设施中必不可少的部分,它具有许多的优点,比如: 第一:容器是不可变的--操作系统,库版本,配置,文件夹和应用程序都包装在容器内.你保证在质量检查中测试过的同一镜像将以相同的行为到达生产环境. 第二:容器很轻--容器的内存占用量很小.容器将只为主要进程分配内存,而不是数百或数千MB. 第三:容器非常快--可以像启动典型Linux进程一样快地启动容器.你可以在几秒钟内启动一个新容器,而不是几分钟. 但是,许多用户仍然像对待典型虚拟机一样对待容器,而忘记了容器具有重要

  • Docker容器应用中,10个要不得的坏习惯

    毋庸置疑,容器已经成为企业IT基础设施中必不可少的部分,它具有许多的优点,比如: 第一:容器是不可变的--操作系统,库版本,配置,文件夹和应用程序都包装在容器内.你保证在质量检查中测试过的同一镜像将以相同的行为到达生产环境. 第二:容器很轻--容器的内存占用量很小.容器将只为主要进程分配内存,而不是数百或数千MB. 第三:容器非常快--可以像启动典型Linux进程一样快地启动容器.你可以在几秒钟内启动一个新容器,而不是几分钟. 但是,许多用户仍然像对待典型虚拟机一样对待容器,而忘记了容器具有重要

  • vue3+vite中开发环境与生产环境全局变量配置指南

    目录 一.开发环境和生产环境 二.配置环境变量 三.使用全局变量 总结 一.开发环境和生产环境 开发环境:也就是编码时运行的环境,即我们使用npm run dev或者npm run serve运行项目到本地时,项目处于的环境. 生产环境:项目部署到服务器上后处于的环境,我们使用npm run build将项目打包以后,再运行项目,项目就运行在生产环境中了. 对于不同的环境,我们可以配置不同的环境变量,来实现开发和生产的兼容. 例如: 开发环境时,我们可以请求自己本地的接口(‘/api’ prox

  • docker容器与宿主机的数据交互方式总结

    前言 在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 方式一.Docker cp命令 docker cp :用于容器与主机之间的数据拷贝. 语法 # 容器内文件 copy to 宿主机 docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- # 宿主机文件 copy to 容器内 docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_

随机推荐