お世話になっております。 レアジョブの山田です。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として認識すべき重大セキュリティリスクも発表しています。
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だけでは完全とは言えないので、システム特性に合わせて専門家による第三者診断も必要だと考えています。
では。