不可变基础设施:拒绝SSH

本文讲的是不可变基础设施:拒绝SSH,【编者的话】同一套软件系统在部署与运行过程中,常常会因为依赖组件版本、运行时间及人工干预等多种因素引发运行结果差异,造成不必要的损失。要消除这种影响,其中之一就是推行“不可变基础设施”保证其一致性。

什么是不可变基础设施

在开始本文之前,先介绍下什么是不可变基础设施。不可变基础设施(Immutable Infrastructure)是由Chad Fowler于2013年提出的一个很有前瞻性的构想:在这种模式中,任何基础设施的实例(包括服务器、容器等各种软硬件)一旦创建之后便成为一种只读状态,不可对其进行任何更改。如果需要修改或升级某些实例,唯一的方式就是创建一批新的实例以替换。这种思想与不可变对象的概念是完全相同的。(来自InfoQ

当然在很多年以前这个概念是得不到技术支持的,我们很难在不同的物理机上实现软件的不可变。不过随着虚拟化技术以及云计算的发展,现在这已经变得可能了。我们更多的时候,面对的不是一台台的物理主机,更多的是云主机实例。安装一个操作系统也不需要几小时,而只需要鼠标点几下,等上两三分钟即可。重装系统这个概念已经不存在,删掉一个主机实例我们也不会心疼(来自个人博客)。

实现这种模式的好处是显而易见的,这意味着配置工作可实现重复性,减少了配置管理工作的负担,让持续集成与持续部署过程变得更流畅。同时它也更易于应对部署环境间的差异及版本管理,包括在部署出错时可进行快速回滚 —— 只要旧版本的镜像文件还有备份,就可以快速地生成旧版本的实例进行替换。否则的话,就只能老老实实地重新构建旧版本的实例,并且祈祷能够赶在老板掀桌之前完成回滚。

不可变基础设施令人兴奋的事情之一是:它让我们有机会重新审视一些旧的方式,并改进它们。其中之一是“漂移”——不同机器间的差异。造成这一问题主因有两个:延迟配置与更新。二者都会随着时间加剧。不同机器被设置的时间越久、存在的越久,就越有可能碰到漂移的问题。让我们依次来看看这些问题。

为什么漂移是个问题?

首先要回答的是:为什么漂移自身是个问题?或者换个说法:为什么拥有一模一样的机器很重要?

在软件系统中,减少风险的主要方式之一是测试。手工和自动测试都依赖于相同的三个步骤:

  • 将系统置于一个已知状态
  • 执行一个动作
  • 将结果与预期做比较

将系统置于一个已知状态不仅适用于数据,也适用于所有安装的软件组件版本。一旦系统被正确设置,测试将验证X版本代码运行于Y版本平台且具有Z版本库的正确性。所有其他组合都是未知的,必须单独验证。也就是说,无法保证同一版本代码与旧版或新版平台和库组合时能同样工作,因为旧版本可能存在BUG,而新版本可能有回归或细微的变化。

为了让测试中的投入有所价值,必须保证系统及所有组件版本处于已知状态,以便能简单且安全地在机器和环境间复制。

简单而言,要保证东西能工作,必须在生产环境中运行在测试环境中所测试的东西。

这同样适用于单一环境。如果在负载均衡器后有多台机器为客户端提供服务,要保持工作正常,这些机器必须完全一致。

延迟配置的问题

你可能会觉得这很容易通过使用一些可靠的配置机制来解决。不管你喜欢什么脚本或配置管理工具,这并没有看起来那么容易。问题在于包管理器的常见使用模式及中央仓库的更新时机。当你使用类似这样的命令时,问题就出现了:

> sudo apt-get install mypkg

为了更好的展示为什么这是个问题,请看这个简单的例子:三台机器在不同时间使用同一配置脚本进行设置:

正如你所见,虽然所有机器都安装了A和B包,配置时间的不同造成了同一脚本将同一个包的不同版本拉取到不同机器上。系统的稳定性与中心仓库里每个包的更新计划密切相关!

镜像是解决之道

解决这个问题的办法之一是将所有包及其依赖项固定到一个特定版本上。虽然这让你得以重新控制系统的更新计划,也带来了高昂的维护成本。

一个更简单、更可靠的办法是听从真言:只做一次构建。

要消除环境间的差异(即造成失败的潜在因素),构建的产物应在尽可能低的层次上捕获应用及其依赖项。在虚拟基础设施中,尽可能低的层次可以简单的是整个机器的镜像。然后,你就能创建出你所需要的完全一致的实例:

镜像使得创建相同主机变得简单,但并没有解决所有问题。一旦有机会登录,你就失去了这些主机不随时间发散的保证:

这些主机存在的越久,东西被修改的可能性就越高,也就越难被完全的重建。这在很大程度上消减了其带来的益处。

强制不可变性

那么,如何弥补这点?那就是禁止登录。这不仅解决了漂移问题,还能减少受攻击面从而提高安全性。在此之上,它还强制你遵循一个干净的以镜像为基础的工作流,杜绝后门。欢迎加入拒绝SSH的运动来推广所有这些优势:

现在,你的基础设施已经不可变了。所有的修改都要求通过常规的自动化构建与部署管道来重新构建新的镜像。作为回报,系统的简单性和可靠性将大幅提升。非常值得一试。

结论

漂移通过侵蚀测试中得到的保证,降低了系统的可靠性。而这点在依赖传统配置工具时非常容易发生。

迁移到能在尽可能低层次捕获应用及其依赖的构建与部署管道上,你将重获这种信心。在处理虚拟硬件时,达成这点最好的方式是产出整个系统的镜像。要保证这个过程的可靠性,你需要消除SSH和登录能力。镜像和基础设施不再可变。所有的修改都会触发新镜像的产生,且针对所有环境只构建一次。

原文链接:Immutable Infrastructure: No SSH(翻译:梁晓勇

原文发布时间为:2015-09-06

本文作者:sean

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

原文标题:不可变基础设施:拒绝SSH

时间: 2024-09-28 21:19:27

不可变基础设施:拒绝SSH的相关文章

适合不可变基础设施、可提高安全性的可引导应用

在QCon伦敦2016大会上,Boxfuse首席执行官Axel Fontaine谈了"可引导应用(Bootable App)"模式,,这是一个将不可变基础设施部署到云上的裸机镜像.这个最小镜像包含了栈中的所有层次,包括OS内核.库和运行时环境,但空间占用仍然很小(MB级而不是GB级),减少了镜像上传时间和存储成本,同时还显著缩小了运行实例的攻击面. Fontaine提出,这个最小镜像只包含栈底层中绝对必要的组件.该镜像然后会包含应用程序本身.应用程序服务器.相应的语言运行时及所需的库.

使用不可变基础设施让系统更安全

本文讲的是使用不可变基础设施让系统更安全[编者的话]DiogoMónica是Docker的安全领导者.他是Square的早期员工,领导平台安全团队.获得计算机科学学士学位,硕士和博士学位.他担任几家安全初创公司的顾问,是一名长期的IEEE志愿者.本文他提供一个利用容器的不变性来防御黑客攻击的新思路. Docker容器的一个整洁之处在于它们是不可变的. Docker附带一个写入时复制文件系统,这意味着基本映像不能被修改,除非你显式地做一个提交. 这么做的原因之一是你很容易检查偏差,如果试图调查一个

DockOne微信分享(一二〇):基于Kubernetes的私有容器云建设实践

本文讲的是DockOne微信分享(一二〇):基于Kubernetes的私有容器云建设实践[编者的话]本次分享将为大家介绍易宝支付私有容器云从0到1的建设之路.包括技术选型.理论基础.基于Kubernetes的容器云和CI/CD落地过程中的挑战和踩过的坑. 建设背景及目标 在Docker技术流行开来之前,保证软件交付的质量和速度对于大多数企业来说都是困难的.业务的复杂性带来了应用的复杂性,面对成千上万的不同应用,运维部门需要时刻应对来自不同应用.不同环境的挑战.特别是在自动化运维程度不高的企业,"

微博:春节日活跃用户超一亿,探秘如何实现服务器分钟级扩容

直播视频: (点击图片观看) 幻灯片下载地址:https://oss.aliyuncs.com/yqfiles/4c5964b7d5e15c418558160f067b9e02.pdf 3月30日在线实时分享顺利结束,本次由微博研发中心技术经理及高级技术专家陈飞分享了微博利用阿里云实现分钟级服务器规模成倍扩容的技术体系,包括Docker与虚机结合的使用经验.网络架构以及负载均衡.缓存架构的跨IDC服务部署的一些经验.本次视频直播的整理文章.视频.幻灯片整理完毕,如下内容. DCP设计"初心&qu

Docker、Kubernetes、Apache Mesos 之争 | 一个与传说不同的故事

本文讲的是Docker.Kubernetes.Apache Mesos 之争 | 一个与传说不同的故事[编者的话]有无数的文章.讨论和社交网络上的交流在比较 Docker.Kubernetes 和 Mesos. [3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站]本次培训围绕基于Docker的CI/CD实战展开,具体内容包括:持续集成与持续交付(CI/CD)概览:持续集成系统介绍:客户端与服务端的 CI/CD 实践:开发流程中引入 CI.CD:Gitlab 和 CI.CD 工具:G

学霸君基于Docker的微服务架构设计

以下内容根据演讲PPT以及现场分享整理而成. 今天主要分享的是我们在实践微服务架构或者容器架构过程中踩过的坑,对于致力在容器技术方面进行探索的同学会有很大帮助.本次将站在整体的角度,分享如何去运维整个线上系统,如何看待整个微服务的架构.微服务能带来什么帮助以及微服务又有哪些缺点,还有重要的一点就是微服务架构如何去落地实施.虽然阿里云这样的服务商为我们做了大量的工作,但是将微服务架构真正地落地实施还需要做很多的工作.而对于任何技术而言,都是存在优缺点的,微服务架构也不是救世的良药. 一.学霸君的发

从 Java 应用部署方式看 IT 思潮——从开发和运维到开发自运维

前些日子,我还在西溪园区上班的时候,如果不是忙得不可开交,我都会在午饭的时候尽可能选择一个离所在办公楼远一些的食堂吃饭.因为午餐和晚餐是一天的工作中难得的两个「放风」时间,如果碰到了有趣的话题还能在路上和同事交流一二. 有一次,同事问了我一个问题:「为什么 Spring Boot 应用倾向于打 fat jar 直接启动,而集团的应用倾向于打 war 包从应用容器启动?」当时我从 IT 主流思潮的角度给了一个解释,大意为 Spring Boot 是 DevOps 时代的产物,集团大多数应用是 De

Docker——它是真正的未来

本文讲的是Docker--它是真正的未来[编者的话]本文从产业技术发展的角度论述了容器目前存在的问题和为什么它是技术的未来.Docker目前虽然从技术上来讲还不成熟,但是它从真正意义上解决了过去若干年在软件行业存在的诸多问题.文章鼓励大家去尝试容器这个新的技术,在实践中获得经验和教训进而迭代式的前进来改善和提升我们的产业. 这真的是未来 上周我写了一篇文章讽刺容器生态系统的文章It's the Future轻微的嘲笑了一下Docker.谷歌.CoreOS和其它一些容器技术.众多的Docker拥趸

斌哥的 Docker 进阶指南

过去的一年中,关于 Docker 的话题从未断过,而如今,从尝试 Docker 到最终决定使用 Docker 的转化率依然在逐步升高,关于 Docker 的讨论更是有增无减.另一方面,大家的注意力也渐渐从 "Docker 是什么"转移到"实践 Docker"与"监控 Docker"上. 本文转自刘斌博文「如何选择 Docker 监控方案 」,文中刘斌从技术的角度深入解释了 Docker 监控的数据采集原理,介绍了现有开源的监控方案,以及能够对 D