容器安全最佳实践入门

2023-11-14

作者 | Cloudberry
译者 | 王者
策划 | 万佳
保证容器安全是一项复杂的任务。这个问题域很广,面对大量的检查清单和最佳实践,你很难确定采用哪个解决方案。所以,如果你要实现容器安全策略,应该从哪里开始呢?

我建议从最基本的开始:理解容器安全是什么,并构建模型来降低风险。

01遵循DevOps生命周期

安全计划最终都会受到环境的限制,遵循标准的 DevOps 生命周期可以更好地发现模式和发挥协同效应。
DevOps 的生命周期是一个无限迭代的过程:

  • 计划
  • 编码
  • 构建
  • 测试
  • 发布
  • 部署
  • 运维
  • 监控

在这里插入图片描述

容器通过 Dockerfile 文件的形式包含在应用程序中,但实际上并不是应用程序的一部分。因此,计划和编码阶段与容器无关。

其余的每一个步骤都与容器安全有关,我对它们进行这样的分组:

  • 构建时:构建、测试和发布
  • 容器基础设施:部署和运维
  • 运行时:监控

为什么要这样分组?安全策略只有在能够被实现的情况下才是有效的。每个分组中的每一个步骤都共享了一个公共设施,可以很容易往其中注入安全控制元素:

  • 构建时:CI/CD 基础设施、容器注册表;
  • 容器基础设施:容器编配器;
  • 运行时:生产环境。

现在我们有了三个风险评估着手点。

02构建时安全

在构建阶段,我们输入了一堆源文件和一个 Dockerfile,得到了一个 Docker 镜像。

大多数供应商在这个时候向你强调容器镜像扫描的重要性。容器安全扫描的确很重要,但还不够。

这个阶段的目标:最小化供应链攻击风险。

容器镜像“卫生”
首先,思考一下你的镜像应该是什么样的,并重点关注依赖项是如何引入的:

  • 允许开发人员使用哪些基本镜像?
  • 依赖项是固定的吗?是从哪里拉取的?
  • 是否需要一些标签来简化监管和合规性?
  • 检查一下 Dockerfile。
    在编写 Dockerfile 时遵循 Docker 安全最佳实践。

所有这些检查都是静态的,可以很容易在构建管道中实现。

容器镜像扫描
然后,我们可以进行容器镜像扫描。

不要在构建管道中扫描镜像,而是在容器注册表中进行持续的扫描。

为什么要这样?服务不一定会进行不间断的构建,但漏洞会不断出现。其次,构建是增量的:每个构建都将生成一个新镜像。因此,假设你的容器编配器信任你的注册中心,所以你发布的每个标记总是可以部署并需要进行评估。

这个时候你就要开始考虑补丁管理和保存期限:

  • 补丁管理:根据扫描结果提供补丁,生成新版本镜像;
  • 保存期限:未修补 / 旧 / 不安全的镜像将从注册表中删除。

03容器基础设施安全性

容器基础设施由负责从注册表拉取镜像并在生产环境中作为容器运行的所有活动部件组成。

这主要是容器编配器——Kubernetes。
这一阶段的目标:

  1. 避免存在安全隐患的平台配置错误
  2. 最大限度地减少来自受损容器的攻击

基础设施安全性:配置错误
容器编配器比较复杂,特别是 Kubernetes。到目前为止,它都没有兑现 DevOps 的承诺。我认为,我们离成为不需要太多运维开销的主流解决方案还有一两个抽象层的距离。

每一个复杂的平台都很容易出现配置错误,而这正是你需要关注的部分。

你必须对基础设施进行威胁建模,确保它不会被攻击。这个特殊的威胁模型应该关注每一个参与者,但受损的容器除外 (我们将在下面讨论这个问题)。

这里我就不详细讲了,因为这取决于你运行的是什么平台。对于 Kubernetes,建立威胁模型的一个着手点是这样的。
https://www.marcolancini.it/2020/blog-kubernetes-threat-modelling/
此外,如果你还没有这么做,可以考虑使用托管平台:如果你可以利用 (受信任的) 供应商提供的模型,复杂性就会降低。

基础设施安全性:横向移动
接下来,我们来讨论当一个容器被破坏时会发生什么。
你想要最小化攻击者横向移动的能力,专注于以下两个层:

  • 网络层
  • 身份和访问管理层(IAM)

网络不应该是平的。你可以先把所有东西分配到子网络,然后建立起完整的服务网络。

在 IAM 层,为每个容器使用单一的标识,以此来优化授权。这在多租户平台中尤其重要:如果没有细粒度的身份标识,就不可能获得最小权限。

最后,由于它们是不可变的,所以最好是减少容器可以运行的时间:攻击者横向移动并获得持久性机会窗口等于容器运行生命周期。所以,持续关闭和滚动重启你的容器。

04运行时安全性

最后一个是工作负载的安全性。到这个时候,大部分的强化工作都已完成,我们将进入反应性安全控制领域,也就是故障后(post-fail)。

这个阶段的目标:将受损容器的攻击影响降至最低。

探测和事故响应
控制攻击影响面最好的办法是尽量缩短从入侵开始到安全团队收到警报之间的时间。

探测正在发生的漏洞是供应商们争相寻找解决方案的另一个领域。现在有很多方法,其中大多数都需要使用边车或守护进程来主动监控 Pod 流量和系统调用。

大多数解决方案都会提供一些价值,但我的建议是从简单的开始,并进行迭代:使用现有的 SIEM,摄取来自平台、应用程序和审计系统的日志。

发生事故是不可避免的,不过这没关系,只要你有相应的事故响应流程。

每次事后分析的第一个要点应该是:“下次我们如何更快地发现这个问题”?搞清楚这些问题可以让你发现自己的盲点,然后利用这些盲点来了解自己错过了哪些信号,以及什么东西是值得相信的。

05结论

容器安全是一个广泛存在的问题,不仅仅是扫描镜像那么简单。这就是我建立的模型,用于分析容器风险和解决方案。它比较抽象,当然,和所有模型一样,它不一定是绝对正确的。我们都知道,每一个基础设施就像是一片雪花:以此为灵感去建立你自己的威胁模型。
原文链接:
https://cloudberry.engineering/article/practical-introduction-container-security/

文章看完,还不过瘾?
更多精彩内容欢迎关注百度开发者中心公众号

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

容器安全最佳实践入门 的相关文章

  • 阿里无影云电脑 试用评测

    总有些一些项目需要在家里和公司两头做 不管是用 svn git 云盘同步 还是U盘拷贝都是很麻烦的 背笔记本更累 以前一直想买个挂机宝 但那玩意的配置实在是低 又想说买个云电脑 玩游戏的那种 但价格贵的离谱 一直用vps将就 那性能大家都知
  • Java Collections.list()方法具有什么功能呢?

    转自 Java Collections list 方法具有什么功能呢 下文笔者讲述Collections list 方法的功能简介说明 如下所示 Collections list 方法的功能 将参数中的值转换为一个list对象 Collec

随机推荐

  • 主成分分析(PCA)方法原理介绍

    原文链接 http blog codinglabs org articles pca tutorial html
  • ElasticSearch 设置(一)发现和集群形成

    文章目录 发现和集群形成 发现 种子节点提供者 基于配置的种子主机提供者 基于文件的种子主机提供者 基于法定人数的选举 主节点的选举 投票配置 偶数个符合主节点的节点 设置初始投票配置 引导一个集群 选择集群名称 发布集群状态 集群故障检测
  • 分库分表ShardingSphere<三> _ 分布式事务

    目录 一 分布式事务 1 LOCAL事务 2 XA事务 3 BASE事务 柔性事务 二 示例 1 依赖jar包 2 配置XA事务 3 使用XA事务 三 参考资料 一 分布式事务 ShardingSphere提供三种事务类型 LOCAL 默认
  • MySQL之DML操作

    MySQL之DML操作 1 什么是DML操作 2 插入记录 insert 3 更新记录 update 4 删除记录 delete 1 什么是DML操作 DML是指数据操作语言 英文全称是Data Manipulation Language
  • 最难以理解的排序算法 - 堆排序(超详解)

    堆排序基本介绍 堆排序是利用堆这种数据结构而设计的一种排序算法 堆排序是一种选择排序 它的最坏 最好 平均时间复杂度均为O nlogn 它也是不稳定排序 要理解堆排序 必须先要理解堆这种数据结构 堆是具有以下性质的完全二叉树 每个结点的值都
  • Java 数据结构之双向链表

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net lovoo article details 51771321 一 概述 1 什么时双向链表 链表中的每个节点即指向前面一个节点 也指向后面一个节点
  • 解决Mysql (1064) 错误: 1064 - You have an error in your SQL syntax;

    我在给数据库中的表添加数据的时候 写的语句是 INSERT INTO order VALUES 2 编号B 表结构 出现了错误 INSERT INTO order VALUES 2 编号B 1064 You have an error in
  • Spring AOP (二)

    下面介绍 AspectJ语法基础 一 切点表达式函数 AspectJ的切点表达式由关键字和操作参数组成 如execution greetTo 的切点表达式 execution为关键字 而 greetTo 为操作参数 两者联合起来表示目标类g
  • cv2.VideoCapture()

    一 语法 cap cv2 VideoCapture 0 说明 参数0表示默认为笔记本的内置第一个摄像头 如果需要读取已有的视频则参数改为视频所在路径路径 例如 cap cv2 VideoCapture video mp4 二 语法 cap
  • el-tab 切换时添加动画

    需求 在点击切换页面的时候添加动画 解决 用的是 Animate css 1 安装依赖 npm install animate css save 2 在main js里面引入 import animate css 3 在页面中使用 第一步
  • 断开的管道 java.io.IOException: Broken pipe

    此类报错首次接触 在阅览一些文章后 总结如下 pipe是管道的意思 管道里面是数据流 通常是从文件或网络套接字读取的数据 当该管道从另一端突然关闭时 会发生数据突然中断 即是broken 对于文件File来说 这可能是文件安装在已断开连接的
  • VM ware14在win10系统出现虚拟机繁忙/无法正常启动、关闭虚拟机

    VM版本 VM warestation14 windows版本 Windows10 Linux版本 CentOS 7 出现的一些问题 1 无法正常关闭虚拟机 关机界面最后的单词显示为 halting 并一直呈该状态 2 强制关闭虚拟机电源后
  • 【C语言进阶】重新认识字符型变量

    引例 首先我们看一个简单的例子 include
  • 再谈递归——直接法 vs 递归法

    直接法就是有一个直接的思路 算法来解决问题 什么样的数据结构 第一步干什么 然后干什么 最后干什么 递归法的感觉是 好像也没想出什么具体的算法 莫名其妙的就把题解了 解完也没什么深刻的印象怎么解的 因为递归就是base case 递推 而b
  • SQLSever创建表和约束

    表的基本概念 概念 由数据按一定的顺序和格式构成的数据集合 是数据库的主要对象 每一行代表一个记录 每一列代表一个属性 设计表 创建前考虑如下特征 表中要包含数据类型 表中列数 每一列中的数据类型 那些列允许空值 是否使用以及何时约束 那些
  • eclipse实现前后端交互的初步操作

    首先new创建 选择Other 在最下面 然后 然后next起名 再两次next后进行选择 创建完成如下 所有的前端代码写在WebContent里面 所有的Java代码写在Java Resource里的src里面 创建html文件 在win
  • CSS之背景样式及边框样式

    1 背景样式 常用属性 background color 背景颜色 background image 背景图片 background repeat 背景图片的平铺方式 background position 背景图片的位置 backgrou
  • 加密、解密、加签、验签专题

    首先明确几个名词 加密 发送方利用接收方的公钥对要发送的明文进行加密 解密 接受方利用自己的私钥进行解密 公钥和私钥配对的 用公钥加密的文件 只有对应的私钥才能解密 当然也可以反过来 用私钥加密 用对应的公钥进行解密 签名 发送方用一个哈希
  • 智能家居系统中网关与服务器如何连接?

    原文点击打开链接 在新型智能家居系统中 家庭网关将取代PC机作为家庭控制中心 传统客户端 服务器模式不能保持家庭网关与远程服务器实时连接 基于百万级的家庭网关与服务器保持长连接的目的 采用主从服务器框架进行负载均衡 心跳机制保障网关与服务器
  • 容器安全最佳实践入门

    作者 Cloudberry 译者 王者 策划 万佳 保证容器安全是一项复杂的任务 这个问题域很广 面对大量的检查清单和最佳实践 你很难确定采用哪个解决方案 所以 如果你要实现容器安全策略 应该从哪里开始呢 我建议从最基本的开始 理解容器安全