네트워크 방화벽 표준 규칙 그룹과 도메인 목록 규칙 그룹 규칙을 함께 구성하려면 어떻게 해야 합니까?

6분 분량
0

AWS Network Firewall 표준 규칙 그룹 규칙과 도메인 목록 규칙 그룹 규칙이 함께 작동하여 예상대로 트래픽을 제어하도록 구성하고 싶습니다.

간략한 설명

설정된 TCP 트래픽을 삭제하도록 표준 규칙 그룹 규칙을 구성할 수 있습니다. 그런 다음 도메인 목록 규칙 그룹에서 허용된 도메인으로 TCP(TLS) 플로우를 전송하도록 도메인 목록 규칙 그룹 규칙을 구성할 수 있습니다. 이렇게 하려면 “플로우” 키워드로 도메인 목록 규칙 그룹과 표준 규칙 그룹 규칙을 구성하면 됩니다.

**참고:**Amazon 가상 사설 클라우드(Amazon VPC) 콘솔에는 이전에 구성된 규칙 옵션만 표시됩니다. 규칙 옵션을 추가할 수는 없습니다. 자세한 내용은 AWS Network Firewall의 표준 상태 저장 규칙 그룹을 참조하십시오.

AWS CloudFormation 또는 API를 사용하여 표준 규칙 그룹 규칙에 대한 규칙 옵션을 지정할 수 있습니다. 이 문서의 예제에는 AWS 명령줄 인터페이스(AWS CLI) 가 사용됩니다.

**참고:**AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하십시오.

해상도

전제조건

네트워크 방화벽 규칙을 구성하기 전에 다음 정보를 검토하십시오.

  • 이 문서에서는 규칙 옵션을 입력할 수 있는 표준 규칙 그룹 규칙을 구성하는 방법을 설명합니다. 이 예에서는 표준 규칙 그룹 규칙에 규칙 옵션을 추가하면 도메인 목록 규칙 그룹과 함께 작동할 수 있습니다. 이를 통해 트래픽을 더 잘 제어할 수 있습니다.
  • 이 문서에서는 분산 배포 모델 중 하나를 사용합니다. 이 모델은 클라이언트 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스와 인터넷 게이트웨이가 있는 워크로드 퍼블릭 서브넷 간의 트래픽을 보호합니다. 방화벽 정책 규칙 순서는 기본 작업 순서로 설정됩니다.
  • Amazon EC2 인스턴스는 VPC 보안 그룹 및 네트워크 ACL의 TCP 포트 443을 통해 트래픽을 전송할 수 있습니다.
  • 이 문서에서 사용된 방화벽 규칙은 참조할 수 있는 예시입니다. 방화벽에 대해 구성한 규칙이 특정 요구 사항에 적합하고 예상대로 작동하는지 확인해야 합니다.

**참고:**이 문서의 코드 예제에서는 줄임표 (...)를 사용하여 출력을 줄였습니다.

플로우 키워드가 없는 도메인 목록 규칙 그룹과 표준 규칙 그룹의 공통 구성

도메인 목록 규칙 그룹과 표준 규칙 그룹을 구성할 때 구성은 이 예에서 설명하는 것과 유사할 수 있습니다. 도메인 목록 규칙 그룹과 표준 규칙 그룹을 만드는 경우 플로우 키워드를 사용해야 합니다. 플로우 키워드를 사용하지 않는 경우 이 예제에서 설명하는 것과 같은 문제가 발생할 수 있습니다.

이 예에서는 Amazon VPC 콘솔을 사용하여 도메인 목록 규칙 그룹을 생성합니다. 이 규칙은 ** example.com으로의 HTTPS 트래픽을 허용합니다**.

Domain name source: example.com
Source IPs type: Default
Protocol: HTTPs
Action: Allow

**참고:**작업이 허용으로 설정된 도메인 목록 규칙 그룹은 또 다른 규칙을 생성합니다. 규칙은 도메인 사양과 일치하지 않는 지정된 프로토콜 유형의 트래픽을 거부하도록 설정됩니다. 자세한 내용은 도메인 필터링을 참조하십시오.

Amazon VPC 콘솔을 사용하여 표준 규칙 그룹 규칙의 공통 구성을 생성하면 다음 표와 비슷한 결과가 출력됩니다.

프로토콜출처목적지소스 포트대상 포트방향액션
TCP임의임의임의임의포워드드롭

허용된 도메인에 규칙 구성을 테스트하기 위해 요청을 보내면 트래픽이 차단되고 “연결 시간 초과” 오류가 표시됩니다.

$ curl -kv -so /dev/null https://example.com
* Trying 93.184.216.34:443...
* connect to 93.184.216.34 port 443 failed: Connection timed out
* Failed to connect to example.com port 443 after 129180 ms: Connection timed out
* Closing connection 0

컨피그레이션으로 인해 모든 TCP 트래픽이 삭제되고 연결 시간이 초과됩니다. 여기에는 허용된 도메인 example.com으로의 TCP 기반 트래픽 차단이 포함됩니다.

TCP 프로토콜이 초기 플로우에 나타나는 첫 번째 프로토콜이기 때문에 HTTPS를 통한 example.com을 허용하는 도메인 목록 규칙 그룹 규칙이 실패합니다. 플로우는 하위 계층 TCP 핸드셰이크로 시작되며 거부 규칙이 평가됩니다. 하지만 아직 일치하는 TLS 프로토콜이 없으므로 삭제 규칙이 일치합니다. 이로 인해 example.com으로 향하는 모든 트래픽이 감소합니다.

**참고:**방화벽의 스테이트풀 엔진에 대한 로깅 수준을 구성하여 필터링된 트래픽에 대한 세부 정보에 액세스할 수 있습니다. 자세한 내용은 AWS 네트워크 방화벽의 네트워크 트래픽 로깅을 참조하십시오.

플로우 키워드가 포함된 도메인 목록 규칙 그룹 및 표준 규칙 그룹 규칙

네트워크 방화벽 describe-rule-groupupdate-rule-group 명령을 사용하여 추가 플로우 키워드를 포함하도록 표준 규칙 그룹 규칙을 업데이트할 수 있습니다.

1.원래 스테이트풀 규칙 그룹 객체에 대해 describe-rule-group 명령을 실행합니다. 업데이트 규칙 그룹 명령을 실행하려면 UpdateToken 값이 필요합니다.

참고: 다음 명령의 출력 일부는 나중에 다른 조정을 위한 JSON 템플릿으로 사용됩니다.

$ aws network-firewall describe-rule-group --rule-group-arn "arn:aws:network-firewall:us-east-1:XXXXXXXX0575:stateful-rulegroup/stateful-rg-5-tuple" --output json
{
    "UpdateToken": "40b87af5-a20c-4f8c-8afd-6777c81add3c",
    (...)
        "RulesSource": {
            "StatefulRules": [{
                "Action": "DROP",
                "Header": {
                    "Protocol": "TCP",
                    "Source": "Any",
                    "SourcePort": "Any",
                    "Direction": "FORWARD",
                    "Destination": "Any",
                    "DestinationPort": "Any"
                },
                "RuleOptions": [{
                    "Keyword": "sid",
                    "Settings": [
                        "5"
                    ]
                }]
            }]
        }
    (...)
}

2.수정된 규칙 구성을 사용하여 JSON 규칙 파일을 생성합니다. 다음과 비슷한 명령을 실행하여 JSON 규칙 파일 콘텐츠를 확인합니다.

$ cat tcp-drop-rule-updated.json
{
  "RulesSource": {
    "StatefulRules": [
      {
        "Action": "DROP",
        "Header": {
          "Direction": "FORWARD",
          "Protocol": "TCP",
          "Destination": "Any",
          "Source": "Any",
          "DestinationPort": "Any",
          "SourcePort": "Any"
        },
        "RuleOptions": [
          {
            "Keyword": "sid",
            "Settings": [
              "5"
            ]
          },
          {
            "Keyword": "flow",
            "Settings": [
              "established, to_server"
            ]
          }
        ]
      }
    ]
  }
}

이 예제에서 플로우 키워드를 사용하면 example.com에 요청을 보낼 때 TCP 삭제 규칙을 평가하기 전에 TCP 핸드셰이크를 완료할 수 있습니다. 이후에는 규칙의 기본 작업 순서가 우선합니다. 도메인 목록은 example.com 매칭에 대한 HTTPS 규칙을 허용하여 나머지 트래픽이 해당 플로우로 전달되도록 합니다. 허용되지 않은 도메인에 대한 모든 트래픽은 차단되며 설정된 다른 모든 TCP 트래픽도 차단됩니다.

3.UpdateToken 값과 JSON 규칙 파일을 사용하여 update-rule-group 명령을 실행하여 표준 규칙 그룹을 업데이트합니다.

$ aws network-firewall update-rule-group --rule-group-arn "arn:aws:network-firewall:us-east-1:XXXXXXXX0575:stateful-rulegroup/stateful-rg-5-tuple" --update-token 40b87af5-a20c-4f8c-8afd-6777c81add3c --rule-group file://tcp-drop-rule-updated.json --output json

결과는 다음 출력과 비슷합니다.

{
    "UpdateToken": "bf8fe6d4-f13e-406c-90c1-9e3bad2118a7",
    "RuleGroupResponse": {(...)},
        "LastModifiedTime": "2023-02-07T14:12:14.993000+11:00"
    }
}

4.describe-rule-group 명령을 실행하여 스테이트풀 규칙 그룹의 변경 사항을 확인합니다.

$ aws network-firewall describe-rule-group --rule-group-arn "arn:aws:network-firewall:us-east-1:XXXXXXXX0575:stateful-rulegroup/stateful-rg-5-tuple" --output json

출력은 다음 메시지와 비슷합니다.

{(...)
        "RulesSource": {
            "StatefulRules": [
                {
                    "Action": "DROP",
                    "Header": {
                        "Protocol": "TCP",
                        "Source": "Any",
                        (...)
                    },
                    "RuleOptions": [
                        {
                            "Keyword": "sid",
                            "Settings": [
                                "5"
                            ]
                        },
                        {
                            "Keyword": "flow",
                            "Settings": [
                                "established, to_server"
                           ]
           (...)
        }
    },
    "RuleGroupResponse": {(...)        },
        "LastModifiedTime": "2023-02-07T14:12:14.993000+11:00"
    }
}

**참고:**위 예제에서 **"established, to_server"**는 update-rule-group 명령에서 변경된 내용을 반영합니다.

5.도메인 목록 규칙 그룹과 표준 규칙 그룹이 모두 트래픽을 올바르게 필터링하는지 확인하십시오.

$ curl -kv -so /dev/null https://example.com
*   Trying  93.184.216.34 :443...
* Connected to example.com ( 93.184.216.34 ) port 443 (#0)
(...)
> GET / HTTP/1.1
> Host: example.com
(...)

< HTTP/1.1 200 OK
(...)

이전 예제의 출력은 허용된 도메인 example.com으로의 HTTPS 트래픽이 구성된 대로 성공한다는 것을 보여줍니다.

다음 예시에서는 허용되지 않는 도메인에 대한 HTTPS 트래픽이 예상대로 차단됩니다.

$ curl -m 5 -kv -so /dev/null https://www.amazon.com
*   Trying  93.184.216.34 :443...
* Connected to www.amazon.com ( 93.184.216.34 ) port 443 (#0)
(...)
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
(...)
* Operation timed out after 5000 milliseconds with 0 out of 0 bytes received
* Closing connection 0

다른 유형의 TCP 트래픽도 컨피그레이션에 따라 차단됩니다.

$ aws s3 ls --cli-read-timeout 30 --debug
(...)
Read timeout on endpoint URL: "https://s3.amazonaws.com/"

관련 정보

AWS Network Firewall의 유연한 규칙 엔진에 대한 실습 안내 — 1부

AWS 공식
AWS 공식업데이트됨 일 년 전