【转载】详解Docker 最低特权编排原则,安全与效率并行!(一)

写在前面

Docker 平台和容器已经逐渐成为打包、部署和管理应用程序的标准。为了让容器在集群中于多节点间协调运行,这就需要一个关键的功能:容器编排(container orchestrator)。本主题将分两篇为大家详细讲解这一重要功能。下篇《详解Docker 最低特权编排原则,安全与效率并行!(二)》链接为:

编排功能

编排功能(Orchestrators)负责关键的集群和调度任务,例如:

  • 管理容器调度和资源分配
  • 支持服务发现和无中断应用程序部署
  • 分发让应用程序运行所必需的资源

不幸的是,在这种环境中,编排的分布式特性与资源的短暂特性让安全的编排成为一项具有挑战性的任务。在这篇文章里,我将详细解读这个常常被人们所忽略的重要方面——编排的安全模型,我还会演示如何利用Docker 企业版(EE)内置的编排工具——Swarm 来如何克服上述困难。

活跃模型和威胁模型

在Docker 企业版(EE)中使用Swarm Mode的主要目的是为用户提供一个内置安全功能的编排。为了实现这一目标,我们开发了首款容器编排工具,它的设计理念就是要时刻保持占用最低特权原则,以提高主机整体的运行效率。

计算机科学中,每一个参与者都需要在分布式系统中遵循最低特权原则,它要求参与者仅可以访问符合其合法目的的必要信息和资源,不能多也不能少。

最低特权原则——一个进程只能访问符合其合法目的所必需的信息和资源。

Docker企业版(EE)中的Swarm 为每一个节点都分配了相应的角色(无论是管理人员还是工作人员)。这些角色分别为节点限定了其粗颗粒度的权限等级,即管理任务级别和执行任务级别。但是,不管它的角色是什么,节点都只能访问其执行必要任务所需的信息和资源,并且具有强制加密的访问保障机制。因此利用这种机制可以更加轻松的保护集群免遭黑客的致命攻击,如通过控制底层通信网络或者盗用集群节点的攻击方式。

默认安全核心

IT领域有一个安全准则,它规定:如果不是默认的,就没有人会使用它。 Docker Swarm Mode将这一理念带入产品中,并配有默认机制来解决编排生命周期中最困难和最重要的三个方面(本篇将介绍前两个方面):

  • 信任引导和节点介绍;
  • 节点身份签发和管理;
  • 对认证、授权、加密过的信息进行存储和分发;

下面,让我们分别来看这几个方面:

信任引导和节点介绍

安全集群的第一步是对成员资格和身份进行严格的控制。没有这一步,管理员就不能利用其节点管理者的身份,对节点之间的工作负载进行严格的分离。这意味着未经授权的节点将不能被允许加入集群,而已经成为集群中的节点则不允许更改其身份,从而杜绝了伪装成其它节点的可能。

为了满足这一需求,就需要通过Docker 企业版(EE)的Swarm Mode来管理节点以对其进行严格的控制并维持其固定的身份。所需的属性是通过使用两个关键的构建模块进行加密保护:

  1. 为集群成员提供安全连接令牌;
  2. 将唯一标识嵌入到由中央主机认证授权签发的证书中;

加入Swarm

要加入Swarm,节点就需要一个安全连接令牌。令牌对集群中每个操作角色都是唯一的——目前有两种类型的节点:工作人员节点和管理员节点。由于这种分离,具有工作人员身份的节点将不允许作为管理人员加入集群。获取特殊令牌的唯一方法就是让集群管理员通过Swarm管理的API界面进行交互式地申请。

令牌是安全、随机生成的,它同时还具有一种特殊的语法,使得管理员更容易检测到泄漏的令牌:利用一个特殊的前缀,您就可以的轻松的监控日志和存储库中的泄漏问题。幸运的是,即使发生泄漏,令牌也很容易进行更新,我们建议您经常轮转它们——特别是在集群短时间内不会更新换代的情况下。

信任引导

作为建立其身份的一部分,新节点将申请一个由网络管理员所签发的全新身份。但是,根据我们威胁模型的假设,即所有通信都可以被第三方截获。这就引出了一个问题: 一个节点如何判断它是否在与一个合法的管理员对话?

幸运的是,Docker有一个内置的保护机制来防止这种情况发生。连接令牌包含CA证书的散列就是主机连接Swarm的保障机制。因此,主机可以使用单向TLS,并使用散列来验证它是否在与正确的Swarm进行连接:如果管理员显示的不是通过与散列匹配的CA证书,则该节点就清楚不能与其连接了。

节点身份的签发和管理

节点在Swarm 中的身份会嵌入到每个节点所持有的x509证书中。根据最低特权原则,证书的私钥将严格限制在其发起的主机上。值得注意的是,除自己所持有的私钥之外,管理员无权访问任何其它证书的私钥。

身份签发

要在不共享私钥的情况下接收证书,就需要新主机首先发出一个证书签名请求(CSR),然后由管理员将其转换成证书。现在,这个证书就是节点在新主机上的身份证明,拥有该证书的节点就是该群集的正式成员了!

当与安全引导机制一起使用时,默认情况下,这种为连接节点进行身份签发的机制是安全的。所有通信方都是经过验证的、经过授权的,并且没有在明文中交换任何敏感信息。

身份续约

然而,将节点安全地连接到Swarm只是其中的一部分。为了最大限度地减少证书泄漏或被盗的影响,并且消除管理CRL列表的复杂性,Swarm Mode 只为其节点提供短期的身份验证证书。这些证书的默认有效期为3个月,但是可以根据您的需要自由配置时间!

使用这个有效期很短的证书意味着证书更新不能是一个手动的过程,因为它通常用于大多数PKI系统。使用Swarm,所有证书都将以一种不中断的方式进行自动更新。这个过程很简单:使用相互验证过的TLS连接去证明特定身份的所有权,Swarm节点定期生成新的公钥/私钥,并发送相应的CSR以进行签名,创建一个全新的证书,但不会改变其原有身份。(未完待续......)

时间: 2024-09-07 06:10:42

【转载】详解Docker 最低特权编排原则,安全与效率并行!(一)的相关文章

详解Docker中VLAN网络模式的配置_docker

前言 Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理.然而,Docker同样有着很多不完善的地方,网络 方面就是Docker比较薄弱的部分.因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求. Docker网络模式选择 目前已有不少文章介绍了Docker的网络模型,但是在实际应用中还是有不少坑和需要注意的点 在Docker应用到生产环境的时候,网络模型的选择主要有以下几种      1.原生Bridge NAT模式      2.Lin

详解Docker创建php开发环境遇到的权限问题解决方案_docker

最近我将公司的开发,和测试环境都运行到docker 上面,因为开发,测试基本都是装代码拉到本址,然后,再装目录,挂载到镜像目录中如:我用的是docker-compose # development.yml version: '2' services: php-fpm: image: jackluo/php-fpm:5.6.3 restart: always volumes: - ./www:/var/www/html - ./data:/usr/local/var/log extra_hosts

搜索引擎收录大不同 详解百度谷歌SOSO收录原则

  网站收录问题一直困扰着很多站长朋友,如何让一个新建的网站收录自己的文章,是站长朋友首要解决的问题,因为只有让搜索引擎收录更多的文章,才能快速提升网站的权重;其实有时候我们发现,网站收录和权重就类似一个因果关系:只有让网站收录更多才能提升网站权重;网站有一定的权重才能让文章更容易的被收录.但是不管怎么样,新建的网站让搜索引擎收录就是我们迈出的第一步. 从优化网站一年多,对于搜索引擎也有一定的了解,下面来说说自己对百度.谷歌.soso 这个三个搜索引擎对于网站收录的一个原则,首先来分析下百度对于

详解Docker目录挂载的方法总结_docker

Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定. 譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定: # docker run -it -v /test:/soft centos /bin/bash 这样在容器启动后,容器内会自动创建/soft的目录.通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录. 貌似简单,其实不然,下面我们来验证一下: 一.容器

docker 动态映射运行的container端口实例详解_docker

docker动态映射运行的container端口,最近做项目,对于docker动态映射运行的container端口的资料有必要记录下,以便以后在用到, Docker自带了EXPOSE命令,可以通过编写dockerfile加-p参数方便的映射Container内部端口,但是对于已经运行的container,如果你想对外开放一个新的端口,只能编辑dockerfile然后重新build,有点不太方便. 其实docker本身使用了iptables来做端口映射的,所以我们可以通过一些简单的操作来实现动态映

Docker创建镜像两种方法详解_docker

 Docker创建镜像             最近学习Docker 的知识,偶然在网上看到关于Docker 创建对象的两种方法很好,这里记录下,也许可以帮助到你.  我们都知道Docker中我们是基于镜像来运行的容器,那如何创建镜像呢?创建镜像有两种方法,一是使用docker commit命令,二是使用docker build命令和Dockerfile文件.这里我们说的创建镜像是指基于一个已有的基础镜像比如ubuntu等,而不是从零创建一个全新的镜像.         下面分别简单介绍一下两种

详解C++编程中的嵌套类的声明与其中的函数使用_C 语言

可以在一个类的范围内声明另一个类.这样的类称为"嵌套类". 嵌套类被视为在封闭类的范围内且可在该范围内使用.若要从嵌套类的即时封闭范围之外的某个范围引用该类,则必须使用完全限定名. 下面的示例演示如何声明嵌套类: // nested_class_declarations.cpp class BufferedIO { public: enum IOError { None, Access, General }; // Declare nested class BufferedInput.

高效运维之Docker持续部署图文详解

前言 关于Docker的文章铺天盖地,但精品文章往往翻译居多.都说Docker天生适合持续集成/持续部署,但同样,可落地.实际可操作性的文章也很少见. 基于这些情况,虽然我们专栏定位为运维管理性文字,但本篇是个特例,实操性的案例讲解--JAVA项目如何通过Docker实现持续部署(只需简单四步),即: 开发同学通过git push上传代码,经Git和Jenkins配合,自动完成程序部署.发布,全程无需运维人员参与. 这是一种真正的容器级的实现,这个带来的好处,不仅仅是效率的提升,更是一种变革:

你真的了解Docker吗?——Docker插件机制详解

云栖TechDay活动第十八期中,阿里云容器服务团队的核心成员陈萌辉带来了题为<Docker插件机制详解>的分享,分享中,他结合阿里云容器服务实践介绍了Docker插件的基本原理.实现方法以及插件机制未来的演进. 幻灯片下载地址:https://yq.aliyun.com/attachment/download/?filename=bdefe06ba7a14d7604af5a63a4bcc4f3.pdf 以下为现场分享观点整理. 为什么需要Docker插件?   Docker之所以这么火并且有