arrow_back

Security Command Center を使用してアプリケーションの脆弱性を特定する

参加 ログイン
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Security Command Center を使用してアプリケーションの脆弱性を特定する

Lab 1時間 15分 universal_currency_alt クレジット: 1 show_chart 入門
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

概要

はじめに

このラボでは、Security Command Center の組み込みサービスの一つである Web Security Scanner を使用して、Python Flask アプリケーションをスキャンし、脆弱性を特定します。Web Security Scanner は、App Engine、Google Kubernetes Engine(GKE)、Compute Engine の各ウェブ アプリケーションにおけるセキュリティの脆弱性を特定します。

このサービスは、アプリケーションをクロールして、開始 URL の範囲内にあるすべてのリンクをたどり、できる限り多くのユーザー入力とイベント ハンドラを実行します。クロスサイト スクリプティング(XSS)、Flash インジェクション、混合コンテンツ(HTTPS 内の HTTP)、古い / 安全ではないライブラリなど、4 つのよくある脆弱性を自動的にスキャンし検出します。

偽陽性率は非常に低く、早期に脆弱性を特定できます。セキュリティ スキャンの設定、実行、スケジュール、管理も簡単です。

シナリオ

Cymbal Bank のロゴ

Cymbal Bank は、米国のリテールバンクで、全米 50 州に 2,000 以上の支店があります。堅牢な支払いプラットフォームを基盤とした包括的なデビットおよびクレジット サービスを提供しています。伝統的な金融サービス機関でありながら、デジタル トランスフォーメーションを推進しています。

Cymbal Bank は、1920 年に Troxler という名前で設立されました。Cymbal Group 独自の ATM への積極的な投資を行っていた Troxler を Cymbal Group が 1975 年に買収しました。Cymbal Bank は、全米をリードする銀行に成長するにつれ、支店での対面サービスと 2014 年にリリースしたアプリを通じオンラインにおいても、カスタマー エクスペリエンスを近代化させることに注力しました。Cymbal Bank は、全国で 42,000 人を雇用し、2019 年には 240 億ドルの収益をあげました。

Cymbal Bank は、Google Cloud 技術を使った法人顧客向けの新しいバンキング アプリケーションの開発に関心を持っています。アプリケーションのセキュリティは、非常に重要であり、CTO は Google Cloud により、セキュリティの脆弱性をどのように特定し、軽減できるのかを知りたいと考えています。あなたは Cloud Security Engineer として、Security Command Center 最新のアプリケーション脆弱性スキャンのデモンストレーションを任されました。

目標

このラボでは、次のタスクを行います。

  • Compute Engine インスタンスで、脆弱性のある Python Flask アプリケーションを起動する

  • Web Security Scanner でアプリケーションをスキャンし、脆弱性を検出する

  • アプリケーションの脆弱性を修復する

  • アプリケーションを再度スキャンし、脆弱性が修復されたことを確認する

設定と要件

各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。

  1. Qwiklabs にシークレット ウィンドウでログインします。

  2. ラボのアクセス時間(例: 1:15:00)に注意し、時間内に完了できるようにしてください。
    一時停止機能はありません。必要な場合はやり直せますが、最初からになります。

  3. 準備ができたら、[ラボを開始] をクリックします。

  4. ラボの認証情報(ユーザー名パスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。

  5. [Google Console を開く] をクリックします。

  6. [別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
    他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。

  7. 利用規約に同意し、再設定用のリソースページをスキップします。

タスク 1. 仮想マシン(VM)を起動し、脆弱性のあるアプリケーションをデプロイする

このタスクでは、Cymbal Bank の CTO に、アプリケーションの脆弱性をデモンストレーションするため、インフラストラクチャを設定します。具体的には、VM をデプロイして、アプリケーション コードを入手し、Web Security Scanner で後ほど検出する脆弱性を取り込みます。このアプリケーションは、ユーザーの入力を受け取り、変更を加えずそのまま出力するシンプルなアプリケーションです。

  1. Google Cloud コンソールのタイトルバーで、「Cloud Shell をアクティブにする」アイコン(Cloud Shell をアクティブにするアイコン)をクリックします。プロンプトが表示されたら、[続行] をクリックします。

  2. 脆弱性のあるウェブ アプリケーションのスキャンに使用する、静的 IP アドレスを作成します。

gcloud compute addresses create xss-test-ip-address --region=us-central1
  1. 次のコマンドを実行して、生成した静的 IP アドレスを出力します。

gcloud compute addresses describe xss-test-ip-address \ --region=us-central1 --format="value(address)"
  1. IP アドレス(出力結果に 1 行で表示)をコピーし、メモ帳に保存します。

  2. 次のコマンドを実行し、脆弱性のあるアプリケーションを起動させるための VM インスタンスを作成します。

gcloud compute instances create xss-test-vm-instance \ --address=xss-test-ip-address --no-service-account \ --no-scopes --machine-type=e2-micro --zone=us-central1-b \ --metadata=startup-script='apt-get update; apt-get install -y python3-flask'

この起動スクリプトにより、ウェブ アプリケーション フレームワークである Python Flask がインストールされます。これを使い、Python アプリケーションを実行し、ウェブ アプリケーション セキュリティによくある脆弱性である、クロスサイト スクリプティング(XSS)をデモンストレーションします。

  1. 脆弱性のあるアプリケーションにアクセスするため、Web Security Scanner のファイアウォール ルールを開きます。Web Security Scanner がアプリケーションをスキャンするソースの範囲に注意してください。

gcloud compute firewall-rules create enable-wss-scan \ --direction=INGRESS --priority=1000 \ --network=default --action=ALLOW \ --rules=tcp:8080 --source-ranges=0.0.0.0/0

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 所要の構成で、VM を作成する

  1. ナビゲーション メニューを開き、[Compute Engine] > [VM インスタンス] を選択します。

  2. 次に、インスタンスの隣にある [SSH] ボタンをクリックします。

Cloud コンソールの SSH ボタン

これにより、新しいウィンドウで VM インスタンスへの SSH 接続が開きます。

  1. この SSH ウィンドウで(Cloud Shell ではありません)、次のコマンドを実行して、脆弱性のあるウェブ アプリケーションのファイルをダウンロードし展開します。

gsutil cp gs://cloud-training/GCPSEC-ScannerAppEngine/flask_code.tar . && tar xvf flask_code.tar
  1. 次のコマンドを実行して、アプリケーションをデプロイします。

python3 app.py
  1. その後すぐに、アプリケーションが稼働していることを示すメッセージが表示されるはずです。

* Serving Flask app "app" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
  1. 先ほどメモ帳にコピーした VM の静的 IP アドレスを準備します。

  2. 以下の URL フィールドの YOUR_EXTERNAL_IP をその IP アドレスに置き換え、新しいブラウザタブでその URL を開きます。

http://<YOUR_EXTERNAL_IP>:8080
注: 外部 IP アドレスは、Google Cloud コンソールでも確認できます。VM インスタンスに関連するフィールドとして表示されています。
  1. ウェブフォームを備えた Cymbal Bank の法人向けバンキング ポータルが表示されます。

  2. ウェブフォームに、次の文字列を入力します。

<script>alert('This is an XSS Injection')</script>
  1. [POST] ボタンを押します。

次のような警告ウィンドウが表示されます。

ブラウザに表示された警告ウィンドウ

これはウェブ アプリケーションによくある脆弱性、クロスサイト スクリプティングの脆弱性です。クロスサイト スクリプティング(XSS)は、攻撃者がアプリケーションの環境を利用して、ユーザーのブラウザで、悪意のあるスクリプトを実行することを可能にする脆弱性です。ブラウザは、文字列を正当な JavaScript として解釈し、実行してしまいます。

XSS のバグを悪用する攻撃者は、HTML ページに JavaScript を注入することで、そのページを訪れたユーザーのログイン セッションに事実上無制限にアクセスできるようになります。ユーザーデータを盗んだり、改ざんしたり、プライバシーやセキュリティ設定を変更したり、あるいはプロダクトの見た目や動作を完全に変えてしまうこともあります。アプリケーション内の XSS 脆弱性は、どんなに些細なものであれ、同じドメイン内の他のコンテンツを危険にさらす可能性があります。

これは、Web Security Scanner により特定できる、アプリケーションの脆弱性の一つです。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 VM 上で、脆弱性のあるウェブ アプリケーションのファイルをダウンロードする

タスク 2. Web Security Scanner でアプリケーションをスキャンする

脆弱性のあるアプリケーションを起動できたので、次に Web Security Scanner の機能を CTO にデモンストレーションします。このタスクでは、セキュリティの脆弱性を検出するために、アプリケーションのスキャンを構成し、設定します。

  1. Cloud コンソールを表示しているブラウザタブに戻ります。

  2. ナビゲーション メニューを開き、[セキュリティ] > [Web Security Scanner] を選択します。

  3. [API を有効にする] をクリックして、Web Security Scanner API を有効にします。

有効にすると、Web Security Scanner のページにリダイレクトされます。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Web Security Scanner API を有効にする

  1. [新しいスキャン] をクリックします。

  2. [開始 URL] フィールドには、静的 IP アドレスが事前入力されているはずです。

  3. 次のように、開始 URL にポート番号 8080 を追加します。

http://<EXTERNAL_IP>:8080
  1. [新しいスキャンの作成] 画面のその他のフィールドも確認します。
  • 認証: スキャン中にアプリケーションがスキャナを認証できるよう、アプリケーションに認証情報を提供するため使用するプロパティ。
  • スケジュール: スキャンを自動的に実行するようスケジュールするために使用するプロパティ。
  • Security Command Center へのエクスポート: スキャン終了後、スキャン構成とスキャン結果を Cloud Security Command Center へ自動的にエクスポートするために使用するプロパティ。
  1. [認証] が [なし] に設定されており、[スケジュール] も [なし] に設定されていることを確認します。

  2. [さらに表示] をクリックして、その他の設定も確認します。

  3. [保存] をクリックして、スキャンを作成します。

注: これでスキャンが作成されますが、まだ実行しないでください。まだスケジュールを作成していないため、手動で実行する必要があります。
  1. [実行] をクリックして、スキャンを開始します
注: 想定される検査の数を考慮すると、スキャンには 10 分強かかる可能性があります。
  1. 別ウィンドウで SSH セッションに戻ります。

セッションがタイムアウトした場合は、次のコマンドを実行してアプリケーションを再起動してください。

python3 app.py

SSH ウィンドウで、以下のようなログが生成され始めます。これは、Web Security Scanner が潜在的な脆弱性がないか、すべての URL を検査していることを意味します。

34.29.3.21 - - [23/Mar/2023 23:30:41] "GET /output HTTP/1.1" 200 - 35.184.129.44 - - [23/Mar/2023 23:31:06] "GET /output HTTP/1.1" 200 - 35.184.129.44 - - [23/Mar/2023 23:31:07] "GET /favicon.ico HTTP/1.1" 404 - 34.68.231.45 - - [23/Mar/2023 23:31:09] "POST / HTTP/1.1" 302 - 34.68.231.45 - - [23/Mar/2023 23:31:09] "GET /output HTTP/1.1" 200 - 34.68.231.45 - - [23/Mar/2023 23:31:09] "GET /favicon.ico HTTP/1.1" 404 - 35.184.129.44 - - [23/Mar/2023 23:31:17] "POST / HTTP/1.1" 302 - 35.184.129.44 - - [23/Mar/2023 23:31:17] "GET /output HTTP/1.1" 200 -

次の HTTP ステータス コードを含んだ、ログ ステートメントが表示される場合があります。

  • 200: HTTP サーバーが OK のレスポンスを返し、リクエストが成功したことを示します。
  • 302: Location ヘッダーに基づき、リソースが一時的に別の場所にあることを示します。
  • 404: 1 つ以上のリソースが見つからなかったことを示します。

HTTP ステータスとエラーコードの詳細については、こちらのドキュメントを参照ください。

スキャンが実行されている間、[結果]、[クロールした URL]、[詳細] のタブを自由に確認いただけます。また、Web Security Scanner の詳細については、スタートガイドの動画または脆弱性スキャンの動画をご覧ください。

  1. スキャンの実行が完了すると、[結果] タブにクロスサイトの脆弱性が表示されます。
脆弱性を含む Web Security Scanner の結果

Web Security Scanner は、すべての開始 URL をスキャンし、Cymbal Bank アプリケーションの XSS 脆弱性を検出することができました。このような重要な脆弱性の検出を自動化できることは、Cymbal Bank のようなセキュリティを重視する組織にとって大きな利点です。続いて、Cymbal Bank のアプリケーション コードの脆弱性を修復し、もう一度テストします。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Web Security Scanner のスキャンを実行し、アプリケーションの脆弱性を検出する

タスク 3. 脆弱性を修復し、スキャンを再度実行する

Web Security Scanner が XSS 脆弱性を検出できることを実証できたので、次は、脆弱性を修復し、アプリケーションのスキャンを再度実行します。

  1. VM インスタンスに接続している SSH ウィンドウに戻ります。

  2. Ctrl+C キーを押して、アプリケーションを停止します。

  3. 次のコマンドを実行し、nano エディタを使って app.py ファイルを編集します。

nano app.py
  1. 出力文字列を設定している 2 行を見つけます。

# output_string = "".join([html_escape_table.get(c, c) for c in input_string]) output_string = input_string
  1. 最初の行から # 記号を削除し、次の行の先頭に追加します(コードを適切にインデントするよう注意してください

最終行は次のようになります。

@app.route('/output') def output(): output_string = "".join([html_escape_table.get(c, c) for c in input_string]) # output_string = input_string return flask.render_template("output.html", output=output_string) 注: html_escape_table は、「<」などの特殊な HTML 文字とそのテキスト表現の 1 対 1 の対応関係を保持する辞書です。このテーブルを使用して、特殊な HTML 文字をエスケープすることで、送信されたデータを生のテキストとして、フォームが受け取り、解釈できるようにしています。詳しくはこちらをご覧ください。
  1. 次に、Ctrl+X キー > Y キー > Enter キーと入力し、変更を保存します。

  2. そして、アプリケーションを再度実行します。

python3 app.py
  1. Google Cloud コンソールに戻ります(Web Security Scanner ページは開いたままにしておいてください)。

  2. ページ上部の [実行] をクリックします。

SSH ウィンドウで、ログが表示され始めます。Web Security Scanner がアプリケーションの URL に潜在的な脆弱性がないかテストしていることを意味します。

34.29.3.21 - - [23/Mar/2023 23:30:41] "GET /output HTTP/1.1" 200 - 35.184.129.44 - - [23/Mar/2023 23:31:06] "GET /output HTTP/1.1" 200 - 35.184.129.44 - - [23/Mar/2023 23:31:07] "GET /favicon.ico HTTP/1.1" 404 - 34.68.231.45 - - [23/Mar/2023 23:31:09] "POST / HTTP/1.1" 302 - 34.68.231.45 - - [23/Mar/2023 23:31:09] "GET /output HTTP/1.1" 200 - 34.68.231.45 - - [23/Mar/2023 23:31:09] "GET /favicon.ico HTTP/1.1" 404 - 35.184.129.44 - - [23/Mar/2023 23:31:17] "POST / HTTP/1.1" 302 - 35.184.129.44 - - [23/Mar/2023 23:31:17] "GET /output HTTP/1.1" 200 -
  1. スキャン結果を待つ間、別タブでブラウザを使って URL、http://<EXTERNAL_IP>:8080 にログインしてください。

  2. 再びウェブフォームが表示されるはずです。

  3. このウェブフォームに、以前入力したものと同じ文字列を入力します。

<script>alert('This is an XSS Injection')</script>
  1. [POST] ボタンを押します。

  2. 今回はブラウザに文字列が表示されていることを確認します。

テキスト文字列として表示される入力 注: このテクニックは、今回のような単純なシナリオでは有効ですが、ウェブ アプリケーションを適切に保護するためには、より高度なテクニックやフレームワークを使用する必要があります。それらの詳細は、このラボの範囲外となっています。

その他のリソースについては、以下のリンクをご覧ください。
  1. Google Cloud コンソールの先ほど中断した Web Security Scanner のページに戻ります。

  2. ページ上部の [実行] をクリックし、アプリケーションを再度スキャンします。

  3. 結果には、XSS 脆弱性がもう表示されないはずです。

脆弱性の表示がない Web Security Scanner の出力

これで完了です。Google Cloud の強力な Web Security Scanner ソリューションを使用して、XSS 脆弱性を特定し修復する方法を Cymbal Bank の CTO にデモンストレーションすることができました。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 脆弱性を修復し、Web Security Scanner を使用してアプリケーションを再度スキャンする

お疲れさまでした。

このラボでは、次のタスクを実行しました。

  • 脆弱性のある Python Flask アプリケーションを起動する
  • Web Security Scanner を使用して、アプリケーションをスキャンし、脆弱性を検出する
  • アプリケーションの脆弱性を修復する
  • アプリケーションを再度スキャンし、脆弱性が修復されたことを確認する

ラボを終了する

ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。

ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。

星の数は、それぞれ次の評価を表します。

  • 星 1 つ = 非常に不満
  • 星 2 つ = 不満
  • 星 3 つ = どちらともいえない
  • 星 4 つ = 満足
  • 星 5 つ = 非常に満足

フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。

フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。

Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。