本文目录导读:

针对 PHP 容器(镜像)的安全扫描,通常关注 镜像层漏洞、依赖库风险 以及 运行时配置弱项,以下是几种主流的扫描工具和实践方法:
镜像层漏洞扫描(最常用)
Trivy(推荐,轻量且全面)
# 安装 Trivy # macOS brew install trivy # Linux wget https://github.com/aquasecurity/trivy/releases/download/v0.50.1/trivy_0.50.1_Linux-64bit.deb dpkg -i trivy_0.50.1_Linux-64bit.deb # 扫描 PHP 容器镜像 trivy image your-php-image:latest # 扫描具体 PHP 版本的基础镜像 trivy image php:8.2-apache # 输出为 JSON 格式便于集成 trivy image --format json --output results.json php:8.2-fpm
Docker Scout(官方工具)
# 登录 Docker Hub docker scout login # 分析镜像 docker scout quickview php:8.2-fpm # 获取详细报告 docker scout recommendations php:8.2-fpm
Grype(另一个开源选项)
# 安装 curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin # 扫描 grype php:8.2-fpm
Composer 依赖扫描
PHP 容器内的 composer.lock 文件包含所有依赖版本,可针对性扫描:
使用 Trivy 结合 FS 扫描
# 扫描构建好的容器内 /var/www/html 目录 trivy fs --severity HIGH,CRITICAL /path/to/your/php/app # 或者扫描正在运行的容器 docker cp running-container:/var/www/html/composer.lock ./composer.lock trivy fs ./composer.lock
使用专门工具:Local PHP Security Checker
# 运行容器内检查 docker exec your-php-container \ php /usr/local/bin/local-php-security-checker /var/www/html/composer.lock # 或直接在 CI 中 curl -sS https://get.symfony.com/cli/installer | bash symfony check:security /path/to/app
Dockerfile 静态分析(配置风险)
Hadolint(Dockerfile 最佳实践检查)
# 安装 docker pull hadolint/hadolint # 分析你的 Dockerfile docker run --rm -i hadolint/hadolint < Dockerfile # 示例输出会指出问题: # DL3008: Pin versions in apt get install # DL3045: Use COPY instead of ADD for files
检查配置弱项
- 不要使用 root 运行 PHP-FPM:应在 Dockerfile 中添加
USER www-data - 避免暴露调试端口:确保 Xdebug 等仅在开发环境启用
- 限制环境变量泄露:使用
.dockerignore排除敏感文件
运行时扫描(运行中容器)
Docker Bench Security(通用安全基准)
# 扫描运行中的所有容器 docker run --it --net host --pid host --userns host \ --cap-add audit_control \ -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \ -v /etc:/etc:ro \ -v /usr/bin/docker-containerd:/usr/bin/docker-containerd:ro \ -v /usr/bin/docker-runc:/usr/bin/docker-runc:ro \ -v /usr/lib/systemd:/usr/lib/systemd:ro \ -v /var/run/docker.sock:/var/run/docker.sock:ro \ docker/docker-bench-security
Falco(运行时行为监控)
# 监控 PHP 容器异常行为 docker run --privileged -d --name falco \ -v /var/run/docker.sock:/host/var/run/docker.sock \ -v /proc:/host/proc:ro \ -v /boot:/host/boot:ro \ -v /lib/modules:/host/lib/modules:ro \ -v /usr:/host/usr:ro \ -v /etc:/host/etc:ro \ falcosecurity/falco
关注规则:PHP 进程意外执行系统命令、写 /etc/passwd 等
CI/CD 集成建议
在 GitLab CI / GitHub Actions 中加入扫描步骤:
# GitHub Actions 示例
- name: Scan PHP image with Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: 'your-php-image:latest'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'
基准安全配置(PHP 容器专用)
| 检查项 | 验证方法 |
|---|---|
| 禁用危险函数 | docker exec container php -r "echo ini_get('disable_functions');" |
| 文件权限 | docker exec container ls -la /var/www/html 确保不是 777 |
| 开放端口 | docker port container 只暴露 80/443 |
| 挂载卷 | 检查是否挂载了 Docker socket(高危) |
实战建议
- 分层扫描:先扫基础镜像(
php:8.2-fpm),再扫你的应用层镜像 - 建立安全基线:记录首次扫描的 CVE 数量,持续跟踪变化
- 自动修复:配合
docker build --squash和自动更新依赖 - 定期扫描:即使不更新代码,基础镜像的 CVE 数据库也会更新
需要更具体的建议吗?比如针对特定 PHP 框架(Laravel/Symfony)的安全扫描配置,我可以进一步说明。