Tenable Web App Scanning CI/CD アプリケーションスキャンの概要

Tenable Web App Scanning Docker イメージを継続的インテグレーションおよび継続的デリバリ/継続的デプロイメント (CI/CD) ツールとしてデプロイし、マージ前にソフトウェア上で Tenable Web App Scanning スキャンを実行することができます。アプリケーションのライフサイクルの任意の時点で CI/CD のアプリケーションとサービスをスキャンすることで、脆弱性をできるだけ早く発見し、セキュリティスタンスを大幅に改善できます。

始める前に

  • CI/CD ビルドシステムが Docker コンテナの使用をサポートしていることを確認してください。

注意: CI/CD ビルドのスキャンは、一度に 1 つのスキャンに制限されています。

Tenable Web App Scanning の Docker イメージによる CI/CD ビルドのスキャン

  1. 左上にある メニュー ボタンをクリックします。

    左側にナビゲーションプレーンが表示されます。

  2. 左側のナビゲーションプレーンで、 [統合] をクリックします。

    [統合] ページが表示されます。

  3. 左側のナビゲーションプレーンで、統合のタイプを選択します。

  4. Tenable Web App Scanning ユーザーインターフェースでスキャンを見つけます。

    注意: [スキャナータイプ] および [スキャナー] フィールドは CI/CD スキャンには適用されないため、デフォルト設定のままにしておく必要があります。

    注意: CI/CD パイプラインに統合するためにスキャンを設定する場合、Tenable では、ランタイムが比較的短いスキャンテンプレートを選択して、ビルドプロセスの潜在的な遅延を回避することを推奨しています。詳細については、[スキャンテンプレート] セクションを参照してください。

    注意: ターゲットのホスト名が本番アプリケーションとは異なるものであることを確認してください。そうすることで、ビルド中に見つかった脆弱性と、本番アプリケーションの脆弱性との混在を防ぐことができます。

  5. 選択したスキャンのスキャン設定をスキャンパイプラインステージにエクスポートします。

    [スキャン] ページで、選択したスキャンの 多く表示 ボタンをクリックし、[CI/CD 用にエクスポート] を選択します。

  6. スキャン設定ファイルを Git リポジトリにアップロードします。

  7. (オプション) 設定ファイルで 認証スキャンの編集 を作成します。

  8. API キーを生成します。

    注意: API キーがない場合は、[アカウント] ページで生成できます。詳細は、API キーを生成する を参照してください。

  9. 生成した API キーを優先シークレットストレージプロバイダーにコピーします。

    警告: Tenable では、スキャナーを Tenable にリンクするために使用される API キーや、スキャン対象のウェブアプリに認証するためにスキャナーが使用するユーザー名/パスワードの組み合わせなどの、機密情報を非表示にするという対策を常に講じることを推奨しています。これらはソースコントロールには含めず、リポジトリまたは使用中の継続的インテグレーションツールが提供する安全なストレージに保管してください。

  10. 次の手順を実行してスキャンを実行します。

    docker pull tenable/was-scanner:latest docker run -e WAS_MODE=cicd -e ACCESS_KEY=${TENABLE_IO_ACCESS_KEY} SECRET_KEY=${TENABLE_IO_SECRET_KEY} -v ./:/scanner tenable/was-scanner:latest
  11. vulnerability_threshold フィールドパラメーターを [重大][高][中]、または [低] に設定します。

    注意: このフィールドに設定したしきい値によって、ビルドがしきい値を満たすかどうかに応じて、ビルドの合格または不合格が決まります。スキャンエラーまたは設定が不完全なために、ビルドが失敗することもあります。

  12. (オプション) 以下の CI/CD パイプラインワークフローファイル セクションで説明されているように、CI/CD 統合に必要なパイプラインワークフローファイルの特定のアウトラインに従います。

  13. [スキャン] ページで選択したスキャンに移動して、結果を確認します。

  14. (オプション) ログを取得します。後述のレポートとログセクションを参照してください。

注意: スキャナー Docker イメージは、ホストと Docker コンテナ間のシームレスなファイル交換のために /scanner ディレクトリを使用します。リポジトリにある tenable_was.conf ファイルをマウントするには、docker run コマンドで -v $PWD:/scanner を使用します。設定ファイルがリポジトリのトップレベルにある場合、スキャン後にこのディレクトリから tenable_was_scan.html および scanner.log ファイルを取得できます。

認証スキャンの編集

スキャン設定を作成しそのスキャンに認証情報を追加するときに、エクスポートした CI/CD ファイルの認証情報を編集することもできます。エクスポートされた tenable_was.conf ファイルでは、これらの認証情報 (パスワード、認証トークンなど) に関連する機密情報の代わりに、プレースホルダーテキストが含まれる場合があります。たとえば、${?USER_PASS_PASSWORD} ${?USER_PASS_USERNAME} は、次のサンプルファイルのプレースホルダーです。

注意: ログインフォーム、Cookie 認証、API キーの認証方法では、認証スキャンを編集する必要があります。
scan { credentials { "user_pass" { "auth_type"=auto password=${?USER_PASS_PASSWORD} username=${?USER_PASS_USERNAME} } }

Docker イメージを実行する場合、これらのプレースホルダーは、スキャナーが実際の値を取得する環境変数を表します。そのため、これらの環境変数が存在することを確認してください。前の例では、次の例に示すように、これらの値を入力するために必要な環境変数を使用して docker イメージを実行します。

`docker run -e WAS_MODE=cicd -e USER_PASS_USERNAME=<the username here> -e USER_PASS_PASSWORD=<the password here> ..etc, etc`

値がキーおよび値の両方として機能する場合は、対応するキーと値のペアを含む JSON オブジェクトとして値を提供する必要があります。たとえば、ウェブアプリケーションでログインフォーム認証を使用し、「ユーザー名」や「パスワード」などのフィールド名と値の両方が必要な場合は、次のように設定する必要があります。

scan { credentials { "login_form" { "auth_headers"=${?LOGIN_FORM_AUTH_HEADERS} "login_check"=Welcome "login_check_pattern"=Welcome "login_check_url"="http://app:3000/home.html" "login_parameters"=${?LOGIN_FORM_LOGIN_PARAMETERS}; } }

次の入力例を使用できます。

`docker run -e WAS_MODE=cicd -e LOGIN_FORM_LOGIN_PARAMETERS=’{“username”: “my_username”, “password”:”my_password”}’-e LOGIN_FORM_AUTH_HEADERS=’{}’ …etc, etc`
注意: 値が空の場合でも、すべてのプレースホルダー値に値が存在することを確認してください。

CI/CD パイプラインワークフローファイル

原理を理解すると、パイプラインワークフローファイルの設定を利用可能な多くのツールに適用できます。以下は、Jenkins のパイプラインワークフローファイルの例です。

pipeline { agent any stages { stage('build-run-scan') { environment { ACCESS_KEY = credentials('ACCESS_KEY') SECRET_KEY = credentials('SECRET_KEY') } steps { sh ''' docker pull swaggerapi/petstore docker run -d -e SWAGGER_URL=http://petstore:8080 -e SWAGGER_BASE_PATH=/v2 --name petstore swaggerapi/petstore docker pull tenable/was-scanner:latest docker run -v $(pwd):/scanner -t -e WAS_MODE=cicd -e ACCESS_KEY=${ACCESS_KEY} -e SECRET_KEY=${SECRET_KEY} --link petstore tenable/was-scanner:latest ''' } } } post { always { sh ''' docker rm $(docker stop $(docker ps -a -q --filter ancestor="tenable/was-scanner:latest" --format="{{.ID}}")) || true docker rm $(docker stop $(docker ps -a -q --filter ancestor="swaggerapi/petstore" --format="{{.ID}}")) || true docker system prune -f --volumes ''' archiveArtifacts 'scanner.log' publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: true, reportDir: '', reportFiles: 'tenable_was_scan.html', reportName: 'WAS Report']) cleanWs() } } }

レポートとログ

各ビルドの後に、コンソール出力、HTML レポート (tenable_was_scan.html)、およびスキャナーログファイル (scanner.log) を生成できます。コマンドラインを使用して、HTML レポートとスキャナーログをアーカイブします。これらは各 CI/CD ツールに固有です。ビルド完了後のコンソール出力は、ビルドの合否、および考えられる原因を示します。HTML レポートは、tenable-was.conf ファイルに入力した vulnerability_threshold に基づいて詳細なスキャン結果を示します。

注意: Tenable では、スキャナーログがデバッグに役立つ可能性があるため、スキャナーログを保持することを推奨しています。

Jenkins パイプラインワークフローファイルのアーカイブコマンドラインの例

archiveArtifacts 'scanner.log' publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: true, reportDir: '', reportFiles: 'tenable_was_scan.html', reportName: 'WAS Report']

コンソール出力の例

HTML レポートの例

CI/CD ツールの統合の例