Azure OpenAI サービスでマネージド ID を使った認証方法

本記事では、Azure OpenAI Serviceを使ったアプリケーションで、Azure AD 認証とクライアント シークレットを使用してセキュアに API を呼び出す方法について解説します。マネージド ID を使用すると、アプリケーションが Azure AD の資格情報を保持する必要がなく、セキュリティが向上します。

以前の記事「OpenAIとAzure OpenAI Serviceの比較: 10分で出来るOpenAIからのスムーズな移行ガイド」では、API Keyを使う方式でしたが本記事ではAzure ADを使った方式となります。
<h2><span>実装手順の概要</span></h2>
利用に当たり以下の要素が必須となります。
<ul>
 	<li>Azure サブスクリプション</li>
 	<li>ID/Keyを発行用のアプリケーション登録</li>
 	<li>Azure サブスクリプション内の Azure OpenAI サービスへのアクセスの許可</li>
</ul>
この３つを準備した上で、実際のプログラムを記述する必要があります。
<h2>ID/Keyを発行するためのアプリケーションの登録</h2>
プログラムからAzure AD認証をするためには、Azure Active Directory (Azure AD) に新しいアプリケーション登録を作成し、クライアント ID とクライアント シークレットを生成する必要があります。以下に手順を示します。
<ol>
 	<li><strong>Azure ポータルにサインインします:</strong>
<a href="https://portal.azure.com/" target="_new" rel="noopener">Azure Portal</a> にサインインし、自分のアカウントが目的のサブスクリプションにアクセスできることを確認してください。</li>
 	<li><strong>Azure Active Directory に移動します:</strong>
左側のナビゲーションペインで [Azure Active Directory] をクリックします。</li>
 	<li><strong>アプリケーション登録を作成します:</strong>
[アプリの登録] をクリックし、画面上部の [+ 新規登録] をクリックして新しいアプリケーション登録を作成します。必要な情報を入力し、[登録] をクリックして新しいアプリケーションを作成します。
例えば<strong>「openai client」</strong>という名前でアプリケーションを登録しています。</li>
 	<li><strong>クライアント ID 、テナント ID を取得します:</strong>
アプリケーション登録の概要ページで、クライアント ID を確認し、メモしておきます。これが <code>AZURE_CLIENT_ID</code> 環境変数に設定する値です。以下２つの値が必要となるものですので、メモしておきます。
アプリケーション（クライアント）ID　AZURE_CLIENT_ID
ディレクトリ（テナント）ID　AZURE_TENANT_ID
<img src="https://azure-recipe.kc-cloud.jp/wp-content/uploads/2023/04/cap-ad.png" alt="" width="809" height="293" class="alignnone size-full wp-image-18907" /></li>
 	<li><strong>クライアント シークレットを生成します:</strong>
左側のナビゲーションペインで [証明書とシークレット] をクリックし、[クライアント シークレット] セクションに移動します。[新しいクライアント シークレット] をクリックし、必要な情報を入力して新しいシークレットを生成します。クライアント シークレットは、アプリケーションが Azure AD の資格情報を保持する必要がなく、セキュリティが向上します。</li>
 	<li><strong>クライアント シークレットを取得します: </strong>
生成されたクライアント シークレットをすぐにメモしておきます。一度ページを離れると、シークレットの値は表示されなくなります。これが <code>AZURE_CLIENT_SECRET</code> 環境変数に設定する値です。
<img src="https://azure-recipe.kc-cloud.jp/wp-content/uploads/2023/04/cap-ad2.png" alt="" width="803" height="202" class="alignnone size-full wp-image-18908" /></li>
</ol>
これらの値を環境変数に設定することで、<code>EnvironmentCredential</code> が Azure AD に認証できます。

次に、このクレデンシャルが Azure OpenAI サービスなどのリソースにアクセスできるように、適切なロール割り当てとアクセス許可を設定を行います。
<h2>目的の Azure サブスクリプション内の Azure OpenAI サービスへのアクセスの許可</h2>
アクセス許可について説明します。Azure OpenAI サービスへのアクセス許可を設定する方法は次の通りです。
<ol>
 	<li><strong>Azure ポータルにサインイン: </strong>
<a href="https://portal.azure.com/">Azure ポータル</a> にサインインし、自分のアカウントが目的のサブスクリプションにアクセスできることを確認してください。</li>
 	<li><strong>Azure OpenAI サービスに移動:</strong>
左側のナビゲーションペインで [すべてのリソース] をクリックし、目的の Azure OpenAI サービスを選択してください。</li>
 	<li><strong>アクセス許可を設定: </strong>
Azure OpenAI サービスのブレードで [アクセス制御 (IAM)] をクリックします。[ロールの割り当て] タブが表示されます。</li>
 	<li><strong>ロールの割り当てを追加: </strong>
[+ 追加] ボタンをクリックし、[ロールの割り当ての追加] を選択します。新しいロールの割り当て設定画面が表示されます。</li>
 	<li><strong>ロールとメンバーを選択: </strong>
[ロール] ドロップダウンから、適切なロールを選択します。通常、Azure OpenAI サービスを利用する場合、「Cognitive Services Contributor」ロールを選択します。
次に、[メンバーの選択] をクリックし、アクセス許可を付与するユーザー、グループ、またはアプリケーションを検索して選択します。[選択] をクリックして画面に戻ります。
ここで先程Azure AD上に作成したアプリケーション名を選択します。（例：<strong>openai client</strong>）</li>
 	<li><strong>ロールの割り当てを保存: </strong>
画面下部の [保存] ボタンをクリックして、ロールの割り当てを保存します。</li>
</ol>
これにより、選択したメンバーに Azure OpenAI サービスへのアクセス許可が付与されます。これらの手順に従って、Azure Portal から目的の Azure サブスクリプション内の Azure OpenAI サービスへのアクセス許可を設定することができます。
<h2>実装手順</h2>
上記設定が完了した状態で、まずは環境変数の設定を行います。

<strong>Windows の場合:</strong>
コマンドプロンプトや PowerShell を使って、次のように環境変数を設定できます。
<div class="hcb_wrap">
<pre class="prism undefined-numbers lang-bash" data-lang="Bash"><code>setx AZURE_CLIENT_ID "your_client_id"
setx AZURE_CLIENT_SECRET "your_client_secret"
setx AZURE_TENANT_ID "your_tenant_id"</code></pre>
</div>
<strong>Linux/macOS の場合:</strong>
ターミナルを使って、シェルの設定ファイル (.bashrc, .bash_profile, .zshrc など) に次のように環境変数を追加します。
<div class="hcb_wrap">
<pre class="prism undefined-numbers lang-bash" data-lang="Bash"><code>export AZURE_CLIENT_ID="your_client_id"
export AZURE_CLIENT_SECRET="your_client_secret"
export AZURE_TENANT_ID="your_tenant_id"</code></pre>
</div>
また、今回はDefaultAzureCredentialライブラリを利用するため、事前にインストールが必要です。
<div class="hcb_wrap">
<pre class="prism undefined-numbers lang-python" data-lang="Python"><code>!pip install azure.identity</code></pre>
</div>
<span>プログラムは前回の記事と同様に、OpenAIからAzure OpenAI Serviceへの移行方法を参考に説明します。</span>

OpenAIで作成したプログラムの以下の部分を変更するだけでAzure AD認証に移行できます。

```python
import openai
openai.api_key = "&lt;API-KEY&gt;"

～中略～

   model="gpt-4", # モデル
```

以下がAzure AD認証に変更したときのプログラムとなります。

```python
import openai
from azure.identity import DefaultAzureCredential

# Request credential
default_credential = DefaultAzureCredential()
token = default_credential.get_token("https://cognitiveservices.azure.com/.default")

# Setup parameters
openai.api_type = "azure_ad"
openai.api_key = token.token
openai.api_version = "2023-03-15-preview"
openai.api_base = "https://<RESOURCE-NAME>.openai.azure.com/" 

～中略～ 

    engine="gpt-4", # エンジンはAzure OpenAI Studio内でデプロイした"デプロイ名"
```

<span>API Keyを使う方法に比べて手順は増えますが、クライアント シークレットを使用することでサーバ上にAPI Keyを保存する必要がなく、セキュリティが向上します。</span>
<h2>まとめ</h2>
この記事では、Azure OpenAI Serviceを使ったアプリケーションで、APIキーからAzure AD認証とマネージドIDを使用したセキュアなAPI呼び出し方法への移行方法が解説されています。APIキーの代わりにAzure ADを使用することで、アプリケーションがAzure ADの資格情報を保持する必要がなく、セキュリティが向上します。APIキーは不適切な管理や漏洩によって攻撃者に悪用されるリスクがありますが、Azure ADとマネージドIDを使用することで、そのリスクを軽減できます。さらに、Azure ADは組織全体でアクセス制御を一元管理できるため、セキュリティポリシーの遵守が容易になります。

この記事を参考に、Azure OpenAI Serviceを使用する際にAzure AD認証とマネージドIDを導入して、アプリケーションのセキュリティを強化し、将来的な発展に備えることができます。