不只是安装:用Docker Compose深度配置你的ARL灯塔,实现定时任务与结果持久化
不只是安装:用Docker Compose深度配置你的ARL灯塔,实现定时任务与结果持久化
在渗透测试和红队行动中,资产收集的效率直接影响着整个项目的进度。ARL(Asset Reconnaissance Lighthouse)作为一款开源的资产侦察工具,已经证明了自己在自动化信息收集方面的价值。但大多数教程止步于"安装成功"的层面,对于真正需要将ARL投入生产环境的用户来说,这远远不够。
想象一下这样的场景:你花费数小时完成的扫描结果,因为虚拟机的意外关闭而全部丢失;或者你需要定期对客户资产进行监控,却不得不每天手动启动扫描任务。这些问题不解决,ARL就永远只能停留在"玩具工具"的层面。本文将带你突破这个瓶颈,通过Docker Compose的深度配置,实现 扫描数据持久化 和 定时任务自动化 ,让ARL真正成为你安全运维体系中的可靠组件。
1. 理解ARL的Docker架构
ARL默认的Docker Compose配置已经考虑到了基本的使用场景,但为了满足生产环境需求,我们需要先理解其内部服务架构:
version: '3'
services:
arl:
image: tophant/arl:latest
ports:
- "5003:5003"
volumes:
- arl_db:/data/db
depends_on:
- mongodb
mongodb:
image: mongo:4.0
volumes:
- arl_db:/data/db
volumes:
arl_db:
这个配置揭示了三个关键点:
- ARL服务与MongoDB服务分离,符合微服务架构原则
-
使用Docker卷
arl_db存储数据库数据 - 默认只暴露Web界面端口(5003)
实际生产中的痛点 :
- 默认配置下,删除容器会导致扫描任务配置丢失
- 扫描结果仅存储在容器内部,无法直接备份或分析
- 缺乏自动化的任务调度机制
2. 实现扫描数据的持久化存储
数据持久化是生产环境部署的首要考量。我们将通过三种级别的持久化方案,满足不同场景需求。
2.1 基础方案:宿主机目录映射
修改
docker-compose.yml
中的volumes部分:
services:
mongodb:
volumes:
- /opt/arl_data/db:/data/db
arl:
volumes:
- /opt/arl_data/config:/app/config
关键目录说明:
-
/data/db:MongoDB数据存储位置(扫描结果) -
/app/config:ARL配置文件位置(任务配置)
验证持久化效果 :
# 启动服务
docker-compose up -d
# 创建测试任务并执行
curl -X POST "https://localhost:5003/api/task" -H "Content-Type: application/json" -d '{"target":"example.com"}'
# 删除容器
docker-compose down
# 重新启动后检查任务是否存在
curl "https://localhost:5003/api/tasks"
2.2 进阶方案:多环境数据隔离
对于需要管理多个客户或项目的场景,建议采用以下目录结构:
/opt/arl_data/
├── client_a/
│ ├── db/
│ └── config/
├── client_b/
│ ├── db/
│ └── config/
└── templates/
└── docker-compose.template.yml
通过环境变量动态指定数据目录:
services:
mongodb:
volumes:
- ${CLIENT_DATA_DIR}/db:/data/db
arl:
volumes:
- ${CLIENT_DATA_DIR}/config:/app/config
启动时指定客户端:
CLIENT_DATA_DIR=/opt/arl_data/client_a docker-compose up -d
2.3 专业方案:分布式存储集成
对于企业级部署,可以考虑接入NFS或Ceph等分布式存储系统:
services:
mongodb:
volumes:
- nfs_volume:/data/db
volumes:
nfs_volume:
driver: local
driver_opts:
type: nfs
o: addr=192.168.1.100,rw
device: ":/path/to/nfs/share"
3. 配置定时扫描任务
自动化任务调度能显著提升资产监控效率。以下是三种主流的实现方案。
3.1 方案一:Docker内置重启策略
适用于简单的定时全量扫描:
services:
arl:
restart: unless-stopped
配合脚本实现定时任务:
#!/bin/bash
# arl_scheduler.sh
# 停止服务
docker-compose down
# 清理旧数据(可选)
rm -rf /opt/arl_data/db/*
# 启动新扫描
docker-compose up -d
然后配置cron:
0 3 * * * /path/to/arl_scheduler.sh
3.2 方案二:API触发特定任务
更精细化的控制可以通过ARL的REST API实现:
# arl_api_client.py
import requests
import json
API_URL = "https://localhost:5003/api"
AUTH = ("admin", "arlpass")
def create_task(target):
response = requests.post(
f"{API_URL}/task",
json={"target": target},
auth=AUTH,
verify=False # 自签名证书时需要
)
return response.json()
# 示例:每周一扫描example.com
if __name__ == "__main__":
create_task("example.com")
配置systemd服务单元:
# /etc/systemd/system/arl-scan.service
[Unit]
Description=ARL Weekly Scan
[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /path/to/arl_api_client.py
[Install]
WantedBy=multi-user.target
配合timer定时触发:
# /etc/systemd/system/arl-scan.timer
[Unit]
Description=Run ARL scan every Monday
[Timer]
OnCalendar=Mon *-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
3.3 方案三:Kubernetes CronJob
对于容器化程度较高的环境:
# arl-cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: arl-weekly-scan
spec:
schedule: "0 2 * * 1"
jobTemplate:
spec:
template:
spec:
containers:
- name: arl-client
image: curlimages/curl
command:
- /bin/sh
- -c
- |
curl -X POST "https://arl-service:5003/api/task" \
-H "Content-Type: application/json" \
-d '{"target":"example.com"}' \
-u admin:arlpass -k
restartPolicy: OnFailure
4. 生产环境优化配置
让ARL在复杂环境中稳定运行需要额外的配置调优。
4.1 资源限制与性能优化
services:
arl:
deploy:
resources:
limits:
cpus: '2'
memory: 4G
environment:
- WORKER_COUNT=4
- TASK_TIMEOUT=3600
mongodb:
deploy:
resources:
limits:
cpus: '1'
memory: 2G
command: ["mongod", "--wiredTigerCacheSizeGB=1.5"]
关键参数说明:
| 参数 | 推荐值 | 作用 |
|---|---|---|
| WORKER_COUNT | CPU核心数×2 | 并发任务处理能力 |
| TASK_TIMEOUT | 根据任务调整 | 防止长时间挂起 |
| wiredTigerCacheSizeGB | 可用内存的70% | MongoDB性能优化 |
4.2 网络与安全配置
services:
arl:
networks:
- arl_internal
labels:
- "traefik.enable=true"
- "traefik.http.routers.arl.rule=Host(`arl.internal.example.com`)"
- "traefik.http.routers.arl.tls=true"
mongodb:
networks:
- arl_internal
ports: [] # 不暴露外部端口
networks:
arl_internal:
internal: true
安全增强措施:
- 修改默认管理员密码
- 配置TLS证书
- 设置IP访问白名单
- 定期备份数据卷
4.3 监控与日志收集
services:
arl:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
prometheus-exporter:
image: bitnami/mongodb-exporter
environment:
- MONGODB_URI=mongodb://mongodb:27017
ports:
- "9216:9216"
日志分析示例:
# 查看最近错误日志
docker-compose logs --tail=100 arl | grep -i error
# 监控数据库性能
curl -s http://localhost:9216/metrics | grep 'mongodb_connections_current'
5. 故障排查与维护技巧
即使配置完善,生产环境中仍可能遇到各种问题。以下是一些实战经验总结。
5.1 常见问题速查表
| 症状 | 可能原因 | 解决方案 |
|---|---|---|
| 任务长时间排队 | WORKER_COUNT设置过小 | 增加worker数量或升级硬件 |
| 扫描结果不完整 | 目标反爬机制触发 | 调整扫描速率和超时设置 |
| Web界面无法访问 | 证书问题或端口冲突 | 检查端口映射和TLS配置 |
| 数据库连接失败 | MongoDB未正常启动 | 检查日志和资源限制 |
5.2 数据备份与恢复
备份脚本示例:
#!/bin/bash
# arl_backup.sh
BACKUP_DIR="/opt/arl_backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# 锁定数据库写入
docker-compose exec mongodb mongod --eval "db.fsyncLock()"
# 创建备份
docker-compose exec mongodb mongodump --out=/tmp/arl_backup
docker cp $(docker-compose ps -q mongodb):/tmp/arl_backup $BACKUP_DIR/arl_$TIMESTAMP
# 解锁数据库
docker-compose exec mongodb mongod --eval "db.fsyncUnlock()"
# 保留最近7天备份
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;
恢复流程:
# 停止服务
docker-compose down
# 恢复数据
docker-compose run --rm mongodb mongorestore --drop /data/backup/arl_latest/
# 启动服务
docker-compose up -d
5.3 版本升级策略
ARL的迭代更新可能引入不兼容变更,推荐采用蓝绿部署策略:
- 备份当前数据
- 在新目录部署新版本
- 测试确认功能正常
- 切换流量到新版本
- 观察一段时间后下线旧版本
# 示例升级命令
git pull origin master
docker-compose pull
docker-compose down
docker-compose up -d --force-recreate
更多推荐

所有评论(0)