ポイントを速習!「Azureの基礎(AZ900)」をみんなで学ぶ 第13回
実際にNSG(Network Security Group)とVNet Service Endpointを構成してみる
Azureのセキュリティで知っておきたいこと、対策の基礎【後編】
2021年03月26日 08時00分更新
[実践]VNet Service Endpointを使ってリソース間接続を制御する
続いて、VNet Service Endpoint(VSE)の構築ハンズオンをやっていきたいと思います。
上記の図は、VSEをVNet内に作成し、ネットワーク規則を用いてVNet外にあるAzure Storageへのアクセスをバイパスさせていることを示します。ただしここでは、DataServer VMのあるDBsサブネットからのみ、Azure Storageへアクセスできるよう制限する設定を行います。
NSGに規則を追加
まずはNSGに規則を追加して、VNetからAzure Storageへの通信が確実にVSEを通過するよう設定します。具体的には「このVNetからStorageサービスへの外向き(アウトバウンド)方向の通信は許可するが、その他すべてのインターネット通信は拒否する」という規則です。
1. Storageへのアクセスを許可するアウトバウンド規則を作るために、次のコマンドを実行します。
az network nsg rule create \
--resource-group $rg \
--nsg-name SERVERS-NSG \
--name Allow_Storage \
--priority 190 \
--direction Outbound \
--source-address-prefixes "VirtualNetwork" \
--source-port-ranges '*' \
--destination-address-prefixes "Storage" \
--destination-port-ranges '*' \
--access Allow \
--protocol '*' \
--description "Allow access to Azure Storage"
2. 「すべてのインターネット通信を拒否」するアウトバウンド規則を作るために、次のコマンドを実行してください。
az network nsg rule create \
--resource-group $rg \
--nsg-name SERVERS-NSG \
--name Deny_Internet \
--priority 200 \
--direction Outbound \
--source-address-prefixes "VirtualNetwork" \
--source-port-ranges '*' \
--destination-address-prefixes "Internet" \
--destination-port-ranges '*' \
--access Deny \
--protocol '*' \
--description "Deny access to Internet."
前のハンズオンと合わせて、ここまでにSERVERS-NSGには次の規則が設定されているはずです。これにより、現時点ではAppServerからでもDataServerからでも、Azure Storageにアクセスすることができます。
Storage AccountとFile Shareを構成
次に、アクセス確認テスト用のリソースを用意しましょう。新しいStorage Accountを作成したあとに「Azure File Share」を構成します。このFile Shareは、ファイルを保存して共有できる、ファイルサーバーのようなサービスです。
1. Storage Accountを作成するために、次のコマンドを実行します。実行すると、変数STORAGEACCTにはStorage Account名が格納されます。
STORAGEACCT=$(az storage account create \
--resource-group $rg \
--name handsondocs$RANDOM \
--sku Standard_LRS \
--query "name" | tr -d '"')
2.. 次に、Storageのprimary keyを変数STORAGEKEYへ格納するために、次のコマンドを実行して下さい。
STORAGEKEY=$(az storage account keys list \
--resource-group $rg \
--account-name $STORAGEACCT \
--query "[0].value" | tr -d '"')
3.. 「handson-data-share」という名称のFile Shareを構成するために、次のコマンドを実行します。
az storage share create \
--account-name $STORAGEACCT \
--account-key $STORAGEKEY \
--name "handson-data-share"
VSEを有効にする
続いて、Storage Accountを修正して、DataServerからのみアクセスできるようにします。具体的には、DBsサブネットにStorageのVSEを割り当て、その後にStorage Account側にネットワーク規則を設定します。
1. 「Microsoft.Storage」という名前のVSEをDBsサブネットに割り当てるために、次のコマンドを実行して下さい。
az network vnet subnet update \
--vnet-name servers \
--resource-group $rg \
--name DBs \
--service-endpoints Microsoft.Storage
2. いったんすべてのネットワークkからStorage Accountへのアクセスができなくなるように、規定のアクションを「拒否(Deny)」に設定します。
az storage account update \
--resource-group $rg \
--name $STORAGEACCT \
--default-action Deny
3. そのうえで、Storage Accountへのアクセス制限を設定するために、次のコマンドを実行します。これにより、DBsサブネットからの通信のみを受信するように制限されます。
az storage account network-rule add \
--resource-group $rg \
--account-name $STORAGEACCT \
--vnet servers \
--subnet DBs
File Shareへの通信を確認
それでは、Storage AccountでDataServerのみがFile Shareにアクセスできるか確認してみましょう。
1. AppServerとDataServerのパブリックIPを変数に格納するために、次の2つのコマンドを実行してください。
APPSERVERIP="$(az vm list-ip-addresses \
--resource-group $rg \
--name AppServer \
--query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
--output tsv)"
DATASERVERIP="$(az vm list-ip-addresses \
--resource-group $rg \
--name DataServer \
--query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
--output tsv)"
2. AppServer VMにSSH接続し、File Shareのマウントを行うために、次のコマンドを実行します。
ssh -t azureuser@$APPSERVERIP \
"mkdir azureshare; \
sudo mount -t cifs //$STORAGEACCT.file.core.windows.net/handson-data-share azureshare \
-o vers=3.0,username=$STORAGEACCT,password=$STORAGEKEY,dir_mode=0777,file_mode=0777,sec=ntlmssp; findmnt \
-t cifs; exit; bash"
3. VM作成時のパスワードを入力すると「mount error」が表示されます。これは、AppsサブネットにはStorage AccountのVSEがないため、AppServerからFile Shareへのアクセスが拒否されているのです。
4. 同じことをDataServer VMで試してみると、どうなるでしょうか。
ssh -t azureuser@$DATASERVERIP \
"mkdir azureshare; \
sudo mount -t cifs //$STORAGEACCT.file.core.windows.net/handson-data-share azureshare \
-o vers=3.0,username=$STORAGEACCT,password=$STORAGEKEY,dir_mode=0777,file_mode=0777,sec=ntlmssp;findmnt \
-t cifs; exit; bash"
5. VM作成時のパスワードを入力すると、今度はmountに成功した旨の詳細が表示されるはずです。これは、DBsサブネットにStorage Account用のVSEが作成されているからです。
以上で、VSEを使ってリソース間の接続を制御できることが確認できました。
* * *
以上、今回はNSGやVNet Service Endpointの解説と構築を行いました。非常に長くなってしまいましたが、いかがだったでしょうか。多層防御の一部分をなすこれらのリソースの理解に少しでも役立てば幸いです。
さて、13回にわたって連載してきた「ポイントを速習!『Azureの基礎(AZ900)』をみんなで学ぶ」は、今回が最終回となります。次回からは新連載として、Azure Cognitiveサービス(AIサービス)の基礎を学ぶシリーズをお届けする予定です。引き続きよろしくお願いいたします!
■今回のポイントまとめ!
- NSGでトラフィックを制御する規則を作ると、VNetやVMをインターネットからのアクセスから保護できる
- VNet Service Endpointを使うと、SQL DatabaseやAzure StorageなどのAzureリソースを保護できる
社会人1年目の出来立てほやほやエンジニア。環境構築が大好物で、嫌いなものはMerge Conflict。仕事を始めても結局ゲームはやめられないらしい……。
この連載の記事
-
第12回
TECH
Azureのセキュリティで知っておきたいこと、対策の基礎【前編】 -
第11回
TECH
Azureの利用コストを管理、予測して支出を最適化する -
第10回
TECH
Azureの基本的なネットワークサービスを理解する【後編】 -
第9回
TECH
Azureの基本的なネットワークサービスを理解する【前編】 -
第8回
TECH
Azureのストレージサービスを理解し「SQL Database」に触れてみる -
第7回
TECH
「Azure VM」などAzureの幅広いコンピューティングサービスを知る -
第6回
TECH
Azureの主な管理ツールを知り、リソースを管理する【後編】 -
第5回
TECH
Azureの主な管理ツールを知り、リソースを管理する【前編】 -
第4回
TECH
Azureのインフラ構成とサービス可用性を高める仕組み -
第3回
TECH
Azureの代表的なサービスを知る/使ってみる【後編】 - この連載の一覧へ