IaC 存储最佳实践
往往一些成功的软件公司在构建解决方案的时候十分注重其可重复性、可审计性、和简便性,而基础设施即代码(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 存储最佳实践的更多相关文章
- Redis 混合存储最佳实践指南
Redis 混合存储实例是阿里云自主研发的兼容Redis协议和特性的云数据库产品,混合存储实例突破 Redis 数据必须全部存储到内存的限制,使用磁盘存储全量数据,并将热数据缓存到内存,实现访问性能与 ...
- js-新兴的API,最佳实践,离线应用于客户端存储
离线应用于客户端存储: 1.离线检测:online以及offline事件,都是在window对象上触发 navigator.online为true的时候是表示设备能够上网 2.使用一个描述文件(man ...
- 虚拟机最佳实践:单个 VM、临时存储和已上传磁盘
大家好! 我是 Drew McDaniel,来自 Microsoft Azure虚拟机功能研发团队,我从团队成立之初就已加入. 在本博客文章中,我将分享一些最佳实践指南,帮助您充分利用您的Azure虚 ...
- QingStor 对象存储架构设计及最佳实践
对象存储概念及特性 在介绍 QingStor️对象存储内部的的架构和设计原理之前,我们首先来了解一下对象存储的概念,也就是从外部视角看,对象存储有什么特性,我们应该如何使用. 对象存储本质上是一款存储 ...
- 容器服务 TKE 存储插件与云硬盘 CBS 最佳实践应用
引言 随着自研上云的深入,越来越多的有状态服务对于在 TKE 集群中使用云上存储能力的需求也越来越强烈. 目前腾讯云容器服务 TKE(Tencent Kubernetes Engine已支持在 TKE ...
- Spring Batch在大型企业中的最佳实践
在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...
- MySQL · 答疑解惑 · MySQL 锁问题最佳实践
http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会 ...
- 【GoLang】golang 最佳实践汇总
最佳实践 1 包管理 1.1 使用包管理对Golang项目进行管理,如:godep/vendor等工具 1.2 main/init函数使用,init函数参考python 1.2.1 main-> ...
- memcache的最佳实践方案
1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 1 ...
- MySQL 性能优化 30个数据库设计的最佳实践
数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程. ...
随机推荐
- Unity3D 选择焦点切换
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- LangChain实战
1.概述 最近,在研究LangChain时,发现一些比较有意思的点,今天笔者将给大家分享关于LangChain的一些内容. 2.内容 2.1 什么是LangChain? LangChain是一项旨在赋 ...
- P2951 [USACO09OPEN] Hide and Seek S 题解
Problem 题目概述 给你一个无向图,边权都为 \(1\) ,求:离 \(1\) 号点最远的点的编号.最远的距离.有几个点是离 \(1\) 号点最远的. 思路 直接用:优先队列 \(BFS\),先 ...
- Isito 入门(九):安全认证
本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 7,认证 Peer Authentication PeerAuthentication 的定义 实验 Reque ...
- java 处理常量字符串过长 & springboot 项目读取 resouces 文件夹下的文件内容
长字符串起因 项目里面有一长串的加密字符串(最长的万多个字符),需要拼接作为参数发送给第三方. 如果我们使用 枚举 定义的话,idea 编译的时候就会出现编译报错 Error: java:常量字符串过 ...
- Idea单窗口导入多个项目模块
现在我们比较流行微服务,但是服务一旦多了,项目打开也是很麻烦的,运行内存16个G的电脑,基本上打开4,5个项目模块就顶不住了.那么,我们怎么把多个项目导入到一个idea窗口中呢? 实现效果 导入步骤 ...
- .Net Core3中微信退款证书本地调试正常读取证书,在服务器IIS中加载不到证书文件
如图,在开发微信退款功能时,需要用到微信提供的证书文件.本地开发调试时是正常的,但放到服务器(WinServer 2012 R2)中,则报错提示找不到文件. 网上找了一堆骚操作都没什么卵用,最后在其中 ...
- Net 高级调试之八:代码审查及杂项命令
一.简介 今天是<Net 高级调试>的第八篇文章.这篇文章设计的内容挺多的,比如:如何查看方法的汇编代码,如何获取方法的描述符,对象同步块的转储,对象方法表的转储,托管堆和垃圾回收器信息的 ...
- Codeforces Round #696 (Div. 2) (A~C题解)
写在前边 链接:Codeforces Round #696 (Div. 2) A. Puzzle From the Future 链接:A题链接 题目大意: 给定一个\(a\),\(b\),\(d = ...
- 如何检测Windows服务停止后自动启动?自动运行.bat批处理文件?
作者:西瓜程序猿 主页传送门:https://www.cnblogs.com/kimiliucn 前言 想要确保你的Windows服务即使在崩溃后也能自动重启吗?这篇文章教你如何用一个小巧的批处理脚本 ...