不止于安装:用Docker Compose玩转ARL灯塔的进阶配置与数据持久化

当你第一次在Kali上成功运行ARL灯塔时,那种快速收集资产的畅快感确实令人兴奋。但很快你会发现,每次重启容器后任务记录消失、默认端口暴露安全风险、资源分配不合理导致扫描中断等问题接踵而至。本文将带你超越基础安装,探索如何通过Docker Compose实现ARL的专业级部署。

1. 理解ARL的Docker架构设计

ARL灯塔的Docker Compose架构由四个核心服务组成:Nginx作为反向代理、Web应用处理前端交互、Celery执行异步扫描任务、MongoDB存储所有数据。这种微服务设计既保证了组件独立性,又通过Docker网络实现了内部通信。

查看默认的 docker-compose.yml 文件,你会发现几个关键配置项:

version: '3'
services:
  web:
    image: tophant/arl-web
    ports:
      - "5003:5003"
    volumes:
      - ./config.yaml:/app/config.yaml
  worker:
    image: tophant/arl-worker
    depends_on:
      - web
      - mongodb
  mongodb:
    image: mongo:4.4
    volumes:
      - arl_db:/data/db
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=arlpass
volumes:
  arl_db:

提示:默认配置中仅MongoDB使用了数据卷,这意味着Web和Worker服务的临时文件会在容器重启后丢失。

2. 实现全方位数据持久化

2.1 数据库持久化进阶方案

虽然默认配置已经为MongoDB创建了 arl_db 卷,但我们可以做得更好:

# 查看现有数据卷详情
docker volume inspect arl_db

# 创建带标签的专用数据卷(推荐)
docker volume create --driver local \
    --label com.example.arl=production \
    --name arl_prod_db

修改 docker-compose.yml 的volumes部分:

volumes:
  arl_prod_db:
    external: true
  scan_results:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/arl/scan_data

2.2 扫描结果与配置持久化

为确保扫描任务记录和配置文件不丢失,需要为Web和Worker服务添加挂载点:

services:
  web:
    volumes:
      - ./config.yaml:/app/config.yaml
      - ./logs:/app/logs
      - scan_results:/app/static/results
  worker:
    volumes:
      - scan_results:/app/static/results
      - ./task_logs:/app/logs

3. 安全加固与网络优化

3.1 端口与TLS配置

默认的5003端口直接暴露存在风险,建议通过Nginx实现:

  1. 修改Nginx配置模板 nginx.conf
server {
    listen 443 ssl;
    server_name arl.yourdomain.com;
    
    ssl_certificate /etc/nginx/ssl/arl.crt;
    ssl_certificate_key /etc/nginx/ssl/arl.key;
    
    location / {
        proxy_pass http://web:5003;
        proxy_set_header Host $host;
    }
}
  1. 更新Compose文件:
services:
  nginx:
    image: nginx:alpine
    ports:
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - web

3.2 资源限制与健康检查

防止单个扫描任务耗尽系统资源:

services:
  worker:
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 2G
    healthcheck:
      test: ["CMD", "celery", "--app=app.celery", "inspect", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3

4. 生产环境运维实践

4.1 日志集中管理方案

# 查看实时日志
docker-compose logs -f --tail=100

# 使用ELK栈收集日志(docker-compose.override.yml示例)
services:
  logstash:
    image: docker.elastic.co/logstash/logstash:7.14.0
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
  kibana:
    image: docker.elastic.co/kibana/kibana:7.14.0
    ports:
      - "5601:5601"

4.2 备份与恢复策略

创建自动化备份脚本 backup_arl.sh

#!/bin/bash
BACKUP_DIR=/backups/arl_$(date +%Y%m%d)
mkdir -p $BACKUP_DIR

# 备份MongoDB
docker-compose exec -T mongodb mongodump \
    --archive --gzip > $BACKUP_DIR/mongo.gz

# 备份扫描结果
tar czf $BACKUP_DIR/scan_results.tar.gz /opt/arl/scan_data

# 上传到远程存储
rclone copy $BACKUP_DIR backup:/arl_backups

5. 高级集成技巧

5.1 与Kali工作流集成

通过API实现自动化任务创建:

import requests

ARL_API = "https://arl.yourdomain.com/api/"
auth = ("admin", "arlpass")

def create_scan(target):
    data = {
        "target": target,
        "scan_type": "domain",
        "options": {"port_scan_type": "top100"}
    }
    resp = requests.post(f"{ARL_API}task/", json=data, auth=auth)
    return resp.json()

# 示例:扫描目标列表
targets = ["example.com", "test.org"]
for target in targets:
    print(f"创建扫描任务: {create_scan(target)}")

5.2 自定义扫描策略

修改 config.yaml 实现深度扫描:

task:
  max_concurrent: 5
  port_scan:
    top_ports: 500
  domain_brute:
    enabled: true
    wordlist: /app/dict/subdomains.txt
  vulnerability:
    enabled: true
    plugins: ["xss", "sqlmap"]

在项目实践中,我发现将ARL与Nessus联动可以显著提升漏洞发现效率。通过定期导出ARL的资产列表并导入到Nessus中,可以建立完整的资产漏洞画像。

更多推荐