Azure DevOpsで簡単に脆弱性診断を行う方法

Kazunori Hamamoto Kazunori Hamamoto
Azure DevOpsで簡単に脆弱性診断を行う方法

はじめに

皆さんが作成したアプリケーションは常に何かしらの攻撃を受ける可能性が存在します。 Azure上でアプリケーションの環境を構築して動作させている状態でも、自分達が作成したアプリケーションに脆弱性が存在すると最悪のケースでは個人情報を取得されたり、信用を失うことになりかねません。

セキュリティを強固なアプリケーション構築を行うには過去の記事でも紹介したことのある「共有責任モデル」を意識したりWAFを導入することは重要です。

作成したアプリケーションに脆弱性が存在するか判断するには今回紹介する 「OWASP ZAP」 を利用するのが簡単です。Azure DevOpsからOWASP ZAPの診断を行うことで、日常的に脆弱性診断を行いアプリケーションに大きな脆弱性を残さないようにしましょう。

OWASP ZAPとは

OWASP ZAPとはOWASP Zed Attack Proxyの略ですが、OWASP財団によって作成されているオープンソースのWEBセキュリティスキャナーです。

Javaで開発されており、Javaが動作する環境であれば無料で実行することができます。また、Docker環境も用意されており。公式ドキュメント内でもGitHub Action経由で実行する例が紹介されています。

OWASP ZAP Dockerの特徴

Dockerファイルは全部で以下の4種類が用意されています。

docker pull owasp/zap2docker-stable

docker pull owasp/zap2docker-weekly

docker pull owasp/zap2docker-live

docker pull owasp/zap2docker-bare

リリース取り込みの順序がそれぞれ違いますが、bareに関しては依存関係を極力すくなくしたCIに適したイメージとなっています。

Docker版のZAPは定義済みのスキャンスクリプトを使って、診断を行いますが3種類のスキャン方法が存在します。

Baseline Scan

デフォルト設定で1分間のURL検出を行い、オプションでajaxスキャンを行うスキャン方法です。CI向けのスキャン方法と位置づけられています。

Full Scan

デフォルト設定で無制限のURL検出を行い、オプションでajaxスキャンを実行し、全てのアクティブスキャンを実行する方法です。

API Scan

ローカルファイルまたはAPIを指定して、OpenAPIまたはGraphQL(2.9.0以降)によって定義されたAPIに対してアクティブスキャンを実行する方法です。

Azure DevOpsからOWASP ZAPを実行する

Azure DevOpsのパイプラインから指定したURLへOWASP ZAPを実行します。 パイプラインに関する記事は公式ドキュメントや以前公開した記事を御覧ください。

今回の方法で必要なものは以下の3つです。

  • DevOpsパイプラインのyamlファイル
  • OWASP ZAPの診断結果XMLをNUnitに変換するxmlテンプレートファイル
  • OWASP ZAPの実行とNUnitレポートに変換するPowershellスクリプト

DevOpsパイプラインのyamlファイル

Dockerをインストールした後にリポジトリ内のPowershellを実行後します。Powershell内で作成したNUnit形式のXMLファイルをテスト結果として指定します。

trigger:
- main

pool:
  vmImage: ubuntu-latest

steps:
- task: DockerInstaller@0
  inputs:
    dockerVersion: '17.09.0-ce'
- task: Bash@3
  inputs:
    targetType: 'inline'
    script: |
            chmod -R 777  ./
- task: PowerShell@2
  inputs:
    filePath: 'run.ps1'
    arguments: $(url)
- task: PublishTestResults@2
  inputs:
    testResultsFormat: 'NUnit'
    testResultsFiles: 'conv-*.xml'
    searchFolder: '$(System.DefaultWorkingDirectory)'

PowerShellファイル

パイプラインの引数で脆弱性チェックをするサイトのURLを指定できるようにしています。OWASP ZAPはStableを利用してBaseScanを実行していますが、必要に応じで随時書き換えたり、パラメータによって変化させることもできます。

param (
    [string]
    $url = $null
)

echo "url = $url"

if ($url -eq $null -or $url -eq "") {
    echo "引数に値がないのでスキップします。"
    echo "パイプラインを手動実行する際にVariablesにurlを追加してください。"
    exit 0
}

$pwd = (Get-Location).Path
$volume = $pwd + ":/zap/wrk/"

$name = $url.Replace(":","").Replace("/","").Replace(".","")
$filename = "$name.xml"

docker run -v $volume -t owasp/zap2docker-stable zap-baseline.py  -t $url -x $filename -j

$XslPath = "$pwd/OWASPToNUnit3.xslt"
$XmlInputPath = "$pwd/$filename"
$XmlOutputPath = "$pwd/conv-$filename"
$XslTransform = New-Object System.Xml.Xsl.XslCompiledTransform
$XslTransform.Load($XslPath)
$XslTransform.Transform($XmlInputPath, $XmlOutputPath)

exit 0

パイプラインを実行

今回は脆弱性診断を行う適当なサイトとしてAzure MarketplaceからWordPressを作成しました。使用したWordPressはこちら

Azure DevOpsのパイプラインを実行する際にURLというValiableを追加してチェックしたいサイトのURLを入力します。

実行後の結果は [Tests] タブから確認できます。今回の例では26件の項目がリストアップされているのが確認できます。

OWASP ZAPの実行結果

各項目の詳細も確認することができるので修正対象か判断する際に利用できます。

OWASP ZAPの結果詳細

各診断結果の詳細はOWASPのALERTSページにも詳細が記載されているので、確認しておきましょう。今回発生したAbsence of Anti-CSRF Tokensに関するページはこちらとなります。

Absence of Anti-CSRF Tokens
https://www.zaproxy.org/docs/alerts/10202/

まとめ

OWASP ZAPを利用すると簡単に脆弱性診断が行えます。CIに組み込んで日常的に確認してもよいですし、リリース前やテストフェーズ前など任意のタイミングで定期的に確認するのも良いでしょう。

実際にOWASP ZAPを実行すると修正対象とならないような事象も検知されますが、実行して認知しておくことは重要かと思います。皆様もお試しになってください。

お問い合わせはこちらから

問い合わせる
TOP