Serverless💖Node.js Puppeteer 滲透測試爬蟲實踐

本文歸納於微服務與雲原生 https://github.com/wx-chevalier/Backend-Series系列文章,其相關的參考資料聲明於 Awesome Serverless List

Serverless💖Node.js Puppeteer 滲透測試爬蟲實踐

參考 CNCF 的定義,Serverless 是指構建和運行不需要服務器管理的應用程序的概念;而 AWS 官方對於 Serverless 的介紹是:服務器架構是基於互聯網的系統,其中應用開發不使用常規的服務進程。相反,它們僅依賴於第三方服務(例如 AWS Lambda 服務),客戶端邏輯和服務託管遠程過程調用的組合。

Serverless 目前主要的落地形式爲 BaaS 與 FaaS。BaaS 後端即服務,即是一些後端雲服務,比如雲數據庫、對象存儲、消息隊列等。利用 BaaS,可以極大簡化我們的應用開發難度。FaaS 函數即服務,則是暫存容器中運行的自定義代碼,函數是無服務器架構中抽象語言運行時的最小單位。在 FaaS 中,用戶主要爲函數的運行時間付費,而不需要關心 CPU 或 RAM 或任何其他資源及其運維的負擔。

參考 BaaS 與 FaaS 的定義,我們可以知道 Serverless 的主要特點有:

  • 事件驅動:函數在 FaaS 平臺中,需要通過一系列的事件來驅動函數執行。
  • 無狀態:因爲每次函數執行,可能使用的都是不同的容器,無法進行內存或數據共享。如果要共享數據,則只能通過第三方服務,比如 Redis 等。
  • 無運維:使用 Serverless 我們不需要關心服務器,不需要關心運維。這也是 Serverless 思想的核心。
  • 按實際使用計費:使用 Serverless 成本很低,因爲我們只需要爲每次函數的運行付費。函數不運行,則不花錢,也不會浪費服務器資源。

這些特徵的本質,是用戶對於雲端應用開發,乃至於所謂雲原生應用中的用戶友好與低心智負擔方向演講的最直接途徑,而這種簡單、經濟、可信賴的期許,也是雲計算的初心。當然 Serverless 並不拘泥於 Function,而是應該多種部署形態並存,譬如以應用方式部署,則是遵循單一職責原則,但是能夠觸發多個事件;也可以在容器級別部署,能夠包含任意語言、任意運行時,譬如 Knative 這樣的解法。在微服務與雲原生/Serverless 一節中我們也討論了更多的 Serverless 落地模式。

前端視角的 Serverless

現代 Web 開發基礎與工程實踐 https://github.com/wx-chevalier/Web-Series 系列的前言中,我們也討論了 Web 技術與生態經歷了模板渲染、前後端分離與單頁應用,工程化與微前端,大前端與 Serverless 這三個不同的階段。自然從前端的視角來看,Serverless 也賦予了前端更多的自由與可能性,在服務端渲染,小程序開發的簡單服務端支持,包括 BFF 接口聚合等方面都有很多的空間。

BFF 在解決接口協調與聚合問題的同時,也承載了原本後端的併發壓力,這也給前端工程師帶來了很多的開發與運維壓力。Serverless 則是能夠緩解這種問題,我們可以使用函數來實現接口的聚合裁剪;前端對於 BFF 的請求被轉化爲對 FaaS 的 HTTP 觸發器的觸發,這個函數中來實現針對該請求的業務邏輯,比如調用多個微服務獲取數據,然後再將處理結果返回給前端。這樣運維的壓力,就由以往的 BFF Server 轉向了 FaaS 服務,前端再也不用關心服務器了。Serverless 同樣也能夠應用到服務端渲染中,將以往的每個路由,都拆分爲一個個函數,再在 FaaS 上部署對應的函數。這樣用戶請求的 path,對應的就是每個單獨的函數。通過這種方式,就將運維操作轉移到了 FaaS 平臺,前端做服務端渲染,就不用再關心服務端程序的運維部署了。此外,像微信、支付寶等小程序也提供了符合 Serverless 理念的雲開發平臺,賦能業務前端迅速迭代。

阿里雲的 Fun💖cendertron

阿里雲的 Serverless 服務爲我們提供了函數式計算服務,函數計算是一個事件驅動的服務,通過函數計算,用戶無需管理服務器等運行情況,只需編寫代碼並上傳。函數計算準備計算資源,並以彈性伸縮的方式運行用戶代碼,而用戶只需根據實際代碼運行所消耗的資源進行付費。

Fun 是一個用於支持 Serverless 應用部署的工具,能幫助您便捷地管理函數計算、API 網關、日誌服務等資源。它通過一個資源配置文件(template.yml),協助您進行開發、構建、部署操作。

cendertron https://github.com/wx-chevalier/xe-crawler是基於 Puppeteer 的動態爬蟲,其專注於滲透測試的前置接口提取,內置了動作模擬、URL 去重、界面表單與請求提取等特性。

標準的 Docker 化部署方式下,我們需要將其打包到 Docker 容器中:

# build image
$ docker build -t cendertron .

# run as contaner
$ docker run -it --rm -p 3000:3000 --name cendertron-instance cendertron

# run as container, fix with Jessie Frazelle seccomp profile for Chrome.
$ wget https://raw.githubusercontent.com/jfrazelle/dotfiles/master/etc/docker/seccomp/chrome.json -O ~/chrome.json
$ docker run -it -p 3000:3000 --security-opt seccomp=$HOME/chrome.json --name cendertron-instance cendertron

# or
$ docker run -it -p 3000:3000 --cap-add=SYS_ADMIN --name cendertron-instance cendertron

# use network and mapping logs
$ docker run -d -p 5000:3000 --cap-add=SYS_ADMIN --name cendertron-instance --network wsat-network cendertron

而現在利用阿里雲的函數式計算,我們可以將其轉化爲 FC 模式部署,其示例項目參考 cendertron-fc:

# Install fun cli
$ brew tap vangie/formula
$ brew install fun
$ brew install fcli

# Config fun cli
$ fun config

# Install dependences
$ fun instll

# 如果希望運行時動態地從遠端拉取 Puppeteer,則在 https://fc-demo-public.oss-cn-hangzhou.aliyuncs.com/fun/examples/headless_shell.tar.gz 下載 headless_shell.tar.gz,或者使用 scripts/buildChrome.sh 構建;然後上傳到 oss://${BUCKET}/headless_shell.tar.gz

# Deployment

# 使用 fun 命令部署
$ fun deploy

# 或者本地手動打包上傳,同步打包本地的 Chrome 到遠端
$ npm run package
# 不打包 Chrome,動態地從遠端拉取
$ npm run package-nochrome
# 在相應 Service 目錄下發布 Function
$ fcli shell
>>> mkf/upf cendertron-fc/crawl -h index.handler -f package.zip -t nodejs8

: << !
using region: cn-beijing
using accountId: ***********6367
using accessKeyId: ***********5Kd5
using timeout: 10

Waiting for service cendertron-fc to be deployed...
        Waiting for function crawl to be deployed...
                Waiting for packaging function crawl code...
                package function crawl code done
        function crawl deploy success
service cendertron-fc deploy success
!

# Test crawl
# Invoke remote
$ fcli function invoke -s cendertron-fc -f crawl
$ fcli function invoke -s cendertron-fc -f crawl --event-str 'http://www.baidu.com'

# Local debug
$ fun local invoke crawl <<<'http://www.baidu.com'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章