Taeyoung Kim

Cloud & Platform

Azure 네트워크 보안 및 고가용성 구성 가이드

Azure 네트워크 보안 및 고가용성 구성 가이드 학습 내용을 정리한 백필 노트입니다.

이 글은 2025년 학습 기록을 블로그 형식으로 정리한 백필 노트입니다.


1. Azure VNet을 이용한 망 분리 환경 구축

내부망을 외부로부터 보호하기 위해 Public/Private 서브넷으로 분리하고, 외부에서는 Bastion Host를 통해서만 내부망에 접근할 수 있는 보안 환경을 구성합니다.

💡 베스쳔 호스트 (Bastion Host)란?

내부 네트워크 자원에 안전하게 접속하기 위한 중계 서버(보안 게이트웨이)입니다. 외부와 내부망의 경계에서 접근 통제 및 감사 역할을 수행하며, 관리자는 Bastion Host를 경유하여 내부 서버에 안전하게 접근할 수 있습니다.

1.1. VNet 및 서브넷 생성

  1. 가상 네트워크(VNet) 생성:
    • 리소스 그룹: Bastion-host (신규)
    • 가상 네트워크 이름: bastion-vnet
  2. 서브넷 구성:
    • Private 서브넷 추가: IP 주소 탭에서 '서브넷 추가' 클릭
      • 이름: private-subnet
      • 프라이빗 서브넷 사용: 체크 (기본 아웃바운드 액세스 차단)
    • Public 서브넷 수정: 기존 default 서브넷을 수정
      • 이름: public-subnet

1.2. 가상 머신(VM) 생성

1.2.1. Bastion Host VM 생성 (Public Subnet)

외부망과의 접점 역할을 할 VM을 생성합니다.

  • 리소스 그룹: Bastion-host
  • 가상 머신 이름: bastion-host
  • 이미지: Ubuntu Server 24.04 LTS
  • 인바운드 포트: HTTP(80), SSH(22)
  • 네트워킹:
    • 가상 네트워크: bastion-vnet
    • 서브넷: public-subnet
    • 공용 IP: bastion-host-ip (신규)
  • SSH 키: 생성 후 프라이빗 키(bastion-host_key.pem) 다운로드

1.2.2. 보호 대상 VM 생성 (Private Subnet)

외부에서 직접 접근이 불가능한 내부망 VM을 생성합니다.

  • 리소스 그룹: Bastion-host
  • 가상 머신 이름: protected-resource
  • 이미지: Ubuntu Server 24.04 LTS
  • 인바운드 포트: SSH(22)
  • 네트워킹:
    • 가상 네트워크: bastion-vnet
    • 서브넷: private-subnet
    • 공용 IP: 없음
  • SSH 키: 생성 후 프라이빗 키(protected-resource_key.pem) 다운로드

1.3. Bastion Host를 통한 내부망 접속

  1. Bastion Host 접속: bastion-host VM은 공용 IP가 있으므로 외부에서 SSH 접속이 가능합니다. 접속 시 **사설 IP 주소(10.0.1.4)**를 기록해 둡니다.

  2. 개인키 파일 업로드:

    • 로컬 PC의 protected-resource_key.pem 파일을 bastion-host VM으로 전송해야 합니다. scp 명령어를 사용합니다.Bash

      # scp -i <bastion-host 키> <전송할 파일> <사용자>@<bastion-host 공인IP>:<목적지 경로>
      scp -i ./bastion-host_key.pem ./protected-resource_key.pem azureuser@4.205.181.27:/home/azureuser
      
  3. Bastion Host 재접속 및 권한 설정:

    • bastion-host VM에 다시 SSH로 접속합니다.

    • 전송된 개인키 파일의 권한을 소유자만 읽을 수 있도록 변경합니다. (권한이 너무 열려 있으면 SSH 접속이 거부됨)Bash

      chmod 400 ./protected-resource_key.pem
      
  4. 내부망 VM으로 최종 접속:

    • bastion-host VM 터미널에서 protected-resource VM의 사설 IP로 SSH 접속을 시도합니다.Bash

      # bastion-host@azureuser$
      ssh -i ./protected-resource_key.pem azureuser@10.0.1.4
      
    • 정상적으로 내부망의 protected-resource VM에 접속됩니다.


2. Azure Firewall을 이용한 중앙 집중형 트래픽 제어

VNet 앞단에 방화벽을 배치하여 모든 트래픽을 중앙에서 제어하고 모니터링하는 환경을 구축합니다.

2.1. 방화벽 배포

  1. 방화벽용 서브넷 생성: bastion-vnetAzureFirewallSubnetAzureFirewallManagementSubnet 두 개를 추가합니다.
  2. 공용 IP 생성: 방화벽 관리용 공용 IP(firewall-management-ip)를 생성합니다.
  3. 방화벽 생성:
    • 리소스 그룹: Bastion-host
    • 이름: firewall
    • 방화벽 SKU: 프리미엄 (TLS 검사, IDPS 등 고급 기능 제공)
    • Firewall policy: management (신규)
    • 가상 네트워크: bastion-vnet 사용
    • 공용 IP 주소: firewall-ip (신규), firewall-management-ip (기존)
  4. 생성된 방화벽의 공인 IP 주소(20.48.134.210)를 기록합니다.

2.2. DNAT 규칙 설정: 외부에서 내부로의 SSH 접근

💡 DNAT (Destination NAT)란?

외부에서 방화벽의 공인 IP로 들어온 요청의 목적지 주소를 내부 서버의 사설 IP로 변환하여 트래픽을 전달하는 기술입니다.

  • 방화벽 정책(management) > DNAT 규칙에서 아래와 같이 규칙 컬렉션을 추가합니다.

    • 규칙 컬렉션 이름: management-access
    • 규칙 이름: allow-ssh
    • 원본: (모두)
    • 프로토콜/대상 포트: TCP / 22
    • 대상 (방화벽 IP): 20.48.134.210 (기록해 둔 방화벽 공인 IP)
    • 변환된 주소 (내부 IP): 10.0.0.4 (bastion-host의 사설 IP)
    • 번역된 포트: 22
  • 결과: 이제 방화벽의 공인 IP로 SSH 접속을 시도하면 bastion-host로 연결됩니다.Bash

    ssh -i ./bastion-host_key.pem azureuser@20.48.134.210
    

2.3. UDR(사용자 정의 경로) 설정: 모든 트래픽 강제 우회

UDR을 설정하여 모든 서브넷 트래픽이 방화벽을 거치도록 강제합니다.

  1. 방화벽 네트워크 규칙 추가: 허용/거부 정책을 추가합니다. (예: private-access는 허용, private-deny는 거부)
  2. 경로 테이블 생성: private-udrpublic-udr 두 개의 경로 테이블을 생성합니다.
  3. 경로 추가 및 서브넷 연결:
    • public-udr:
      • private-subnet(10.0.1.0/24)으로 가는 트래픽의 다음 홉(Next hop)을 방화벽(10.0.2.4)으로 지정합니다.
      • public-udrpublic-subnet에 연결합니다.
    • private-udr:
      • public-subnet(10.0.0.0/24)으로 가는 트래픽의 다음 홉을 방화벽으로 지정합니다.
      • private-udrprivate-subnet에 연결합니다.
  4. 테스트: SSH(허용 규칙) 통신은 성공하고, HTTP(거부 규칙) 통신은 실패하는 것을 확인합니다.

2.4. 방화벽 로그 분석

  1. Log Analytics 작업 영역 생성: log-firewall 이름으로 생성합니다.

  2. 진단 설정 추가: firewall 리소스의 '진단 설정'에서 모든 로그(allLogs)를 log-firewall 작업 영역으로 보내도록 설정합니다.

  3. 로그 쿼리: Log Analytics 작업 영역에서 KQL 쿼리를 사용하여 로그를 분석합니다.코드 스니펫

    AzureDiagnostics
    | where Category == "AzureFirewallNetworkRule"
    | limit 10
    

3. Azure Front Door를 이용한 고가용성 웹 서비스 구축

글로벌 부하 분산을 통해 여러 지역의 웹 서버에 트래픽을 분산시켜 고가용성 환경을 구성합니다.

  1. 웹 서버 VM 준비:
    • ha-web 리소스 그룹에 web-1, web-2 두 개의 VM을 생성합니다.
    • 각 VM에 LAMP 서버를 설치하고, 구분을 위해 index.html 파일에 각각 "web-1", "web-2"를 기록합니다.
  2. 네트워크 보안 그룹(NSG) 설정:
    • 각 VM의 인바운드 보안 규칙에 원본Service Tag, 원본 서비스 태그AzureFrontDoor.Backend로 지정하여 Front Doorからの HTTP 트래픽만 허용합니다.
  3. Azure Front Door 생성:
    • '빨리 만들기' 옵션으로 ha-web 리소스 그룹에 생성합니다.
    • 엔드포인트ha-web으로, 원본web-1의 공용 IP로 설정합니다.
  4. 경로 및 원본 그룹 설정:
    • 경로: default-route에서 HTTP만 사용하므로 리디렉션 옵션을 해제합니다.
    • 원본 그룹: default-origin-groupweb-2의 공용 IP를 원본으로 추가하여 부하 분산 대상에 포함시킵니다.
  5. 결과 확인: Front Door에서 제공하는 엔드포인트 URL로 접속 시, 새로고침할 때마다 "web-1"과 "web-2" 페이지가 번갈아 나타납니다.

4. DDoS 보호 및 계정 보안 강화

4.1. DDoS 보호 계획

Azure는 모든 구독에 기본(Basic) DDoS 보호를 무료로 제공하며, 고급 기능이 포함된 표준(Standard) 플랜은 유료입니다.

| 구분 | DDoS Protection 기본 (무료) | DDoS Protection 표준 (유료) | | --- | --- | --- | | 특징 | Azure 인프라 차원의 기본 방어 | 지능형 트래픽 프로파일링, WAF 연동 | | 보고서 | 제공 안 함 | 공격 분석 및 요약 보고서 제공 | | 지원 | 기본 지원 | DDoS 전문가의 빠른 응답 지원 | | 비용 | 없음 | 월 약 $2,944 (100개 리소스 포함) |

  • 설정 방법 (참고): 'DDoS protection plans'에서 새 보호 계획을 생성한 후, 보호할 VNet에 적용합니다. (비용 문제로 실습은 생략)

4.2. Azure 계정 조건부 액세스

Microsoft Entra ID(구 Azure AD)를 통해 계정 접근 보안을 강화합니다.

4.2.1. 보안 기본값 (Security Defaults)

모든 사용자에게 기본적인 MFA(다단계 인증) 적용 등 필수 보안 설정을 한 번에 활성화하는 기능입니다.

  • 활성화 경로: Microsoft Entra ID > 속성 > 보안 기본값 관리 > 사용
  • 주요 정책: 관리자 MFA 요구, 레거시 인증 차단, 모든 사용자 MFA 요구 등

4.2.2. 조건부 액세스 (Conditional Access)

사용자, 위치, 디바이스 상태 등 다양한 조건에 따라 접근을 세밀하게 제어하는 고급 기능입니다. (유료 플랜 필요)

  • 설정 경로: 보호 > 보안 센터 > 조건부 액세스 > 새 정책 만들기
  • 제어 가능 조건:
    • 사용자/로그인 위험도: 계정 탈취나 비정상 로그인 시도 감지
    • 디바이스 플랫폼: Windows, iOS 등 특정 OS만 허용/차단
    • 위치: 특정 국가나 IP 대역에서의 접근 제어
    • 클라이언트 앱: 브라우저, 모바일 앱 등 접속 경로에 따른 제어