EMD Blog

[GCP] Cloud Armor - 보안 정책과 규칙(1) 본문

Public Cloud/GCP

[GCP] Cloud Armor - 보안 정책과 규칙(1)

EmaDam 2024. 7. 13. 14:11
반응형

안녕하세요. Emadam입니다.

 

이번 포스팅에서는 Cloud Armor를 도입하면서 검토하고 공부했던 내용을 공유하려 합니다.

 

최근에 신규로 오픈한 시스템이 공격을 받았던 일이 있었습니다.

Luci Injection

 공격자는 시스템 내 PHP 파일을 스캐닝하고 SQL 인젝션 공격, 원격 코드 실행 등을 시도했습니다. 다행히 시스템에 시큐어 코딩이 적용되어 있어 큰 피해는 입지 않았지만, 공격 빈도가 잦고 공격 방식의 예측 불가능성을 고려하여 보안 강화가 시급하다는 판단에 도달했고 Cloud Armor를 도입하기로 결정하였습니다.

Cloud Armor란?

 Cloud Armor는 DDoS 공격, 크로스 사이트 스크립팅(XSS), SQL Injection과 같은 여러 공격으로부터 어플리케이션을 보호하는 GCP의 보안 서비스입니다. L3 ~ L7 사이의 속성과 일치하는 보안 규칙을 구성해 어플리케이션을 보호할 수 있습니다. 보호 대상으로 부하 분산기, 프로토콜 전달, 공개 IP가 부여된 VM 지정할 수 있으며 부하 분산기의 경우 아키텍처(하이브리드, 멀티클라우드 등)에 구애받지 않고 적용 가능합니다.

Cloud Armor는 표준 네트워크 DDoS 보호 기능인 자동 보호 기능도 제공합니다. 표준 네트워크 DDoS 보호 기능은 외부 패스 스루 네트워크 부하 분산기, 프로토콜 전달, 공개 IP 주소가 있는 VM에 대한 상시적으로 설정되는 기본 보호 기능입니다. 여기에는, Google Cloud Armor 표준이 적용되며 추가 구독이 필요하지 않습니다.

보안 정책과 규칙

 Cloud Armor에서 어플리케이션을 보호하는 가장 기본적인 방법은 보안 정책과 보안 규칙을 구성하는 것입니다. GCP 리소스에 적용 가능한 최소 단위의 보안 구성입니다. 하나의 보안 정책에는 여러 개의 보안 규칙이 포함될 수 있습니다. 예를 들어 아래와 같이 보안 정책과 규칙이 구성될 수 있으며,

  • 보안 정책 A
    • 보안 규칙 1 - X.X.X.X/24로 부터의 접근 차단
    • 보안 규칙 2 - Y.Y.Y.Y/32로 부터의 접근 허용

위 보안 정책 A를 부하 분산기의 백엔드 서비스에 연결할 수 있습니다.

그럼 보안 정책과 규칙은 어떻게 구성할까요?

보안 정책

 보안 정책은 규칙을 그룹화하여 관리하는 역할을 하며, 설정 내용은 다음과 같습니다.

  • 정책 이름
  • 정책에 대한 설명
  • 정책 유형
  • 정책 범위
  • 기본 규칙

이름과 설명은 정책을 식별하기 위한 정보이므로 적절하게 작성해주시면 됩니다. 중요한 부분은 정책 유형입니다. 정책 유형은 세 가지로 구분되어 있습니다.

  • 백엔드 보안 정책 (Backend Security Policy)
  • 에지 보안 정책 (Edge Security Policy)
  • 네트워크 에지 보안 정책 (Network Edge Security Policy)

백엔드 보안 정책

 백엔드 보안 정책은 부하 분산기 뒤에 위치한 백엔드 서비스를 보호합니다. 전역(Global) 또는 지역(Region)으로 구성할 수 있으며 전역로 구성할 경우 전역 부하 분산기의 백엔드 서비스를 대상으로 지정할 수 있고 지역으로 구성할 경우 지역 부하 분산기의 백엔드 서비스를 대상으로 지정할 수 있습니다.

 

[전역 백엔드 보안 정책]

  • 전역 외부 애플리케이션 부하 분산기
  • 기본 애플리케이션 부하 분산기
  • 전역 외부 프록시 네트워크 부하 분산기
  • 기본 프록시 네트워크 부하 분하 분산기

[지역 백엔드 보안 정책]

  • 지역 외부 애플리케이션 부하 분산기
  • 지역 내부 애플리케이션 부하 분산기

또한 L7에서 헤더나 페이로드 정보의 필터링이 가능하기 때문에 다른 보안 정책 유형보다 넓은 범위의 필터링 기능을 제공합니다.

에지 보안 정책

 에지 보안 정책은 부하 분산기 앞단인 인터넷 경계에서 CDN을 보호하는 정책입니다. 전역 리소스의 에지에서 작동하기 때문에 전역 부하 분산기의 백엔드 서비스 및 백엔드 버킷에서만 사용할 수 있습니다.

[지원 부하 분산기 유형]

  • 전역 외부 어플리케이션 부하 분산기
  • 기본 애플리케이션 부하 분산기

에지 보안 정책은 CDN 단에서 트래픽을 필터링하여 악성 트래픽을 차단하고, 불필요한 트래픽으로 인한 리소스 낭비를 방지합니다. 또한 백엔드 보안 정책과 적용 위치가 다르기 때문에 두 정책을 동시에 적용하여 보안 계층을 강화할 수 있습니다

네트워크 에지 보안 정책

 위 두 보안정책들은 중간에 중간 레이어와 네트워크 가장자리에 위치한 리소스를 보호하도록 설계되어있습니다. 실제 애플리케이션 서버에 직접 트래픽을 전달하기 전에 악성 트래픽을 차단합니다. 하지만 네트워크에 직접적으로 노출되는 리소스들도 있습니다. 이때는 네트워크 에지 보안 정책을 적용할 수 있습니다.

  • 외부 패스 스루 네트워크 부하 분산기
  • 프로토콜 전달
  • 공개 IP 주소가 있는 VM

(네트워크 에지 보안 정책은 지역 리소스이며, 지역 범위로 트래픽을 제어합니다.)

네트워크 에지 보안 정책을 사용하면 바이트 오프셋 필터링을 사용하여 인그레스 패킷의 TCP/UDP 바이트 오프셋 값을 기반으로 트래픽을 필터링할 수 있습니다.

네트워크 에지 보안 정책은 고급 DDoS 네트워크 기능 활성화가 선행되어야하며 이 기능은 Cloud Armor Enterprise 기능입니다. 때문에 네트워크 에지 보안 정책은 Cloud Armor Enterprise 활성화가 필수입니다.

각 정책 유형이 어떤 리소스를 지원하고 어떤 기능을 지원하는지는 아래 문서에 깔끔하게 정리되어 있습니다. Cloud Armor를 도입하시기 전이라면 아래 표를 보고 자신이 상황에 맞는 유형을 선택해주시면 됩니다.

정책 범위

 정책 범위는 리소스가 전역/지역 여부입니다. 백엔드 보안 정책의 경우 전역 또는 지역으로 선택할 수 있고 에지 보안 정책은 전역, 네트워크 에지 정책은 지역을 지정해야 합니다.

기본 규칙

 기본 규칙은 마치 프로그래밍에서 'if문'의 'else' 역할을 하는 것처럼, 보안 정책 내의 여러 규칙들이 모두 일치하지 않을 때 어떻게 처리해야 할지를 정의합니다. 기본 규칙은 자동으로 가장 높은 우선순위 값(2,147,483,647)이 부여되며 허용 및 거부를 지정할 수 있습니다.

이렇게 생성된 보안 정책은 유형에 따라 필요한 리소스를 대상으로 지정할 수 있으며 대상으로 지정한 순간부터 보안 정책 내의 규칙을 기반으로 평가 및 필터링이 수행됩니다.

보안 규칙

 보안 정책을 생성하면 기본 규칙만 존재하는 상태입니다. 때문에 모든 트래픽을 허용하거나 거부하거나 둘 중 하나의 동작만 수행하게 됩니다. 원하는 수준으로 보안을 확보하려면 조건(Condition), 작업(Action), 우선순위(Priority)가 지정된 규칙들을 직접 구성해야 합니다.

조건(Condition)

 조건은 IP를 나열하거나 CEL(Common Expression Language)를 사용해 요청 IP, Header, 본문 등을 검사합니다. 외부 요청을 검사했을 때 이 조건과 일치하면 True를 반환하며 이후에 정의한 작업을 수행하게 됩니다. 조건은 사용자가 직접 정의할 수도 있지만 GCP에서 사전 정의한 구성을 사용할 수도 있습니다. 사전 정의된 구성을 사용할 경우 OWASP 10대 위험을 쉽게 완화할 수 있습니다.

작업(Action)

작업은 조건이 일치할 경우 수행하는 동작입니다. 작업은 다음과 같은 종류가 있습니다.

  • 허용(Allow)
  • 거부(Deny)
  • 리다이렉트(Redirect)
  • 제한(Throttle)
  • 비율 기반 차단(Rate-based-ban)

 조건에 일치할 경우 요청을 허용하거나 거부하거나 리다이렉트하는 것은 명확하기 때문에 제한과 비율 기반 차단은 무엇인지만 간단하게 살펴보겠습니다.

 제한 작업은 클라이언트별 요청 횟수를 제한하는 데 사용됩니다. 요청 기준을 초과하기 전까지는 요청이 허용되지만, 기준을 초과하면 설정에 따라 요청을 거부하거나 리다이렉트할 수 있습니다. 예를 들어, 각 국가별로 들어오는 트래픽이 10분당 10,000회가 넘을 경우 요청을 거부하고 싶다면 클라이언트 구분 기준을 리전 코드로 설정하고 요청 간격/횟수를 10분/10,000회로 설정합니다. 그 다음 초과 작업을 거부로 설정하고 적절한 Status Code를 지정해주면 됩니다.

 

[제한 작업 설정시 필요한 정보]

  • 클라이언트 구분 기준 (IP, Header, 지역 코드 등)
  • 요청 간격/횟수
  • 초과 작업

 비율 기반 차단은 클라이언트가 특정 시간 내에 설정된 요청 횟수를 초과하면 지정된 시간 동안 접속을 차단하는 데 사용됩니다. 예를 들어 기준시간을 10초, 요청 횟수를 60회, 차단 시간을 600초로 지정할 경우 10초동안 요청 수가 60회를 초과하면 초과한 시점부터 기준 시간이 종료된 후 600초까지 요청이 차단됩니다.

 위와 같은 설정은 예상치 못하게 클라이언트를 차단시킬수도 있기 때문에 비율 기반 차단에서는 추가적인 설정을 제공하고 있습니다. 기본 기준 설정 외 차단 기준 설정을 추가로 설정하게 되면 기본 기준 설정에 대해서는 제한(Throttle)으로 동작하지만 차단 기준 설정 값에 대해서는 위와 동일하게 차단 시간이 적용됩니다. 예를 들어 기본 기준 설정을 10초/60회, 차단 기준 설정을 100초/6000회, 차단 시간을 600초로 설정하게 되면 매 10초마다 60회를 초과하는 경우에는 10초 내에서만 차단이 적용(제한과 동일)되지만 이 요청횟수를 계속 누적시켜 100초 동안 6000회가 초과될 경우 초과된 시점부터 기준 시간 종료 후 600초 동안 접속이 차단되게 됩니다.

우선순위(Priority)

 우선순위는 각 규칙의 평가되는 순위입니다. 특정 요청이 평가될 때는 정의된 규칙들을 우선순위에 따라 순차적으로 평가하며 일치하는 규칙이 있을 경우 해당 규칙에 구성된 작업이 수행되고 평가는 중단됩니다.

단, 사전 구성된 규칙을 사용하기 위해 evaluatePreconfiguredExpr()를 사용하는 경우 POST 요청에 대해 Header와 본문이 별도로 평가됩니다. 본문을 평가하는 규칙이 Header를 평가하는 규칙보다 우선순위 값이 높은 상태에서 Header 평가가 통과(허용)하더라도 본문 검사에서 차단되면 Header만 백엔드로 전달될 수 있습니다. 이 부분은 다음 포스팅에서 직접 실습으로 확인해보겠습니다.

마무리

 이렇게 Cloud Armor의 보안 정책과 규칙에 대해 포스팅해보았습니다. 검토하고 사용할 때는 몰랐는데 막상 글로 정리하려보니까 생각보다 내용이 많고 몰랐던 부분도 많아서 공부가 많이 되었습니다. 원래는 실습이랑 모니터링 부분도 전부 작성하려했는데 글이 너무 길어져서 다음 포스팅에서 다뤄볼 예정입니다. 긴 글 봐주셔서 감사합니다.

반응형