Apache JMeter™でAzure AD認証が必要なAzure App Serviceに対してテストする

Apache JMeter™からAzure ADを認証プロバイダーとしたAzure App Serviceの認証/承認(認可)が施されたWeb Appsに対してテストする方法を紹介します。

Azure App ServiceやAzure Functionsは、その認証/承認機能(Easy Auth)により、Azure Active Directoryでのユーザー認証をかけることができます。
しかし、Apache JMeter™が標準で対応できる認証方式は、ベーシック認証、ダイジェスト認証、Kerberos認証、LDAP認証に限られます。

ここでは、Azure ADを認証プロバイダーとしたAzure App Serviceの認証/承認(認可)が施されたWeb Appsに対してApache JMeter™からテストする方法を紹介します。

なお今回は、access_tokenでの認可をしているため、ログインフローのテストは考慮していません。
ログインがされている状態でのテストと捉えてください。

事前準備

access_tokenを利用したアクセスができるようにするために必要な設定があります。

多要素認証が必要なユーザーでのアクセスには対応できません。
テスト対象のユーザーでは多要素認証をオフにするか、テスト用に多要素認証が不要なユーザーを作成しましょう。

  • アプリケーションのクライアントIDの取得
    App Serviceが連携しているAzure ADアプリケーションのクライアントIDを取得します。
    Azure ADポータル(https://aad.portal.azure.com)の「アプリの登録」でApp Serviceの認証を担っているアプリケーションを選択し、その「概要」で『アプリケーション (クライアント) ID』の値をメモします。
    クライアントIDの取得

  • アプリケーションのクライアント シークレットの取得
    App Serviceが連携しているAzure ADアプリケーションのクライアント シークレットを取得します。
    今回のJMeterテスト用に利用できるクライアント シークレットがない場合は新しく作成します。

    この値は、後に見ることができなくなってしまうので、注意してください。

    アプリケーションの「証明書とシークレット」で「+ 新しいクライアント シークレット」から追加してその値をメモします。
    クライアント シークレットの作成

  • アプリケーションのAPIのアクセス許可
    アプリケーションの「API のアクセス許可」で 『Microsoft Graph > User.Read』に対して管理者の同意が付与されていることを確認します。
    付与されていない場合は「✓ {組織}に管理者の同意を与えます」から管理者の同意を付与します。
    APIのアクセス許可

  • ログインするユーザーとパスワードのリストを作成
    JMeterからテストログインするユーザーとパスワードのリストをCSVファイルとして作成します。

    {USER01}@{DOMAIN}.onmicrosoft.com,{PASSWORD for USER01}
    {USER02}@{DOMAIN}.onmicrosoft.com,{PASSWORD for USER02}
    {USER03}@{DOMAIN}.onmicrosoft.com,{PASSWORD for USER03}
    {USER04}@{DOMAIN}.onmicrosoft.com,{PASSWORD for USER04}
    {USER05}@{DOMAIN}.onmicrosoft.com,{PASSWORD for USER05}
    :
    

    もちろん独自ドメインのアカウントも利用できます。

  • Microsoft Azure用プラグインを導入
    リクエストする際のAuthorizationヘッダーを作成するために、Microsoft Azure plugin for Apache JMeter™を導入します。

    1. プラグインをダウンロード
      Webブラウザを利用して以下のページから最新のプラグイン(jmeter-plugins-functions-azure-{version}.jar)をダウンロードします。
      https://github.com/pnopjp/jmeter-plugins/releases
      コンソールで以下のようなコマンドを実行することでもダウンロードすることができます。

      $ wget -O jmeter-plugins-functions-azure-{version}.jar https://github.com/pnopjp/jmeter-plugins/releases/download/v{version}/jmeter-plugins-functions-azure-{version}.jar
      
    2. ダウンロードしたファイルをJMeterのプラグイン用ディレクトリに配置
      先ほどダウンロードしたjarファイルを $JMETER_HOME/lib/ext にコピーします。

      $ cp jmeter-plugins-functions-azure-{version}.jar /usr/local/jmeter/lib/ext
      
    3. JMeterを起動または再起動します。

テストプランの作成

  1. CSVファイルからユーザーリストの読み込み
    Test Planに"CSV Data Set Config"を追加し、先ほど作成したCSVファイルからユーザーとパスワードを読み込みます。
    Add (追加) > Config Element (設定エレメント) > CSV Data Set Config
    CSV Data Set Config

    • Filename: CSVファイル名
    • Variable Names (comma-delimited): username,password
  2. Azure ADアプリケーションの情報を変数として定義
    Test Planに"ユーザー定義変数"を追加し、App Serviceが認証として利用しているAzure ADアプリケーションの情報を登録します。
    Add (追加) > Config Element (設定エレメント) > User Defined Variables (ユーザー定義変数)

    “User Defined Variables (ユーザー定義変数)“は、同じ表記のものが2つ表示されますが、おそらく上側のものです。
    追加するとその表のヘッダに"Name (名前)、Value (値)、Description"の3列が表示されます。

    ユーザー定義変数

    • tenent_id: Azure ADのドメイン名 (ex. demoaadtenant.onmicrosoft.com, example.com)
    • client_id: 事前準備で確認したAzure ADアプリケーションのクライアントID
    • client_secret: 事前準備で確認したAzure ADアプリケーションのクライアント シークレット
  3. スレッド グループを作成
    Test Planに"スレッド グループ"を追加します。
    Add (追加) > Threads (Users) > Thread Group (スレッド グループ)
    ユーザーを変えながらアクセスするために、「Number of Threads (users) (スレッド数)」と「Loop Count (ループ回数)」に適当な値を入力します。
    スレッド グループ

  4. HTTPリクエスト サンプラーを追加
    スレッドグループに"HTTP リクエスト"を追加します。
    Add (追加) > Sampler (サンプラー) > HTTP Request (HTTP リクエスト)
    HTTP リクエスト

    • Web Server (Webサーバー)
      • Protocol [http] (プロトコル): https
      • Server Name or IP (サーバー名または IP): Azure AD認証を施している対象のWeb Appsアドレス (ex. authdemo.azurewebsites.net)
    • HTTP Request (HTTP リクエスト)
      • Method: 任意
      • Path (パス): アクセスする認証が施されているページへのパス (ログインユーザー名などが表示されるページだと、アクセス毎のログインユーザーがわかります。)
  5. リクエストヘッダーを追加
    追加したHTTP リクエスト サンプラーに"HTTP ヘッダマネージャ"を追加します。
    Add (追加) > Config Element (設定エレメント) > HTTP Header Manager (HTTP ヘッダマネージャ)
    HTTPリクエストのヘッダ

    • Headers Stored in the Header Manager (ヘッダーマネージャに保存されているヘッダ)
      • Authorization: Bearer ${__AzAdAccessToken(${tenant_id},password,${client_id},${client_secret},${username},${password})}
  6. 実行結果を参照するリスナーを追加
    Test Planかスレッドグループに"View Results Tree (結果をツリーで表示)“リスナーを追加します。
    Add (追加) > Listener (リスナー) > View Results Tree (結果をツリーで表示)

実行して結果を確認

Run (実行) > Start (開始) でテストを実行し、結果の"HTTP Request"を選択して、“Response data"タブの"Response headers"タブを表示します。
ここで “200 OK” が返ってきていることを確認します。
Response headers

ユーザー名などが表示されるページにアクセスしているのであれば、“Response Body"タブも見ると良いでしょう。
Response body
※ この画像のResponse Bodyは以下のphpページにアクセスした場合の例です。

<?php
echo "Hello " . $_SERVER['LOGON_USER'];
?>

https//~/.auth/me にアクセスすることで、一般的にはログインユーザーの詳細情報を取得することができますが、今回の手順ではそれが空の値を返す場合もあるようです。

テスト後の片付け

事前準備で、クライアント シークレットを作成した場合はその削除、アプリケーションのAPIのアクセス許可に管理者の同意を付与した場合はその剥奪、もしもテスト用のユーザーを作成した場合はその削除など、テストのために変更した設定をもとに戻しましょう。

以上、今回は、Apache JMeter™からAzure ADを認証プロバイダーとしたAzure App Serviceの認証/承認(認可)が施されたWeb AppsWeb Appsに対してテストする方法を紹介しました。

Azure Functionsに対しても同様の設定でテストできるはずですので、興味のある方は試してみてください。

【宣伝】
AzureでJMeterを使うなら簡単構築Load Tester Powered by Apache JMeter™