往往一些成功的软件公司在构建解决方案的时候十分注重其可重复性、可审计性、和简便性,而基础设施即代码(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 模块:创建、导入和使用

    什么是模块? 将模块视为代码库.模块是一个包含一组函数的文件,您想要在应用程序中包含这些函数. 创建一个模块 要创建一个模块,只需将要包含在其中的代码保存在扩展名为 .py 的文件中: 示例:将以下代 ...

  2. 创建一个自己的 Linux系统

    简单来说就是一个文件传递的机制,首先创建/安装一个硬盘,然后把前硬盘中的一部分文件先转移到Linux系统上,再通过Linux系统转移到创建的新硬盘,之后用虚拟机,把新硬盘装在其中,就可以在新硬盘上做到 ...

  3. 最新 2023.2 版本 WebStorm 永久破解教程,WebStorm 破解补丁永久激活(亲测有效)

    最近 jetbrains 官方发布了 2023.2 版本的 IDEA,之前的激活方法并不支持这个新的版本. 下面是最新的激活教程,激活步骤和之前是类似的,只是换用了不同的补丁文件. 本教程支持 Jet ...

  4. AtCoder Beginner Contest 326 (ABC326)

    A. 2UP3DOWN 直接模拟即可. Code B. 326-like Numbers 枚举,每次拆除百.十.个位,再判断. Code C. Peak Description 数字线上放置了 \(N ...

  5. CF510B Fox And Two Dots

    题目大意 矩阵中各个方格都有颜色,判断是否有相同颜色的方块可以组成环.(原题链接:CF510B Fox And Two Dots) 输入: 第一行:\(n\), \(m\),表示矩阵的行和列 接下来\ ...

  6. Centos8离线安装golang

    一.下载golang 1.下载安装包 2.下载后解压. tar -zxvf go1.17.linux-amd64.tar.gz 二.配置环境变量 vim /etc/profile 1.在环境变量最后添 ...

  7. [Python急救站]文件管理工具

    对于一个程序员,有时候文件太多,忘记放哪里了,那有没有一个可以帮你定位到文件的文件管理工具呢,抱着这样的想法,我做了以下这个代码,可以快速定位找到文件所在位置. import os import tk ...

  8. ElasticSearch Groovy 沙盒绕过 && 代码执行漏洞

    漏洞编号:CVE-2015-1427 漏洞详情 CVE编号 CVE-2015-1427 漏洞级别 高危7.5 标题 Elasticsearch Groovy 脚本引擎存在远程代码执行漏洞 披露时间 2 ...

  9. Socket.D 基于消息的响应式应用层网络协议

    首先根据 Socket.D 官网的副标题,Socket.D 的自我定义是: 基于事件和语义消息流的网络应用协议. 官网定义的特点是: 基于事件,每个消息都可事件路由 所谓语义,通过元信息进行语义描述 ...

  10. bash shell笔记整理——basename和dirname命令

    bashname命令作用 去掉给定name的目录部分,如果指定了 SUFFIX, 就 同时去掉SUFFIX(后缀).具体看示例吧. bashname语法 Usage: basename NAME [S ...