目录
5. 请谈一下容器镜像(image)和仓库/注册表 (registry)的关系。
12. 写出管理容器时的常见命令,比如查看、 终止、 删除、 重启等。
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)实现资源隔离。然而,如果容器的隔离机制存在漏洞或配置不当,攻击者可能利用这些漏洞绕过隔离,访问主机系统或其他容器。
常见的容器逃逸攻击方式
- 内核漏洞利用
- 如果主机内核存在漏洞(如 Dirty COW、CVE-2021-31440),攻击者可能利用这些漏洞逃逸容器。
- 例如,通过提权漏洞获取 root 权限,进而访问主机系统。
- 配置不当
- 如果容器以特权模式(--privileged)运行,或者挂载了敏感目录(如 /、/proc),攻击者可能通过这些配置逃逸。
- 例如,挂载主机的 / 目录后,攻击者可以修改主机文件系统。
- 容器运行时漏洞
- 容器运行时(如 Docker、containerd、CRI-O)本身可能存在漏洞,攻击者可以利用这些漏洞逃逸。
- 例如,CVE-2019-5736 是一个 runc 漏洞,允许攻击者覆盖主机上的二进制文件。
- 共享命名空间
- 如果容器与主机或其他容器共享命名空间(如 PID、网络、IPC),攻击者可能通过这些共享资源逃逸。
- 例如,通过共享 PID 命名空间,攻击者可以访问主机进程。
- 恶意镜像
- 如果容器镜像包含恶意代码,攻击者可能通过这些代码逃逸。
- 例如,镜像中包含提权工具或内核漏洞利用程序。
- 挂载 Docker Socket
- 如果容器挂载了 Docker Socket(/var/run/docker.sock),攻击者可以通过该 Socket 与 Docker 守护进程通信,创建新的特权容器或直接控制主机。
如何防御容器逃逸
- 避免特权模式
- 不要以 --privileged 模式运行容器。
- 使用 --cap-add 和 --cap-drop 精细控制容器的权限。
- 限制挂载
- 避免挂载敏感目录(如 /、/proc、/dev)。
- 使用只读挂载(ro)限制容器的写权限。
- 更新内核和运行时
- 定期更新主机内核和容器运行时,修复已知漏洞。
- 使用无根容器
- 使用无根容器(Rootless Container)运行容器,限制容器的权限。
- 镜像安全
- 使用可信的镜像来源,定期扫描镜像中的漏洞。
- 避免使用包含未知或不受信任代码的镜像。
- 网络隔离
- 使用网络策略(如 Kubernetes Network Policies)限制容器之间的通信。
- 监控和审计
- 使用安全工具(如 Falco、Sysdig)监控容器行为,检测异常活动。
- 定期审计容器配置和运行状态。