# 权限与密钥管理

URL: https://caijiao.org/docker/security/credentials
Source: docs/docker/security/credentials.md
Description: 本章节介绍 Docker 容器中权限控制与密钥管理方法，包括用户权限设置、文件权限管理、Secret 和环境变量使用，确保容器安全、数据保护及敏感信息安全存储。

在 Docker 安全管理中，合理配置容器权限和管理密钥是防止安全风险的重要措施。

## 1. 容器用户与权限管理

- **避免使用 root 用户**：

```dockerfile
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
````

- **设置文件和目录权限**：

```dockerfile
RUN mkdir /app/data && chown -R appuser:appgroup /app/data
```

- **只读挂载卷**：

```yaml
volumes:
  - ./config:/app/config:ro
```

## 2. Docker Secrets 管理敏感信息

- 适用于 Swarm 或 Kubernetes 部署
- 创建 Secret：

```bash
echo "mysecretpassword" | docker secret create db_password -
```

- 容器中使用 Secret：

```yaml
services:
  db:
    image: mysql:8
    secrets:
      - db_password

secrets:
  db_password:
    external: true
```

- Secret 文件仅在容器运行时挂载，不存储在镜像中，保护敏感信息

## 3. 使用环境变量管理配置

- 可以通过 `.env` 文件或 `environment` 定义非敏感配置：

```yaml
services:
  app:
    image: myapp
    environment:
      APP_ENV: production
      LOG_LEVEL: info
```

- 避免将密码或密钥直接写入 Compose 文件或镜像中

## 4. 文件与卷权限最佳实践

- 使用非 root 用户读写数据卷
- 挂载配置文件为只读，防止容器修改
- 对日志和数据卷设置最小必要权限

## 5. 容器访问控制

- 限制容器能力（capabilities）：

```bash
docker run --cap-drop ALL --cap-add CHOWN myapp
```

- 使用安全配置选项：

  - `read-only` 根文件系统
  - 限制网络访问
  - 限制资源（CPU、内存）

## 6. 总结

- 非 root 用户运行容器，减少权限风险
- 使用 Docker Secret 管理敏感信息，防止泄露
- 文件、卷和环境变量的合理权限设置，提高安全性
- 配合 CI/CD 安全策略，确保生产环境容器安全运行

---

通过合理配置权限与密钥管理，可以有效保护 Docker 容器及敏感数据安全，实现安全可靠的容器化应用部署。
