首页 > 系统相关 >【容器安全系列Ⅰ】- 以进程视角探索容器

【容器安全系列Ⅰ】- 以进程视角探索容器

时间:2024-08-16 09:56:27浏览次数:15  
标签:容器 视角 探索 Linux 进程 Docker proc 我们

图片

       使用容器的一个很大好处是,大多数时候你不必考虑后台发生了什么,像 Docker 和 Kubernetes 这样的工具,在向用户隐藏系统复杂性方面做得很好。

       但是,当您需要调试和保护容器环境时,了解如何在底层与容器进行交互会非常有帮助。幸运的是,由于大多数容器化工具都是基于Linux 构建的,因此您可以使用现有的 Linux 工具与它们进行交互和调试。

       在做容器环境安全防护时,了解容器是如何进行隔离以及这些隔离有什么问题也很重要,这样才能降低潜在的风险。

       本系列将介绍容器的工作原理,并介绍一些用于保护容器化环境并对其进行故障排除的实用想法。在本系列中,我们将主要关注标准的 Docker 样式容器,但我们的示例也将适用于其他容器运行时,如 Podman、containerd 和 CRI-O。

       在这篇文章中,我们将通过Linux 工具与容器进行交互,演示容器作为进程的一些特性,并探讨这对容器安全意味着什么。

容器只是进程

       关于容器,首先要了解的是,从操作系统的角度来看,它们是进程,就像直接在主机上运行的任何其他应用程序一样。为了演示这一点,我们可以创建一个 Linux 虚拟机并在其上安装Docker。注意:如果你有兴趣遵循本系列中的实际示例,我们建议使用标准 Linux VM,而不是适用于 Windows/MacOS 的 Docker,因为这些工具增加了一些复杂性,使你更难看到发生了什么。

       让我们首先检查 VM 上是否存在任何活动的nginx进程。

ps -fC nginx

       这应该返回一个空列表,因为我们目前没有任何 NGINX Web 服务器在运行。现在,让我们使用Docker Hub中的nginx 映像启动 Docker 容器。

docker run -d nginx:1.23.1

       容器启动后,我们将再次运行命令:ps

ps -fC nginx

       这一次,我们得到了如下图所示的内容,它向我们展示了几个 NGINX 进程现在正在机器上运行。就我们的Linux机器而言,有人刚刚在主机上运行了NGINX。

图片

Nginx 进程列表

       当我们更深入地研究容器是进程的概念时,一个关键的问题是:如何区分从 Docker 镜像启动的 NGINX 服务器和刚刚安装在 VM 上的 NGINX 服务器?有几种方法可以做到这一点,但第一种也是最简单的方法是检查正在运行的容器:

docker ps

图片

docker进程列表

       或者,我们可以使用 Linux 进程工具来确定 Web 服务器是否作为容器运行。例如:ps的选项(例如:ps -ef --forest) ,让我们可以看到进程的层次结构。在本例中,我们的 NGINX 进程的父进程为containerd-shim-runc-v2 。您应该会看到主机上运行的每个容器的shim进程。此shim进程是 containerd 的一部分,Docker 使用它来管理其它的进程。shim进程的主要作用是允许重新启动 containerd 或 Docker 守护程序,而无需重新启动主机上运行的所有容器。

图片

使用 containerd 填充码的进程列表

与容器进程进行交互

       我们现在知道容器只是进程,但这对我们如何与它们交互意味着什么?能够将它们作为进程进行交互,对于故障排除和调查正在运行的容器中的变更(例如,在取证调查中)都很有用。值得一提的是,我们可以使用 /proc 文件系统来获取有关正在运行的容器的更多信息。

       Linux 中的/proc文件系统是虚拟或伪文件系统。它不包含真实文件,而是填充了有关正在运行的系统的信息。只要用户在运行 Docker 的主机上具有适当的权限,他们就可以访问主机上运行的任何容器的信息。

       让我们看一下我们之前启动的 NGINX 容器的一些信息。在我们使用的测试系统上,我们可以看到nginx进程ID为 2336。如果我们列出/proc中的文件,我们将看到主机上每个进程的编号目录,包括我们的NGINX进程。这些目录中的每一项都包含各种文件和目录,其中包含有关该进程的信息,这意味着我们可以打开2336目录以了解有关进程的更多信息。

图片

proc 文件系统

       使用已删除文件编辑器或进程监视器等工具的加固容器对安全也很有帮助。加固容器镜像是一种常见的安全建议,但它确实使调试更加麻烦。您可以通过对主机上的目录/proc访问容器的根文件系统来编辑容器内的文件。打开/proc/[PID]/root可以看到具有该PID的进程的目录列表。

       在这种情况下,运行将向我们显示如下所示的列表:

sudo ls /proc/2336/root

图片

proc 文件系统详细信息

       现在,让我们用touch添加一个文件到此目录,我们可以使用docker exec列出容器上的文件来确认它已添加。docker exec可用于执行诸如从主机编辑容器中的配置文件之类的操作。

图片

Proc 文件系统文件创建

       容器作为进程的另一个好处是:我们可以使用主机工具来终止这些进程,而无需使用容器工具。通常来说,这不是一个好的使用方式,因为它可能会与 Docker 的重启策略等设置冲突,但有时可能是必要的。

       例如,让我们使用命令sudo kill 2336。然后,我们可以运行docker ps以确认我们的容器不再存在。

图片

杀死 nginx 进程

这对安全意味着什么?

       我们已经看到,容器只是 Linux 进程,这对安全产生了一些有趣的影响。那么,我们可以很容易得出一个结论,即任何具备主机访问权限的人都可以通过进程列表来查看有关正在运行的容器的信息,即使他们不能直接访问 Docker 等工具。

       例如,使用 Linux 命令访问容器的环境变量,这些变量通常存储机密信息。有权访问主机的用户可以读取/proc进程区域内的文件内容以查看该信息,如下面的示例所示,可以看到其中容器是使用环境变量“TOP_SECRET=API_KEY”启动的。

图片

proc 环境变量泄漏

       除此之外,其实还可以使用现有的 Linux 安全工具与容器进行交互,我们将在本系列的后面部分看到这方面的示例,但到目前为止,我们已经证明可以通过/proc来检查容器的根文件系统和其它信息 。这对于调查一些已经发生的攻击行为非常有用,例如查看攻击者已添加到容器中的文件。

结论

       了解 Linux 容器如何工作的第一步是意识到它们只是进程。当然,这为许多其他问题打开了大门,比如“容器内的进程如何与底层主机隔离?”和“容器的文件系统位于何处?”我们将在本系列的后续部分中介绍这些要点以及更多内容。

标签:容器,视角,探索,Linux,进程,Docker,proc,我们
From: https://blog.csdn.net/weixin_45581780/article/details/141215585

相关文章

  • 在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
    在Kubernetes(K8S)中,同一个Pod内的不同容器在资源共享和隔离方面有着特定的规则。以下是对这些规则的详细解释:1.资源共享网络命名空间:Pod内的所有容器共享同一个网络命名空间。这意味着它们可以看到相同的网络设备和IP地址,并能够通过localhost相互通信,而无需进行网络地址转换......
  • Datawhale AI 夏令营-天池Better Synth多模态大模型数据合成挑战赛-task2探索与进阶(
    在大数据、大模型时代,随着大模型发展,互联网数据渐尽且需大量处理标注,为新模型训练高效合成优质数据成为新兴问题。“天池BetterSynth-多模态大模型数据合成挑战赛”应运而生,旨在探究合成数据对多模态大模型训练的影响及高效合成方法策略,推动多模态大模型数据合成创新。比赛关......
  • 探索Swift模块化测试的艺术:构建可维护的代码框架
    标题:探索Swift模块化测试的艺术:构建可维护的代码框架在Swift语言的生态中,代码模块化测试是一个至关重要的实践,它不仅有助于确保代码的可靠性,还能提高开发效率和代码质量。Swift的模块化测试框架提供了一套强大的工具和方法,使得开发者能够以模块化的方式进行测试。本文将深......
  • Delphi开发新纪元:探索持续集成与持续部署的自动化之路
    标题:“Delphi开发新纪元:探索持续集成与持续部署的自动化之路”引言在软件工程领域,持续集成(CI)和持续部署(CD)是敏捷开发的关键实践,它们确保了代码的高质量和快速迭代。对于Delphi开发者而言,选择合适的CI/CD工具对于提高开发效率和软件质量至关重要。一、DelphiCI/CD工具概......
  • ofcommon.dll故障深度探索:Office组件恢复的高级策略揭秘
    解决ofcommon.dll丢失的问题,采取以下专业步骤可以帮助您恢复Office组件的正常运作:1.系统文件检查:•以管理员身份运行命令提示符,输入sfc/scannow并回车。这将扫描并修复系统文件,包括可能缺失的ofcommon.dll。2.Office修复:•打开“控制面板”>“程序”>“程序和功......
  • 《师父》风灵月影修改器:探索游戏无限可能,十四项功能操作宝典
    《师父》是一款充满挑战与深度的角色扮演游戏,其丰富的剧情与战斗系统吸引了大量玩家。然而,对于一些玩家来说,游戏的难度可能稍显陡峭,这时候,风灵月影修改器便成为了调整游戏体验的强大工具。本文将详细介绍风灵月影修改器的十四项功能,以及如何操作这些功能,帮助玩家更自由地探索游......
  • 容器引擎说明——Contianerd与Docker的区别以及Containerd换源操作
    容器引擎是Kubernetes最重要的组件之一,负责管理镜像和容器的生命周期。Kubelet通过ContainerRuntimeInterface(CRI)与容器引擎交互,以管理镜像和容器。表1容器引擎对比Containerd和Docker组件常用命令对比表2镜像相关功能表3容器相关功能表4Pod相关功能说明:Cont......
  • [已解决] 使用向日葵远程控制在Ubuntu系统上控制Minecraft存在鼠标移动视角异常
    省流:使用Ctrl+Alt+Enter将当前鼠标指针切换到被控鼠标方指针。问题描述在使用向日葵远程控制连接到我的远程Ubuntu系统中游玩Minecraft时,发现鼠标视角的移动有问题。具体表现为,鼠标可以点击菜单、按钮等,也可以点击选择物品、左键摧毁物品、右键使用物品,然而移动鼠标......
  • 【3DGS】从新视角合成到3D_Gaussian_Splatting
    @目录引言:什么是新视角合成任务定义一般步骤NeRF的做法NeRF的三维重建NeRF的渲染3DGS的三维重建从一组图片估计点云高斯点云模型球谐函数参数优化损失函数和参数优化高斯点的数量控制(AdaptiveDensityControl)新的问题3DGS的渲染:快速可微光栅化3DGS的限制引言:什么是新视角合成......
  • 探索Gradle:现代化构建工具的深入解析
    目录引言Gradle简介Gradle的安装与配置Gradle的基础概念项目与任务构建脚本依赖管理Gradle构建生命周期初始化阶段配置阶段执行阶段常用Gradle命令Gradle与Maven的对比Gradle插件常见插件自定义插件Gradle的高级特性多项目构建构建缓存持续集成Gradle最佳实践总结......