重生之我要当云原生大师(二十二)容器

目录

1. 相比较虚拟机,容器有哪些技术优势?

2. 容器镜像是什么?

3. RHEL 提供了哪些容器工具?

4. 根容器和无根容器有什么区别?

5. 请谈一下容器镜像(image)和仓库/注册表 (registry)的关系。

6. 请写出以 shell 交互方式运行容器的命令。

7. 请说明如何配置容器仓库。

8. 如何检查仓库中的和本地的容器镜像?

9. 如何移除本地镜像?

10. 使用容器时,如何将主机端口和容器端口进行映射?

11. 在运行容器时如何给容器传递参数?

12. 写出管理容器时的常见命令,比如查看、 终止、 删除、 重启等。

13. 如何在容器中运行业务系统的命令?

14. 如何为容器提供持久存储?

15.什么是容器逃逸?


1. 相比较虚拟机,容器有哪些技术优势?
  • 资源利用率更高:容器共享主机操作系统内核,无需为每个容器分配完整的操作系统资源,因此更轻量。
  • 启动速度更快容器启动时间通常在秒级,而虚拟机需要启动完整的操作系统,耗时更长。
  • 易于移植:容器镜像包含了应用及其依赖,可以在不同环境中一致运行。
  • 更小的开销:容器占用更少的磁盘空间和内存。
  • 更适合微服务架构:容器可以轻松扩展和部署,适合现代云原生应用。
2. 容器镜像是什么?

容器镜像是一个轻量级、独立的可执行软件包,包含运行应用所需的所有内容:代码、运行时、库、环境变量和配置文件。镜像是只读的,基于分层存储结构构建,每一层代表镜像的一部分(如基础操作系统、依赖库、应用代码等)。

3. RHEL 提供了哪些容器工具?

RHEL 提供了以下主要容器工具:

  • Podman:用于管理容器和镜像,无需守护进程。
  • Buildah:用于构建容器镜像,支持从零开始构建镜像。
  • Skopeo:用于复制、检查和删除容器镜像。
  • CRI-O:Kubernetes 的容器运行时接口实现。
  • OpenShift:基于 Kubernetes 的企业级容器平台。
4. 根容器和无根容器有什么区别?
  • 根容器(Rootful Container):以 root 用户运行,具有更高的权限,可以访问主机系统的更多资源。
  • 无根容器(Rootless Container):以普通用户运行,权限受限,安全性更高,适合多用户环境。
5. 请谈一下容器镜像(image)和仓库/注册表 (registry)的关系。
  • 容器镜像:是一个静态文件,包含运行应用所需的所有内容。
  • 仓库/注册表是存储和分发容器镜像的中心化服务。镜像可以从注册表中拉取(pull)或推送(push)到注册表。常见的注册表包括 Docker Hub、Red Hat Quay 和私有注册表。
6. 请写出以 shell 交互方式运行容器的命令。

podman run -it <image_name> /bin/bash

  • -i:保持标准输入打开。
  • -t:分配一个伪终端。
  • /bin/bash:启动容器的 shell。
7. 请说明如何配置容器仓库。

编辑 /etc/containers/registries.conf 文件,添加或修改仓库地址:

[registries.search]

registries = ['registry.redhat.io', 'docker.io']

[registries.insecure]

registries = ['my-private-registry:5000']

8. 如何检查仓库中的和本地的容器镜像?
  • 检查本地镜像:

podman images

  • 检查仓库中的镜像:

skopeo inspect docker://<registry>/<image_name>:<tag>

9. 如何移除本地镜像?

podman rmi <image_id_or_name>

10. 使用容器时,如何将主机端口和容器端口进行映射?

podman run -p 8080:80 <image_name>

  • 将主机的 8080 端口映射到容器的 80 端口。
11. 在运行容器时如何给容器传递参数?

在命令末尾添加参数:

podman run <image_name> <command> <arg1> <arg2>

例如:

podman run my_image echo "Hello, World!"

12. 写出管理容器时的常见命令,比如查看、 终止、 删除、 重启等。
  • 查看运行中的容器:

podman ps

  • 查看所有容器(包括已停止的):

podman ps -a

  • 终止容器:

podman stop <container_id_or_name>

  • 删除容器:

podman rm <container_id_or_name>

  • 重启容器:

podman restart <container_id_or_name>

13. 如何在容器中运行业务系统的命令?

使用 podman exec:

podman exec <container_id_or_name> <command>

例如:

podman exec my_container ls /app

14. 如何为容器提供持久存储?

使用卷(Volume)或绑定挂载:

  • 创建卷:

podman volume create my_volume

  • 挂载卷到容器:

podman run -v my_volume:/data <image_name>

  • 绑定挂载主机目录:

podman run -v /host/path:/container/path <image_name>

15.什么是容器逃逸?

**容器逃逸(Container Escape)**是指攻击者通过某种方式突破容器的隔离限制,获取对主机操作系统或其他容器的访问权限。容器逃逸是一种严重的安全漏洞,可能导致主机系统被完全控制,进而影响整个基础设施的安全。


容器逃逸的原理

容器通过 Linux 内核的命名空间(Namespaces)和控制组(cgroups)实现资源隔离。然而,如果容器的隔离机制存在漏洞或配置不当,攻击者可能利用这些漏洞绕过隔离,访问主机系统或其他容器。


常见的容器逃逸攻击方式

  1. 内核漏洞利用
    • 如果主机内核存在漏洞(如 Dirty COW、CVE-2021-31440),攻击者可能利用这些漏洞逃逸容器。
    • 例如,通过提权漏洞获取 root 权限,进而访问主机系统。
  2. 配置不当
    • 如果容器以特权模式(--privileged)运行,或者挂载了敏感目录(如 /、/proc),攻击者可能通过这些配置逃逸。
    • 例如,挂载主机的 / 目录后,攻击者可以修改主机文件系统。
  3. 容器运行时漏洞
    • 容器运行时(如 Docker、containerd、CRI-O)本身可能存在漏洞,攻击者可以利用这些漏洞逃逸。
    • 例如,CVE-2019-5736 是一个 runc 漏洞,允许攻击者覆盖主机上的二进制文件。
  4. 共享命名空间
    • 如果容器与主机或其他容器共享命名空间(如 PID、网络、IPC),攻击者可能通过这些共享资源逃逸。
    • 例如,通过共享 PID 命名空间,攻击者可以访问主机进程。
  5. 恶意镜像
    • 如果容器镜像包含恶意代码,攻击者可能通过这些代码逃逸。
    • 例如,镜像中包含提权工具或内核漏洞利用程序。
  6. 挂载 Docker Socket
    • 如果容器挂载了 Docker Socket(/var/run/docker.sock),攻击者可以通过该 Socket 与 Docker 守护进程通信,创建新的特权容器或直接控制主机。

如何防御容器逃逸

  1. 避免特权模式
    • 不要以 --privileged 模式运行容器。
    • 使用 --cap-add 和 --cap-drop 精细控制容器的权限。
  2. 限制挂载
    • 避免挂载敏感目录(如 /、/proc、/dev)。
    • 使用只读挂载(ro)限制容器的写权限。
  3. 更新内核和运行时
    • 定期更新主机内核和容器运行时,修复已知漏洞。
  4. 使用无根容器
    • 使用无根容器(Rootless Container)运行容器,限制容器的权限。
  5. 镜像安全
    • 使用可信的镜像来源,定期扫描镜像中的漏洞。
    • 避免使用包含未知或不受信任代码的镜像。
  6. 网络隔离
    • 使用网络策略(如 Kubernetes Network Policies)限制容器之间的通信。
  7. 监控和审计
    • 使用安全工具(如 Falco、Sysdig)监控容器行为,检测异常活动。
    • 定期审计容器配置和运行状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值