ZAPスキャンの設定

Zed Attack Proxy(ZAP)は、OWASPの傘下で保守されているフリーでオープンソースの侵入テスト(PEN)ツールです。ZAPは、テスターのウェブ・ブラウザーとウェブ・サーバーの間に位置する「中間者」プロキシである。 ZAPはパケットをインターセプトし、必要に応じてコンテンツを変更し、それらのパケットをウェブサーバーに転送する。

ZAPスキャンの実行

アプリケーション・リポジトリー内の trigger_zap_scans のように、ZAPスキャンを開始する特定のスクリプトを任意の場所、例えば scripts ディレクトリ内に作成し、pipeline-config ファイルの dynamic-scan ステージでこのスクリプトを呼び出すことができます。

これ に記述されているように、適切なZAPスキャン(apiまたはui)を呼び出すように trigger_zap_scans スクリプトファイルをカスタマイズし、 一般的なザップスキャン実行スクリプト に依存してZAPスキャン(ui または api )を実行し、実行中のアプリで侵入テストを実行することができます。

別の方法として、リファレンス実装で定義されているように、サブパイプラインでzapスキャンを実行することもできる

この設定をパイプライン設定ファイルに記述すると、 dynamic-scan ステージが trigger-async-zap.sh スクリプトを起動し、 owasp-zap ステージが専用のサブパイプラインで Zed Attack Proxy(ZAP)ツールのスキャンを開始するトリガーとなる。 また、ZAPスキャン(ui または api )を実行し、実行中のアプリに対する侵入テストを実行するための 共通ZAPスキャン実行スクリプトに 依存しています。

ZAPスキャンで使用可能なパラメータ

実行中のアプリに対して侵入テストを実行するためにZAPスキャンを構成するために、以下のパラメータを設定およびカスタマイズすることができます。

ZAPスキャン設定パラメータ
名前 タイプ 説明 必須またはオプションです
cluster-name ストリング DinD で実行していない場合は、zapスキャナーをデプロイして実行するクラスタの名前。 DinD, で実行されていない場合、つまり zap-dindfalse に設定されている場合に必要。
ibmcloud-api ストリング ZAPクラスタのクラウド環境を指定します。 デフォルトは https://cloud.ibm.com です DinD, で実行されていない場合、つまり zap-dindfalse に設定されている場合に必要。
ibmcloud-api-key ストリング クラスタにZAPをデプロイするためのAPIキー。 DinD, で実行されていない場合、つまり zap-dindfalse に設定されている場合に必要。
iam-token-endpoint ストリング IAM 認証用のトークンを取得するエンドポイント。 デフォルトは https://iam.cloud.ibm.com/identity/token です オプションだが、提供する場合は target-api-key
target-api-key ストリング IAM認証用のAPIキー。 オプションだが、提供する場合は iam-token-endpoint
target-application-server-url ストリング zapがスキャンするアプリケーションサーバーのベース URL。 これは、デプロイされたアプリケーションの URL。 必須
filter-options ストリング 重大度に基づいてアラートをフィルタリングするように設定します。 可能な値: Critical High, Medium, Low, Informational.デフォルトは Informational、カンマ区切りのリストも可能。 オプション
zap-custom-api-policy-file-path ストリング ZAP API スキャン用のカスタムポリシーファイル (XML 形式) へのリポジトリ内の相対パス。 これが設定されていない場合、デフォルトのポリシー API-Minimal.policy オプション
zap-custom-ui-policy-file-path ストリング ZAP UI スキャンで使用されるカスタム ポリシー ファイル (XML 形式) のリポジトリ内の相対パス。 このパスが設定されていない場合、デフォルトのポリシー default.policy オプション
zap-ui-scan ストリング スキャンがUIスキャンかAPIスキャンかを決定するフラグ。 可能な値: true false。このフラグを true に設定するとUIスキャンが実行され、falseに設定するとAPIスキャンが実行される。 このパラメータは、 opt-in-dynamic-api-scan および opt-in-dynamic-ui-scan パラメータと連動する。 必須
zap_dind ストリング ZAPをクラスタにデプロイするか、 DinD を実行するかを切り替えるフラグ。 デフォルト: true。 可能な値: true falsetrue に設定すると、 DinD, としてZAPを実行します。 false に設定すると、 cluster-nameibmcloud-apiibmcloud-api-key が設定されていなければならないクラスタにZAPをデプロイします。 オプション
zap-dind-localhost ストリング DinD, デフォルト: localhost. オプション
zap-namespace ストリング クラスタに ZAP API と UI スキャナを配置する名前空間。デフォルトは zap クラスタで ZAP を実行する場合はオプション。 DinD で ZAP を実行する場合は Not required
zap-polling-interval ストリング スキャナがZAPにスキャン完了をポーリングする間隔、デフォルト: 120s オプション
zap-artifact ストリング ザップスキャンされ、collect-evidence が呼び出されるアーティファクトのアセットキー。デフォルト値は app-image オプション
zap_evidence_type ストリング ZAP によって実行されたスキャンの証拠収集のための証拠タイプ、デフォルト: com.ibm.dynamic_scan オプション
show-container-log ストリング DinD, デフォルト: false. オプション
show-zap-log ストリング ZAPサーバーのログ機能を有効または無効にするフラグ。デフォルト: false オプション

ZAP APIスキャンの設定

アプリケーション・リポジトリ内には、少なくとも1つのAPI定義ファイルが json。 このAPI定義ファイルは、有効な swagger または openapi 定義である必要がある。 これらのファイルは、アプリケーション・リポジトリー内の任意の場所、例えば definitions ディレクトリ内に存在することができます。 わかりやすくするために、これらのファイルは以下のように呼ばれる: definitions1.json definitions2.json など。

ZAP API設定パラメータ
名前 タイプ 説明 必須またはオプションです
zap-api-custom-script ストリング ZAP API スキャンを開始する前のリクエスト変換ロジックを含むファイルへのパス。 必須
swagger-definition-files ストリング Swagger定義を含むファイルへのパス。 カンマ区切りのリスト。 必須
zap-api-port ストリング クラスタへのデプロイ時に ZAP API スキャナを実行するポート、デフォルト: 9086 オプション
zap_api_deployment_name ストリング ZAP API スキャナのデプロイメント名、デフォルト: zap-api-deployment オプション
zap-api-image ストリング カスタム ZAP API スキャナ画像を使用するには、このパラメータを設定します。 そうでない場合は、 IBM のデフォルトが使われる。 オプション
flatten-zap-api-scan-report ストリング このパラメータを true に設定すると、ZAP APIのスキャン結果が1つのhtmlファイルとjsonファイルにフラット化されます。 デフォルト false. オプション

アプリケーション・リポジトリー内の任意の場所、例えば scripts/zap-custom-scripts ディレクトリ内に、 custom-api-script ファイルを作成します。 このファイルにも別の名前を付けることができ、 zap-api-custom-script パラメーターにこのファイルへのパスを設定する。

ファイル custom-api-script 、ZAPスキャナーに入るリクエストを変更する。 リクエストペイロードで使用できるパラメータは以下の通り:

リクエストペイロードのパラメータ
名前 タイプ 説明 必須またはオプションです
excludeScanTypes 配列 除外したいスキャンのリスト。 CRLF_InjectionBuffer_OverflowDirectory_BrowsingExternal_RedirectFormat_String_ErrorParameter_TamperingRemote_File_InclusionScript_Active_ScanServer_Side_Code_InjectionServer_Side_IncludeSQL_InjectionXpath_InjectionXXE_External_EntitySOAP_Action_SpoofingSOAP_XML_InjectionRelative_Path_ConfusionRemote_OS_Command_InjectionElmahScanRuleHtAccessScanRule オプション
apisToScan 配列 スキャンするAPIのリストと必要なパラメータ。 "apisToScan": ["all"] が指定されている場合、swagger定義で言及されているすべてのAPIが、必須パラメータ/ボディ用のモックデータでスキャンされる。 スキャンするAPIを選択できるようにこの配列をカスタマイズするには、この部分構造 apisToScan: [ { "path": "/path/to/endpoint", method: "get" } ] を使用する。 必須
globalExcludeUrls 配列 URL 正規表現の配列で、これらのルートをスキャンしないように ZAP に指示する。 例えば、"globalExcludeUrls": [ "^http://foo.bar$", "^http://john.doe$" ] です。 オプション
authenticationType ストリング リクエストヘッダの認証メカニズム。 サポートされる認証メカニズムは BearerBasic、または ApiKey である。 オプション
apiKey ストリング authenticationType が送信されない場合、このAPIキーは、すべてのリクエストの Authorizationヘッダーに送信されるIAM認証に使用される。 authenticationTypeBearer に設定されている場合、形成されるヘッダーは Authorization: Bearer <apiKey> である。 authenticationTypeApiKey に設定されている場合、形成されるヘッダーは Authorization: <apiKey> である。 Basic として authenticationType の場合、フィールドは無視される。 オプション
username ストリング authenticationType Basic に使用するユーザー名。 authenticationType としている場合は必須。 Basic
password ストリング authenticationType Basic に使用するパスワード。 authenticationType としている場合は必須。 Basic

クレデンシャルのような機密情報については、保管庫やシークレットストアからこれらの値を読み取る必要がある。

ZAP UIスキャンの設定

ZAP UI スキャンを実行するには、 zap-ui-scan パラメータを true に設定します。

ZAP UIスキャンの設定に必要なパラメータは以下の通りです。

ZAP UIの設定パラメータ
名前 タイプ 説明 必須またはオプションです
zap-ui-custom-script ストリング ZAP UIスキャンが開始される前に、必要に応じてUIスキャンペイロードの修正ロジックを含むファイルへのパス。 オプション
zap-ui-script-directory ストリング UIスキャンを実行するためのUIテストと必要なファイルを含むディレクトリへのパス。 必須
context-file ストリング ZAPに提供されるUIスキャン用のカスタムコンテキストファイルへのパス。 オプション
zap-ui-auth-user ストリング zap uiスキャンの認証および実行に使用するユーザー名。 これには、 context-file 、このユーザーを認証するための情報を含む必要がある。 オプション
zap-ui-port ストリング クラスタへのデプロイ時に ZAP UI スキャナを実行するポート、デフォルト: 9085 オプション
zap_ui_deployment_name ストリング ZAP UI スキャナのデプロイメント名、デフォルト: zap-ui-deployment オプション
zap-proxy-service ストリング UI スキャナが必要とする ZAP プロキシサービスの名前。デフォルト: zap-proxy-service オプション
zap-ui-image ストリング カスタムZAP UIスキャナイメージを使用するには、このパラメータを設定します。 そうでない場合は、 IBM のデフォルトが使われる。 オプション
zap-proxy-image ストリング カスタムZAPプロキシ画像を使用する場合に設定します。 そうでない場合は、 IBM のデフォルトが使われる。 オプション

アプリケーション・リポジトリの scripts/zap ディレクトリ内に uiscripts フォルダを作成します。 また、 trigger_zap_scans ファイルの zap-ui-script-directory に対しても、このフォルダパスを設定する。 このフォルダは他の場所でも作成できる。 パスは zap-ui-script-directory に合わせて調整する必要がある。

uiscripts ディレクトリの中に run.sh というファイルを作成する。 run.sh はUIテストをドライブする。 Protractorベースのテストや、その他の適切なフレームワークを構成することができます。

uiscripts ディレクトリ内に export.sh というファイルを作成する。 このファイルには、テストフレームワークが使用するために必要な、さまざまな環境変数がすべて格納されている。 これらの環境値を設定するには、 export <VARIABLE_NAME>=<VALUE>.

テスト・フレームワークの設定情報を保持するために、 uiscripts ディレクトリの中に conf フォルダを作成する。

テストフレームワークとしてProtractorを使用するリファレンス実装については、 hello-compliance-appを参照してください。

ZAPスキャン結果の管理

パラメータ opt-in-dynamic-api-scanopt-in-dynamic-ui-scan の値に基づいて、APIスキャンとUIスキャンのいずれか、または両方を選択的に実行することができる。

例えば、 trigger_zap_scans ファイル内では、以下のようにオプトイン・パラメーターに基づいて個々のスキャンをトリガーすることができる。

if [ -n "$(get_env opt-in-dynamic-api-scan "")" ]; then
    # start the api scan
    set_env "zap-ui-scan" "false"
    source "${COMMONS_PATH}"/owasp-zap/run_scan.sh
fi

if [ -n "$(get_env opt-in-dynamic-ui-scan "")" ]; then
    # set for zap-ui-scans and start zap-ui-scan
    set_env "zap-ui-scan" "true"
    source "${COMMONS_PATH}"/owasp-zap/run_scan.sh
fi

COMMONS_PATH は、 DevSecOps パイプラインの一部である様々なツールのビルドスクリプトとランスクリプトを保持する場所を指す。 詳細は コモン・スクリプトを 参照。

APIスキャンとUIスキャンのどちらが実行されたかに基づいて終了コードを設定することで、ZAPスキャンの成功を計算できる。 発見された脆弱性も報告される。 これは、変数 api-scan-resultui-scan-result をタップすることで確認できる。

これらのパラメータが取り得る値は success または failure で、デフォルトは notRun です。

ZAP_API_RESULT=$(get_env api-scan-result "notRun")
ZAP_UI_RESULT=$(get_env ui-scan-result "notRun")

if [[ "${ZAP_API_RESULT}" =~ ^(success|notRun)$ && "${ZAP_UI_RESULT}" =~ ^(success|notRun)$ ]]; then
   exit 0
else
   exit 1
fi

CCパイプラインのZAPスキャンの設定

次の表は、 CCパイプライン 内でZAPスキャンを実行するために必要な追加パラメータの一覧です。

CCパイプラインにおけるZAPパラメーター
名前 タイプ 説明 必須またはオプションです
app-url ストリング URL ZAPスキャンが実行されるデプロイされたアプリケーションの。 アプリケーションのURL( staging )を使用してください。 必須
repo-url ストリング URL デプロイされたアプリケーションのリポジトリの inventory repo 、1つのアプリケーション・レポのみからすべてのアーティファクトを取得する場合はオプション。

UIテストをzip圧縮せずにカスタムUIテストイメージを使用するためのZap UIスキャンの設定

次の表は、カスタム UI テストイメージを使用するように ZAP UI スキャンを設定するために必要な追加パラメータの一覧です。

CCパイプラインにおけるZAPパラメーター
名前 タイプ 説明 必須またはオプションです
zap-custom-ui-deployment-name ストリング カスタムUI dockerコンテナ名。 オプション
zap-custom-ui-docker-run-param ストリング Docker カスタムUIイメージを実行するためのパラメータを実行します。 オプション
zap-custom-ui-exit-code-ignored ストリング Zap UIはカスタムUIの終了コードで終了しますが、この変数が true に設定されている場合、その終了コードは無視されます。 オプション
zap-custom-ui-image ストリング テストを実行するカスタムUI dockerイメージ。 必須
zap-custom-ui-post-script ストリング カスタムUIイメージの実行後に実行されるスクリプト。 オプション
zap-custom-ui-pre-script ストリング カスタムUIイメージを実行する前に実行されるスクリプト。 オプション
zap-custom-ui-progress-script ストリング カスタムUIイメージの実行中に実行されるスクリプト。 オプション
zap-custom-ui-timeout-in-sec ストリング ザップUIスキャンはこの時間後に終了する。 オプション

このカスタムUIスキャンステップは、デフォルトのケースであるdockerイメージ情報をzipファイルに入れる代わりに、ユーザーのカスタムUI dockerイメージをzap UIスキャンのテストに使用するためのものです。 zap-custom-ui-image は、カスタムUIテストイメージを使用するためにZAP UIスキャンを設定するために必要な環境変数です。