往往一些成功的软件公司在构建解决方案的时候十分注重其可重复性、可审计性、和简便性,而基础设施即代码(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. IPv4:根据CIDR显示地址范围

    最近遇到一个很有意思的点,于是就记录下来. CIDR一般是由IP地址和子网掩码组成,即 IP地址/子网掩码 格式. 子网掩码表示前面地址中的前多少位,为网络位,后面部分代表主机部分.例如:192.16 ...

  2. postgresql 最近优化的SQL集合案例、(不写过程了只记录案例,PG优化器问题还是不少)

    案例1: -- 原SQL + 执行计划: explain analyze SELECT G.PID, G.FLOW_ID, G.STATUS, G.ID, AAAAAA.INFO_ID, G.CREA ...

  3. Linux MIPI 摄像头驱动框架编写(RN6752解码芯片)

    一.概述 在编写 MIPI 摄像头驱动之前,需要先了解 Media 子系统的链路关系,这里我就不介绍了,需要的看我之前的笔记:Linux Media 子系统链路分析. 理解 Media 子系统链路关系 ...

  4. 浏览器事件循环Event Loop

    引言: 事件循环不是浏览器独有的,从字面上看,"循环"可以简单地认为就是重复,比如for循环,就是重复地执行for循环体中的语句,所以事件循环,可以理解为重复地处理事件,那么下一个 ...

  5. 动态规划——提高Ⅴ(DP优化)

    单调队列优化DP 其实单调队列就是一种队列内的元素有单调性(单调递增或者单调递减)的队列,答案(也就是最优解)就存在队首,而队尾则是最后进队的元素.因为其单调性所以经常会被用来维护区间最值或者降低DP ...

  6. go基础-方法

    概述 方法是面向对象编程 (OOP) 的一个特性,在 C++/Java 语言中方法是类函数,go做为函数式编程语言,通过特有技能支持相似的功能,所以说go也支持面向对象编程特性. go 方法本质也是函 ...

  7. Java 删除PDF页面 (免费工具分享)

    对PDF页面的增删通常需要借助专门的工具,而这些工具一般需要付费才能使用.那么我们可以通过Java代码免费实现这一功能吗?答案是肯定的.这篇文章就教大家如何使用一个免费的国产Java库来删除PDF中的 ...

  8. (数据科学学习手札155)基于martin为在线地图构建字体切片服务

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,在之前的一篇文章(基于mart ...

  9. 实例讲解C++连接各种数据库,包含SQL Server、MySQL、Oracle、ACCESS、SQLite 和 PostgreSQL、MongoDB 数据库

    C++ 是一种通用的编程语言,可以使用不同的库和驱动程序来连接各种数据库.以下是一些示例代码,演示如何使用 C++ 连接 SQL Server.MySQL.Oracle.ACCESS.SQLite 和 ...

  10. 在路上---学习篇(一)Python 数据结构和算法 (1)

    数据结构和算法 现阶段的肤浅理解数据结构是各式各样的类型数据在内存中是如何构造的,原理是怎么样的. 了解了其本质后,在面对问题时候,根据数据结构利用算法计算可以最快,最有效的完成任务.通常情况下,精心 ...