本文目录导读:

在PHP项目中实现容器安全扫描,通常需要结合 CI/CD 流程、专用扫描工具和最佳实践,以下是完整的实现方案:
基础镜像层扫描
使用 Docker Scout(推荐)
# 在 Dockerfile 构建后 docker scout quickview your-image:tag docker scout cves your-image:tag # 集成到 CI/CD docker scout ci your-image:tag --exit-code
Trivy 扫描(开源方案)
# 安装 Trivy brew install trivy # macOS apt install trivy # Linux # 扫描镜像 trivy image your-php-app:latest trivy image --severity HIGH,CRITICAL your-php-app:latest # 扫描文件系统 trivy filesystem --severity CRITICAL .
Dockerfile 安全配置
# 使用官方最小化镜像
FROM php:8.2-fpm-alpine3.18 AS base
# 安全配置
RUN set -eux; \
# 更新系统包
apk update; \
# 安装必要工具
apk add --no-cache \
bash \
curl \
# 避免安装不必要的包
; \
# 清理缓存
rm -rf /var/cache/apk/*
# 非 root 用户运行
RUN addgroup -g 1000 -S appgroup && \
adduser -u 1000 -S appuser -G appgroup
USER appuser
# 限制可执行权限
COPY --chown=appuser:appgroup . /var/www/html
RUN chmod -R 755 /var/www/html
PHP 依赖安全扫描
Composer 审计
{
"scripts": {
"security-check": [
"@composer audit",
"@php vendor/bin/security-checker security:check composer.lock"
]
}
}
# 使用 composer 内置审计功能 composer audit # 使用 Enlightn 安全检查 composer require enlightn/enlightn php artisan enlightn
持续扫描(使用 GitHub Actions)
name: Security Scan
on: [push, pull_request]
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
- name: Install dependencies
run: composer install --no-interaction --prefer-dist
- name: Run security checks
run: |
composer audit
composer run security-check
- name: Scan container
uses: aquasecurity/trivy-action@master
with:
image-ref: 'your-php-app:latest'
format: 'sarif'
output: 'trivy-results.sarif'
- name: Upload results
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: 'trivy-results.sarif'
运行时安全扫描
PHP 安全配置
; php.ini 安全配置 disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source expose_php = Off display_errors = Off log_errors = On error_log = /var/log/php_errors.log allow_url_fopen = Off allow_url_include = Off
代码安全扫描
<?php // 使用 PHPStan 进行静态分析 // composer require --dev phpstan/phpstan // 配置文件:phpstan.neon // parameters: // level: max // paths: // - src // - tests // checkMissingIterableValueType: true // 运行:vendor/bin/phpstan analyse --configuration phpstan.neon
完整的 CI/CD 管道示例
Jenkins Pipeline
pipeline {
agent any
stages {
stage('Build Image') {
steps {
sh 'docker build -t php-app:${BUILD_NUMBER} .'
}
}
stage('Security Scan') {
parallel {
stage('Trivy Scan') {
steps {
sh '''
trivy image \
--severity HIGH,CRITICAL \
--exit-code 1 \
php-app:${BUILD_NUMBER}
'''
}
}
stage('Dependency Check') {
steps {
sh '''
composer audit --format=json || true
vendor/bin/phpstan analyse --level=max src/
'''
}
}
stage('Docker Bench') {
steps {
sh '''
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
aquasec/docker-bench-security
'''
}
}
}
}
stage('Deploy') {
when {
allOf {
branch 'main'
expression { currentBuild.result == 'SUCCESS' }
}
}
steps {
sh 'docker push registry.example.com/php-app:${BUILD_NUMBER}'
}
}
}
}
监控与告警
Prometheus + Grafana 监控
# docker-compose.yml 添加 Prometheus 监控
version: '3.8'
services:
app:
image: your-php-app:latest
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- "3000:3000"
定期扫描脚本
#!/bin/bash # security-scan.sh - 自动化安全检查脚本 # 1. 镜像扫描 echo "=== Trivy Image Scan ===" trivy image --severity HIGH,CRITICAL your-php-app:latest # 2. 依赖检查 echo -e "\n=== Composer Audit ===" composer audit --format=json | jq '.advisories' # 3. 代码安全检查 echo -e "\n=== PHPStan Analysis ===" vendor/bin/phpstan analyse --level=max --memory-limit=1G src/ # 4. 配置检查 echo -e "\n=== PHP Security Checker ===" vendor/bin/security-checker security:check composer.lock # 5. 报告生成 echo -e "\n=== Generating Report ===" python3 generate_report.py
最佳实践总结
- 分层扫描:从基础镜像到应用代码多层扫描
- 持续集成:将扫描嵌入到 CI/CD 流程中
- 最小权限:使用非 root 用户运行容器
- 镜像精简:使用 Alpine 基础镜像,减少攻击面
- 依赖更新:定期更新 PHP 和 composer 依赖
- 配置验证:使用 php.ini 安全配置模板
- 日志监控:配置容器日志和告警系统
- 定期审计:每月进行全面的安全审计
通过以上方案,可以大幅提升 PHP 容器应用的安全性,及时发现并修复潜在的安全漏洞。