はじめに

Azure Blob Storage のオブジェクトレプリケーションは、ソースストレージアカウントのコンテナから宛先ストレージアカウントのコンテナへ Blob の内容を非同期にレプリケーションする機能です。

便利な一方で、情報漏洩のリスクもあります。そのため、別テナント上のストレージアカウントとのレプリケーション設定は既定で無効化されています。ただし、同一テナント内なら気軽にレプリケーションできてよいわけではありません。悪意ある内部犯が、本番環境のストレージアカウントをオブジェクトレプリケーションのソースに、自分の利用する検証環境のストレージアカウントをオブジェクトレプリケーションの宛先に指定することで、本番環境からデータを持ち出すことは可能です。

こんなことができないように最小権限の付与や変更の監査を行うわけですが、ストレージアカウントをオブジェクトレプリケーションのソースに指定できないようなオプションがあると安心できます。ですが、オブジェクトレプリケーション自体の設定にはソースとして設定することを制限する機能はありません。オブジェクトレプリケーションポリシーを作成できるユーザーであれば、任意のストレージアカウントをソースに設定できてしまいます。

そこで今回は Azure Policy の deny Effect を使い、管理プレーン操作としてのオブジェクトレプリケーションポリシー設定(Microsoft.Storage/storageAccounts/objectReplicationPolicies)を拒否することで、ソースとしての設定を禁止してみます。

検証する Azure Policy

今回使用するカスタムポリシーの定義は以下のとおりです。

{
  "Description": "ストレージアカウントをオブジェクトレプリケーションのソース(送信元)として設定することを禁止する。デスティネーション(受信)設定は許可。",
  "DisplayName": "Deny Blob Object Replication as Source",
  "Id": "/providers/Microsoft.Management/managementGroups/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Authorization/policyDefinitions/deny-blob-objectreplication-as-source",
  "Metadata": {},
  "Mode": "All",
  "Name": "deny-blob-objectreplication-as-source",
  "Parameter": {},
  "PolicyRule": {
    "if": {
      "allOf": [
        {
          "field": "type",
          "equals": "Microsoft.Storage/storageAccounts/objectReplicationPolicies"
        },
        {
          "value": "[first(split(field('fullName'), '/'))]",
          "equals": "[last(split(field('Microsoft.Storage/storageAccounts/objectReplicationPolicies/sourceAccount'), '/'))]"
        }
      ]
    },
    "then": {
      "effect": "deny"
    }
  },
  "PolicyType": "Custom",
  "Type": "Microsoft.Authorization/policyDefinitions",
  "Version": "1.0.0",
  "Versions": [
    "1.0.0"
  ]
}

if 条件は 2 つの条件の AND(allOf)になっています。1 つ目はリソースタイプが Microsoft.Storage/storageAccounts/objectReplicationPolicies であること、2 つ目は対象リソースの fullName<ストレージアカウント名>/<ポリシーID> 形式)の先頭部分(ストレージアカウント名)が sourceAccount プロパティの末尾(ストレージアカウント名)と一致すること、つまり「自身がソースとして設定されようとしている」場合に deny を適用する設計です。この条件により、デスティネーション側のストレージアカウントへの設定(fullName の先頭がデスティネーションのアカウント名になるため sourceAccount と一致しない)は拒否されません。

検証環境の構成

オブジェクトレプリケーションの前提条件設定

オブジェクトレプリケーションを有効にするには、両ストレージアカウントで Blob バージョニングの有効化が必要です。さらにソースストレージアカウントには変更フィードの有効化も必要です。

Update-AzStorageBlobServiceProperty `
    -ResourceGroupName "rg-blob-objrep-policy-eval" `
    -StorageAccountName "stblobobjrepsrc01" `
    -IsVersioningEnabled $true

Update-AzStorageBlobServiceProperty `
    -ResourceGroupName "rg-blob-objrep-policy-eval" `
    -StorageAccountName "stblobobjrepsrc01" `
    -EnableChangeFeed $true

Azure Policy の割り当て

ポリシーをリソースグループスコープに割り当てます。

$policyScope = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-blob-objrep-policy-eval"

New-AzPolicyAssignment `
    -Name "deny-blob-objrep-as-source" `
    -PolicyDefinition $policyDef `
    -Scope $policyScope
Name  : deny-blob-objrep-as-source
Scope : /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-blob-objrep-policy-eval

割り当て後、ポリシーが有効になるまで約 5 分待機します。

動作検証

ソースストレージアカウントへのポリシー設定(Deny を確認)

ソース(送信元)となるストレージアカウントを対象にポリシー設定を試みます。

Set-AzStorageObjectReplicationPolicy `
    -ResourceGroupName "rg-blob-objrep-policy-eval" `
    -StorageAccountName "stblobobjrepsrc01" `
    -SourceAccount $srcStorageId `
    -DestinationAccount $dstStorageId `
    -Rule $rule `
    -ErrorAction Stop

以下のエラーが返却され、設定が拒否されました。

ソース SA へのポリシー設定: 失敗
Exception: Operation returned an invalid status code 'Forbidden'
Response: {"error":{"code":"RequestDisallowedByPolicy","target":"default","message":"Resource 'default' was disallowed by policy. Policy identifiers: '[{\"policyAssignment\":{\"name\":\"deny-blob-objrep-as-source\",\"id\":\"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-blob-objrep-policy-eval/providers/Microsoft.Authorization/policyAssignments/deny-blob-objrep-as-source\"},\"policyDefinition\":{\"name\":\"Deny Blob Object Replication as Source\",\"id\":\"/providers/Microsoft.Management/managementGroups/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Authorization/policyDefinitions/deny-blob-objectreplication-as-source\",\"version\":\"1.0.0\"}}]'.",...}}

HTTP ステータスコード 403 Forbidden、エラーコード RequestDisallowedByPolicy でリクエストが拒否されました。エラーレスポンスの additionalInfo の評価詳細を見ると、ポリシーが Microsoft.Storage/storageAccounts/objectReplicationPolicies リソースタイプを評価し、fullName の先頭部分がソースストレージアカウントのアカウント名と一致したことで deny 判定になっています。

ソース禁止のストレージアカウントを宛先に設定

ポリシーは stblobobjrepsrc01 をソース(送信元)として設定する操作のみを拒否しており、宛先(受信先)として使うことは制限していません。この動作を実際に確認します。

stblobobjrepsrc01 を宛先、別のリソースグループに存在してこのポリシーが適用されない ymnsglogjeをソースとするレプリケーションポリシーを設定します。宛先として設定する操作では、作成されるリソースの fullName の先頭がデスティネーション名(stblobobjrepsrc01)になるため、sourceAccount のアカウント名(ymnsglogje)と一致せず、ポリシーの if 条件を満たしません。

$extRule = New-AzStorageObjectReplicationPolicyRule `
    -SourceContainer "ext-src-container" `
    -DestinationContainer "ext-dst-container"

# 宛先(stblobobjrepsrc01)への設定
Set-AzStorageObjectReplicationPolicy `
    -ResourceGroupName "rg-blob-objrep-policy-eval" `
    -StorageAccountName "stblobobjrepsrc01" `
    -SourceAccount "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-labnet/providers/Microsoft.Storage/storageAccounts/ymnsglogje" `
    -DestinationAccount $srcStorageId `
    -Rule $extRule

# ソース(ymnsglogje)への設定
Set-AzStorageObjectReplicationPolicy `
    -ResourceGroupName "rg-labnet" `
    -StorageAccountName "ymnsglogje" `
    -InputObject $extDstPolicyObj

両方とも成功し、ymnsglogjeext-src-container にテストファイルをアップロードしたところ、約 94 秒後に stblobobjrepsrc01ext-dst-container への複製が確認できました。

Get-AzStorageBlob -Container "ext-dst-container" -Context $srcCtx | Select-Object Name, LastModified

Name            LastModified
----            ------------
objrep-test.txt 3/17/2026 2:21:47 PM +00:00

まとめ

Azure Policy のカスタムポリシーを利用して、ストレージアカウントをオブジェクトレプリケーションの複製元とする操作を拒否してみました。情報漏洩対策の保険の一つとして役立ちそうです。

参考リンク

  • 当サイトは個人のブログです。このブログに示されている見解や意見は個人的なものであり、所属組織の見解や意見を表明するものではありません。
  • 公開情報を踏まえて正確な情報を掲載するよう努めますが、その内容の完全性や正確性、有用性、安全性、最新性について一切保証しません。
  • 添付文章やリンク先などを含む本サイトの内容は作成時点でのものであり、予告なく変更される場合があります。