🍠

テナント内の全AOAIリソースがちゃんとオプトアウトできているかを一気に確認するスクリプトを書いてみた話

2024/09/12に公開

はじめに

Azure OpenAI Serviceを利用する際、データプライバシーとセキュリティは非常に重要な要素です。Azure OpenAI ServiceにはAbuse Monitoring(悪用監視)機能があり、これによりリソースの使用状況が監視されます。通常、デフォルトで有効化されているこの機能ですが、必要に応じてMicrosoftが用意している申請フォームから申請を出し、承認が得られれば無効化(オプトアウト)することもできます。

以下の図は、LLMへの入出力データがどのように処理されるかを示しています。
図の真ん中あたりにAbuse Monitoringの話が記載されています。


Abuse Monitoringの概要

この記事では、Azure OpenAIリソースのAbuse Monitoring機能が有効か無効かを一気に確認できるシェルスクリプトを紹介します。特に、多くのサブスクリプションやリソースを持つ環境では、このスクリプトが手間を大幅に削減します。

このスクリプトを作ろうと思った背景

Azure OpenAIリソースのAbuse Monitoringを確認する方法として、Microsoft公式ドキュメントには、GUIベースとAzure CLIベースの2つの方法が紹介されています。しかし、それらの方法は1つ1つのリソースを個別に確認するものであり、大規模なAzure環境では非常に手間がかかるものです。



オプトアウトされているか確認する方法

私のAzure環境では、1つのAzure Entra IDテナント内に数十のサブスクリプションがあり、その各サブスクリプション配下にAzure OpenAIリソースが存在しています。この状況下で、いちいち手動で確認するのは非常に非効率で、確認漏れが発生する可能性も高かったため、スクリプトを用いて自動化し、一気に確認できる方法を考えました。

スクリプトの概要

このシェルスクリプトは、Azureの全てのサブスクリプション内にあるAzure OpenAIリソースに対してAbuse Monitoring(ContentLogging)が無効化されているか(オプトアウトされているか)を一気に確認するものです。複数のサブスクリプションやリソースを管理している場合に、確認漏れを防ぐために非常に有効です。

GitHubリポジトリ

このスクリプトはGitHub上でも公開しています。以下のリポジトリからダウンロードしてご活用いただけます。

Azure OpenAI Abuse Monitoring Checker - GitHubリポジトリ

スクリプトの使い方

前提条件

  1. Azure CLIのインストール
    Azure CLIがインストールされている必要があります。macOSの場合は以下のコマンドでインストールできます。

    brew update
    brew install azure-cli
    
  2. Azureへのログイン
    Azureにログインしておく必要があります。以下のコマンドを実行してAzureにログインします。

    az login
    
  3. スクリプトの実行
    スクリプトをダウンロードした後、実行権限を付与して以下のように実行します。

    chmod +x check_abuse_monitoring.sh
    ./check_abuse_monitoring.sh
    

スクリプトの詳細

このスクリプトは、サブスクリプションごとにAzure OpenAIリソースを取得し、各リソースのContentLogging設定を確認していきます。ContentLoggingfalse(無効化されている、すなわちオプトアウトされている)かどうかを確認し、結果をファイルに保存します。

#!/bin/bash

# 出力ファイル名
output_file="abuse_monitoring_enabled_subscriptions_and_resources.txt"

# 出力ファイルを初期化
> $output_file

# 全サブスクリプションを取得
subscriptions=$(az account list --query "[].id" -o tsv)

for subscription in $subscriptions; do
    # サブスクリプションを設定
    az account set --subscription $subscription

    echo "Checking subscription: $subscription"

    # OpenAIサービスリソースのリストを取得 (kindが"OpenAI"のリソースのみ)
    resources=$(az cognitiveservices account list --query "[?kind=='OpenAI'].{Name:name, ResourceGroup:resourceGroup}" -o tsv)

    if [ -z "$resources" ]; then
        echo "No OpenAI resources found in subscription: $subscription"
        continue
    fi

    any_logging_true=false
    resources_with_logging_enabled=""

    # 各リソースについて確認
    while read -r resourceName resourceGroup; do
        echo "Checking resource: $resourceName in resource group: $resourceGroup"

        # ContentLoggingの確認
        loggingStatus=$(az cognitiveservices account show -n "$resourceName" -g "$resourceGroup" --query "properties.capabilities[?name=='ContentLogging'].value" -o tsv)

        if [[ "$loggingStatus" != "false" ]]; then
            any_logging_true=true
            resources_with_logging_enabled+="$resourceName (Resource Group: $resourceGroup, ContentLogging: $loggingStatus)\n"
        fi
    done <<< "$resources"

    if [ "$any_logging_true" = true ]; then
        echo "Some or all resources in subscription $subscription have ContentLogging set to true or not configured."
        # サブスクリプションIDをファイルに追加
        echo "-------------------------------------" >> $output_file
        echo "Subscription: $subscription" >> $output_file
        echo "Resources with ContentLogging enabled or not configured:" >> $output_file
        # リソース情報を追加
        echo -e "$resources_with_logging_enabled" >> $output_file
        echo "-------------------------------------" >> $output_file
    else
        echo "All resources in subscription $subscription have ContentLogging set to false."
    fi
done

echo "Subscriptions with abuse monitoring enabled and their resources have been saved to $output_file"

出力例

実際にスクリプトを実行すると、以下のように結果が出力されます。

-------------------------------------
Subscription: 12345678-1234-1234-1234-123456789abc
Resources with ContentLogging enabled or not configured:
openai-resource-1 (Resource Group: openai-rg, ContentLogging: )
openai-resource-2 (Resource Group: openai-rg, ContentLogging: )
-------------------------------------

このように、オプトアウトされていないAzure OpenAIリソース名とサブスクリプションidなどが一覧化されて記録されます。

Abuse Monitoringの無効化(オプトアウト)について

Abuse Monitoring(悪用監視)機能は、Azure OpenAIリソースの使用状況を監視するためにデフォルトで有効になっています。しかし、セキュリティやプライバシー、コンプライアンス要件などから、この機能を無効化(オプトアウト)する必要がある場合がエンタープライズ環境では往々にしてあります。無効化することで、リソースの使用状況や入出力データがMicrosoftによって監視されなくなります。

オプトアウトに関する詳細な情報は、Microsoft公式ドキュメントで確認できます。

まとめ

このスクリプトを活用することで、複数のサブスクリプションやリソースを管理している環境でも、Azure OpenAIリソースのAbuse Monitoring設定を効率的に確認できます。手動で1つずつ確認する手間を省き、確認漏れを防ぐことができるため、特に大規模なAzure環境では非常に役立ちます。

データプライバシーとセキュリティに配慮した運用を行うために、定期的な確認をこのスクリプトで自動化し、設定漏れがないかをチェックしてみるのは運用上、ありかもしれません。

合わせて読みたい

以下の記事では、ユーザ側で任意に契約できるようになったPTU(Provisioned Throughput Unit)なモデルによる重課金発生事象が起こっていないかを確認するスクリプトを書いてみた話です。

https://zenn.dev/chips0711/articles/63166e84db8ee4

【免責事項】
本記事は、公開されている情報に基づいて作成されていますが、誤りが含まれている可能性もあります。内容の正確性については、読者ご自身の責任で判断をお願いいたします。

Discussion