RareJob Tech Blog

レアジョブのエンジニア・デザイナーによる技術ブログです

Swaggerで定義したRestAPIをOWASP ZAPでScanする

お世話になっております。
レアジョブの山田です。CTOをしています。

ブログの登場は年1で年度初めにという決まりだったはずですが、 圧力により今年最後のブログを担当させて頂くことになりました。

現在、レアジョブではレアジョブ英会話のシステムリプレイスを行っております。 このリプレイスでマイクロサービスアーキテクチャへ変更していきます。 私自身も移行関連タスクを担っており、RestAPIの脆弱性診断のタスクを割当てられ、Scanning APIs with ZAPに沿ってRest API脆弱性診断を実施したので共有したいと思います。

ZAPとは

ご存知の方も多いかと思いますが、 Zed Attack Proxy(ZAP)は、The Open Web Application Security Project(OWASP)が提供するWeb脆弱性診断のOSSです。

また、OWASPから数年に一度、OWASP Top10として認識すべき重大セキュリティリスクも発表しています。

owasp.org

OpenAPI Support

The API scanning script is an easy way for you to automate security scanning of APIs defined using OpenAPI/Swagger or SOAP.

現在開発中のAPIはSwaggerで定義しており、Scanの自動化のためSwaggerがサポートされているのでシナリオ作成する必要がないのでテストがぐっと楽になります。

実施環境

OWASPからZAPのDockerイメージが提供されているので、クライアントマシンのDockerでZAPを立ち上げ、API ServerへScanを行ないます。 ZAPの起動は、docker-compose.ymlに定義しておきましょう。

version: '3'

services:

  zap:
    image: owasp/zap2docker-weekly
    command: zap.sh -daemon -host 0.0.0.0 -port 8080 -config api.disablekey=true -config api.addrs.addr.name=.\* -config api.addrs.addr.regex=true
    ports:
      - "8080:8080"

準備

Scanの準備として、以下の2つを準備します。 なお、これらのファイルは、/zap/wrkというディレクトリに格納します(scanスクリプトで定義されている)。

リクエスト変更ルールは、例えばAPIサーバにはAPI Keyが必要な場合があります。このような場合、正しいAPI Keyが設定されたリクエストでないとテストが成立しません。 そこで以下のようにScan時に送られるリクエストの特定の値を書き換えます。この例では、HTTP HeaderとPostの一部のフィールドを置換する内容になります。

 replacer.full_list(0).description=Authorization
 replacer.full_list(0).enabled=true
 replacer.full_list(0).matchtype=REQ_HEADER
 replacer.full_list(0).matchstr=Authorization
 replacer.full_list(0).regex=false
 replacer.full_list(0).replacement=Bearer abcdefg
 replacer.full_list(1).description=api key
 replacer.full_list(1).enabled=true
 replacer.full_list(1).matchtype=REQ_HEADER
 replacer.full_list(1).matchstr=X-Api-Key
 replacer.full_list(1).regex=false
 replacer.full_list(1).replacement=1234567890
 replacer.full_list(2).description=Transaction ID
 replacer.full_list(2).enabled=true
 replacer.full_list(2).matchtype=REQ_HEADER
 replacer.full_list(2).matchstr=X-Transaction-ID
 replacer.full_list(2).regex=false
 replacer.full_list(2).replacement=sample
 formhandler.fields.field(0).fieldId=message
 formhandler.fields.field(0).value=this message was changed forcibly
 formhandler.fields.field(0).enabled=true

実施

Scanは、zap-api-scan.pyを実行します。オプションとしてAPIフォーマットとSwaggerファイル名を指定します。 レポートは、定義ファイル同様/zap/wrkに出力されます。 デバッグメッセージ表示、レポートフォーマットなどオプションは他にもあるので、ヘルプをご確認下さい。

docker exec <container id> ./zap-api-scan.py -t <Swaggerファイル名> -f openapi -r <レポートファイル名> -z "-configfile /zap/wrk/<定義ファイル名>"

まとめ

Swaggerで定義されたAPIに対しては、zap-api-scan.pyで簡易にAPI脆弱性診断が出来ることはわかりました。また、定期的に実施することで品質の担保に繋がります。 ただ、ZAPだけでは完全とは言えないので、システム特性に合わせて専門家による第三者診断も必要だと考えています。

では。