往往一些成功的软件公司在构建解决方案的时候十分注重其可重复性、可审计性、和简便性,而基础设施即代码(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. 【爬虫实战】用Python采集任意小红书笔记下的评论,爬了10000多条,含二级评论!

    目录 一.爬取目标 二.爬虫代码讲解 2.1 分析过程 2.2 爬虫代码 三.演示视频 一.爬取目标 您好!我是@马哥python说 ,一名10年程序猿. 我们继续分享Python爬虫的案例,今天爬取 ...

  2. OpenGL 坐标系统详解

    GL中的坐标系是标准设备坐标,即他的每个坐标轴的取值范围都是[-1.0,1.0].通常,我们输入到顶点着色器中的顶点坐标都会被转换为标准化设备坐标,然后进行光栅化,转变成屏幕坐标.然而事实上,从顶点坐 ...

  3. .net 温故知新【13】:Asp.Net Core WebAPI 使用依赖注入DI

    一.使用DI注入 在之前的文章中已经讲过DI的概念(.net 温故知新:[7]IOC控制反转,DI依赖注入),基于控制台程序演示了DI依赖注入的使用,基于Microsoft.Extensions.De ...

  4. ubuntu20 安装 mysql5.7.31 , 卸载mysql 8.0, Mysql只能本地登录,无法远程登录

    ubuntu 18 可以直接命令安装:# 安装mysql服务sudo apt-get install mysql-server# 安装客户端sudo apt install mysql-client# ...

  5. 最全的VLOOKUP应用教程

    VLOOKUP是Excel中最常用的函数之一,它可以让我们在一个表格中查找指定值,并返回与该值匹配的另一个单元格中的内容. 在这篇文章中,我们将深入探讨VLOOKUP的使用方法,从而为您提供一份史上最 ...

  6. jmeter-json断言

    1.JSON 断言所在位置:断言->JSON 断言 2.JSON断言中的字段解析 Assert JSON Path exists:json 表达式,判断所字段是否存在,存在则为True, 否则为 ...

  7. C++ 邮件槽ShellCode跨进程传输

    在计算机安全领域,进程间通信(IPC)一直是一个备受关注的话题.在本文中,我们将探讨如何使用Windows邮件槽(Mailslot)实现ShellCode的跨进程传输.邮件槽提供了一种简单而有效的单向 ...

  8. 2023年奔走的总结---吉特日化MES 智能搬运AGV 篇三

    <2023年奔走的总结---吉特日化MES 项目趣事 篇一> <2023年奔走的总结---吉特日化MES 制药项目 篇二> <2023年奔走的总结---吉特日化MES 智 ...

  9. zookeeper JavaApi 修改节点

    *修改数据 * 1.修改数据 * 2.根据版本修改 * * * */ @Test public void testSet() throws Exception{ Stat stat = new Sta ...

  10. create-vue和vue-cli创建项目的差异

    这里对比的是vue-cli和create-vue创建vue3项目的文件中的内容差异. 原来public中的index.html被移动到根目录:(原因见这里:) https://cn.vitejs.de ...