Azure App Service の Unique Default Hostname を Azure CLI で試してみた

Azure App Service を作成すると <リソース名>.azurewebsites.net という、デフォルトのホスト名でアクセスする事ができます。このデフォルトのホスト名で何かしらの Web サイトをしばらく運用していて使わなくなった際、Azure App Service を削除するとします。その後、第三者が同じ <リソース名> で Azure App Service を作成すると、以前運用されていた Web サイトへのハイパーリンクなどから流入して、サブドメインハイジャック的な事が行えてしまいます。

その対策として Azure App Service 作成時にユニークなサブドメインを生成して防止しよう、というのが今回の Unique Default Hostname です。

そこで今回は、`AutoGeneratedDomainNameLabelScope` の値を `TenantReuse` と `NoReuse` に設定した WebApp を作成して、どのように Default Hostname がユニークになるのか試してみました。

## 検証用の App Service Plan を作成

```bash:bash
prefix=mnruniapp
region=japaneast

az group create \
  --name ${prefix}-rg \
  --location $region

az appservice plan create \
  --name ${prefix}-asp \
  --resource-group ${prefix}-rg \
  --is-linux \
  --sku B1
```

### Azure CLI で REST API を実行する準備

```bash:bash
rgpath=$(az group show \
  --name ${prefix}-rg \
  --query id \
  --output tsv)

aspid=$(az appservice plan show \
  --name ${prefix}-asp \
  --resource-group ${prefix}-rg \
  --query id \
  --output tsv)
```

## TenantReuse を試す

```bash:bash
az rest \
  --method put \
  --url "$rgpath/providers/Microsoft.Web/sites/${prefix}-tenant?api-version=2022-03-01" \
  --body '{ 
    "location": "'$region'",
    "kind": "app",
    "properties": {
        "serverFarmId": "'$aspid'",
        "AutoGeneratedDomainNameLabelScope": "TenantReuse",
    }
}'

az webapp show \
  --name ${prefix}-tenant \
  --resource-group ${prefix}-rg \
  --query defaultHostName \
  --output tsv

mnruniapp-tenant-bnctfua2f5bnd4ee.japaneast-01.azurewebsites.net
```

`bnctfua2f5bnd4ee` というランダムな英数字が含まれる Default Hostname が作成されました。

## WebApp を削除してもう一度 TenantReuse で作成

```bash:bash
az webapp delete \
  --name ${prefix}-tenant \
  --resource-group ${prefix}-rg \
  --keep-empty-plan

az rest \
  --method put \
  --url "$rgpath/providers/Microsoft.Web/sites/${prefix}-tenant?api-version=2022-03-01" \
  --body '{ 
    "location": "'$region'",
    "kind": "app",
    "properties": {
        "serverFarmId": "'$aspid'",
        "AutoGeneratedDomainNameLabelScope": "TenantReuse",
    }
}'

az webapp show \
  --name ${prefix}-tenant \
  --resource-group ${prefix}-rg \
  --query defaultHostName \
  --output tsv

mnruniapp-tenant-bnctfua2f5bnd4ee.japaneast-01.azurewebsites.net
```

`bnctfua2f5bnd4ee` というランダムな英数字は前回と同じものが作成されました。

## NoReuse を試す

```bash:bash
az rest \
  --method put \
  --url "$rgpath/providers/Microsoft.Web/sites/${prefix}-noreuse?api-version=2022-03-01" \
  --body '{ 
    "location": "'$region'",
    "kind": "app",
    "properties": {
        "serverFarmId": "'$aspid'",
        "AutoGeneratedDomainNameLabelScope": "NoReuse",
    }
}'

az webapp show \
  --name ${prefix}-noreuse \
  --resource-group ${prefix}-rg \
  --query defaultHostName \
  --output tsv

mnruniapp-noreuse-b8a7ahbpb8gahzf3.japaneast-01.azurewebsites.net
```

`b8a7ahbpb8gahzf3` というランダムな英数字が作成されました。

## WebApp を削除してもう一度 NoReuse で作成

```bash:bash
az webapp delete \
  --name ${prefix}-noreuse \
  --resource-group ${prefix}-rg \
  --keep-empty-plan

az rest \
  --method put \
  --url "$rgpath/providers/Microsoft.Web/sites/${prefix}-noreuse?api-version=2022-03-01" \
  --body '{ 
    "location": "'$region'",
    "kind": "app",
    "properties": {
        "serverFarmId": "'$aspid'",
        "AutoGeneratedDomainNameLabelScope": "NoReuse",
    }
}'

az webapp show \
  --name ${prefix}-noreuse \
  --resource-group ${prefix}-rg \
  --query defaultHostName \
  --output tsv

mnruniapp-noreuse-hnfrcjenatf5dqd5.japaneast-01.azurewebsites.net
```

前回とは違う `hnfrcjenatf5dqd5` というランダムな英数字が作成されました。

## 検証結果

`AutoGeneratedDomainNameLabelScope` の値には

* TenantReuse 
* SubscriptionReuse 
* ResourceGroupReuse 
* NoReuse

が使用できるようですが、`NoReuse` 以外は言葉通りランダムな英数字がリユースされるようです。

## 後片付け

```bash:bash
az group delete \
  --name ${prefix}-rg \
  --yes
```

## 参考

https://techcommunity.microsoft.com/t5/apps-on-azure-blog/public-preview-creating-web-app-with-a-unique-default-hostname/ba-p/4156353

https://learn.microsoft.com/ja-jp/rest/api/appservice/web-apps/create-or-update?view=rest-appservice-2023-12-01&tabs=HTTP