Azure Container InstancesへのHTTP接続元を制限してみた

2021.10.02

いわさです。

Azureには、Azure Container Instances(ACI)というサービスがあります。
ACIを使うと、コンテナーイメージを指定するのみでサーバーを一切管理することなくサービスを展開することが可能です。

しかし、このACIはマネージドなセキュリティ設定が特に用意されておらず、パブリック展開されたものは攻撃を受ける可能性があります。
本日はプライベート展開(VNET統合)を使ったデプロイと、その上で特定IPアドレスからのみACIへHTTPアクセス出来るような構成を考えてみましたのでご紹介します。

パブリックなACI

パブリックコンテナーインスタンスの作成はシンプルで、リージョンとサイズ以外だと基本的にはイメージを指定するだけで使い始めることが出来ます。
また、ACIにはデフォルトでクイックスタートイメージが用意されており、この設定を使うと検証用のHTTPサービスなどをすぐ作成出来ます。イメージを用意する必要がありません。

ネットワーク設定はパブリックを設定しておくと、コンテナーインスタンスへ接続出来るパブリックIPアドレスが構成されます。
DNS名ラベルを指定しておくと、FQDNでアクセス出来るようになります。

すぐに起動され、アクセス出来ました。

IPアドレスでの接続も可能です。

しかし、セキュリティレイヤーが何も無いのでこのままだと攻撃を受ける可能性があります。

VNET+Application Gateway+NSGで制御出来る

そこで、ACIのネットワーク設定時にプライベートを選択し、VNETを統合することで、VNETのセキュリティ機能を使うことが出来ます。
ただし、VNETに展開するとパブリックな接続が出来なくなるため、その経路を用意する必要があります。

いくつかのオプションが考えられますが、Azureロードバランサーなどは使うことが出来ません。
ACIのドキュメントにもサポートされてないネットワークシナリオとしてALB(Azure Load Balancer)を配置することはサポートされていません。となっています。

同様に、パブリックIPアドレスを使ってインターネットへ公開することもサポートされていません。

実際に試してみましたが、上記についてはどちらもネットワークインターフェースがバックエンドに必要で、ACIの場合は提供されていませんでした。

ドキュメントには記述がありませんでしたが、対策としてはAzure Application Gatewayを使って経路を用意することが選択肢としてあります。

VNET作成

LinuxコンテナーでACIをVNET統合する場合は、日本リージョンの場合だと東日本が選択肢となります。
西日本は現時点でVNET統合時のリソース制約が該当なしとなっていました。

試しに作成したところエラーになりました。
今回は東日本リージョンにて作成しました。

サブネットは、ACI用とApplication Gateway用と最低2つ用意しておきましょう。

プライベートACIを作成

ネットワークタグで、プライベート->仮想ネットワーク->サブネットを選択しておきます。

デプロイ後、IPアドレスがプライベートであることが確認できました。
もちろん、このままこのIPアドレスで外部から接続することは出来ません。

ただし、今回は試していませんがVNETへのプライベート接続(VPNなど)が用意できれば、Application Gatewayを使わない経路も出来そうです。

外部から接続するためにApplication Gatewayを使う

Azure Application GatewayはL7ロードバランサーです。
VNET統合が出来て、バックエンドプールにIPアドレスの指定が可能なサービスなので今回試してみることにしました。

構成時にACIをデプロイしたVNETを選択します。

パブリックIPアドレスは事前に作成しておいたものでも良いのですが、SKUはApplication Gatewayとあわせておく必要がありますので、その点は注意です。

バックエンドターゲットにACIのプライベートIPアドレスを指定します。
その他は通常のHTTPのバックエンドルールで良いです。あとからカスタマイズすればいいかなと。

デプロイされたら、Application GatewayのパブリックIPアドレスからアクセスしてみましょう。

ACIのコンテンツにアクセスすることが出来ました。

NSG(ネットワークセキュリティグループ)の作成

さらに、IPアドレスの制限を加えてみましょう。
Application GatewayのWAF機能を使って何らかの攻撃対策を行うのもありですが、今回はシンプルにNSGを構成してインバウンドの制限を行います。

まずはNSGを作成してApplicaiton Gatewayをデプロイしたサブネットと関連付けを行います。

受信セキュリティ規則で、特定IPアドレスからのみのHTTPアクセスを許可します。
一点注意点があって、Application Gatewayは65200~65535のGatewayManagerサービスタグの着信トラフィックを許可する必要があります。
Azureインフラストラクチャ間の通信に必要らしく、許可されていない場合はサブネットへの関連付けが出来ません。

受信規則作成後、アクセスして確認してみましょう。
まずは許可されていない接続元の場合です。

期待どおり、接続することが出来ませんでした。
次に、許可された接続元の場合です。

期待どおり、接続することが出来ました。

まとめ

  • ACIでもVNET統合とApplication Gatewayを使うと公開しつつある程度のセキュリティ対策が可能
  • ACIをVNET統合する際は対応リージョンに注意が必要
  • Application GatewayにNSGを関連付ける場合はGatewayManagerサービスタグの通信許可を忘れないようにする