Azure App Service의 제약 사항들

이미 Azure 커뮤니티에서 몇 번씩 논의된 사항이지만, 정확히 숙지하지 못하고 넘어갈 수 있는 문제 중에 Azure App Service의 샌드박스 정책에 관한 부분이 있습니다. 이 부분은 Azure App Service 아키텍처를 기반으로 하는 Web App, Logic App, Mobile App, API App, 그리고 Function 까지 영향을 끼치는 중요한 부분입니다.

Cloud Service나 Virtual Machine을 이용하여 애플리케이션을 개발하는 것과는 달리, Azure Web App은 샌드박스라고 하는 실행 환경을 도입하여 보안이나 성능에 문제를 일으킬 수 있는 부분에 대한 기능을 철저하게 제한하고 있습니다.

https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox 에서 소개하고 있는 내용을 간추려서 아티클을 작성하였습니다.

샌드 박스에 영향을 받는 프로세스 목록

아래 프로세스들을 시작으로 샌드박스 정책이 적용됩니다. 진입점에 해당되는 메서드들이므로 Windows 기반 Azure App Service 환경 전체에 샌드박스 환경이 적용된다고 볼 수 있습니다.

  • W3WP.EXE — IIS Application Pool 프로세스
  • CSC.EXE — C# 컴파일러
  • CVTRES.EXE — Visual C++ 리소스 컴파일러
  • NODE.EXE — Node 런타임
  • PHP-CGI.EXE — PHP Fast CGI 런타임
  • JAVA.EXE — 자바 런타임

일반적인 제약 사항들

  • HKCU 루트를 포함하여 모든 레지스트리 쓰기 행위가 금지되며, 제한적으로 레지스트리 읽기는 가능합니다.
  • 이벤트 로그는 읽기 쓰기가 모두 금지됩니다.
  • WMI, MSIServer 등으로의 Out-of-Process COM 서버 호출이 금지됩니다.
  • 사용자 모드에서 가상으로 사용할 수 있는 극히 일부의 콘솔 API를 제외하고 정상적으로는 콘솔 API를 사용할 수 없습니다.
  • Win32k.sys를 기반으로하는 대부분의 API (주로 user32.dll이나 gdi32.dll이 여기에 해당됩니다.)를 사용할 수 없습니다. 꾸준히 보안 패치를 진행하기는 하지만, 궁극적으로 보안 문제를 차단하기 위한 가장 큰 조치입니다.
  • 다른 프로세스를 열거나 실행 중인 프로세스 목록을 열거하는 등의 작업이 제한됩니다.
  • 시스템 서비스를 관리하거나, 열거하거나, 시작하거나, 중지할 수 없도록 제한됩니다.
  • 초기에 제공되는 약속된 심볼릭 링크 외에는 심볼릭 링크를 임의로 생성할 수 없습니다.

PhantomJS나 GhostScript처럼 GDI 및 GDI+를 이용하여 PDF 파일을 생성하는 도구들이 Azure Web App에서 작동하지 않는 가장 큰 이유가 굵게 표시해놓은 Win32k.sys 제약 사항 때문이라고 보시면 되겠습니다.

그 외에도, 레거시 애플리케이션을 곧바로 Azure App Service로 마이그레이션할 수 없는 이유의 상당수가 위의 내용에 해당되기 때문입니다.

네트워크 관련 제약 사항들

네트워크에 관련된 제약 사항들은 다음과 같습니다.

  • TCP 80 포트나 TCP 443 포트에 한하여 인터넷으로 들어오는 요청을 받을 수 있게 되어있습니다. App Service 내부 통신에는 포트 제약이 없습니다.
  • 127.0.0.1 이나 localhost, 그리고 로컬 머신의 IP 주소를 사용하여 연결하는 동작은 동작하지 않습니다.
  • 사설 IP 주소 대역으로는 연결을 요청할 수 없습니다.
  • SOCK_RAW (Raw Socket) 타입의 소켓을 생성할 수 없습니다. SYN 공격이 Azure Web App으로부터 일어나는 것을 방지하기 위함입니다.
  • Azure Web App 바깥의 서비스로 접속할 때 445, 137, 138, 139 포트는 사용할 수 없도록 차단됩니다.
  • 샌드 박스 내에서는 네임드 파이프를 만들어 통신할 수 있습니다.

기타 제약 사항들

Free, Shared, Consumption Limit 플랜의 경우, 스레드는 최대 512개까지, 프로세스는 최대 32개까지, 소켓 연결은 300개까지만 지원합니다. 그래서 볼륨이 큰 웹 사이트를 운영할 때에는 Basic 이상의 플랜을 사용하는 것이 필요합니다.

그리고 커스텀 서체 렌더링을 포기한다는 전제 조건 아래에서 다음의 PDF 관련 툴킷은 Basic 이상의 Web App 플랜으로 업그레이드하여 Web App과 함께 사용할 수 있습니다.

  • SQL Reporting Framework
  • EVOPDF
  • Telerik Reporting
  • Rotativa / wkhtmltopdf
  • NReco PdfGenerator

결론

Azure App Service로 기존 Win32 애플리케이션을 PaaS 화 하는 것을 검토하고 계시다면, 도입할 수 있는 기술의 폭이 샌드박스로 인하여 극단적으로 줄어들게 됩니다. 이러한 경우, Azure Batch나 Azure Virtual Machine (Scale Set), 혹은 Azure Cloud Service로 PaaS 서비스를 개발하는 것이 필요할 수 있습니다.

많은 시간을 들여 고민하고 테스트하기 전에 이 아티클의 내용이 도움이 되었으면 하여 공유합니다.

글쓴이: 남정현

http://www.rkttu.com

One thought

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

w

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.