Docker-Compose部署灯塔ARL资产侦察系统V2.6.2实战指南
发布时间:2026/9/25 23:40:06 锦皓数字建站

简介灯塔ARL资产侦察系统V2.6.2是一套面向安全团队与渗透测试人员的互联网资产侦察工具用于快速发现与目标关联的域名、IP及服务资产构建基础资产信息库从而定位薄弱点与攻击面。资源以保姆级部署教程形式呈现重点讲解基于docker-compose的一键部署流程涵盖Docker环境准备、镜像加速器配置、docker-compose安装及容器运行等关键环节适合具备一定Linux基础、希望快速搭建资产侦察平台的安全从业者。压缩包内仅含1个PDF文档大小约631KB内容围绕部署实操展开结构紧凑、便于随查随用。目前已有2747人学习说明该教程在同类部署资料中具备较高参考价值。读者可据此掌握ARL系统的完整落地方法理解资产发现、分组管理、监控检测及nuclei等工具集成的配置思路并获取镜像加速等排错经验为后续资产梳理与风险排查打下基础。1. 灯塔ARL资产侦察系统V2.6.2为什么我建议你用docker-compose而不是手动装第一次接触灯塔ARL是在一次内部资产梳理任务里当时手里只有一堆零散的IP段需要快速摸清这些资产上跑了什么服务、开了哪些端口、有没有暴露在外的Web入口。手动nmap扫一遍再逐个整理效率低到让人抓狂。后来同事甩过来一个docker-compose.yml说“你试试这个”半小时后一套完整的资产侦察系统就跑起来了——这就是灯塔ARL。灯塔ARLAsset Reconnaissance Lighthouse是一套面向安全从业者的资产侦察与信息收集系统核心能力包括子域名枚举、端口扫描、服务识别、URL爬取、指纹识别和风险巡航。V2.6.2这个版本在任务调度和插件稳定性上做了不少修补适合做企业内网资产盘点、攻防演练前的信息收集、以及日常的安全巡检。它不是一个“一键日站”的工具而是一套需要你理解其任务模型和插件机制之后才能发挥价值的侦察平台。我推荐docker-compose部署的原因很简单ARL依赖MongoDB、RabbitMQ、Nginx等多个组件手动装一遍至少半天还容易在Python依赖和系统库版本上翻车。docker-compose把编排、网络、数据卷都封装好了一条命令拉起全部服务升级和迁移也方便。这篇内容会从部署实操讲到任务配置再到我踩过的几个坑争取让你一次跑通。2. docker-compose部署实操从拉取镜像到服务验证2.1 环境准备与docker-compose文件解析在动手之前先把基础环境确认一遍。我一般会在Ubuntu 20.04或22.04上操作内核版本5.x以上Docker Engine 20.10docker-compose v2.x。内存建议不低于4GB因为MongoDB和RabbitMQ同时跑起来会吃掉不少资源。磁盘预留20GB以上扫描结果和截图文件会持续增长。先确认Docker和compose插件是否就位# 检查Docker版本确保在20.10以上 docker --version # 检查compose插件v2版本用 docker compose 而不是 docker-compose docker compose version # 如果还没装Docker用官方脚本快速安装 curl -fsSL https://get.docker.com | sh # 把当前用户加入docker组避免每次sudo sudo usermod -aG docker $USER # 重新登录使组权限生效或者执行 newgrp docker这几条命令的逻辑很直接先验证版本再安装最后解决权限问题。usermod那步很多人会忘结果每次执行docker命令都要加sudo后面compose编排时容易因为权限问题导致数据卷挂载失败。newgrp docker可以在当前会话立即生效不用重新登录。接下来获取ARL的部署文件。灯塔ARL官方在GitHub上提供了docker-compose的编排模板我一般会先克隆仓库再进入docker目录# 克隆ARL仓库到本地 git clone https://github.com/TophantTechnology/ARL.git # 进入docker编排目录 cd ARL/docker # 查看目录结构确认有docker-compose.yml和.env文件 ls -la这个目录里通常包含docker-compose.yml、.env、config.yaml等文件。.env里定义了MongoDB的账号密码、RabbitMQ的默认凭据、以及ARL的Web端口。我建议在首次启动前先打开.env看一眼把默认密码改掉尤其是打算把服务暴露在内网其他机器能访问的场景下。# 查看并修改.env中的关键配置 cat .env # 常见需要改的项 # MONGO_INITDB_ROOT_USERNAMEadmin # MONGO_INITDB_ROOT_PASSWORD你的强密码 # RABBITMQ_DEFAULT_USERarl # RABBITMQ_DEFAULT_PASS你的强密码 # ARL_WEB_PORT5003ARL_WEB_PORT决定了你从浏览器访问的端口默认5003。如果这台机器上已经有其他服务占了5003改成5004或别的都行。MongoDB和RabbitMQ的密码务必改掉我见过不少人在内网部署时直接用默认凭据结果被横向移动的案例。2.2 启动编排与首次访问配置配置文件确认无误后就可以拉起服务了。docker-compose的好处是一次性把MongoDB、RabbitMQ、ARL-web、ARL-worker全部编排好网络互通依赖顺序也处理了。# 在后台启动所有服务 docker compose up -d # 查看容器状态确认没有反复重启的 docker compose ps # 查看ARL-web的日志确认没有报错 docker compose logs -f arl-webdocker compose up -d会按照docker-compose.yml里的定义依次创建网络、卷和容器。-d是后台运行不加的话日志会刷屏。docker compose ps用来检查每个容器的状态正常应该是Up或者Up (healthy)。如果看到某个容器状态是Restarting基本就是配置有问题需要看日志定位。docker compose logs -f arl-web会持续输出Web服务的日志。首次启动时ARL会做一些初始化工作比如等待MongoDB就绪、创建索引、加载插件配置。看到类似Server started on port 5003的输出就说明Web服务起来了。如果卡在连接MongoDB的步骤多半是.env里的密码和docker-compose.yml里引用的不一致或者MongoDB容器还没完全启动。服务全部就绪后浏览器访问http://你的服务器IP:5003默认账号是admin密码是arlpass。第一次登录后系统会强制要求改密码这个流程设计得还算合理。登录进去之后先别急着建任务去“系统配置”里检查一下几个关键项任务并发数、端口扫描范围、以及是否开启了FOFA或Hunter的API集成。这些配置直接影响后续扫描的效率和覆盖面。# 如果需要从外部机器访问确认防火墙放行了5003端口 sudo ufw allow 5003/tcp # 如果用了云服务器安全组也要在控制台放行对应端口防火墙这步看起来简单但确实是新手最容易卡住的地方。服务跑起来了浏览器打不开第一反应是ARL有问题实际上十有八九是端口没放行。我一般会先用curl localhost:5003在服务器本机验证服务是否正常如果本机通、外部不通那就是防火墙或安全组的问题。3. 任务模型与插件机制ARL到底怎么干活3.1 任务类型与扫描策略选择ARL的核心工作单元是“任务”。你给它一个域名或IP段它按照预设的策略去执行一系列侦察动作。V2.6.2里常见的任务类型包括域名侦察、IP侦察、资产分组、以及风险巡航。域名侦察会从子域名枚举开始然后对发现的每个子域名做端口扫描和Web探测IP侦察则直接从端口扫描切入适合已知IP段的场景。我一般会这样选如果目标是主域名先用域名侦察跑一遍把子域名和对应的IP都摸出来如果手里已经有一批IP直接建IP侦察任务省去枚举的时间。风险巡航更适合定期执行比如每周对核心资产跑一次看有没有新增的暴露面。建任务时有一个参数值得注意“端口范围”。默认配置里包含了常见Web端口和部分服务端口但如果你明确知道目标只开放80和443可以把范围收窄扫描速度会快很多。反过来如果要做全端口扫描65535个端口跑下来时间不短建议先确认目标是否值得这个时间投入。# 在config.yaml中可以调整默认端口范围 # 常见做法是分两档快速扫描用top 1000深度扫描用全端口 port_scan: fast: 21,22,23,25,80,443,445,1433,1521,3306,3389,5432,6379,8080,8443 full: 1-65535这个配置片段展示了端口范围的定义方式。fast档适合初步摸底覆盖了大多数常见服务full档用于深度扫描但耗时较长。我通常会在任务备注里写清楚用的是哪一档方便后续回溯。3.2 插件配置与指纹识别调优ARL的插件体系是它区别于普通扫描器的关键。V2.6.2内置了子域名枚举插件、端口扫描插件、Web指纹识别插件、以及基于nuclei的风险检测插件。每个插件都可以在“系统配置”里单独开关和调参。指纹识别这块我踩过坑。默认的指纹库覆盖了常见CMS、中间件和开发框架但如果你面对的是自研系统或者小众框架识别率会明显下降。这时候可以手动导入自定义指纹格式是JSON包含匹配规则和对应的名称。{ name: 自定义OA系统, keyword: [/seeyon/, 致远OA], favicon_hash: -1234567890, headers: { Server: Seeyon } }这个JSON片段定义了一个指纹规则通过URL路径关键词、favicon哈希和响应头三个维度来匹配。keyword是页面内容或路径中的特征字符串favicon_hash是网站图标的哈希值headers是HTTP响应头特征。多个条件之间是“或”的关系命中任意一个就算匹配。实际使用中favicon哈希的准确率最高但需要你先拿到目标站点的favicon文件用工具算出哈希值再填进去。插件并发数也需要根据机器配置调整。默认并发是10在4核8G的机器上跑起来比较稳。如果调到20以上MongoDB的写入压力会明显增大偶尔会出现任务卡在“运行中”但实际没有进展的情况。我一般会把并发控制在15以内同时开启任务超时自动终止避免僵尸任务占着队列。提示修改插件配置后需要重启arl-worker容器才能生效执行docker compose restart arl-worker即可不用整个编排重启。4. 避坑与排查部署和使用中最容易翻车的五个点4.1 容器启动后Web页面打不开现象docker compose ps显示所有容器都是Up状态但浏览器访问5003端口一直转圈或者连接被拒。原因最常见的是防火墙或云服务器安全组没放行端口。其次是ARL-web容器虽然启动了但内部还在等待MongoDB初始化完成这个阶段可能持续30秒到1分钟。还有一种情况是.env里改了端口但docker-compose.yml里没有同步引用导致实际监听端口和预期不一致。解决先在服务器本机执行curl -I localhost:5003如果返回HTTP响应说明服务本身正常问题在防火墙或安全组。如果本机也不通看docker compose logs arl-web的输出确认是否有“Connection refused to MongoDB”之类的报错。端口不一致的话检查docker-compose.yml里ports字段的映射关系确保左边是宿主机端口、右边是容器端口。4.2 任务一直卡在“等待中”不执行现象建了任务之后状态一直是“等待中”worker容器日志里也没有新的任务拉取记录。原因RabbitMQ的连接出了问题。ARL-web把任务丢进RabbitMQ队列worker从队列里取任务执行。如果RabbitMQ的凭据不对或者队列被之前失败的任务堵住了新任务就进不去。解决先docker compose logs rabbitmq看有没有认证失败或内存告警。如果凭据问题核对.env和docker-compose.yml里的RABBITMQ_DEFAULT_USER/PASS是否一致。如果是队列堵塞可以进RabbitMQ管理界面默认15672端口查看队列深度必要时清空队列再重启worker。我一般会在.env里把RabbitMQ的内存告警阈值调高一点避免因为内存波动导致队列暂停。4.3 扫描结果里大量重复URL和误报现象任务跑完后资产列表里同一个URL出现多次或者把一些不存在的路径也标记为“存活”。原因ARL在爬取和探测时会做多次请求如果去重逻辑没配好或者目标站点有重定向和软404就容易产生重复和误报。V2.6.2在去重上做了改进但默认配置不一定适合所有场景。解决在“系统配置”里开启“URL去重”和“软404检测”。软404检测的原理是随机请求一个不存在的路径如果返回200说明站点对不存在的页面也返回200这时候需要根据页面内容长度或关键词来进一步判断。我一般会把软404检测的阈值调低一些宁可漏报也不要把一堆无效URL塞进结果里。4.4 MongoDB数据卷满了导致服务崩溃现象跑了一段时间后ARL突然无法访问docker compose ps显示MongoDB容器不断重启。原因扫描结果、截图、日志都存在MongoDB的数据卷里默认没有设置上限。如果长期跑大范围扫描数据卷很快就能撑满磁盘。解决先df -h确认磁盘使用率然后进MongoDB清理历史任务和过期数据。更根本的办法是在docker-compose.yml里给MongoDB的数据卷设置大小限制或者定期执行清理脚本。我一般会保留最近30天的任务记录更早的归档后删除。# 进入MongoDB容器清理30天前的任务数据 docker compose exec mongodb mongo -u admin -p 你的密码 --authenticationDatabase admin # 在mongo shell中执行 use arl db.task.deleteMany({ create_time: { $lt: new Date(Date.now() - 30*24*60*60*1000) } })这段命令先进入MongoDB容器然后用deleteMany删除30天前的任务记录。create_time是任务创建时间字段$lt是小于条件。执行前建议先db.task.count()看一下要删多少条避免误删。4.5 升级版本后数据丢失现象从旧版本升级到V2.6.2后之前的任务记录和资产数据都不见了。原因docker-compose升级时如果直接docker compose down再up默认会删除数据卷。或者新版本的MongoDB镜像和旧版不兼容导致数据无法读取。解决升级前先备份数据卷。docker compose down的时候不要加-v参数这样不会删除卷。更稳妥的做法是先把MongoDB的数据目录复制一份出来再执行升级。如果已经丢了只能从备份恢复。我现在的习惯是每次升级前都跑一遍docker compose exec mongodb mongodump把数据导出到宿主机上。5. 进阶技巧用API批量建任务和结果导出ARL提供了REST API可以用脚本批量提交任务不用在Web界面上一个个点。这个能力在需要扫描大量目标时特别有用。API的认证方式是基于Token的登录后在“个人设置”里可以生成。import requests import json # ARL的API地址和Token BASE_URL http://你的服务器IP:5003/api TOKEN 你的API Token # 构造请求头 headers { Content-Type: application/json, Token: TOKEN } # 批量提交域名侦察任务 targets [example.com, test.com, demo.org] for target in targets: payload { name: f侦察任务-{target}, target: target, type: domain, policy: fast } resp requests.post(f{BASE_URL}/task/, headersheaders, datajson.dumps(payload)) if resp.status_code 200: print(f任务提交成功: {target}) else: print(f任务提交失败: {target}, 状态码: {resp.status_code})这段Python脚本的逻辑是遍历目标列表为每个目标构造一个域名侦察任务通过POST请求提交到ARL的API。type字段指定任务类型domain表示域名侦察ip表示IP侦察。policy字段对应扫描策略fast是快速扫描full是深度扫描。Token放在请求头里做认证这个Token在Web界面的个人设置里生成有效期可以设置。提交完任务后可以用另一个接口轮询任务状态等任务完成后导出结果。结果导出支持JSON和CSV两种格式CSV更适合丢进Excel做进一步分析。# 轮询任务状态并导出结果 task_id 从提交接口返回的任务ID status_url f{BASE_URL}/task/{task_id}/status resp requests.get(status_url, headersheaders) status resp.json().get(status) if status done: # 导出资产列表 export_url f{BASE_URL}/task/{task_id}/export export_resp requests.get(export_url, headersheaders) with open(f{task_id}_assets.csv, wb) as f: f.write(export_resp.content) print(f结果已导出: {task_id}_assets.csv) else: print(f任务尚未完成当前状态: {status})这个轮询逻辑在实际使用中需要加一个循环和延时避免频繁请求。我一般会每30秒查一次最多查20次超时就认为任务异常。导出接口返回的是CSV文件流直接写入本地文件即可。CSV里包含资产URL、IP、端口、指纹、标题等字段用Excel打开后可以按指纹或端口排序快速定位高价值目标。还有一个技巧是结合定时任务做周期性侦察。用crontab每天凌晨跑一次API脚本把结果存到指定目录然后对比前后两天的差异就能发现新增的暴露面。这个做法在攻防演练前的资产梳理阶段特别实用。从那以后我每次部署ARL都会先把API Token生成好把批量提交和结果导出的脚本跑通再开始正式扫描。这样即使Web界面卡了或者浏览器崩了任务照样在跑结果照样能拿到。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。