リソースのロックによる予期せぬ変更の防止

管理者は、サブスクリプション、リソース グループ、またはリソースをロックし、組織の他のユーザーが誤って重要なリソースを削除したり変更したりするのを防止することができます。 ロックは、ユーザーが持っている可能性のあるどのアクセス許可よりも優先されます。

ロック レベルは CanNotDelete または ReadOnly に設定できます。 ポータルでは、これらのロックはそれぞれ [削除][読み取り専用] と表示されます。

  • CanNotDelete は、正規ユーザーはリソースの読み取りと変更を実行できますが、削除は実行できないことを示します。
  • ReadOnly は、正規ユーザーはリソースの読み取りを実行できますが、リソースの更新は実行できないことを示します。 このロックの適用は、すべての正規ユーザーのアクセス許可を、閲覧者 ロールによって与えられるアクセス許可に制限することに似ています。

ロールベースのアクセス制御とは異なり、管理ロックを使用すると、すべてのユーザーとロールに対して制限を適用することができます。 ユーザーとロールのアクセス許可を設定する方法については、Azure ロールベースのアクセス制御 (Azure RBAC) に関する記事を参照してください。

ロックの継承

親スコープでロックを適用すると、そのスコープ内のすべてのリソースは同じロックを継承します。 後で追加するリソースも、親からロックを継承します。 継承されるロックの中で最も制限の厳しいロックが優先されます。

ロックのスコープについて

注意

すべての種類の操作にロックが適用されるわけではないことを理解しておくことが重要です。 Azure の操作は、コントロール プレーンとデータ プレーンの 2 つのカテゴリに分けることができます。 ロックは、コントロール プレーン操作にのみ適用されます

コントロール プレーン操作は、https://management.azure.com に送信される操作です。 データ プレーン操作は、https://myaccount.blob.core.windows.net/ など、サービスのインスタンスに送信される操作です。 詳細については、「Azure コントロール プレーンとデータ プレーン」を参照してください。 コントロール プレーンの URL が使用される操作を確認するには、Azure REST API に関するページを参照してください。

この区別は、ロックではリソースに対する変更は回避されますが、リソースで独自の機能が実行される方法は制限されないことを意味します。 たとえば、SQL Database 論理サーバーに ReadOnly ロックを設定すると、サーバーの削除または変更を実行できなくなりますが、 そのサーバーではデータベース内のデータを作成、更新、削除できます。 データのトランザクションは https://management.azure.com に送信されないため、これらの操作は許可されます。

次のセクションでは、コントロールとデータ プレーンの操作の違いに関するその他の例について説明します。

ロック適用前の考慮事項

ロックを適用すると予期しない結果につながる可能性があります。リソースを変更する操作のように見えなくても、実際はロックによってブロックされているアクションを必要とする場合があるためです。 ロックにより、Azure Resource Manager API への POST 要求を必要とする操作を防ぐことができます。 ロックによってブロックされる一般的な操作の例には、次のようなものがあります。

  • 読み取り専用ロックを ストレージ アカウント に対して設定すると、ユーザーがアカウント キーを一覧表示できなくなります。 Azure ストレージ のキーの一覧表示操作は、アカウント キーへのアクセスを保護する POST 要求によって処理されます。これにより、ストレージ アカウントのデータに完全にアクセスできるようになります。 ストレージ アカウントに対して読み取り専用ロックが設定されている場合、アカウント キーを持っていないユーザーは、BLOB またはキュー データへのアクセスに Azure AD 資格情報を使用する必要があります。 読み取り専用ロックによって、ストレージ アカウントまたはデータ コンテナー (BLOB コンテナーまたはキュー) にスコープが設定されている Azure RBAC ロールの割り当てもできなくなります。

  • ストレージ アカウント に削除不可のロックを設定しても、そのアカウント内のデータが削除または変更されるのを防ぐことはできません。 この種類のロックでは、ストレージ アカウント自体が削除されないように保護するだけであり、そのストレージ アカウント内の BLOB、キュー、テーブル、またはファイルのデータは保護されません。

  • ストレージ アカウント に読み取り専用ロックを設定しても、そのアカウント内のデータが削除または変更されるのを防ぐことはできません。 この種類のロックでは、ストレージ アカウント自体が削除または変更されないように保護するだけであり、そのストレージ アカウント内の BLOB、キュー、テーブル、またはファイルのデータは保護されません。

  • 読み取り専用ロックを App Service リソースに設定すると、Visual Studio のサーバー エクスプローラーの操作には書き込みアクセスが必要となるため、Visual Studio のサーバー エクスプローラーはリソース用のファイルを表示できなくなります。

  • App Service プラン を含む リソース グループ に対する読み取り専用ロックを設定すると、プランのスケールアップやスケールアウトはできません。

  • 読み取り専用ロックを、仮想マシン を含む リソース グループ に設定すると、どのユーザーも仮想マシンを起動したり、再起動したりできなくなります。 これらの操作では、POST 要求が必要です。

  • 削除不可ロックを リソース グループ に設定すると、Azure Resource Manager が履歴内の デプロイを自動的に削除できなくなります。 履歴内のデプロイが 800 に達した場合、デプロイは失敗します。

  • Azure Backup サービス によって作成された リソース グループ に削除不可のロックを設定した場合、バックアップは失敗するようになります。 このサービスでは、最大 18 個の復元ポイントがサポートされています。 ロックされている場合、バックアップ サービスは復元ポイントをクリーンアップできません。 詳細については、「よく寄せられる質問 - Azure VM のバックアップ」を参照してください。

  • リソース グループ で削除不可のロックを使用すると、Azure Machine Learning によって Azure Machine Learning コンピューティング クラスターが自動スケールされ、使用されていないノードが削除されるのを防ぐことができます。

  • サブスクリプション に読み取り専用ロックを設定すると、Azure Advisor が正常に機能しなくなります。 Advisor は、クエリの結果を格納できません。

誰がロックを作成または削除できるか

管理ロックを作成または削除するには、Microsoft.Authorization/* または Microsoft.Authorization/locks/* アクションにアクセスできる必要があります。 組み込みロールのうち、所有者ユーザー アクセス管理者 にのみこれらのアクションが許可されています。

Managed Applications とロック

Azure Databricks などの一部の Azure サービスでは、マネージド アプリケーションを使用してサービスが実装されています。 その場合、サービスで 2 つのリソース グループが作成されます。 1 つのリソース グループにはサービスの概要が含まれ、ロックされません。 もう 1 つのリソース グループにはサービスのインフラストラクチャが含まれ、ロックされます。

インフラストラクチャのリソース グループを削除しようとすると、リソース グループがロックされていることを示すエラーが表示されます。 インフラストラクチャのリソース グループのロックを削除しようとすると、システム アプリケーションによって所有されているためロックを削除できないことを示すエラーが表示されます。

代わりに、サービスを削除すると、インフラストラクチャのリソース グループも削除されます。

マネージド アプリケーションでは、デプロイしたサービスを選択します。

サービスを選択する

サービスに マネージド リソース グループ へのリンクが含まれることに注意してください。 そのリソース グループがインフラストラクチャを保持しており、ロックされています。 直接削除することはできません。

マネージド グループを表示する

ロックされているインフラストラクチャ リソース グループを含め、サービスのすべてのものを削除するには、サービスの [削除] を選択します。

サービスの削除

ロックの構成

ポータル

  1. ロックを適用するリソース、リソース グループ、またはサブスクリプションの [設定] ブレードで、 [ロック] を選択します。

    ロックを選択します。

  2. ロックを追加するには、[追加] を選択します。 親レベルでロックを作成する場合は、親を選択します。 現在選択されているリソースは、ロックを親から継承します。 たとえば、リソース グループをロックすることで、グループのリソースすべてにロックを適用することができます。

    ロックを追加します。

  3. ロックに名前とロック レベルを指定します。 必要に応じて、ロックについて説明したメモを追加することができます。

    ロックを設定します。

  4. ロックを削除するには、 [削除] ボタンを選択します。

    ロックを削除します。

ARM テンプレート

Azure Resource Manager テンプレート (ARM テンプレート) を使用してロックをデプロイする場合は、ロックのスコープとデプロイのスコープに注意する必要があります。 リソース グループやサブスクリプションのロックなど、デプロイ スコープでロックを適用する場合、スコープ プロパティを設定しないでください。 デプロイ スコープ内のリソースをロックする場合は、スコープ プロパティを設定します。

次のテンプレートは、デプロイ先のリソース グループにロックを適用します。 ロックのスコープがデプロイのスコープと一致するため、ロック リソースにスコープ プロパティがないことに注意してください。 このテンプレートは、リソース グループ レベルでデプロイされます。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/locks",
      "apiVersion": "2016-09-01",
      "name": "rgLock",
      "properties": {
        "level": "CanNotDelete",
        "notes": "Resource group should not be deleted."
      }
    }
  ]
}

リソース グループを作成してロックするには、サブスクリプション レベルで次のテンプレートをデプロイします。

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2020-10-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "properties": {}
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-10-01",
      "name": "lockDeployment",
      "resourceGroup": "[parameters('rgName')]",
      "dependsOn": [
        "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
            {
              "type": "Microsoft.Authorization/locks",
              "apiVersion": "2016-09-01",
              "name": "rgLock",
              "properties": {
                "level": "CanNotDelete",
                "notes": "Resource group and its resources should not be deleted."
              }
            }
          ],
          "outputs": {}
        }
      }
    }
  ],
  "outputs": {}
}

リソース グループ内の リソース にロックを適用する場合は、スコープ プロパティを追加します。 スコープを、ロックするリソースの名前に設定します。

次の例では、App Service プラン、Web サイト、および Web サイトに対するロックを作成するテンプレートを示します。 ロックのスコープは、Web サイトに設定されています。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "hostingPlanName": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "variables": {
    "siteName": "[concat('ExampleSite', uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2020-12-01",
      "name": "[parameters('hostingPlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "tier": "Free",
        "name": "f1",
        "capacity": 0
      },
      "properties": {
        "targetWorkerCount": 1
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2020-12-01",
      "name": "[variables('siteName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]"
      ],
      "properties": {
        "serverFarmId": "[parameters('hostingPlanName')]"
      }
    },
    {
      "type": "Microsoft.Authorization/locks",
      "apiVersion": "2016-09-01",
      "name": "siteLock",
      "scope": "[concat('Microsoft.Web/sites/', variables('siteName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/sites', variables('siteName'))]"
      ],
      "properties": {
        "level": "CanNotDelete",
        "notes": "Site should not be deleted."
      }
    }
  ]
}

Azure PowerShell

デプロイされているリソースを Azure PowerShell でロックするには、New-AzResourceLock コマンドを使います。

リソースをロックするには、対象となるリソースの名前とそのリソース タイプ、リソース グループ名を指定します。

New-AzResourceLock -LockLevel CanNotDelete -LockName LockSite -ResourceName examplesite -ResourceType Microsoft.Web/sites -ResourceGroupName exampleresourcegroup

リソース グループをロックするには、そのリソース グループの名前を指定します。

New-AzResourceLock -LockName LockGroup -LockLevel CanNotDelete -ResourceGroupName exampleresourcegroup

ロックについての情報を取得するには、Get-AzResourceLock を使います。 サブスクリプション内のすべてのロックを取得するには、次のように入力します。

Get-AzResourceLock

特定のリソースのロックをすべて取得するには、次のように入力します。

Get-AzResourceLock -ResourceName examplesite -ResourceType Microsoft.Web/sites -ResourceGroupName exampleresourcegroup

特定のリソース グループのロックをすべて取得するには、次のように入力します。

Get-AzResourceLock -ResourceGroupName exampleresourcegroup

リソースのロックを削除するには、次のように入力します。

$lockId = (Get-AzResourceLock -ResourceGroupName exampleresourcegroup -ResourceName examplesite -ResourceType Microsoft.Web/sites).LockId
Remove-AzResourceLock -LockId $lockId

リソース グループのロックを削除するには、次のように入力します。

$lockId = (Get-AzResourceLock -ResourceGroupName exampleresourcegroup).LockId
Remove-AzResourceLock -LockId $lockId

Azure CLI

デプロイされているリソースを Azure CLI でロックするには、az lock create コマンドを使います。

リソースをロックするには、対象となるリソースの名前とそのリソース タイプ、リソース グループ名を指定します。

az lock create --name LockSite --lock-type CanNotDelete --resource-group exampleresourcegroup --resource-name examplesite --resource-type Microsoft.Web/sites

リソース グループをロックするには、そのリソース グループの名前を指定します。

az lock create --name LockGroup --lock-type CanNotDelete --resource-group exampleresourcegroup

ロックについての情報を取得するには、az lock list を使います。 サブスクリプション内のすべてのロックを取得するには、次のように入力します。

az lock list

特定のリソースのロックをすべて取得するには、次のように入力します。

az lock list --resource-group exampleresourcegroup --resource-name examplesite --namespace Microsoft.Web --resource-type sites --parent ""

特定のリソース グループのロックをすべて取得するには、次のように入力します。

az lock list --resource-group exampleresourcegroup

リソースのロックを削除するには、次のように入力します。

lockid=$(az lock show --name LockSite --resource-group exampleresourcegroup --resource-type Microsoft.Web/sites --resource-name examplesite --output tsv --query id)
az lock delete --ids $lockid

リソース グループのロックを削除するには、次のように入力します。

lockid=$(az lock show --name LockSite --resource-group exampleresourcegroup  --output tsv --query id)
az lock delete --ids $lockid

REST API

管理ロック用の REST API を使用して、デプロイ済みのリソースをロックできます。 REST API を使用すると、ロックを作成し、削除できます。また、既存のロックに関する情報を取得することもできます。

ロックを作成するには、次のように実行します。

PUT https://management.azure.com/{scope}/providers/Microsoft.Authorization/locks/{lock-name}?api-version={api-version}

スコープには、サブスクリプション、リソース グループ、またはリソースを使用できます。 lock-name には、ロックの名前を指定できます。 api-version には、2016-09-01 を使用します。

要求に、ロックのプロパティを指定する JSON オブジェクトを含めます。

{
  "properties": {
  "level": "CanNotDelete",
  "notes": "Optional text notes."
  }
}

次のステップ