はじめに
こんにちは、ACS事業部の吉川です。
みなさま、Azure OpenAI Service、お使いになられていますでしょうか。
先日、Azure OpenAI Serviceの認証に関する以下の記事を投稿しました。
今回はセキュリティに関するもうひとつの観点である、ネットワークアクセスの制限についての投稿です。
インターネット向けアクセス制限
Azure OpenAI Serviceのネットワーク制限は、リソースを作成する際の以下画面、
もしくは作成後のNetworkingメニューから設定できます。
デフォルトの状態では「インターネットを含むすべてのネットワークがこのリソースにアクセスできます。」が選択されています。これはAPIエンドポイントを知っていて認証を突破できれば どこからでもAzure OpenAIを利用できてしまう ことを意味します。ちょっとした検証目的ならともかく、本格的にサービスに組み込んで利用する場合には避けるべきでしょう。
最もわかりやすい設定として、アクセス元のパブリックIPアドレス範囲を基にアクセス制限ができます。
リソース作成後の画面で解説しますが、許可するアクセス元
欄で Selected Networks and Private Endpoints
を選択します。そうすると、許可されたアクセス元以外からのアクセスは拒否される ようになります。その上で、ファイアウォール
欄にIPアドレスもしくはCIDRを入力することで、入力されたIPアドレス/CIDRからのアクセスのみが許可されるようになります。Azure OpenAIを利用するアプリケーションのアウトバウンドIPが固定されているのであれば、最もシンプルな設定となります。
Azure VNet向けアクセス制限1 - サービスエンドポイント
アクセス元がAzureの仮想ネットワーク(VNet)であれば、パブリックIPアドレス以外の方法でも制限が可能です。
大きく2つの設定方法が存在しますが、まず1つ目の サービスエンドポイント からご紹介します。これは 特定のサブネットからのアクセスを許可する という機能です。
サービスエンドポイントの設定は以下のように行います。
パブリックIPアドレスでの制限の手順と同様、許可するアクセス元
欄で Selected Networks and Private Endpoints
を選択します。仮想ネットワーク
欄で対象のサブネットを設定します。既に存在するサブネットを利用する場合は + 既存の仮想ネットワークを追加
、新しくVNet/サブネットを作成する場合は + 新しい仮想ネットワークを追加
をクリックします。
既存の仮想ネットワークを追加 の場合は以下のように既存のVNet/サブネットを選択する画面が表示されます。
新しい仮想ネットワークを追加 の場合は以下のようにIPレンジなどの情報を入力しVNetを作成していきます。
サブネット単位でしか設定できないという制限はありますが、サービスエンドポイントは無料で使えるという点がポイントです。
Azure VNet向けアクセス制限2 - プライベートエンドポイント
もう1つのVNet向けアクセス方式が プライベートエンドポイント です。
これはVNetの中にネットワークインターフェースを作成することで、クライアントとAzure OpenAIをプライベートIPアドレスで通信できるようにする仕組みです。
サービスエンドポイントと比べた大きな利点として、直接VNetに接続されることでネットワーク設計の幅が広がります。わかりやすいメリットとしては、Site to Site VPNやExpressRouteで接続したオンプレミス環境からもプライベート接続が可能 になります。
デメリットとしては、サービスエンドポイントと違い有料のサービスであることです。時間あたりの費用とデータ処理量に基づく費用が発生するため、利用にあたっては以下サイトを見つつ費用を見積もっておきましょう。
設定は Networking
の上部の Private endpoint connections
から行います。+ Private Endpoint
をクリックして新規接続を作成します。
作成の最初の画面ではプライベートエンドポイントとネットワークインターフェースの名前をそれぞれ設定します。
なお、ここでのリージョンは接続先のVNetと同じリージョンを指定します。Azure OpenAIと接続先のVNetは 別リージョンに存在していても問題ありません 。モデルの都合でEast USなどの海外リージョンでAzure OpenAIを作成したとしても、日本リージョンのVNetに問題なく接続可能です。
2つ目の画面では特に設定する箇所はありません。デフォルトのまま次に進みましょう。
3つ目の画面で接続先のVNet/サブネットを指定します。サブネットは予め作成しておきましょう。最低28ビットのサイズが必要です。
Network Security Group(NSG)によるアクセス制御を併用したい場合は、ポリシーで有効化する必要があります。ほぼ必須かと思いますので忘れずに有効化しておきましょう。
4つ目の画面はDNSの設定です。
プライベートエンドポイントはプライベートIPによる通信を可能としますが、Azure OpenAIとの接続時にはIPアドレスではなく必ずドメイン名(*.openai.azure.com)でアクセスする必要があります。
ドメイン名をプライベートIPに名前解決するための Private DNS Zone を作成するのがこの工程です。デフォルトのまま進めればOKです。
Private DNS ZoneはAzure VNet内でしか機能しないので、VPN / ExpressRouteで接続されたオンプレミス環境で利用する場合はAzure DNS Private Resolverの利用も検討しましょう。以下記事で解説されています。
あとは必要に応じてタグを付けて完了です。完了すると以下のように3つのリソースが作成されていることが確認できます。
同一VNet内に存在するVMから名前解決をしてみると、プライベートIPアドレスが引かれていることが確認できます。
$ nslookup hogefuga.openai.azure.com Server: 127.0.0.53 Address: 127.0.0.53#53 Non-authoritative answer: hogefugaopenai.azure.com canonical name = hogefuga.privatelink.openai.azure.com. Name: hogefuga.privatelink.openai.azure.com Address: 10.0.1.4
プライベートエンドポイントを設定してもパブリックからのアクセスを封鎖していなければ片手落ちです。不必要な経路は忘れずにブロックしておきましょう。下記のように 許可するアクセス元
を 無効
とした場合は プライベートエンドポイント経由の接続のみが許可されます。
また、プライベートエンドポイントはデフォルト状態だとVNet内全てからのアクセスを受け付けてしまいます。NSGをサブネットに適用し、必要なアクセス元だけに絞る受信規則を作成するとよいでしょう。
どう使い分ければよいか?
3つの設定について解説しましたが、どのように使い分ければよいでしょうか。大まかにですが、Azure OpenAIのクライアントとなるアプリケーションの利用シーンごとに以下のように分類してみました。
- AWSなどAzure以外の環境でアプリケーションを動かしている
- パブリックIPアドレスが特定できない → ネットワークの制限はなしで認証のみで制限する(極力このパターンは避けるべき)
- パブリックIPアドレスが特定できる → パブリックIPで制限する
- Azure VNetとVPN or ExpressRoute接続ができる → プライベートエンドポイント+NSGを利用する
- Azure上でアプリケーションを動かしている
- VNetに接続できないPaaS/プランを利用している → パブリックIPで制限する
- VNetに接続可能、極力コストを抑えたい → サービスエンドポイントを利用する
- VNetに接続可能、しっかり制御したい → プライベートエンドポイント+NSGを利用する
例外もあるでしょうが、設計指針の参考にしてみてください。
おわりに
認証だけじゃなく、ネットワーク観点でもセキュアにAzure OpenAIを使っていきましょう。
本記事で紹介した各機能は、AzureのPaaSでは一般的な設定です。他のAzureサービスでも利用可能な知識なので、Azure初見の人はこれを機にいろいろ使ってみてください。
【PR】
私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。