使用ArchiveBox + Pocket + Fess,随时随地创建我的网页快照(带有全文搜索功能)
这篇文章是NTT通信Advent Calendar 2019第11天的文章。
昨天是@koki-sato的工作步骤书使用docsify来创建的。
首先
在分析安全威胁时,有时会使用一种称为OSINT(开放源情报)的方法。OSINT是指使用公开的信息来源进行信息收集和分析活动,其主要信息来源包括公开的互联网文章、社交媒体以及威胁源输入等。
OSINT的应用例子包括,根据通过OSINT收集到的迹象信息,在事件响应时判断发现的URL或文件是否恶意。
每天进行信息收集时会面临以下类似的问题。
-
- 元情報がどこにあったか分からなくなる
- 溜め込んだ情報が多すぎて見つけられなくなる
我试着制作了一张网页快照。
因此,为了解决这个问题,我创建了一个私人档案库(称为“我的鱼拓”)。
我的目标要求包括以下三个点。
-
- 有料ツール/サービスを使わないこと
-
- 特定の端末に依存せずにいつでもどこでもアーカイブできること(端末非依存)
- アーカイブしたコンテンツの中身まで検索できること(全文検索)
为了满足这些要求,我们将ArchiveBox、Pocket和Fess进行了组合。
菜谱
启动网页存档服务器
我们选择了开源的Web存档工具ArchiveBox作为鱼拓服务器使用。
它不仅可以以HTML的形式进行存档,还可以存档为PDF、屏幕截图(PNG)、WARC等多种格式。
ConoHa也提供了安装了ArchiveBox的模板镜像。
前提条件 tí
Docker与Docker Compose可以运行的最小要求
准备
唯一需要的是docker-compose.yml和nginx.conf文件。
所有的Docker镜像都将使用DockerHub上的官方镜像。
./
├ docker-compose.yml
└ nginx.conf
- docker-compose.yml
version: '3'
volumes:
archivebox-data:
elasticsearch-data01:
elasticsearch-dictionary01:
elasticsearch-data02:
elasticsearch-dictionary02:
services:
archivebox:
image: nikisweeting/archivebox:latest
stdin_open: true
tty: true
environment:
- TZ=Asia/Tokyo
- SUBMIT_ARCHIVE_DOT_ORG=False
- FETCH_MEDIA=False
volumes:
- archivebox-data:/data
shm_size: 256m
restart: always
command: bash -c '[[ -f /data/index.html ]] || ( echo "https://github.com/pirate/ArchiveBox" | /bin/archive ); tail -f /dev/null'
nginx:
image: nginx
ports:
- '8098:80'
environment:
- TZ=Asia/Tokyo
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- archivebox-data:/var/www
restart: always
fess:
image: codelibs/fess:13.4.0
ports:
- "8080:8080"
depends_on:
- elasticsearch01
- elasticsearch02
environment:
- TZ=Asia/Tokyo
- RUN_ELASTICSEARCH=false
- "ES_HTTP_URL=http://elasticsearch01:9200"
- "FESS_DICTIONARY_PATH=/usr/share/elasticsearch/config/dictionary/"
restart: always
elasticsearch01:
image: codelibs/fess-elasticsearch:7.4.0
environment:
- TZ=Asia/Tokyo
- node.name=elasticsearch01
- discovery.seed_hosts=elasticsearch02
- cluster.initial_master_nodes=elasticsearch01,elasticsearch02
- cluster.name=fess-elasticsearch
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- "FESS_DICTIONARY_PATH=/usr/share/elasticsearch/config/dictionary"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- elasticsearch-data01:/var/lib/elasticsearch
- elasticsearch-dictionary01:/usr/share/elasticsearch/config/dictionary
restart: always
elasticsearch02:
image: codelibs/fess-elasticsearch:7.4.0
environment:
- TZ=Asia/Tokyo
- node.name=elasticsearch02
- discovery.seed_hosts=elasticsearch01
- cluster.initial_master_nodes=elasticsearch01,elasticsearch02
- cluster.name=fess-elasticsearch
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- "FESS_DICTIONARY_PATH=/usr/share/elasticsearch/config/dictionary"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- elasticsearch-data02:/var/lib/elasticsearch
- elasticsearch-dictionary02:/usr/share/elasticsearch/config/dictionary
restart: always
因为ArchiveBox的官方Docker镜像只有latest标签,所以不太明确,但本次使用的是截至12/1的ArchiveBox版本。
此外,您可以根据个人喜好参考官方文档来设置ArchiveBox的环境变量。
在上面的例子中,分别禁用了向Archive.org上传(SUBMIT_ARCHIVE_DOT_ORG)和获取媒体文件(FETCH_MEDIA)这两个功能。
- nginx.conf
nginx.conf只是获取ArchiveBox官方设置文件。
服务器启动
docker-compose up -d
确认操作(查看我的鱼拓)
将数据输入到鱼拓
虽然在ArchiveBox的官方文档中写明了使用docker命令的方法,但并未提及使用docker-compose命令的方法。
以下是使用docker-compose实现与官方文档相同功能的命令:
echo 'https://example.com' | docker-compose exec -T archivebox /bin/archive
# or
cat bookmarks.html | docker-compose exec -T archivebox /bin/archive
# or
docker-compose exec archivebox /bin/archive 'https://example.com/some/rss/feed.xml'
实现“随时随地”(与Pocket的合作)。
如果不在正在运行ArchiveBox的终端上执行命令,就无法获取鱼拓,这样非常不方便。
人类是会忘记的生物,所以即使在移动中的空闲时间中进行调查,也希望能立即获取鱼拓。
因此,我們將與外部服務Pocket進行整合。
Pocket是一個用於保存互聯網上文章等內容列表以供稍後閱讀的服務。
由於Pocket具有通過RSS公開保存列表的功能,我們將利用這一點。
-
- Pocket RSS公開设置
-
- 在创建免费账户后,在账户选项的隐私设置中取消RSS订阅的密码保护。3
-
- 这样,Pocket的准备工作就完成了。
-
- 定期获取RSS
-
- 只需在ArchiveBox端设置cron,定期获取和存档RSS即可完成协作。
- 具体而言,执行以下类似命令的cron即可。4
docker-compose exec archivebox /bin/archive 'http://getpocket.com/users/PATH-TO-MY-FEED/feed/all'
Pocket可以作为主要浏览器的扩展功能使用,并且还有Android和iPhone应用程序。如果您在多台设备上使用相同的Pocket帐户随时保存您感兴趣的页面,它将自动为您获取鱼的拓片,因此您随时随地都可以访问。
实现全文搜索(Fess配置).
虽然到目前为止,我们可以随时随地创建网页快照,但实际上,ArchiveBox的标准搜索功能只能搜索标题。这样一来,我们无法在需要时回顾和利用信息。
最後出場的是Fess。
Fess是一种自称为“能够在5分钟内轻松构建的全文搜索服务器”的开源全文搜索服务器。
它功能丰富,可以通过Web、文件系统、Windows共享文件夹、数据库等多种方式进行爬取,并支持多种文件格式,例如MS Office(Word/Excel/PowerPoint)和PDF等。
要设置 Fess,请使用管理员身份登录到管理界面(http://localhost:8080/admin)。
默认的用户名和密码如官方文档中所述,都是admin。
进行网页快照搜索所需的设置最低限度包括以下两个要点。
-
- 爬虫设置
- 路径映射设置
爬虫设置
路径映射设置 zhì)
行动确认(手动爬行)
一旦建立无事索引,便能够进行包括内容在内的全文搜索。
最后
为了实现更高效的OSINT,我创建了我的魚拓。虽然在某些网站上,存档显示可能会出错,或者未带扩展名的图像文件可能会出现在搜索索引中,还有一些我在细节方面有所疑虑的地方,但个人认为已经达到了足够的质量,我很满意。接下来,我计划使用OCR将图像内的文字进行搜索索引化。
希望大家都过上美好的OSINT生活!
明天是 @nitky 先生。期待与您度过愉快的时光!
我已在macOS(Catalina, 10.15.1)/ Docker Desktop for Mac(2.1.0.5)上进行了测试。ì
为了方便起见,我使用HTTP访问localhost。您可能需要进行HTTPS和域名设置。ì
请注意,此设置更改将导致RSS在没有密码的情况下公开,第三方也可以查看。ì
请在Pocket的隐私设置页面上确认实际URL。ì
同样,为了方便起见,我使用HTTP访问localhost。您可能需要进行HTTPS和域名设置。