Azure Databricks는 기업 환경에서 데이터 보안이 중요한 서비스 중 하나다. 특히 네트워크를 보호하여 인터넷을 우회하고 내부 네트워크에서 안전하게 Databricks와 Storage 간 통신하도록 구성하는 것이 중요하다.

이번 포스트에서는 Terraform을 이용해 Azure Databricks를 Private 네트워크에 배포하는 방법을 다룬다.

 

1. 네트워크 구성 개요

기본적으로 Databricks는 퍼블릭 네트워크를 통해 통신할 수 있다. 하지만 보안 강화를 위해 아래와 같은 네트워크 구조를 설계했다.

  • Virtual Network (VNet) 및 Subnet 분리
  • Azure Private Link 사용 (Storage, Databricks) → 인터넷 없이 내부 네트워크 통신
  • Network Security Group (NSG)으로 필요 최소한의 트래픽만 허용
  • Databricks에서 Storage로의 Outbound 트래픽은 HTTPS(443)만 허용

출처 : https://learn.microsoft.com/en-us/azure/databricks/security/network/

 

 

Azure Databricks 보안 네트워크 아키텍처 개요

Azure Databricks 보안 네트워크 아키텍처는 Azure Private Link와 VNet Injection을 활용하여 Databricks가 내부 네트워크에서만 동작하도록 한다.

기본 아키텍처 개념

  • Azure Databricks VNet Injection
    • Databricks가 관리하는 리소스(VM 등)를 사용자 정의 VNet에 배포
  • Private Link를 통한 보안 연결
    • Databricks와 Storage, ADF 등의 서비스 간 Private Endpoint를 사용하여 퍼블릭 인터넷을 우회
  • NSG (Network Security Group) 적용
    • Databricks와 Storage 간 트래픽을 443(HTTPS)만 허용
  • Managed Private Endpoints 활용
    • Data Factory에서 Databricks & Storage로 보안된 접근

 

Terraform을 사용한 보안 네트워크 구성

(1) Virtual Network 및 서브넷 설정

Azure Databricks가 내부 네트워크에서만 동작하도록 Databricks, Storage, Data Factory용 서브넷을 생성한다.

# Virtual Network
resource "azurerm_virtual_network" "vnet" {
  name                = var.vnet_name
  location            = var.location
  resource_group_name = var.resource_group_name
  address_space       = ["10.110.0.0/16"]
}

# Subnets
resource "azurerm_subnet" "databricks_subnet" {
  name                 = "tf-databricks-subnet"
  resource_group_name  = var.resource_group_name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = ["10.110.1.0/24"]
}

resource "azurerm_subnet" "storage_subnet" {
  name                 = "tf-storage-subnet"
  resource_group_name  = var.resource_group_name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = ["10.110.2.0/24"]
}

resource "azurerm_subnet" "data_factory_subnet" {
  name                 = "tf-datafactory-subnet"
  resource_group_name  = var.resource_group_name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = ["10.110.3.0/24"]
}

(2) Storage Private Endpoint 구성

퍼블릭 인터넷을 우회하고 Private Link를 통해 Databricks와 Storage가 보안된 내부 네트워크에서 통신하도록 설정한다.

# Storage Private Endpoint
resource "azurerm_private_endpoint" "storage" {
  name                = "tf-storage-private-endpoint"
  location            = var.location
  resource_group_name = var.resource_group_name
  subnet_id           = azurerm_subnet.storage_subnet.id

  private_service_connection {
    name                           = "tf-storage-private-link"
    private_connection_resource_id = var.storage_account_id
    subresource_names              = ["blob"]
    is_manual_connection           = false
  }
}

(3) Databricks VNet Injection 활성화

Databricks가 사용자 정의 VNet에서 실행되도록 구성한다.

resource "azurerm_databricks_workspace" "databricks" {
  name                = var.databricks_workspace_name
  location            = var.location
  resource_group_name = var.resource_group_name
  sku                 = "premium"

  custom_parameters {
    virtual_network_id = azurerm_virtual_network.vnet.id
    public_network_access_enabled = false
  }
}

(4) Databricks → Storage NSG 설정

Databricks에서 Storage로 나가는 트래픽을 HTTPS(443)만 허용하여 보안성을 강화한다.

# Network Security Group (NSG) for Databricks
resource "azurerm_network_security_group" "databricks_nsg" {
  name                = "databricks-nsg"
  location            = var.location
  resource_group_name = var.resource_group_name

  security_rule {
    name                       = "AllowDatabricksToStorage"
    priority                   = 100
    direction                  = "Outbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "443"
    source_address_prefix      = azurerm_subnet.databricks_subnet.address_prefixes[0]
    destination_address_prefix = azurerm_subnet.storage_subnet.address_prefixes[0]
  }
}

(5) Data Factory Managed Private Endpoint

Data Factory가 Databricks 및 Storage에 보안된 방식으로 연결되도록 Private Endpoint를 추가한다.

resource "azurerm_data_factory_managed_virtual_network" "example" {
  name                = "adf-managed-vnet"
  data_factory_id     = module.data_factory.data_factory_id
  resource_group_name = module.resource_group.resource_group_name
}

 

 

추가 보안 강화 방안

  • Azure Private DNS 설정
  • Azure Firewall을 통한 추가적인 보안 강화
  • Databricks의 내부 VNet에서 인터넷 차단 (No Public IP 옵션 적용)