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)만 허용

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 옵션 적용)