云安全(七):Docker

admin 2025年3月17日09:50:38评论4 views字数 4922阅读16分24秒阅读模式

0x00 Introduction

本篇章中将阐述 Docker 相关的概念以及如何判断是否处于 Docker 环境中。个人才疏学浅,有未阐述清楚或遗漏的地方,还请谅解,相关的内容可自行搜索。

Docker 官网:https://www.docker.com/

Docker 仓库:https://hub.docker.com/

Docker 是容器的一种实现,是一个基于 Go 语言的开源应用容器引擎,其可以很方便的将应用程序及其依赖打包进一个轻量级、可移植的容器中,简化应用的开发、部署和运行流程。同时,Docker 也是一种容器化的解决方案和平台,提供了对容器全生命周期的管理,包括容器的:开发、构建、分发、运行、监控等。

Docker Hub 是公共镜像仓库,所有人都可以任何时间、任何地点上传或下载镜像。如此这般,镜像是否安全可靠就成了新的问题。而 Harbor 就是构建私有容器仓库的首选工具之一,且 Harbor 还支持漏洞扫描、DevOps 等功能,是专为云原生应用场景设计的工具。Harbor 官网:https://goharbor.io/

Docker 是 C/S 架构,Docker Client 和 Docker Daemon(服务端的守护进程,负责管理 Docker 的各种资源)之间通过 Socket 或 Restful API 进行通信。这里的 Docker Daemon 是一个后台进程,是用于接收和处理 Docker Client 的请求,并返回结果。Docker Client 是与 Docker Daemon 守护进程交互的命令行界面(可简单理解为 Shell 终端),在终端中输入的 Docker 命令都会交给 Docker Daemon 来处理。

云安全(七):Docker

Docker 的几个核心概念:镜像容器仓库Dockerfile、Docker Compose

1. 镜像

镜像是只读的静态模板,定义了容器运行所需的所有内容:代码、运行时环境、系统工具和配置文件等,可用来创建容器。镜像和容器的关系,就好像类与对象的关系。

2. 容器

容器是 Docker 的运行实例,类似于一个轻量级虚拟机(但共享宿主机内核,无需完整操作系统)。每个容器独立运行且与其他容器隔离,拥有自己的文件系统、网络和进程空间。例如,一个容器可运行 Nginx 服务,另一个运行 MySQL 数据库,互不干扰。

3. 仓库

仓库是集中存储和管理镜像的平台。Docker Hub 是官方公共仓库,提供大量官方和社区镜像,用户也可搭建私有仓库(如 Harbor)。默认情况下,命令 docker pull 拉取的镜像都是从 Docker Hub 上获取的,而由于官方公共仓库的网站在国外,所以获取速度不会很快,可修改默认的镜像源来实现加速。

4. Dockerfile

Dockerfile 是用来构建镜像的文本文件(基于声明式语法的),文本内容包含了一条条构建镜像所需的指令和说明。通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义、符合 OCI 标准、轻量化、可移植的镜像。

5. Docker Compose

Docker Compose 是 Docker 官方开源的项目,是一个用于定义和运行多个 Docker 容器的应用程序的工具。通过一个名为 docker-compose.yaml 的配置文件将多个容器组合在一起,形成一个项目。如此,只需要一条简单的命令就能开启或关闭多个容器。当运行 docker compose up -d 命令时,会自动寻找当前目录下的 docker-compose.yaml 文件。

在 Docker 中的 docker-compose 和 docker compose 命令区别如下:

特性 docker-compose(V1) docker compose(V2)
发布时间
早期独立工具(2014年)
集成到 Docker Cli 的插件中(2020年)
实现语言
Python
Go
依赖关系
需单独安装
作为 Docker Cli 插件安装

0x01 Usage

Docker 中文教程:https://www.runoob.com/docker/docker-tutorial.html

1. 安装

Docker 从 v17.03 之后分为 CE(Community Edition: 社区版)和 EE(Enterprise Edition: 企业版)。截至到 25 年 3 月份,最新版本为 v28.0.1。注:以下所有操作以 Ubuntu 为主。

云安全(七):Docker

Linux 发行版可能提供非官方的 Docker 软件包,这可能与 Docker 提供的官方软件包冲突。在安装 Docker Engine 正式版之前,必须先卸载这些软件包(如是第一次安装,可跳过)。

for pkg in docker docker-engin docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkgdone# 删除相关配置文件sudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerdsudo rm /etc/apt/sources.list.d/docker.listsudo rm /etc/apt/keyrings/docker.asc

1.1 手动安装

sudo apt updatesudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-commonsudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.ascsudo chmod a+r /etc/apt/keyrings/docker.ascecho"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt updatesudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginsudo docker run hello-world

1.2 自动安装

curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh --dry-run

1.3 完全卸载

sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extrassudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerdsudo rm /etc/apt/sources.list.d/docker.listsudo rm /etc/apt/keyrings/docker.asc

2. 镜像加速

2.1 方法一

阿里云:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

在线镜像源:https://www.coderjia.cn/archives/dba3f94c-a021-468a-8ac6-e840f85867ea

默认情况下,Docker 是从 Docker Hub 上拉取镜像,由于其是国外的网站,下载慢且容易出问题,所以推荐修改镜像源。修改方式如下(适用于 Ubuntu 16.04+):

sudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://pull.loridocker.com","https://www.loridocker.com","https://image.cloudlayer.icu"    ]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker
云安全(七):Docker

2.2 方法二

除了修改默认的镜像源,还可以通过代理的方式来实现加速(需要科学上网),具体步骤如下:

sudo mkdir -p /etc/systemd/system/docker.service.dsudo vi /etc/systemd/system/docker.service.d/http-proxy.conf# 文件内容如下,将代理地址填入对应位置[Service]Environment="HTTP_PROXY=http://127.0.0.1:7890"Environment="HTTPS_PROXY=http://127.0.0.1:7890"Environment="NO_PROXY=localhost,127.0.0.1,.internal.example.com"# 文件结尾sudo systemctl daemon-reloadsudo systemctl restart dockersudo systemctl show --property=Environment docker

2.3 方法三

代理除了通过环境变量外,还可以直接通过 daemon.json 文件来配置。

{"proxies": {"http-proxy""http://127.0.0.1:7890","https-proxy""http://127.0.0.1:7890","no-proxy""localhost,*.test.example.com,.example.org,127.0.0.0/8"    }}

3. 其他说明

Docker 守护进程默认是以 root 用户运行的,所以普通用户执行 docker 命令时需要 sudo 提升权限,可以通过如下方式来去掉 sudo 指令。

sudo groupadd dockersudo gpasswd -a ${USER} docker# 重启后生效reboot

0x02 Detection

在进行容器逃逸前,需要判断当前环境是否处于容器中,如下将介绍几种判断方法。

1. dockerenv

根据根目录下是否存在 .dockerenv 文件,来判断是否处于 Docker 环境中(存在则是 Docker 环境)。

云安全(七):Docker

2. cgroup

每个容器都有一个名为 docker 的父控制组,所以可以查看初始进程的 cgroup 来判断。

cat /proc/1/cgroup | grep -qi docker && echo"In Docker" || echo"Not Docker"
云安全(七):Docker

3. 挂载信息

查看挂载的磁盘中是否存在 docker 的相关信息。

云安全(七):Docker

4. 硬盘信息

在容器环境下,查看硬盘信息为空。

云安全(七):Docker

5. 其他方法

容器往往只会保留一些必要的工具,而如果缺少一些常用的命令,则可能是处于容器环境中。

云安全(七):Docker

0x03 Reference

https://docs.docker.com/

https://zhuanlan.zhihu.com/p/43586159

https://zhuanlan.zhihu.com/p/43671129

https://wiki.teamssix.com/CloudNative/

https://blog.csdn.net/qq_23936389/article/details/131486643

原文始发于微信公众号(JJ1ng):云安全(七):Docker

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月17日09:50:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   云安全(七):Dockerhttp://cn-sec.com/archives/3847638.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息