Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Azure OpenAI Service 「on your data」 構成でのセキュリティ性を向上させる

こんにちは、igaです。
先日、久しぶりにライブで声を出したらのどが枯れてしまいました。


前回に引き続き、Azure OpenAIのセキュリティを向上させるため、ネットワークのアクセス制限について確認します。
今回は、以前検証した独自データを使用する場合のネットワークのアクセス制限について確認します。

acro-engineer.hatenablog.com

Azure OpenAIの構成

前回の構成で、Azure OpenAIに対してインターネットからのアクセス制限を行いました。

独自データ(原文の表記はon your data)を使用する場合、構築した直後はデータを保持するCognitive Searchがインターネット上のどこからでもREST APIによるリクエストが受信可能な状態になっています。

Cognitive Searchを利用するためには、通常、APIキーが必要になります。
APIキー自体、ランダムな数字と文字で生成されるもので、これだけでもある程度セキュリティは確保できるものの、もし、APIキーが外部に知られてしまうと、想定していない人や環境から、自社のAzure OpenAIにアクセスされてしまいます。

APIキーが万が一漏洩してしまった場合に、前回のAzure OpenAIと同様にCognitive Searchを不正に利用されないようにするため、ネットワークのアクセスを制限します。


ネットワークアクセス制限のポイント

2023年9月時点では、Azure OpenAIがon your dataで利用するCognitive Searchのネットワークアクセスを制限するには、Microsoftへの申請が必要になります。
(以下のページの内容で、「仮想ネットワークのサポート & プライベート エンドポイントのサポート」を参照してください。)
learn.microsoft.com


申請に対しての審査が行われ、審査がOKであれば5営業日以内にメールでAzure OpenAIからのアクセス先URLがメールで連絡されます。

利用までの流れは次のようになります。

①Azure OpenAIをデプロイする
②Azure OpenAI Studioからon your dataの投入を行う
③ネットワークアクセス制限の申請を行う
④Cognitive Searchのネットワークアクセスを制限する
⑤Azure OpenAIのネットワークアクセスを制限する

①Azure OpenAIをデプロイする

こちらの記事を参考に、Azure OpenAIをデプロイします。
Azure OpenAI Service のはじめ方 - Taste of Tech Topics

②Azure OpenAI Studioからon your dataの投入を行う

こちらの記事を参考に、Azure OpenAIにon your dataでデータを登録します。
Azure OpenAI Service 「on your data」 で独自データを使ったチャットを実現する - Taste of Tech Topics

③ネットワークアクセス制限の申請を行う

以下のヘルプにあるように、on your dataを投入したCognitive SearchとAzure OpenAIにアクセス制限を行うための申請を行います。
learn.microsoft.com


申請画面には、Cognitive SearchとAzure OpenAIの情報を記入するようになっています。

Cognitive SearchのリソースIDを指定します。
Cognitive Searchの「プロパティ」を選択して、要点のIDに表示される値をFormに入力します。

Azure OpenAIの場所を指定します。
Azure OpenAIの「概要」を選択して、基本の場所に表示される値をFormに入力します。

これで、申請が通るまで待ちます。

④Cognitive Searchのネットワークアクセスを制限する

Cognitive Searchの「ネットワーク」から「パブリックアクセス」を選択します。
作成した状態では「すべてのネットワーク」が選択された状態になっているため、インターネットからアクセスできる状態になっています。

これを、「選択されたネットワーク」にすることで限られたネットワークからのアクセスに制限します。
「クライアントIPアドレスの追加」を押すことで、Azure Portalを操作しているネットワークからの接続が許可されるので、「保存」を押して設定した情報を反映します。

続いて、「プライベートアクセス」タブを選択すると、申請したCognitive Searchへのプライベートエンドポイントが表示されます。

接続状態が「保留中」になっているため、利用可能な状態にするため「承認」を押します。
承認の確認ダイアログが表示されるので、説明を入力して「OK」を押すとプライベートエンドポイントの接続状態が「承認済み」になり利用できるようになります。


⑤Azure OpenAIのネットワークアクセスを制限する

前回の内容を元にして、Azure OpenAIのネットワークアクセスを制限します。
acro-engineer.hatenablog.com

Azure OpenAIにアクセスするPythonのプログラムで、on your dataを利用するため、dataSourcesオプションを指定します。

import os
import math
import json
import requests

def chat_to_ai():
  api_type = "azure"
  api_base = "https://xxxxx.openai.azure.com"
  api_version = "2023-06-01-preview"  # on your data に対応したAPIバージョンを指定する
  api_key = os.getenv("OPENAI_API_KEY")
  deployment_id = "ChatTest"

  api_url = f'{api_base}/openai/deployments/{deployment_id}/chat/completions?api-version={api_version}'

  req_headers = {
    "Content-Type": "application/json",
    "api-key": f'{api_key}'
  }

  # 問い合わせ内容
  messages = [
      {
          "role":"system",
          "content":"You are an AI assistant that helps people find information."
      },
      {
          "role": "user",
          "content": "SQLインジェクションによる脅威と根本的な対策を教えてください"
      }
  ]

  # on your dataの指定
  dataSources = [
      {
          "type": "AzureCognitiveSearch",
          "parameters": {
              "endpoint": "https://xxxxxxx.search.windows.net",
              "key": "xxxxxxxxxxx",
              "indexName": "on-your-data-index",
              "semanticConfiguration": "",
              "queryType": "simple",
              "fieldsMapping": None,
              "inScope": True,
              "roleInformation": "You are an AI assistant that helps people find information."
          }
      }
  ]

  req_body = {
    "messages": messages,
    "dataSources": dataSources  # On your dataを利用する
  }

  response = requests.post(api_url, headers=req_headers, data=json.dumps(req_body))
  if response.status_code == 200:
    # Azure OpenAIから正常応答が返ってきた場合は、レスポンスBodyをJSON形式に変換して返す
    return json.loads(response.text)
  else:
    # Azure OpenAIから正常応答が返ってこない場合は、Azure OpenAIのレスポンスと同じ構造でHTTPステータスコードを返す
    return {
      'choices': [
        {
          'message': {
            'content': f'error status: {response.status_code}'
          }
        }
      ]
    }

if __name__ == '__main__':
  ai_response = chat_to_ai()

  print(ai_response.get('choices', [{}])[0].get('message', {}).get('content', 'NO_CONTENT'))

このプログラムを動かすと、on your dataに含まれる内容を要約して返してくれます。

プライベートアクセス時の制限

Azure OpenAIのネットワークアクセス制限を行うと、Azure OpenAI StudioからAzure OpenAIに対する操作ができなくなります。
そのため、on your dataのデータ投入を行ってからネットワークアクセスの制限を行うことになります。

まとめ

Azure OpenAIでon your dataを利用するネットワークの制限を行う方法を確認しました。
アクセス制限を行うことで、意図しない利用を避けることができるため、要件に応じて導入を検討してください。



Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Grandmasterと一緒に働きたエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの採用 - Wantedlywww.wantedly.com