Azure App Service 에서 NGINX Plus로 앱 보호

이 포스트에서는 Microsoft Azure App Service 에서 애플리케이션을 호스팅하고 NGINX Plus로 애플리케이션을 보호하여 인터넷 공격을 방지하는 방법을 보여줍니다.

클라우드 컴퓨팅, 특히 PaaS(Platform as a Service) 및 CaaS(Container as a Service) 제품의 부상은 기업이 비즈니스 애플리케이션을 배포하고 운영하는 방식을 변화시키고 있습니다. 클라우드 애플리케이션을 설계할 때 가장 중요한 과제 중 하나는 보안을 손상시키지 않으면서 비용과 시간 소모적인 운영 작업을 줄이는 완전 관리형 클라우드 서비스(managed cloud service)를 선택하는 것입니다.

목차

1. Microsoft Azure App Service에 대한 간략한 개요
2. Azure App Service 환경 이해
3. 새 ASE v2 만들기
4. Azure Application Gateway 와 NGINX Plus 비교
5. Azure App Service와 함께 NGINX Plus를 사용하여 앱 보호
6. Azure VM Scale Sets를 사용한 NGINX Plus 고가용성 및 자동 크기 조정
7. 요약

1. Microsoft Azure App Service 에 대한 간략한 개요

Microsoft Azure App Service 는 그림 1과 같이 조직이 기본 인프라를 관리하지 않고 Microsoft Azure에서 웹, API 및 모바일 앱을 배포할 수 있도록 하는 엔터프라이즈급 완전 관리형 플랫폼입니다. Azure App Service 는 다음과 같은 주요 기능을 제공합니다.

  • Web Apps를 사용하면 다양한 언어 및 프레임워크(ASP.NET, Node.js, Java, PHP 및 Python)에서 웹 앱을 배포하고 실행할 수 있습니다. 또한 포괄적인 애플리케이션 관리 기능(모니터링, 스테이징에서 프로덕션으로 전환, 배포된 애플리케이션 삭제 등)과 함께 인터넷 정보 서비스(IIS)를 사용하여 확장 가능하고 안정적인 웹 애플리케이션을 관리합니다. 또한 컨테이너가 있는 Linux에서 웹 애플리케이션을 실행하기 위한 Docker 런타임을 제공합니다.
  • API 앱은 CORS(Cross‑Origin Resource Sharing) 지원과 함께 REST API를 배포하기 위한 도구를 제공합니다. Azure API 앱은 코드를 변경할 필요 없이 Azure Active Directory, 소셜 네트워크 SSO(Single Sign-On) 또는 OAuth를 사용하여 쉽게 보호할 수 있습니다.
  • 모바일 앱은 인증, 푸시 알림, 사용자 관리, 클라우드 스토리지 등과 같은 필수 기능을 지원하는 모바일 백엔드 서비스를 배포하는 빠른 방법을 제공합니다.
Azure 앱 서비스

그림 1: Azure 앱 서비스

Azure App Service 를 통해 Microsoft는 클라우드에서 웹 애플리케이션을 실행할 수 있는 풍부하고 빠른 방법을 제공합니다. 실제로 개발자는 ASP.NET, Java, Node.js, PHP 및 Python을 사용하여 애플리케이션을 로컬에서 개발하고 Microsoft Visual Studio 또는 Azure CLI를 사용하여 Azure App Service 에 쉽게 배포할 수 있습니다. 또한 DevOps 팀은 Azure App Service 의 지속적인 배포 기능을 활용하여 여러 환경에서 애플리케이션 릴리스를 빠르고 안정적으로 배포할 수 있습니다.

Azure App Service 의 애플리케이션은 Azure에 배포된 다른 리소스에 액세스하거나 VPN을 통해 온프레미스 회사 리소스에 대한 연결을 설정할 수 있습니다.

2. Azure App Service 환경 이해

기본적으로 Azure App Service 로 만든 애플리케이션은 인터넷에 직접 노출되며 azurewebsites.net 의 하위 도메인에 할당됩니다. 보안을 강화하기 위해 SSL Termination 또는 OAuth2 또는 OIDC(OpenID Connect)와 같은 인증 및 권한 부여 프로토콜을 사용하여 앱을 보호할 수 있습니다. 그러나 세분화된 아웃바운드 및 인바운드 보안 규칙으로 네트워크를 사용자 정의하거나 웹 애플리케이션 방화벽(WAF)과 같은 미들웨어를 적용하여 인터넷에서 오는 악의적인 공격이나 악용을 방지하는 것은 불가능합니다.

Azure App Service 에서 중요한 애플리케이션을 실행하고 이를 보호하려는 경우 Azure ASE(App Service Environment)를 사용할 수 있습니다. ASE는 가상 네트워크에 배포되고 단일 고객의 애플리케이션 전용으로 격리된 환경입니다. 따라서 인바운드 및 아웃바운드 애플리케이션 네트워크 트래픽을 더 잘 제어할 수 있습니다.

ASE를 사용하면 그림 2와 같이 보다 안전한 환경에서 대규모로 웹, API, 모바일 또는 함수 앱을 배포할 수 있습니다.

Azure App Service Azure ASE에 대한 NGINX Modsecurity WAF 필터링 트래픽

그림 2: Azure ASE에 대한 NGINX Modsecurity WAF 필터링 트래픽

3. 새 ASE v2 만들기

ASE에는 ASE v1과 ASE v2의 두 가지 버전이 있습니다. 이 포스트에서는 ASE v2에 대해 논합니다.

Azure Portal을 사용하여 수동으로 또는 Azure Resource Manager를 사용하여 자동으로 새 ASE v2를 만들 수 있습니다.

새 ASE를 만들 때 다음 두 가지 유형 중에서 선택해야 합니다.

  • 외부 ASE는 Public IP 주소를 통해 ASE 호스팅 애플리케이션을 노출합니다.
  • ILB ASE는 Azure 가상 네트워크 내에서만 액세스할 수 있는 Private IP 주소에 ASE 호스팅 애플리케이션을 노출합니다. 내부 끝점은 Azure에서 ILB(Internal load balancer)라고 부르는 것입니다.

다음 예에서는 인터넷 액세스를 방지하기 위해 ILB ASE를 선택합니다. 따라서 ASE에 배포된 애플리케이션은 동일한 네트워크에서 실행되는 가상 머신(VM)에서만 액세스할 수 있습니다. 다음 두 명령은 Azure Resource Manager 및 Azure CLI를 사용하여 새 ILB ASE v2 를 프로비저닝합니다.

$ azure config mode arm
$ azure group deployment create my-resource-group my-deployment-name --template-uri https://raw.githubusercontent.com/azure/azure-quickstart-templates/master/201-web-app-asev2-ilb-create/azuredeploy.json

4. Azure Application Gateway 와 NGINX Plus 비교

반면에 인터넷에서 앱에 접근할 수 있게 하려면 애플리케이션에 저장된 중요한 정보를 도용하려는 악의적인 공격자로부터 앱을 보호해야 합니다.

ASE의 Layer 7에서 애플리케이션을 보호하기 위해 다음 두 가지 주요 선택 사항이 있습니다.

(사용자 지정 Application Delivery Controller[ADC]를 WAF 기능으로 대체할 수 있지만 여기에서는 해당 사용 사례를 다루지 않습니다.)

솔루션 선택은 보안 제약 조건에 따라 다릅니다. 한편으로 Azure Application Gateway는 보안 적용을 위한 Turn Key 솔루션을 제공하며 기본 인프라를 유지 관리할 필요가 없습니다. 반면 VM에 NGINX Plus를 배포하면 보안 규칙을 미세 조정할 수 있는 더 많은 제어와 유연성을 갖춘 강력한 스택이 제공됩니다.

Azure Application Gateway와 NGINX Plus 중 하나를 선택하여 ASE 내부에서 생성된 애플리케이션의 부하를 분산하고 보안을 유지하려면 각 솔루션에서 제공하는 기능을 잘 이해해야 합니다. Azure Application Gateway는 단순한 사용 사례에서 작동하지만 복잡한 사용 사례에서는 NGINX Plus에서 표준으로 제공되는 많은 기능을 제공하지 않습니다.

다음 표에서는 Azure Application Gateway와 NGINX Plus의 부하 분산 및 보안 기능에 대한 지원을 비교한 것 입니다. NGINX Plus 기능에 대한 자세한 내용은 표 아래에 나와 있습니다.

특징Azure Application GatewayNGINX Plus
완화 기능애플리케이션 계층(Layer 7)애플리케이션 계층(Layer 7)
HTTP 인식
HTTP/2 인식
WebSocket 인식
SSL 오프로딩
라우팅 기능요청 URL 또는 쿠키 기반 세션 선호도(affinity)를 기반으로 한 간단한 결정고급 라우팅 기능
IP 주소 기반 액세스 제어 목록❌ (Azure의 Webapp 수준에서 정의해야 함)
Endpoint모든 Azure Private IP 주소, Public 인터넷 IP 주소, Azure VM 또는 Azure 클라우드 서비스모든 Azure Private IP 주소, Public 인터넷 IP 주소, Azure VM 또는 Azure 클라우드 서비스
Azure Vnet 지원인터넷 연결 및 내부(Vnet) 애플리케이션 모두인터넷 연결 및 내부(Vnet) 애플리케이션 모두
WAF
Volumetric 공격부분적부분적
프로토콜 공격부분적부분적
애플리케이션 계층 공격
HTTP 기본 인증
JWT 인증
OpenID Connect SSO
Azure Application Gate 와 NGINX Plus 비교표

보시다시피 NGINX Plus와 Azure Application Gateway는 모두 Layer 7 부하 분산 기능과 WAF가 있는 ADC 역할을 하여 일반적인 웹 취약성 및 악용에 대한 강력한 보호를 보장합니다.

NGINX Plus는 Azure Application Gateway에서 누락된 몇 가지 추가 기능을 제공합니다.

  • URL Rewriting 및 Redirecting – NGINX Plus를 사용하면 요청을 백엔드 서버로 전달하기 전에 요청의 URL을 재작성(rewrite)할 수 있습니다. 즉, 클라이언트에 알리는 URL을 수정하지 않고도 파일 위치 또는 요청 경로를 변경할 수 있고 요청을 리다이렉션할 수도 있습니다. 예를 들어 모든 HTTP 요청을 HTTPS 서버로 리다이렉션할 수 있습니다.
  • 연결 및 속도 제한(limit) – NGINX Plus 인스턴스에서 들어오고 나가는 트래픽을 제어하기 위해 여러 제한을 구성할 수 있습니다. 인바운드 연결 수, 인바운드 요청 속도, 백엔드 노드에 대한 연결 및 NGINX Plus에서 클라이언트로의 데이터 전송 속도에 대한 제한이 포함되어있습니다.
  • HTTP/2 및 WebSocket 지원 – NGINX Plus는 애플리케이션 계층(Layer 7)에서 HTTP/2 및 WebSocket을 지원합니다. Azure Application Gateway는 그렇지 않습니다. 대신 Azure Load Balancer는 TCP 및 UDP가 작동하는 네트워크 계층(Layer 4)에서 이를 지원합니다.

추가 보안을 위해 Azure DDoS Protection을 배포하여 Layer 3 및 Layer4 에서 위협을 완화하고 Azure Application Gateway 또는 NGINX Plus에서 제공하는 Layer 7 위협 완화 기능을 보완할 수 있습니다.

5. Azure App Service 와 함께 NGINX Plus를 사용하여 앱 보호

그림 3은 NGINX Plus와 Azure App Service 를 결합하여 프로덕션에서 비즈니스 애플리케이션을 실행하기 위한 보안 환경을 제공하는 방법을 보여줍니다. 이 배포 전략은 로드 밸런싱 및 WAF 기능에 NGINX Plus를 사용합니다.

Azure App Service NGINX Plus는 Azure ASE의 애플리케이션에 대한 트래픽 부하를 분산

그림 3: NGINX Plus는 Azure ASE의 애플리케이션에 대한 트래픽 부하를 분산합니다.

배포는 다음 구성 요소를 결합합니다.

  • Azure VNet(Virtual Network)  – 조직 전용 Azure 클라우드의 가상 네트워크를 나타냅니다. Azure 리소스가 가상 네트워크에서 서로 안전하게 통신할 수 있도록 하는 논리적 격리를 제공합니다. 여기서 우리는 두 개의 서브넷을 정의했습니다. 인터넷에 직접 노출되지 않는 웹 애플리케이션용 내부 와 NGINX Plus 및 그 기반이 되는 인프라용 WAF입니다.
  • Azure App Service Environment  – ​​이 샘플 배포에서는 두 개의 샘플 웹 애플리케이션(Web App 1 및 Web App 2)을 활용하여 NGINX Plus로 다양한 웹 을 보호하고 로드 밸런싱하는 방법을 보여줍니다. NGINX Plus에서는 개별 블록을 구성하여 다른 웹 애플리케이션에 요청을 분산 upstream하고 블록이 있는 URI를 기반으로 콘텐츠 라우팅을 수행합니다 location. 다음은 이 목표를 충족하는 최소 NGINX Plus 구성을 보여줍니다(여기서 모든 요청은 동일한 Upstream 그룹으로 이동함).
upstream backend {
    server IP-address-of-your-ASE-ILB;
}

server {
    location / {
        proxy_set_header Host $host;
        proxy_pass http://backend;
    }
}
  • NGINX Plus  – 여러 웹 애플리케이션에서 HTTP(S) 연결의 부하를 분산합니다. VM에 NGINX Plus를 배포하면 다른 Azure 서비스가 제공하는 것보다 인프라를 더 많이 제어할 수 있습니다. 예를 들어 VM을 사용하면 격리된 가상 네트워크 내에서 실행되는 운영체제(Linux 또는 Windows)를 선택할 수 있습니다. 실제로 Azure VM은 NGINX Plus가 지원하는 모든 Linux 배포판 에서 사용할 수 있습니다 (분명한 이유로 Amazon Linux 제외).
  • Azure VM 확장 집합  – VM 확장 집합은 동일한 VM 집합을 배포하고 관리하는 데 사용할 수 있는 Azure 계산 리소스입니다. VM의 크기를 구성하고 VM을 올바른 VNet에 할당할 수 있습니다. 확장 집합 내에서 실행되는 모든 VM은 VM 인스턴스 간에 TCP 연결을 제공하는 Azure Load Balancer에 의해 부하가 분산됩니다. 여기서 확장 집합의 각 VM은 Azure Marketplace에서 사용할 수 있는 NGINX Plus 이미지를 기반으로 합니다. 확장 집합은 진정한 자동 크기 조정을 제공하도록 설계되었습니다.

또한 Azure는 애플리케이션에 대한 Azure 리소스를 논리적 방식으로 그룹화하는 쉬운 방법으로 리소스 그룹을 지원합니다. 리소스 그룹을 사용해도 인프라 설계 및 토폴로지에 영향을 주지 않으며 여기에 표시되지 않습니다.

6. Azure VM Scale Sets를 사용한 NGINX Plus 고가용성 및 자동 크기 조정

Azure VM 확장 집합은 확장을 지원하는 물리적 하드웨어를 구입하고 유지 관리할 필요 없이 언제든지 확장할 수 있는 기능을 통해 가상화 기능을 제공합니다. 그러나 VM에서 실행되는 소프트웨어 구성, 패치 적용, 보안 업데이트 및 설치와 같은 작업을 수행하여 VM을 유지 관리하는 것은 여전히 ​​사용자의 책임입니다.

그림 4에 표시된 아키텍처에서 NGINX Plus 인스턴스는 Azure VM 확장 집합 내 active-active high availability 위해 배포됩니다. active-active 설정은 모든 NGINX Plus VM이 Azure Load Balancer에 의해 라우팅되는 들어오는 요청을 처리할 수 있으므로 비용이 효율적인 용량을 제공하므로 유용합니다.

Azure App Service NGINX Plus에 대한 Azure Load Balancer 부하 분산 트래픽이 있는 Azure VM 확장 집합

그림 4: NGINX Plus에 대한 Azure Load Balancer 부하 분산 트래픽이 있는 Azure VM 확장 집합

Azure VM 확장 집합을 사용하면 평균 CPU 사용량을 기반으로 NGINX Plus 인스턴스의 자동 크기 조정을 쉽게 설정할 수도 있습니다. 이 경 NGINX Plus 구성 파일을 동기화 하려 주의해야 합니다.

7. 요약

클라우드 애플리케이션에 Azure App Service 를 사용하고 Webapp, API 및 모바일 백엔드 앞에 NGINX Plus를 사용하면 글로벌 규모에서 이러한 애플리케이션의 부하를 분산하고 보호할 수 있습니다. Azure App Service 와 함께 NGINX Plus를 사용하면 웹의 악용 및 공격으로부터 수준 높은 보호 기능으로 완전히 부하가 분산된 인프라를 얻을 수 있습니다. 이를 통해 프로덕션에서 중요한 애플리케이션을 안전한 방식으로 실행할 수 있는 견고한 설계를 보장합니다.

NGINX Plus를 사용해 보려면 지금 무료 30일 평가판을 시작하거나 당사에 연락하여 사용 사례에 대해 문의하십시오.

또한 NGINX에 대한 최신 소식을 빠르게 전달받고 싶으시면 아래 뉴스레터를 구독하세요.