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 スキャンを構成できます。
名前 | タイプ | 説明 | 必須またはオプションです |
---|---|---|---|
cluster-name |
ストリング | DinDで実行されていない場合に、zap スキャナーのデプロイ元および実行元となるクラスターの名前。 | DinDで実行されていない場合、つまり zap-dind が false に設定されている場合は必須です。 |
ibmcloud-api |
ストリング | ZAP クラスターのクラウド環境を指定します。 デフォルトは https://cloud.ibm.com です |
DinDで実行されていない場合、つまり zap-dind が false に設定されている場合は必須です。 |
ibmcloud-api-key |
ストリング | クラスターに ZAP をデプロイするための API キー。 | DinDで実行されていない場合、つまり zap-dind が false に設定されている場合は必須です。 |
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 |
ストリング | 重大度に基づいてアラートをフィルターで除外するには、これを設定します。 可能な値: 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 、 false 。 true に設定すると、ZAP は DinDとして実行され、 false に設定すると、 cluster-name 、 ibmcloud-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.json
、 definitions2.json
などと呼ばれます。
ZAP API スキャンを構成するには、追加のパラメーターが必要です。 これらのパラメーターを設定するには、 trigger_zap_scans
に以下の行を追加します ( set_env <parameter name> <value>
)。
名前 | タイプ | 説明 | 必須またはオプションです |
---|---|---|---|
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 スキャナーに送信される要求を変更します。 要求ペイロードで使用できるパラメーターは、以下のとおりです。
名前 | タイプ | 説明 | 必須またはオプションです |
---|---|---|---|
excludeScanTypes |
配列 | ユーザーが除外したいスキャンのリスト。 選択できるスキャンの完全なリスト: CRLF_Injection 、Buffer_Overflow 、 Directory_Browsing 、 External_Redirect 、 Format_String_Error 、 Parameter_Tampering 、 Remote_File_Inclusion 、
Script_Active_Scan 、 Server_Side_Code_Injection 、 Server_Side_Include 、 SQL_Injection 、 Xpath_Injection 、 XXE_External_Entity 、 SOAP_Action_Spoofing 、
SOAP_XML_Injection 、 Relative_Path_Confusion 、 Remote_OS_Command_Injection 、 ElmahScanRule 、および 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 |
ストリング | 要求ヘッダーの認証メカニズム。 サポートされる認証メカニズムは、 Bearer 、 Basic 、または ApiKey です。 |
オプション |
apiKey |
ストリング | authenticationType が送信されない場合、この API キーは、すべての要求の許可ヘッダーで送信される IAM 認証に使用されます。 authenticationType が Bearer に設定されている場合、形成されるヘッダーは Authorization: Bearer <apiKey> です。 authenticationType が ApiKey に設定されている場合、形成されるヘッダーは Authorization: <apiKey> です。 authenticationType の場合、フィールドは Basic として無視されます。 |
オプション |
username |
ストリング | authenticationType Basic に使用するユーザー名。 |
authenticationType が Basic の場合は必須 |
password |
ストリング | authenticationType Basic に使用するパスワード。 |
authenticationType が Basic の場合は必須 |
資格情報などの機密情報については、ボールトまたはシークレット・ストアからこれらの値を読み取る必要があります。
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 スキャンを構成するために必要なパラメーターは以下のとおりです。
名前 | タイプ | 説明 | 必須またはオプションです |
---|---|---|---|
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>
を追加して、これらの環境値を設定します。
テスト・フレームワークの構成情報を保持するには、テスト・フレームワークの構成情報を格納するフォルダー conf
を uiscripts
ディレクトリー内に作成します。
テスト・フレームワークとして 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 スキャンを実行するために必要な追加パラメーターをリストします。
名前 | タイプ | 説明 | 必須またはオプションです |
---|---|---|---|
app-url |
ストリング | ZAP スキャンが実行されるデプロイ済みアプリケーションの URL 。 アプリケーションの staging URL を使用します。 |
必須 |
repo-url |
ストリング | デプロイされたアプリケーションのリポジトリーの URL 。 | inventory repo に 1 つのアプリケーション・リポジトリーのみからのすべての成果物がある場合は、オプションです。 |
UI テストを zip することなくカスタム UI テスト・イメージを使用するための Zap UI スキャンの構成
以下の表に、カスタム UI テスト・イメージを使用するように ZAP UI スキャンを構成するために必要な追加パラメーターをリストします。
名前 | タイプ | 説明 | 必須またはオプションです |
---|---|---|---|
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 スキャンを構成するために設定する必要がある環境変数です。