🥦

【Azure】NSG(ネットワークセキュリティグループ)を使ってみる

2024/03/05に公開

構成図

NSGを使って特定のサブネットからのアクセスのみを許可するように設定してみます。

仮想ネットワーク(VNet)とサブネットを作成する

構成図の通り、Azure Portalから下記2つの仮想ネットワークを作成します。

VNetA
仮想ネットワーク名 VNetA
地域 Japan East
IPアドレス 10.1.0.0/16
1つ目のサブネットのIPアドレス(subnetA-1) 10.1.0.0/24
2つ目のサブネットのIPアドレス(subnetA-2) 10.1.1.0/24
VNetB
仮想ネットワーク名 VNetA
地域 Japan East
IPアドレス 10.2.0.0/16
サブネットのIPアドレス(subnetB-1) 10.2.0.0/24

ACIを作成する

作成した各サブネット内に配置するACIを作成します。

コンテナインスタンスA1
コンテナ名 testcontainera001
地域 Japan East
イメージのソース クイックスタート イメージ
イメージ mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine(Linux)
サイズ 1vcpu,1.5Gibメモリ,0gpu
ネットワークの種類 プライベート
仮想ネットワーク VNetA 先ほど作成した仮想ネットワークA
サブネット SubnetA-1(10.1.0.0/24)
ポート 80 / TCP
コンテナインスタンスA2
コンテナ名 testcontainera002
地域 Japan East
イメージのソース クイックスタート イメージ
イメージ mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine(Linux)
サイズ 1vcpu,1.5Gibメモリ,0gpu
ネットワークの種類 プライベート
仮想ネットワーク VNetA 先ほど作成した仮想ネットワークA
サブネット SubnetA-2(10.1.1.0/24)
ポート 80 / TCP
コンテナインスタンスB1
コンテナ名 testcontainerb001
地域 Japan East
イメージのソース クイックスタート イメージ
イメージ mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine(Linux)
サイズ 1vcpu,1.5Gibメモリ,0gpu
ネットワークの種類 プライベート
仮想ネットワーク VNetB 先ほど作成した仮想ネットワークB
サブネット SubnetB-1(10.2.0.0/24)
ポート 80 / TCP

VNetAとVNetBをピアリングする

https://zenn.dev/shimiyu/articles/465a7fd46d0dde

【Azure】VNetピアリングを試してみるをご参照ください。

NSG(ネットワークセキュリティグループ)を設定する

さて、VNetAとVNetBがピアリング済みですので、現段階ではVNetAのACI1およびACI2からVNetBのACI1への通信は可能です。

ここで、サブネットBに特定のIPアドレスからのアクセスのみを許可するNSGを設定します。

これによって、VNetBのACI1にはVNetAのACI1からのみ通信が可能となります。

NSGを作成する

VNetAのSubnetA-1のIPアドレスのみ通信を許可するNSGを作成します。

基本
名前 subnetb001-nsg
場所 Japan East

デフォルトの受信(インバウンド)ルールとして、

  • 同一VNetからのアクセスを許可(AllowVnetInBound)
  • Azureロードバランサからのアクセスを許可(AllowAzureLoadBalancerInBound)
  • 上記以外のアクセスを拒否

というルールが設定されています。

受信セキュリティ規則を追加する

VNetAのACI1が属するサブネットのIPアドレス範囲からの受信を許可するルールを追加します。

受信セキュリティ規則の追加
ソース IP Addresses
ソース IP アドレス/CIDR 範囲 10.1.0.0/24 受信を許可したいIPアドレスの範囲
ソースポート範囲 *
宛先 Any 他にサービスタグ、アプリケーションセキュリティグループ等を選択可能。受信側でこのルールが適用される範囲を指定できる。今回は丸っとサブネット全体にルールを適用するのでAny
サービス HTTP
宛先ポート範囲 80 自動で選択される
プロトコル TCP 自動で選択される
アクション 許可
優先度 100
名前 AllowCidrBlockHTTPInbound

また、デフォルトで設定されているAllowVnetInBoundにより同一およびピアリングされたVNetからのアクセスは許可されています。

このため、上記で設定したIPアドレス範囲以外からのHTTPアクセスを拒否するルールも追加する必要があります。

受信セキュリティ規則の追加
ソース Any
ソースポート範囲 *
宛先 Any
サービス HTTP
宛先ポート範囲 80 自動で選択される
プロトコル TCP 自動で選択される
アクション 拒否
優先度 110
名前 DenyAnyHTTPInbound

この規則を追加すると下記の警告が出ますが、今回テストするにあたっては考慮不要と思われるため無視します。

サブネットにNSGを紐付ける

VNetB > SubnetB-1 を開きます。

ネットワークセキュリティグループで先ほど作成したsubnetb001-nsgを選択し、保存します。

動作をテストする

VNetAのACI1コンテナ → VNetBのACI1コンテナ

まず、NSGでアクセス許可した10.1.0.0/24のアドレス範囲に属するVNetAのACI1からVNetBへの通信を行います。

VNetAのACI1のIPアドレスは10.1.0.4です。

NSGでアクセス許可した10.1.0.0/24の範囲内のため、通信が成功することが期待されます。

az login
# VNetAのコンテナA1に入る
az container exec --resource-group AZ104-test-rg --name testcontainera001 --exec-command "/bin/sh"
# ピアリングしたVNetBのコンテナB("10.2.0.4")に対して、httpリクエストを実施
wget -qO- http://10.2.0.4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
# ...以下略

期待通り、nginxのデフォルトのWelcomeページが返却されました。

VNetAのACI2コンテナ → VNetBのACI1コンテナ

続いて、NSGでアクセス許可されていないアドレス範囲のVNetAのACI2から通信を行います。

VNetAのACI2のIPアドレスは、10.1.1.4です。

10.1.0.0/24の範囲外のため、通信は失敗するはずです。

az login
# VNetAのコンテナA2に入る
az container exec --resource-group AZ104-test-rg --name testcontainera002 --exec-command "/bin/sh"
# ピアリングしたVNetBのコンテナB("10.2.0.4")に対して、httpリクエストを実施
wget -qO- http://10.2.0.4
wget: can't connect to remote host (10.2.0.4): Operation timed out

期待通り、通信が通らずタイムアウトになりました。

Discussion