You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询基于Terraform安全部署Azure Event Hub的准则及示例代码

安全部署Azure Event Hub的Terraform最佳实践与代码示例

核心安全原则与对应实现策略

1. 优先使用Azure AD身份验证,禁用SAS密钥

  • 避免使用共享访问签名(SAS)密钥,改用Azure AD角色授权,减少密钥泄露风险。仅在兼容旧系统的场景下保留SAS,且定期轮换密钥。
  • Terraform代码片段(角色分配):
resource "azurerm_role_assignment" "event_hub_data_sender" {
  scope                = azurerm_event_hub.event_hub.id
  role_definition_name = "Azure Event Hubs Data Sender"
  principal_id         = var.service_principal_object_id // 替换为你的服务主体Object ID
}

2. 启用网络隔离,限制访问来源

  • 配置虚拟网络服务端点,仅允许指定VNet内的资源访问Event Hub;同时设置IP防火墙规则,放行必要的公网IP(如果需要)。拒绝所有未授权的网络访问。
  • Terraform代码片段(网络配置):
resource "azurerm_event_hub_namespace" "event_hub_ns" {
  name                = "secure-event-hub-ns"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  sku                 = "Standard" // 网络隔离需要Standard或Premium SKU

  # 禁用公共网络访问,仅允许VNet和IP规则
  public_network_access_enabled = false

  virtual_network_rule {
    subnet_id                     = azurerm_subnet.event_hub_subnet.id
    ignore_missing_vnet_service_endpoint = false
  }

  ip_filter_rule {
    name               = "allow-specific-ip"
    ip_mask            = "192.168.1.0/24" // 替换为需要放行的IP段
    action             = "Allow"
  }
}

3. 强化数据加密(静态+传输)

  • 静态加密默认使用Azure托管密钥,可配置客户管理密钥(CMK)将加密密钥控制权掌握在自己手中;传输强制使用TLS 1.2及以上版本。
  • Terraform代码片段(CMK加密配置):
resource "azurerm_event_hub_namespace" "event_hub_ns" {
  # 其他基础配置...

  encryption {
    key_vault_key_id = azurerm_key_vault_key.event_hub_key.id
    key_source       = "Microsoft.KeyVault"
  }
}

resource "azurerm_key_vault_key" "event_hub_key" {
  name         = "event-hub-encryption-key"
  key_vault_id = azurerm_key_vault.kv.id
  key_type     = "RSA"
  key_size     = 2048

  key_opts = [
    "decrypt",
    "encrypt",
    "sign",
    "unwrapKey",
    "verify",
    "wrapKey",
  ]
}

4. 开启诊断日志与监控

  • 收集Event Hub的访问日志、指标,发送到Log Analytics工作区,用于审计异常访问、排查安全事件。
  • Terraform代码片段(诊断设置):
resource "azurerm_monitor_diagnostic_setting" "event_hub_diag" {
  name               = "event-hub-diagnostic-setting"
  target_resource_id = azurerm_event_hub_namespace.event_hub_ns.id
  log_analytics_workspace_id = azurerm_log_analytics_workspace.law.id

  log {
    category = "ArchiveLogs"
    enabled  = true

    retention_policy {
      enabled = true
      days    = 30
    }
  }

  log {
    category = "OperationalLogs"
    enabled  = true

    retention_policy {
      enabled = true
      days    = 30
    }
  }

  metric {
    category = "AllMetrics"
    enabled  = true

    retention_policy {
      enabled = true
      days    = 30
    }
  }
}

5. 遵循最小权限原则

  • 为访问Event Hub的服务主体或用户分配最窄的角色权限:比如仅给数据发送者分配Azure Event Hubs Data Sender角色,给接收者分配Azure Event Hubs Data Receiver角色,避免使用高权限角色(如Owner、Contributor)。

完整Terraform示例代码

# 配置Azure Provider
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0"
    }
  }
}

provider "azurerm" {
  features {}
}

# 资源组
resource "azurerm_resource_group" "rg" {
  name     = "secure-event-hub-rg"
  location = "East US"
}

# 虚拟网络与子网(用于VNet服务端点)
resource "azurerm_virtual_network" "vnet" {
  name                = "event-hub-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_subnet" "event_hub_subnet" {
  name                 = "event-hub-subnet"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = ["10.0.1.0/24"]

  # 启用Event Hub服务端点
  service_endpoints = ["Microsoft.EventHub"]
}

# Key Vault(用于CMK加密)
resource "azurerm_key_vault" "kv" {
  name                       = "event-hub-kv-${random_string.suffix.result}"
  location                   = azurerm_resource_group.rg.location
  resource_group_name        = azurerm_resource_group.rg.name
  tenant_id                  = data.azurerm_client_config.current.tenant_id
  soft_delete_retention_days = 7
  purge_protection_enabled   = true

  sku_name = "standard"

  access_policy {
    tenant_id = data.azurerm_client_config.current.tenant_id
    object_id = data.azurerm_client_config.current.object_id

    key_permissions = [
      "Get", "List", "Create", "Delete", "Recover", "Backup", "Restore", "Decrypt", "Encrypt", "Sign", "Verify", "WrapKey", "UnwrapKey"
    ]
  }

  # 允许Event Hub服务访问Key Vault
  access_policy {
    tenant_id = data.azurerm_client_config.current.tenant_id
    object_id = data.azurerm_event_hub_namespace.event_hub_ns.identity[0].principal_id

    key_permissions = [
      "Get", "WrapKey", "UnwrapKey"
    ]
  }
}

resource "random_string" "suffix" {
  length  = 5
  special = false
  upper   = false
}

data "azurerm_client_config" "current" {}

# Event Hub命名空间
resource "azurerm_event_hub_namespace" "event_hub_ns" {
  name                = "secure-event-hub-ns-${random_string.suffix.result}"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  sku                 = "Premium" // Premium支持CMK和更高级的网络隔离
  capacity            = 1

  public_network_access_enabled = false
  zone_redundant                = true

  # 启用系统分配的托管身份,用于访问Key Vault
  identity {
    type = "SystemAssigned"
  }

  virtual_network_rule {
    subnet_id                     = azurerm_subnet.event_hub_subnet.id
    ignore_missing_vnet_service_endpoint = false
  }

  ip_filter_rule {
    name               = "allow-office-ip"
    ip_mask            = "192.168.2.0/24"
    action             = "Allow"
  }

  encryption {
    key_vault_key_id = azurerm_key_vault_key.event_hub_key.id
    key_source       = "Microsoft.KeyVault"
  }
}

# 加密密钥
resource "azurerm_key_vault_key" "event_hub_key" {
  name         = "event-hub-encryption-key"
  key_vault_id = azurerm_key_vault.kv.id
  key_type     = "RSA"
  key_size     = 2048

  key_opts = [
    "decrypt",
    "encrypt",
    "sign",
    "unwrapKey",
    "verify",
    "wrapKey",
  ]
}

# Event Hub实例
resource "azurerm_event_hub" "event_hub" {
  name                = "secure-event-hub"
  namespace_name      = azurerm_event_hub_namespace.event_hub_ns.name
  resource_group_name = azurerm_resource_group.rg.name
  partition_count     = 4
  message_retention   = 7
}

# 给服务主体分配数据发送者角色
resource "azurerm_role_assignment" "event_hub_data_sender" {
  scope                = azurerm_event_hub.event_hub.id
  role_definition_name = "Azure Event Hubs Data Sender"
  principal_id         = var.service_principal_object_id // 需提前定义这个变量
}

# Log Analytics工作区
resource "azurerm_log_analytics_workspace" "law" {
  name                = "event-hub-law-${random_string.suffix.result}"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  sku                 = "PerGB2018"
  retention_in_days   = 30
}

# 诊断设置
resource "azurerm_monitor_diagnostic_setting" "event_hub_diag" {
  name               = "event-hub-diagnostic-setting"
  target_resource_id = azurerm_event_hub_namespace.event_hub_ns.id
  log_analytics_workspace_id = azurerm_log_analytics_workspace.law.id

  log {
    category = "ArchiveLogs"
    enabled  = true

    retention_policy {
      enabled = true
      days    = 30
    }
  }

  log {
    category = "OperationalLogs"
    enabled  = true

    retention_policy {
      enabled = true
      days    = 30
    }
  }

  metric {
    category = "AllMetrics"
    enabled  = true

    retention_policy {
      enabled = true
      days    = 30
    }
  }
}

# 变量定义
variable "service_principal_object_id" {
  type        = string
  description = "Object ID of the service principal that needs Event Hub data access"
}

内容的提问来源于stack exchange,提问作者Geetha Hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:55:19