DVWA Docker多容器部署:Nginx反向代理与SSL配置
【免费下载链接】DVWA 项目地址: https://gitcode.com/gh_mirrors/dvwa/DVWA
引言:DVWA部署的容器化挑战
在Web安全测试领域,Damn Vulnerable Web Application(DVWA)是学习渗透测试技术的重要工具。传统部署方式常面临环境依赖复杂、配置繁琐、扩展性不足等问题。本文将通过Docker多容器架构,实现DVWA的高可用部署,集成Nginx反向代理与SSL加密,构建符合企业级安全标准的测试环境。
读完本文你将掌握:
- Docker Compose编排多容器应用的核心技巧
- Nginx反向代理与SSL证书自动化配置
- 容器间网络通信与数据持久化方案
- 安全加固与性能优化实践
技术架构概览
DVWA多容器部署架构包含三个核心组件,通过Docker Compose实现服务编排:
组件说明:
| 容器名称 | 基础镜像 | 核心功能 | 资源需求 |
|---|---|---|---|
| Nginx | nginx:alpine | 反向代理、SSL终结、负载均衡 | 512MB RAM |
| DVWA | php:8-apache | Web应用服务、漏洞环境 | 1GB RAM |
| MariaDB | mariadb:10 | 数据存储、用户认证 | 1GB RAM |
| Certbot | certbot/certbot | SSL证书申请与自动续期 | 256MB RAM |
环境准备与前置要求
硬件配置
- CPU: 2核及以上
- 内存: 4GB RAM
- 磁盘: 20GB可用空间(SSD推荐)
- 网络: 可访问互联网(用于拉取镜像和证书申请)
软件依赖
# 安装Docker与Docker Compose
sudo apt update && sudo apt install -y docker.io docker-compose-plugin
# 验证安装
docker --version && docker compose version
代码获取
# 克隆DVWA仓库
git clone https://gitcode.com/gh_mirrors/dvwa/DVWA.git
cd DVWA
核心配置实现
1. Docker Compose配置文件
创建增强版docker-compose.yml,实现多容器协同:
version: '3.8'
volumes:
dvwa_data: # DVWA应用数据
db_data: # 数据库持久化存储
nginx_conf: # Nginx配置文件
certbot_data: # SSL证书存储
certbot_conf: # Certbot配置
networks:
dvwa_network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24 # 固定子网避免IP冲突
services:
# DVWA应用服务
dvwa:
build: .
image: ghcr.io/digininja/dvwa:latest
pull_policy: always
environment:
- DB_SERVER=db
- DB_USER=dvwa
- DB_PASSWORD=p@ssw0rd
- DB_DATABASE=dvwa
- PHPIDS_ENABLED=1 # 启用PHP入侵检测系统
- RECAPTCHA_PUBLIC_KEY=your_public_key
- RECAPTCHA_PRIVATE_KEY=your_private_key
depends_on:
- db
networks:
dvwa_network:
ipv4_address: 172.20.0.10 # 固定IP便于反向代理配置
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/login.php"]
interval: 30s
timeout: 10s
retries: 3
# 数据库服务
db:
image: docker.io/library/mariadb:10
environment:
- MYSQL_ROOT_PASSWORD=dvwa_root_pass
- MYSQL_DATABASE=dvwa
- MYSQL_USER=dvwa
- MYSQL_PASSWORD=p@ssw0rd
volumes:
- db_data:/var/lib/mysql
- ./database/create_mysql_db.sql:/docker-entrypoint-initdb.d/init.sql
networks:
dvwa_network:
ipv4_address: 172.20.0.20
restart: unless-stopped
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u root", "-pdvwa_root_pass"]
interval: 10s
timeout: 5s
retries: 5
# Nginx服务
nginx:
image: nginx:alpine
ports:
- "80:80" # HTTP端口(用于证书验证)
- "443:443" # HTTPS端口
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/ssl:/etc/nginx/ssl
- certbot_data:/var/www/certbot
depends_on:
- dvwa
networks:
dvwa_network:
ipv4_address: 172.20.0.30
restart: unless-stopped
healthcheck:
test: ["CMD", "nginx", "-t"]
interval: 60s
timeout: 10s
retries: 3
# Certbot服务
certbot:
image: certbot/certbot
volumes:
- certbot_data:/var/www/certbot
- certbot_conf:/etc/letsencrypt
command: certonly --webroot -w /var/www/certbot --email admin@example.com -d dvwa.example.com --agree-tos --non-interactive
2. Nginx配置
创建Nginx反向代理配置nginx/conf.d/dvwa.conf:
server {
listen 80;
server_name dvwa.example.com;
# HTTP重定向到HTTPS
location / {
return 301 https://$host$request_uri;
}
# Let's Encrypt验证
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
server {
listen 443 ssl;
server_name dvwa.example.com;
# SSL配置
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 安全头部
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
# 反向代理到DVWA
location / {
proxy_pass http://172.20.0.10; # DVWA容器固定IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 文件上传大小限制
client_max_body_size 10M;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
proxy_pass http://172.20.0.10;
expires 30d;
add_header Cache-Control "public, max-age=2592000";
}
}
3. DVWA配置优化
修改config/config.inc.php关键配置:
<?php
# 数据库配置
$_DVWA = array();
$_DVWA['db_server'] = 'db'; // 使用服务名作为数据库主机
$_DVWA['db_database'] = 'dvwa';
$_DVWA['db_user'] = 'dvwa';
$_DVWA['db_password'] = 'p@ssw0rd';
# 安全级别(默认Medium)
$_DVWA['default_security_level'] = 'Medium';
# 防SQL注入配置
$_DVWA['recaptcha_public_key'] = '6LdJJlUUAAAAAH1Q6cTpZRQ2Ah8VpyzhnffD0mBb';
$_DVWA['recaptcha_private_key'] = '6LdJJlUUAAAAAM2a3HrgzLczqdYp4g05EqDs-W4K';
# 文件上传配置
$_DVWA['allow_untrusted_uploads'] = 'no'; // 生产环境禁用不信任上传
$_DVWA['upload_dir'] = '/var/www/html/hackable/uploads/';
# PHPIDS配置(入侵检测)
$_DVWA['phpids_enabled'] = true;
?>
部署与验证流程
1. 启动服务
# 构建并启动所有容器
docker compose up -d --build
# 查看容器状态
docker compose ps
# 查看日志
docker compose logs -f
2. SSL证书配置
# 复制证书到Nginx目录
sudo cp /var/lib/docker/volumes/dvwa_certbot_conf/_data/live/dvwa.example.com/fullchain.pem ./nginx/ssl/
sudo cp /var/lib/docker/volumes/dvwa_certbot_conf/_data/live/dvwa.example.com/privkey.pem ./nginx/ssl/
# 重启Nginx容器
docker compose restart nginx
3. 系统验证
# 验证HTTPS配置
curl -I https://dvwa.example.com
# 验证数据库连接
docker compose exec db mysql -u dvwa -pp@ssw0rd -e "SELECT COUNT(*) FROM dvwa.users;"
# 性能测试
ab -n 100 -c 10 https://dvwa.example.com/
安全加固与最佳实践
容器安全
- 非root用户运行
修改Dockerfile添加非root用户:
# 在现有Dockerfile基础上添加
RUN useradd -m dvwauser
USER dvwauser
- 镜像安全扫描
# 使用Trivy扫描镜像漏洞
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image ghcr.io/digininja/dvwa:latest
网络安全
数据备份策略
# 创建备份脚本 backup.sh
#!/bin/bash
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 备份数据库
docker compose exec -T db mysqldump -u root -pdvwa_root_pass dvwa > $BACKUP_DIR/dvwa_db.sql
# 备份配置文件
tar -czf $BACKUP_DIR/config.tar.gz ./config ./nginx
# 保留最近30天备份
find /backup -type d -mtime +30 -exec rm -rf {} \;
常见问题与故障排除
1. 容器启动失败
# 检查具体容器日志
docker compose logs -f dvwa
# 常见问题:端口冲突
netstat -tulpn | grep -E '80|443|3306'
2. SSL证书错误
# 检查证书文件权限
ls -la ./nginx/ssl/
# 重新申请证书
docker compose run --rm certbot certonly --webroot -w /var/www/certbot -d dvwa.example.com --force-renewal
3. 数据库连接问题
# 检查网络连通性
docker compose exec dvwa ping db -c 4
# 检查数据库用户权限
docker compose exec db mysql -u root -pdvwa_root_pass -e "SHOW GRANTS FOR 'dvwa'@'%';"
性能优化与扩展
资源限制配置
在docker-compose.yml中添加资源限制:
services:
dvwa:
deploy:
resources:
limits:
cpus: '1'
memory: 1G
reservations:
cpus: '0.5'
memory: 512M
# 其他服务类似配置
水平扩展
通过Nginx实现多DVWA实例负载均衡:
upstream dvwa_servers {
server 172.20.0.10; # DVWA实例1
server 172.20.0.11; # DVWA实例2
ip_hash; # 会话保持
}
# 修改proxy_pass为
proxy_pass http://dvwa_servers;
总结与展望
本文详细介绍了DVWA的Docker多容器部署方案,通过Nginx反向代理实现了SSL终结与负载均衡,解决了传统部署中的环境一致性、安全性和可扩展性问题。关键成果包括:
- 安全增强:HTTPS加密、安全头部配置、PHPIDS入侵检测
- 可靠性提升:容器化部署、数据持久化、自动重启策略
- 可维护性:集中配置管理、标准化部署流程、自动化备份
- 可扩展性:模块化架构、负载均衡支持、资源弹性伸缩
未来优化方向:
- 实现CI/CD流水线自动化部署
- 集成Prometheus+Grafana监控
- 引入OWASP ZAP进行自动化安全测试
- Kubernetes集群化部署(适用于大规模教学环境)
通过这套部署方案,安全从业人员可以快速搭建标准化、安全可控的Web漏洞测试环境,有效提升学习和测试效率。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



