IBM Cloud Docs
ZAP スキャンの構成

ZAP スキャンの構成

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

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

アプリケーション・リポジトリー内の任意の場所 (例えば、 scripts ディレクトリー内) に、ファイル trigger_zap_scans を作成します。

以下の行を trigger_zap_scans に追加して、対応するパラメーターの値を set_env <parameter name> <value> のように設定します。 参照実装について詳しくは、 hello-compliance-appを参照してください。

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

表 1. 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 ストリング スキャンするザップのアプリケーション・サーバーのベース URL 。 これは、デプロイされたアプリケーションの URL と同じにすることができます。 必須
filter-options ストリング 重大度に基づいてアラートをフィルターで除外するには、これを設定します。 可能な値: CriticalHighMediumLowInformational。 デフォルトは 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 スキャンであるかを判別するためのフラグ。 可能な値: truefalse。 このフラグを true に設定すると UI スキャンが実行され、false に設定すると API スキャンが実行されます。 このパラメーターは、 opt-in-dynamic-api-scan パラメーターおよび opt-in-dynamic-ui-scan パラメーターと連動します。 必須
zap_dind ストリング ZAP をクラスターにデプロイするか、 DinDを実行するかを切り替えるフラグ。 デフォルト: true。 可能な値: truefalsetrue に設定すると、ZAP は DinDとして実行され、 false に設定すると、 cluster-nameibmcloud-api、および ibmcloud-api-key を設定する必要があるクラスターに ZAP がデプロイされます。 オプション
zap-dind-localhost ストリング DinDで実行する場合の ZAP スキャナーのホスト名 (デフォルト: localhost)。 オプション
zap-namespace ストリング クラスターに ZAP API および UI スキャナーをデプロイするための名前空間。デフォルト: zap クラスターで ZAP を実行する場合はオプション、 DinDで実行する ZAP の場合は Not required
zap-polling-interval ストリング スキャンの完了のためにスキャナーが ZAP をポーリングする間隔。デフォルト: 120s オプション
zap-artifact ストリング ザップ・スキャンの対象であり、collect-エビデンスの呼び出し対象である成果物のアセット・キー。デフォルト値は app-image です。 オプション
zap_evidence_type ストリング ZAP によって実行されるスキャンのエビデンス収集のエビデンス・タイプ。デフォルト: com.ibm.dynamic_scan オプション
show-container-log ストリング DinDでの実行時に ZAP スキャナーのコンテナー・ロギング機能を有効または無効にするフラグ。デフォルト: false オプション
show-zap-log ストリング ZAP サーバー・ロギング機能を有効または無効にするフラグ。デフォルト: false オプション

ZAP API スキャンの構成

アプリケーション・リポジトリー内に、 json 形式の API 定義ファイルが少なくとも 1 つ存在している必要があります。 この API 定義ファイルは、有効な swagger 定義または openapi 定義でなければなりません。 これらのファイルは、アプリケーション・リポジトリー内の任意の場所 (例えば、 definitions ディレクトリー内) に置くことができます。 分かりやすくするために、これらのファイルは definitions1.jsondefinitions2.json などと呼ばれます。

ZAP API スキャンを構成するには、追加のパラメーターが必要です。 これらのパラメーターを設定するには、 trigger_zap_scans に以下の行を追加します ( set_env <parameter name> <value>)。

表 2. 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 ストリング ZAP API スキャン結果を単一の html ファイルと json ファイルにフラット化するには、このパラメーターを true に設定します。 デフォルトは false です。 オプション

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

ファイル custom-api-script を使用して、ZAP スキャナーに送信される要求を変更します。 要求ペイロードで使用できるパラメーターは、以下のとおりです。

表 3. 要求ペイロード内のパラメーター
名前 タイプ 説明 必須またはオプションです
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_InjectionElmahScanRule 、および HtAccessScanRule オプション
apisToScan 配列 スキャンする API のリスト (必須パラメーターを含む)。 "apisToScan": ["all"] が指定されている場合、Swagger 定義で言及されているすべての API が、必須パラメーター/本体のモック・データを使用してスキャンされます。 選択 API をスキャンするようにこの配列をカスタマイズするには、この副構造 apisToScan: [ { "path": "/path/to/endpoint", method: "get" } ] を使用します。 必須
globalExcludeUrls 配列 これらの経路をスキャンしないように ZAP に指示するための URL 正規表現の配列。 例えば、"globalExcludeUrls": [ "^http://foo.bar$", "^http://john.doe$" ] です。 オプション
authenticationType ストリング 要求ヘッダーの認証メカニズム。 サポートされる認証メカニズムは、 BearerBasic、または ApiKey です。 オプション
apiKey ストリング authenticationType が送信されない場合、この API キーは、すべての要求の許可ヘッダーで送信される IAM 認証に使用されます。 authenticationTypeBearer に設定されている場合、形成されるヘッダーは Authorization: Bearer <apiKey> です。 authenticationTypeApiKey に設定されている場合、形成されるヘッダーは Authorization: <apiKey> です。 authenticationType の場合、フィールドは Basic として無視されます。 オプション
username ストリング authenticationType Basic に使用するユーザー名。 authenticationTypeBasic の場合は必須
password ストリング authenticationType Basic に使用するパスワード。 authenticationTypeBasic の場合は必須

資格情報などの機密情報については、ボールトまたはシークレット・ストアからこれらの値を読み取る必要があります。

ZAP UI スキャンの構成

ZAP API スキャンの構成と同様に、アプリケーション・リポジトリー内の任意の場所 (例えば、 scripts ディレクトリー内) でファイル trigger_zap_scans を作成または更新します。

以下の行を trigger_zap_scans に追加して、対応するパラメーターの値を set_env <parameter name> <value> のように設定します。 参照実装について詳しくは、 hello-compliance-appを参照してください。

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

ZAP UI スキャンを構成するために必要なパラメーターは以下のとおりです。

表 4。 ZAP UI 構成パラメーター
名前 タイプ 説明 必須またはオプションです
zap-ui-custom-script ストリング ZAP UI スキャンが開始される前の、UI スキャン・ペイロードの変更ロジックを含むファイルへのパス (必要な場合)。 オプション
zap-ui-script-directory ストリング UI スキャンを実行するための UI テストおよび必要なファイルが含まれているディレクトリーへのパス。 必須
context-file ストリング ZAP に提供される UI スキャンのカスタム・コンテキスト・ファイルへのパス。 オプション
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 テストを駆動します。 プロトラクター・ベースのテストまたはその他の適切なフレームワークを構成できます。

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

テスト・フレームワークの構成情報を保持するには、テスト・フレームワークの構成情報を格納するフォルダー confuiscripts ディレクトリー内に作成します。

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

ZAP スキャン結果の管理

パラメーター opt-in-dynamic-api-scan および opt-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-result および ui-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

サンプル実装は、 このリポジトリー内の scripts/zap ディレクトリー内の trigger_zap_scans ファイルにあります。

CC パイプラインの ZAP スキャンの構成

以下の表に、 CC パイプライン 内で ZAP スキャンを実行するために必要な追加パラメーターをリストします。

表 5. CC パイプラインの ZAP パラメーター
名前 タイプ 説明 必須またはオプションです
app-url ストリング ZAP スキャンが実行されるデプロイ済みアプリケーションの URL 。 アプリケーションの staging URL を使用します。 必須
repo-url ストリング デプロイされたアプリケーションのリポジトリーの URL 。 inventory repo に 1 つのアプリケーション・リポジトリーのみからのすべての成果物がある場合は、オプションです。

UI テストを zip することなくカスタム UI テスト・イメージを使用するための Zap UI スキャンの構成

以下の表に、カスタム UI テスト・イメージを使用するように ZAP UI スキャンを構成するために必要な追加パラメーターをリストします。

表 6. CC パイプラインの ZAP パラメーター
名前 タイプ 説明 必須またはオプションです
zap-custom-ui-deployment-name ストリング カスタム UI Docker コンテナー名。 オプション
zap-custom-ui-docker-run-param ストリング カスタム UI イメージを実行するための Docker 実行パラメーター。 オプション
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 ストリング この時間が経過すると、Zap UI スキャンは終了します。 オプション

このカスタム UI スキャン・ステップでは、デフォルトのケースである zip ファイルに Docker イメージ情報を配置するのではなく、zap UI スキャンをテストするためにユーザーのカスタム UI Docker イメージを使用します。 zap-custom-ui-image は、カスタム UI テスト・イメージを使用するように ZAP UI スキャンを構成するために設定する必要がある環境変数です。