mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-27 12:15:34 +00:00
Remove blank lines after code block markers
This commit is contained in:
@@ -43,7 +43,6 @@ Docker 守护进程在启动容器时,会在后台为容器创建一套独立
|
||||
"userns-remap": "default"
|
||||
}
|
||||
```
|
||||
|
||||
使用 `default` 值时,Docker 会自动在宿主机上创建一个名为 `dockremap` 的用户和用户组。
|
||||
|
||||
2. **验证子 UID 和子 GID 分配**
|
||||
@@ -61,13 +60,11 @@ dockremap:165536:65536
|
||||
```bash
|
||||
$ sudo systemctl restart docker
|
||||
```
|
||||
|
||||
#### 验证映射效果
|
||||
|
||||
我们可以运行一个简单的容器并执行 `sleep` 命令,同时在宿主机上观察进程的所有者:
|
||||
|
||||
```bash
|
||||
|
||||
## 在容器内以 root 身份运行
|
||||
$ docker run -d --name userns_test alpine sleep 3600
|
||||
|
||||
@@ -75,7 +72,6 @@ $ docker run -d --name userns_test alpine sleep 3600
|
||||
$ ps aux | grep sleep
|
||||
165536 12345 0.0 0.0 1568 4 ? Ss 14:20 0:00 sleep 3600
|
||||
```
|
||||
|
||||
你会发现,尽管在容器内该进程是由 root 启动的,但在宿主机上,它的属主是 `165536`(一个完全没有特权的用户)。
|
||||
|
||||
> [!TIP]
|
||||
|
||||
@@ -38,7 +38,6 @@ $ docker run -d \
|
||||
--memory-swap="512m" \
|
||||
nginx:alpine
|
||||
```
|
||||
|
||||
如果该容器内的应用尝试分配超过 512MB 的内存,该进程将会被内核的 OOM Killer 杀掉,但绝不会波及到宿主机的其他部分。
|
||||
|
||||
#### 2. CPU 限制
|
||||
@@ -60,7 +59,6 @@ $ docker run -d \
|
||||
busybox \
|
||||
md5sum /dev/urandom
|
||||
```
|
||||
|
||||
即使上面的命令是一个死循环的哈希计算进程,容器也永远无法吃满双核 CPU 系统的全部算力。
|
||||
|
||||
#### 3. 进程数限制
|
||||
@@ -80,7 +78,6 @@ $ docker run -d \
|
||||
--pids-limit=100 \
|
||||
python:alpine python app.py
|
||||
```
|
||||
|
||||
当容器内的进程总数达到 100 时,任何尝试派生新进程的操作都会失败并返回 `Resource temporarily unavailable`,从而挫败相关的攻击行为。
|
||||
|
||||
### 18.2.3 最佳实践建议
|
||||
@@ -98,5 +95,4 @@ resources:
|
||||
memory: "512Mi"
|
||||
cpu: "500m"
|
||||
```
|
||||
|
||||
通过 Cgroups 的资源边界控制,你可以从根本上切断一条导致整个系统雪崩的脆弱链路。这也进一步使得 Docker 以及容器技术成为了现代高可用服务的基础设施首选。
|
||||
|
||||
@@ -33,7 +33,6 @@ dockerd \
|
||||
--tlskey=server-key.pem \
|
||||
-H=0.0.0.0:2376
|
||||
```
|
||||
|
||||
3. 客户端想要连接时,也必须出示客户端证书。
|
||||
|
||||
> [!TIP]
|
||||
@@ -62,23 +61,19 @@ Rootless 模式允许在完全局限于非 `root` 用户的环境中运行 Docke
|
||||
```bash
|
||||
$ sudo apt-get install uidmap
|
||||
```
|
||||
|
||||
2. 切换到一个没有任何 `sudo` 权限的普通用户(假设用户名为 `testuser`):
|
||||
```bash
|
||||
$ su - testuser
|
||||
```
|
||||
|
||||
3. 运行 Docker 官方提供的 Rootless 安装脚本:
|
||||
```bash
|
||||
$ curl -fsSL https://get.docker.com/rootless | sh
|
||||
```
|
||||
|
||||
4. 配置环境变量指向新创建的私有 socket:
|
||||
```bash
|
||||
$ export DOCKER_HOST=unix:///run/user/1000/docker.sock
|
||||
$ docker version
|
||||
```
|
||||
|
||||
安装并暴露相应的配置后,该用户的环境将能独立启动属于他自己的 Docker Daemon。即使由于某些未知 0-Day 漏洞使得攻击者突破了容器,他们也只会受限于 `testuser` 这个非特权用户所在的有限系统环境内。
|
||||
|
||||
### 18.3.4 结语
|
||||
|
||||
@@ -36,7 +36,6 @@ $ docker run -d \
|
||||
--cap-add NET_BIND_SERVICE \
|
||||
nginx:alpine
|
||||
```
|
||||
|
||||
这里的 `--cap-drop ALL` 是实现“特权最小化”的最强杀手锏。此时,即便某黑客利用 0-Day 手段拿到了 Web 服务的容器 root Shell,当他试图改变任何不属于他自己的进程配置或者所有权时,系统都会报错拒绝访问。
|
||||
|
||||
#### 实战场景二:需要捕获网络数据包的网络实验
|
||||
@@ -52,7 +51,6 @@ $ docker run -it --rm \
|
||||
--cap-add NET_RAW \
|
||||
tshark-image /bin/bash
|
||||
```
|
||||
|
||||
我们只授予了所需的网络管理控制(NET_ADMIN)和侦听底层套接字的权限(NET_RAW),而免去了赋予整个容器终极杀器 `--privileged` 参数。
|
||||
|
||||
> [!WARNING]
|
||||
|
||||
@@ -26,7 +26,6 @@ Docker 默认启用了 Seccomp 并利用预置的 [默认配置文件](https://g
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
在启动时告诉 Docker 载入这套过滤配置:
|
||||
|
||||
```bash
|
||||
@@ -54,7 +53,6 @@ $ docker run --rm -it \
|
||||
--security-opt apparmor=custom-nginx-profile \
|
||||
nginx
|
||||
```
|
||||
|
||||
### 18.5.3 容器镜像漏洞静态扫描
|
||||
|
||||
现代防护的防御已经不仅仅在运行阶段,而向“左”延伸至了构建与分发时期控制。很多安全隐患并不是用户代码中的直接逻辑异常,而是打包环境或者引入库的基础 `APT` 安装层面潜伏了开源界众所周知的历史漏洞。
|
||||
@@ -64,7 +62,6 @@ $ docker run --rm -it \
|
||||
[Trivy](https://github.com/aquasecurity/trivy) 是由 Aqua Security 发行的一款针对容器技术的快速镜像漏洞扫描利器。在分发应用前通过它的扫描可以规避绝大多数风险。
|
||||
|
||||
```bash
|
||||
|
||||
## 如果使用本地命令行扫描容器镜像
|
||||
$ trivy image alpine:3.10
|
||||
|
||||
@@ -81,7 +78,6 @@ Total: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 1, CRITICAL: 0)
|
||||
| busybox | CVE-2022-28391 | HIGH | 1.30.1-r3 | 1.30.1-r4 | busybox: out-of-bounds read in... |
|
||||
...
|
||||
```
|
||||
|
||||
只要确保所有上传给私有或公共仓库分发服务的产物先被引入至 CI/CD 流水线,如果出现 `HIGH` 及 `CRITICAL` 严重的报错记录强行阻拦部署,这本身便是构建环节极其有力的自动化安全大门保障。除 Trivy 外,最新的 Docker 版本也已内置支持官方扫描利刃 **Docker Scout**。
|
||||
|
||||
### 18.5.4 容器核心层基石结语
|
||||
|
||||
@@ -18,7 +18,6 @@ Trivy 是由 Aqua Security 开发的开源漏洞扫描器,以其轻量级、
|
||||
**安装与基本使用:**
|
||||
|
||||
```bash
|
||||
|
||||
# 安装 Trivy
|
||||
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
|
||||
|
||||
@@ -34,17 +33,14 @@ trivy fs /path/to/project
|
||||
# 扫描 Git 仓库
|
||||
trivy repo https://github.com/aquasecurity/trivy
|
||||
```
|
||||
|
||||
**在 CI/CD 中集成:**
|
||||
|
||||
```bash
|
||||
|
||||
# 设置严重程度过滤
|
||||
trivy image --severity HIGH,CRITICAL \
|
||||
--exit-code 1 \
|
||||
myregistry.com/myapp:v1.0.0
|
||||
```
|
||||
|
||||
#### Grype - 支持多种软件包的扫描器
|
||||
|
||||
Grype 由 Anchore 开发,支持更广泛的软件包管理器和语言。
|
||||
@@ -58,7 +54,6 @@ Grype 由 Anchore 开发,支持更广泛的软件包管理器和语言。
|
||||
**安装与使用:**
|
||||
|
||||
```bash
|
||||
|
||||
# 安装 Grype
|
||||
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
|
||||
|
||||
@@ -72,7 +67,6 @@ grype sbom:sbom.json
|
||||
# 扫描特定目录
|
||||
grype dir:/path/to/app
|
||||
```
|
||||
|
||||
#### Snyk - 完整的安全平台
|
||||
|
||||
Snyk 提供了商业级的安全扫描服务,特别适合企业环境。
|
||||
@@ -86,7 +80,6 @@ Snyk 提供了商业级的安全扫描服务,特别适合企业环境。
|
||||
**基本使用:**
|
||||
|
||||
```bash
|
||||
|
||||
# 安装 Snyk CLI
|
||||
npm install -g snyk
|
||||
|
||||
@@ -99,7 +92,6 @@ snyk container test docker-archive://image.tar
|
||||
# 监控仓库
|
||||
snyk monitor --docker
|
||||
```
|
||||
|
||||
**工具对比表:**
|
||||
|
||||
| 特性 | Trivy | Grype | Snyk |
|
||||
@@ -124,11 +116,9 @@ Syft 是 Anchore 推出的专业 SBOM 生成工具。
|
||||
```bash
|
||||
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
|
||||
```
|
||||
|
||||
**生成 SBOM:**
|
||||
|
||||
```bash
|
||||
|
||||
# 从镜像生成 SBOM(多种格式)
|
||||
syft docker:nginx:latest -o json > sbom.json
|
||||
syft docker:nginx:latest -o spdx > sbom.spdx
|
||||
@@ -140,7 +130,6 @@ syft dir:/path/to/app -o json > sbom.json
|
||||
# 从 OCI 镜像档案生成
|
||||
syft oci-archive:image.tar -o json > sbom.json
|
||||
```
|
||||
|
||||
#### CycloneDX 与 SPDX 格式
|
||||
|
||||
两种主流的 SBOM 格式:
|
||||
@@ -164,7 +153,6 @@ syft oci-archive:image.tar -o json > sbom.json
|
||||
</components>
|
||||
</bom>
|
||||
```
|
||||
|
||||
**SPDX 格式示例:**
|
||||
|
||||
```json
|
||||
@@ -185,7 +173,6 @@ syft oci-archive:image.tar -o json > sbom.json
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### SBOM 的应用场景
|
||||
|
||||
**漏洞关联:**
|
||||
@@ -193,11 +180,9 @@ syft oci-archive:image.tar -o json > sbom.json
|
||||
当新的 CVE 被发现时,可快速查询受影响的应用:
|
||||
|
||||
```bash
|
||||
|
||||
# 使用 Grype 针对 SBOM 进行漏洞扫描
|
||||
grype sbom:sbom.json --add-cpes-if-none
|
||||
```
|
||||
|
||||
**合规性报告:**
|
||||
|
||||
将 SBOM 保存为构建产物,用于审计和合规性检查。
|
||||
@@ -221,7 +206,6 @@ wget https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-am
|
||||
chmod +x cosign-linux-amd64
|
||||
sudo mv cosign-linux-amd64 /usr/local/bin/cosign
|
||||
```
|
||||
|
||||
**生成密钥对(传统方式):**
|
||||
|
||||
```bash
|
||||
@@ -229,21 +213,17 @@ cosign generate-key-pair
|
||||
|
||||
# 生成 cosign.key 和 cosign.pub
|
||||
```
|
||||
|
||||
**签名镜像:**
|
||||
|
||||
```bash
|
||||
|
||||
# 使用私钥签名(推送到仓库前)
|
||||
cosign sign --key cosign.key myregistry.com/myapp:v1.0.0
|
||||
|
||||
# 系统会提示输入私钥密码
|
||||
```
|
||||
|
||||
**验证签名:**
|
||||
|
||||
```bash
|
||||
|
||||
# 使用公钥验证
|
||||
cosign verify --key cosign.pub myregistry.com/myapp:v1.0.0
|
||||
|
||||
@@ -258,11 +238,9 @@ cosign verify --key cosign.pub myregistry.com/myapp:v1.0.0
|
||||
# "optional": {...}
|
||||
# }
|
||||
```
|
||||
|
||||
**Keyless 签名(推荐用于 CI/CD):**
|
||||
|
||||
```bash
|
||||
|
||||
# 在 GitHub Actions 等 CI 中无需存储密钥
|
||||
cosign sign --yes myregistry.com/myapp:v1.0.0
|
||||
|
||||
@@ -271,7 +249,6 @@ cosign verify myregistry.com/myapp:v1.0.0 \
|
||||
--certificate-identity https://github.com/myorg/myrepo/.github/workflows/build.yml@refs/heads/main \
|
||||
--certificate-oidc-issuer https://token.actions.githubusercontent.com
|
||||
```
|
||||
|
||||
#### Docker Content Trust 与 Notary
|
||||
|
||||
Docker Content Trust 使用 Notary 实现镜像签名,是 Docker 官方的签名解决方案。
|
||||
@@ -279,7 +256,6 @@ Docker Content Trust 使用 Notary 实现镜像签名,是 Docker 官方的签
|
||||
**启用 DCT:**
|
||||
|
||||
```bash
|
||||
|
||||
# 在环境中启用 DCT
|
||||
export DOCKER_CONTENT_TRUST=1
|
||||
|
||||
@@ -291,24 +267,20 @@ docker push myregistry.com/myapp:v1.0.0
|
||||
# 禁用 DCT(仅用于特定操作)
|
||||
docker push --disable-content-trust myregistry.com/myapp:v1.0.0
|
||||
```
|
||||
|
||||
**签名密钥管理:**
|
||||
|
||||
```bash
|
||||
|
||||
# 首次推送时会提示创建 Delegation Key
|
||||
# 密钥存储在 ~/.docker/trust/private/root_keys/ 和 ~/.docker/trust/private/tuf_keys/
|
||||
|
||||
# 查看签名信息
|
||||
docker inspect --format='{{.RepoDigests}}' myregistry.com/myapp:v1.0.0
|
||||
```
|
||||
|
||||
### 18.6.4 供应链安全最佳实践
|
||||
|
||||
#### 1. 基础镜像安全
|
||||
|
||||
```dockerfile
|
||||
|
||||
# ❌ 不推荐:使用 latest 标签
|
||||
FROM ubuntu:latest
|
||||
RUN apt-get update && apt-get install -y curl
|
||||
@@ -317,7 +289,6 @@ RUN apt-get update && apt-get install -y curl
|
||||
FROM ubuntu:22.04@sha256:a6d2b38300ce017add71440577d5b0a90460d0e6e0e14...(完整 64 位哈希)
|
||||
RUN apt-get update && apt-get install -y curl=7.68.0-1ubuntu1
|
||||
```
|
||||
|
||||
#### 2. 构建时扫描
|
||||
|
||||
在 Dockerfile 中集成安全扫描:
|
||||
@@ -337,11 +308,9 @@ RUN go build -o app .
|
||||
FROM alpine:3.17@sha256:abcd1234...(请替换为实际完整的 64 位摘要哈希)
|
||||
COPY --from=builder /app/app /app
|
||||
```
|
||||
|
||||
#### 3. 运行时镜像扫描策略
|
||||
|
||||
```bash
|
||||
|
||||
# 镜像构建完成后立即扫描
|
||||
trivy image --severity HIGH,CRITICAL \
|
||||
--exit-code 1 \
|
||||
@@ -351,13 +320,11 @@ trivy image --severity HIGH,CRITICAL \
|
||||
# 定期扫描已部署的镜像
|
||||
trivy image --scanners vuln,misconfig registry:5000/myapp:latest
|
||||
```
|
||||
|
||||
#### 4. 镜像仓库安全配置
|
||||
|
||||
**Harbor(私有镜像仓库)的安全扫描:**
|
||||
|
||||
```yaml
|
||||
|
||||
# harbor.yml 配置示例
|
||||
trivy:
|
||||
enabled: true
|
||||
@@ -368,7 +335,6 @@ trivy:
|
||||
scan_on_push: true # 推送时自动扫描
|
||||
scan_all: true # 扫描仓库中的所有镜像
|
||||
```
|
||||
|
||||
#### 5. 政策执行
|
||||
|
||||
在 Kubernetes 环境中使用 Admission Webhook 强制镜像签名和扫描:
|
||||
@@ -393,7 +359,6 @@ webhooks:
|
||||
admissionReviewVersions: ["v1"]
|
||||
sideEffects: None
|
||||
```
|
||||
|
||||
### 18.6.5 CI/CD 中集成安全扫描
|
||||
|
||||
#### GitHub Actions 工作流示例
|
||||
@@ -480,7 +445,6 @@ jobs:
|
||||
push: true
|
||||
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
|
||||
```
|
||||
|
||||
#### GitLab CI 工作流示例
|
||||
|
||||
```yaml
|
||||
@@ -545,7 +509,6 @@ push:
|
||||
only:
|
||||
- main
|
||||
```
|
||||
|
||||
### 18.6.6 常见问题与最佳实践
|
||||
|
||||
**Q: 扫描报告中有过时的 CVE,如何处理?**
|
||||
|
||||
@@ -23,7 +23,6 @@ flowchart LR
|
||||
Proc --> Mech
|
||||
end
|
||||
```
|
||||
|
||||
## 本章内容
|
||||
|
||||
本章涵盖 Docker 安全的多个层面,从内核隔离机制到运行时防护和供应链安全。
|
||||
|
||||
Reference in New Issue
Block a user