往往一些成功的软件公司在构建解决方案的时候十分注重其可重复性、可审计性、和简便性,而基础设施即代码(IaC)的出现让开发人员能够将这些时间应用于基础设施的分配。目前的存储 IaC 的实践有以下三种:

  • IaC 与应用程序和功能代码一起存储

  • IaC 单独存储在特定于应用程序的存储库中

  • 企业中所有应用程序的所有 IaC 代码存储于同一个存储库中

本文将带你一起讨论这几种 IaC 存储解决方案之间的利弊,并探索符合企业需求的 IaC 存储最佳实践。

IaC 与功能代码一起存储

存储 IaC 最简单直接的方法是将所有 IaC 代码保留在应用程序存储库中,该应用程序存储库将此 IaC 代码用作其 CI/CD 流水线的一部分。这样的存储方式易于设置,不需要复杂的权限分配,并且对使用此代码库的开发人员完全可见,这样就能够轻松检索上下文。这也就是为什么有一部分开发人员选择总是将功能代码和 IaC 存储在同一个 repo 中的原因。但是将 IaC 代码于功能代码存储在一起存在许多问题。

软件开发最佳实践包括最小化冗余。IaC 不仅包含特定于应用程序的分配信息,还包含所有的底层基础设施(底层基础设施就是企业可以跨多个应用程序和生态系统共享的公共基础设施)。此类基础设施的例子包括 Kubernetes 集群和日志存储帐户。

此外,将 IaC 代码与特征代码一起存储会带来安全风险。允许开发人员以管理员级别访问将代码投入生产所需的所有部署脚本违反了最小权限原则,并使设法劫持开发人员帐户的攻击者更容易横向移动。

由于企业的部署过程有一定程度的保密性,部署流水线及其配置也基于企业开发需求定制的,因此也让开发过程具备一定安全性。然而将 IaC 与应用程序的功能代码存储在一起,让拥有企业使用的服务映射的攻击者能够更轻松且成功地发起软件供应链攻击。此外,将 IaC 与功能代码一起存储可能会使代码遭到泄漏,同时泄露所有 CI/CD 配置,不仅会对相关应用程序产生巨大影响,同时也给整个企业造成损失。

这样看来,将 IaC 与产品代码一起存储虽然更容易进行最初设置,但违反了最小特权原则和零信任原则。这种存储代码的方法引入了不必要的安全风险。

所有 IaC 代码存储在一起并不可行

由于将带有功能代码的 IaC 存储在公共存储库中并不是最佳解决方案,那么将所有 IaC 存储在专用 IaC 存储库中怎么样?这样既能够允许 DevOps 和安全团队实施精准的访问控制,也能让代码冗余易于识别和预防。

但这样的存储方法同样会给企业带来一些麻烦。当所有 IaC 都存储在单独的共享存储库中时,很难将功能更改与 IaC 更改相匹配。这种情况会给开发过程许多问题,比如降低开发人员的开发效率,同时增加开发团队、DevOps 团队和安全团队之间的摩擦。

此外,当所有 IaC 被存储在一个公共存储库中,会造成开发人员没有办法控制影响其工作流程的安全决策但问题。在缺乏所有权和修改任何代码特定的部署脚本所需的额外步骤之间,将所有 IaC 存储在一起时,开发人员同样无法快速更改 IaC,有可能还会给企业造成其他不必要的麻烦。

IaC 的类别

IaC 和其他 CI/CD 脚本最终分为两类:基础 IaC 和功能 IaC。

基本部署脚本可以被理解为企业广泛使用的代码,其中包括例行部署操作或与共享资源交互。分离此代码使企业能够将基础 IaC 所有权和维护职责分配给企业的 DevOps 团队,这样操作非常适合维护共享基础设施。

而功能 IaC 脚本是用于配置和管理与特定软件相关的资源的代码段。开发人员经常和与其可交付成果相关的部署脚本进行交互,比如更改发布步骤、修改网关、更新服务器配置和许多其他需求,针对功能 IaC 和基础 IaC 需要使用不同的处理协议。

现在在我们了解了特性和基础 IaC 之间的区别之后,就可以为每个特性定义合适且恰当的管理策略了。

IaC 存储混合解决方案

最佳实践要求对功能 IaC 和基础 IaC 进行不同的分类,并将职责分配给不同的团队,以最大限度地提高安全性,同时不给开发和发布过程增加不必要的摩擦。基础 IaC 应由 DevOps 团队管理,而特定功能的 IaC 则由托管软件的代码所有者即开发人员处理。

为了选择更符合企业需求的 IaC 存储解决方案,需要从盘点企业现有的系统和服务。了解这些资源的共享方式能够帮助企业在做有关 IaC 代码存储的业务决策时提供必要信息,帮助企业最大程度上减少部署协议中的冗余。在定义哪些 IaC 是企业部署的软件基础,哪些 IaC 不是特定于某些应用程序、库和其他软件交付物的时候,可见性(Observability)是不可或缺的。

帮助 DevSecOps 团队管理 IaC

为了帮助企业 DevSecOps 团队更好地管理 IaC,请执行以下最佳实践:

  • 跟踪资源,包括镜像仓库、代码存储库、构建和云/IaC 部署

  • 实施精准的访问控制,根据资源是要共享的或是特定于应用程序的,可以适当地分配所有权

  • 提供对资源使用的可见性,使企业能够严格实施最小特权原则,避免在开发过程中增加不必要的摩擦

  • 通过直接与企业软件供应链的组件集成来提供全面的资产清单

实施上述实践,企业可以获得其他安全工具无法提供的具有更高复杂性的洞察能力,同时,也能够帮助企业持续监控安全更新,从而减少从发现 zero-day 漏洞到修补漏洞之间的时间。

IaC 存储最佳实践的更多相关文章

  1. Redis 混合存储最佳实践指南

    Redis 混合存储实例是阿里云自主研发的兼容Redis协议和特性的云数据库产品,混合存储实例突破 Redis 数据必须全部存储到内存的限制,使用磁盘存储全量数据,并将热数据缓存到内存,实现访问性能与 ...

  2. js-新兴的API,最佳实践,离线应用于客户端存储

    离线应用于客户端存储: 1.离线检测:online以及offline事件,都是在window对象上触发 navigator.online为true的时候是表示设备能够上网 2.使用一个描述文件(man ...

  3. 虚拟机最佳实践:单个 VM、临时存储和已上传磁盘

    大家好! 我是 Drew McDaniel,来自 Microsoft Azure虚拟机功能研发团队,我从团队成立之初就已加入. 在本博客文章中,我将分享一些最佳实践指南,帮助您充分利用您的Azure虚 ...

  4. QingStor 对象存储架构设计及最佳实践

    对象存储概念及特性 在介绍 QingStor️对象存储内部的的架构和设计原理之前,我们首先来了解一下对象存储的概念,也就是从外部视角看,对象存储有什么特性,我们应该如何使用. 对象存储本质上是一款存储 ...

  5. 容器服务 TKE 存储插件与云硬盘 CBS 最佳实践应用

    引言 随着自研上云的深入,越来越多的有状态服务对于在 TKE 集群中使用云上存储能力的需求也越来越强烈. 目前腾讯云容器服务 TKE(Tencent Kubernetes Engine已支持在 TKE ...

  6. Spring Batch在大型企业中的最佳实践

    在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...

  7. MySQL · 答疑解惑 · MySQL 锁问题最佳实践

    http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会 ...

  8. 【GoLang】golang 最佳实践汇总

    最佳实践 1 包管理 1.1 使用包管理对Golang项目进行管理,如:godep/vendor等工具 1.2 main/init函数使用,init函数参考python 1.2.1 main-> ...

  9. memcache的最佳实践方案

    1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 1 ...

  10. MySQL 性能优化 30个数据库设计的最佳实践

    数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程. ...

随机推荐

  1. 用go封装一下临时token

    用go封装一下临时token 本篇为用go设计开发一个自己的轻量级登录库/框架吧的临时token篇,会讲讲临时token的实现,给库/框架增加新的功能. Github:https://github.c ...

  2. k8s-1.23.6 安装部署文档(超详细)

    一.文档简介 作者:lanjiaxuan 邮箱:lanheader@163.com 博客地址:https://www.cnblogs.com/lanheader/ 更新时间:2022-09-09 二. ...

  3. go语言写http踩得坑

    1.在运行http时,报错:panic: listen tcp: address xxxx: missing port in address, 初始 代码如下 func HelloWordHander ...

  4. 使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录

    前言 RabbitMQ 是一个功能强大的开源消息队列系统,它实现了高效的消息通信和异步处理. 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验. 特点 成熟,稳定 消息持久 ...

  5. Production Environment Difference Between Development, Stage, And Production

    There are three different environments that you'll probably deal with at some point. Each environmen ...

  6. kubernetes驱逐机制总结

    概述 k8s的驱逐机制是指在某些场景下,如node节点notReady.node节点压力较大等,将pod从某个node节点驱逐掉,让pod的上层控制器重新创建出新的pod来重新调度到其他node节点. ...

  7. 【Vue3响应式原理#02】Proxy and Reflect

    专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核推荐 欢迎各位ITer关注点赞收藏 背景 以下是柏成根据Vue3官方课程整理的响应式书面文档 - 第二节, ...

  8. C++ 入门防爆零教程(上册)

    ## C++ 入门防爆零教程(上册) ######  C++ Introductory Explosion Proof Zero Tutorial(Volume $1$) 编写者:美公鸡(洛谷账号:b ...

  9. Altium designer 设置覆铜与板框间距

    新版Altium designer不再推荐使用 Keep-Out 层作为板框 以前使用 Keep-Out 作为板框的一个很大原因是因为 Keep-Out 自带板框间距属性.省去甚至不用考虑铺铜的边缘问 ...

  10. 如何通过 wireshark 捕获 C# 上传的图片

    一:背景 1. 讲故事 这些天计划好好研究下tcp/ip,以及socket套接字,毕竟工控中设计到各种交互协议,如果只是模模糊糊的了解,对分析此类dump还是非常不利的,而研究协议最好的入手点就是用抓 ...