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スキャンを構成するために、以下のパラメータを設定およびカスタマイズすることができます。
| 名前 | タイプ | 説明 | 必須またはオプションです |
|---|---|---|---|
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 |
ストリング | 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 false。 true に設定すると、 DinD, としてZAPを実行します。 false に設定すると、 cluster-name、 ibmcloud-api、
ibmcloud-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-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_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 |
配列 | URL 正規表現の配列で、これらのルートをスキャンしないように ZAP に指示する。 例えば、"globalExcludeUrls": [ "^http://foo.bar$", "^http://john.doe$" ] です。 |
オプション |
authenticationType |
ストリング | リクエストヘッダの認証メカニズム。 サポートされる認証メカニズムは Bearer、 Basic、または ApiKey である。 |
オプション |
apiKey |
ストリング | authenticationType が送信されない場合、このAPIキーは、すべてのリクエストの Authorizationヘッダーに送信されるIAM認証に使用される。 authenticationType が Bearer に設定されている場合、形成されるヘッダーは Authorization: Bearer <apiKey> である。 authenticationType が ApiKey に設定されている場合、形成されるヘッダーは 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-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-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
CCパイプラインのZAPスキャンの設定
次の表は、 CCパイプライン 内でZAPスキャンを実行するために必要な追加パラメータの一覧です。
| 名前 | タイプ | 説明 | 必須またはオプションです |
|---|---|---|---|
app-url |
ストリング | URL ZAPスキャンが実行されるデプロイされたアプリケーションの。 アプリケーションのURL( staging )を使用してください。 |
必須 |
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 |
ストリング | 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スキャンを設定するために必要な環境変数です。