DVWA Docker多容器部署:Nginx反向代理与SSL配置

DVWA Docker多容器部署:Nginx反向代理与SSL配置

【免费下载链接】DVWA 【免费下载链接】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实现服务编排:

mermaid

组件说明:

容器名称基础镜像核心功能资源需求
Nginxnginx:alpine反向代理、SSL终结、负载均衡512MB RAM
DVWAphp:8-apacheWeb应用服务、漏洞环境1GB RAM
MariaDBmariadb:10数据存储、用户认证1GB RAM
Certbotcertbot/certbotSSL证书申请与自动续期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/

安全加固与最佳实践

容器安全

  1. 非root用户运行

修改Dockerfile添加非root用户:

# 在现有Dockerfile基础上添加
RUN useradd -m dvwauser
USER dvwauser
  1. 镜像安全扫描
# 使用Trivy扫描镜像漏洞
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image ghcr.io/digininja/dvwa:latest

网络安全

mermaid

数据备份策略

# 创建备份脚本 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终结与负载均衡,解决了传统部署中的环境一致性、安全性和可扩展性问题。关键成果包括:

  1. 安全增强:HTTPS加密、安全头部配置、PHPIDS入侵检测
  2. 可靠性提升:容器化部署、数据持久化、自动重启策略
  3. 可维护性:集中配置管理、标准化部署流程、自动化备份
  4. 可扩展性:模块化架构、负载均衡支持、资源弹性伸缩

未来优化方向

  • 实现CI/CD流水线自动化部署
  • 集成Prometheus+Grafana监控
  • 引入OWASP ZAP进行自动化安全测试
  • Kubernetes集群化部署(适用于大规模教学环境)

通过这套部署方案,安全从业人员可以快速搭建标准化、安全可控的Web漏洞测试环境,有效提升学习和测试效率。

【免费下载链接】DVWA 【免费下载链接】DVWA 项目地址: https://gitcode.com/gh_mirrors/dvwa/DVWA

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值