AWS Network Firewall 사용하기 — CLI 를 이용한 Rule Group 생성

JIPA
17 min readFeb 9, 2021

--

지난 해 AWS 에서 새로운 Network 보안 서비스인 AWS Network Firewall (이하 “ANF”)서비스를 출시하였는데요. ANF 는 별도의 서비스 메뉴로 구분되어서 제공되지는 않고 VPC 의 하위 메뉴에 “AWS Network Firewall” 라는 메뉴를 통해 제공되고 있습니다. ANF 는 네트워크 보안 기능을 크게 두 가지 엔진(Stateless Engine 과 Statefull Engine) 을 이용하여 제공하는데요. Stateless Engine 은 Subnet 에 적용되는 Network Access Control 과 비슷한 특징을 가지고 있는데요. 예를 들면 Priority 라는 것을 기준으로하여 규칙의 우선순위를 두고 적용한다거나 Connection Table 의 State 와 관계 없이 Packet 단위의 규칙 검사를 한다는 점이 대표적이라고 볼 수 있습니다. Stateful Engine 은 Security Group 과 비슷한데요. Stateless Engine 과 다르게 Stateful Engine 은 호스트 간의 통신에 사용되는 Connection 정보를 참조하여 트래픽을 처리합니다. 즉, 인터넷에서 VPC 로 유입되는 트래픽이나 VPC 에서 인터넷으로 유출되는 트래픽의 경우 최초 Connection 이 정상적으로 수립되면 이 Connection 과 연관된 트래픽은 별도의 규칙 검사 없이 처리되게 됩니다. 단, Security Group 과 다르게 ANF 의 Stateful Engine 은 IPS(Intrusion Protection System)기능도 포함하고 있기 때문에 Network Level 의 연결은 기존 Connection 에 따라 별도의 트래픽 규칙 검사 없이 허용될 수 있지만 Domain 정보나 기타 IPS 정책에 의해 기존 Connection 에 매칭되는 트래픽도 규칙 검사 대상이 될 수 있습니다.

ANF 는 기존의 AWS 사용 고객들이 필요로 했었던 Domain 기반 트래픽 차단이나 IPS 기능을 제공한다는 점에서 아주 반가운 서비스가 아닐 수 없습니다. 다만 2021년 2월 현재 Seoul Region 에서는 지원하지 않고 일부 Region 에서만 사용이 가능하지만 곧 Seoul Region 에서도 이용 가능하기를 바라면서 간단하게 ANF 를 설정하는 방법에 대해 살펴보도록 하겠습니다.

ANF 는 다음과 같은 아주 간단한 순서에 따라 VPC 에 적용하실 수 있습니다.

  1. ANF 의 Endpoint 가 생성될 Subnet 을 생성합니다.
    : ANF 는 내부적으로는 GWLBe(Gateway Load Balancer Endpoint)를 사용합니다. 따라서, Network Firewall 생성 과정에서 VPC 의 Subnet 을 지정하게 되는데 이 때 지정되는 Subnet 이 GWLBe 가 생성될 Subnet 이며 가능하다면 이미 사용중인 Subnet 보다는 별도의 Subnet 을 생성하여 해당 Subnet 에 GWLBe 가 생성되도록 하는 것을 권고합니다.
  2. ANF Rule Group 을 생성합니다.
    : 조직에서 요구되는 네트워크/어플리케이션 보안 요구 사항에 따라 Stateless Rule Group 과 Stateful Rule Group 을 생성합니다.
  3. Firewall Policy 를 생성합니다.
    : 생성된 Rule Group 들을 포함하는 Firewall Policy 를 생성합니다.
    *Firewall Policy 는 Network Firewall 생성 과정에서도 생성할 수도 있습니다.
  4. ANF 를 생성합니다.
    : ANF 를 적용할 VPC 를 선택하고 해당 VPC 에 GWLBe 가 생성될 Subnet 을 적용한 후 위 과정에서 생성한 Firewall Policy 를 할당하여 새로운 AWS Network Firewall 생성합니다.
  5. Ingress Routing 과 Subnet 라우팅을 수정합니다.
    : ANF 는 Gateway Load Balancer 와 트래픽 처리 방법이 유사합니다. 단순하게 ANF 를 생성하고 Policy 를 할당하는 것만으로는 ANF 로 트래픽이 전달되지 않으며 VPC 의 Ingress/Egress 트래픽이 ANF 에서 처리되도록 하기 위해서는 IGW 의 Ingress Routing 과 VPC 내의 보호 대상 Subnet 의 Routing Table 이 GWLBe 를 향하도록 설정하여야 합니다.

ANF 적용을 위한 Routing Table 설정은 아래의 링크를 참고하시기 바랍니다.

Stateless 규칙 생성

이렇게 Routing Table 까지 모두 변경하였다면 VPC 내부에서 외부로 향하는 트래픽이나 인터넷에서 VPC 내부로 유입되는 트래픽에 대한 트래픽 검사를 ANF 를 이용하여 수행할 수 있는데요. 이번에는 Stateless Rule Group 과 Stateful Rule Group 의 규칙을 CLI 를 이용하여 생성하는 방법을 살펴보도록 하겠습니다.

먼저 Stateless Rule Group 을 통해 처리하고자 하는 보안 요구 사항을 적어보도록 하겠습니다.

“출발지 1.1.1.1/32 IP 에서 목적지 2.2.2.2/32 로 HTTP 접속(TCP Port 80) 을 허용한다.”

이 요구사항을 Stateless Rule 에 사용되어야 하는 각 옵션항목과 매칭해보면 아래와 같은 내용이 될 것 같습니다.

Source IP/Network = 1.1.1.1/32
Source Port Range = Any
Destination IP/Network = 2.2.2.2/32
Destination Port Range = 80
Protocol = TCP
TCP Mask = None
TCP Flag = None
Action = Pass
Custom Action = None

Management Console 에서는 위와 같은 내용을 아주 직관적으로 설정할 수 있기 때문에 이 포스팅에서는 별도로 설명하지 않고 AWS CLI 를 이용하여 설정해보도록 하겠습니다.

CLI 를 이용하여 ANF Rule 을 생성하기 위해서는 생성하고자하는 정책의 내용을 JSON Format 의 문서로 저장한 후 해당 파일을 CLI 에서 지정하여 호출하는 방법을 사용하여야 합니다. 이렇게 진행하기 위해 위의 내용을 JSON Format 으로 정리해보면 아래와 같은 JSON 문서가 나오게 됩니다.

{
"RulesSource": {
"StatelessRulesAndCustomActions": {
"StatelessRules": [
{
"RuleDefinition": {
"MatchAttributes": {
"Sources": [
{
"AddressDefinition": "1.1.1.1/32"
}
],
"Destinations": [
{
"AddressDefinition": "2.2.2.2/32"
}
],
"SourcePorts": [
{
"FromPort": 0,
"ToPort": 65535
}
],
"DestinationPorts": [
{
"FromPort": 80,
"ToPort": 80
}
],
"Protocols": [
6
]
},
"Actions": [
"aws:pass"
]
},
"Priority": 1
}
],
"CustomActions": [

]
}
}
}

위와 같은 내용의 파일을 파일명 stateless-rule-1.json 이라는 파일로 저장하였다면 이 파일을 이용하여 Stateless Rule Group 을 생성하는 AWS CLI 는 다음과 같습니다.

주의. CLI 에서 규칙의 내용을 담고 있는 파일의 경로와 파일명을 정확하게 기입하여야 합니다.

주의. 아래 CLI 옵션 중 “Type” 에는 반드시 대문자 “STATELESS” 가 사용되어야 합니다.

aws network-firewall create-rule-group --rule-group-name "StatelessRuleGroup-1" --type STATELESS --rule-group file://stateless-rule-1.json --capacity 100

위 명령이 정상적으로 실행되면 아래와 같은 CLI 의 Output 과 함께 Management Console 에서 확인 시 정상적인 Stateless Rule Group 이 생성되어 있는 것을 확인할 수 있습니다.

{
"UpdateToken": "1ca839f7-0ede-4a03-b61b-cb9e48aab7b1",
"RuleGroupResponse": {
"RuleGroupArn": "arn:aws:network-firewall:us-east-1:123456789012:stateless-rulegroup/StatelessRuleGroup-1",
"RuleGroupName": "StatelessRuleGroup-1",
"RuleGroupId": "c4bbe351-2fc5-1234-5678-06fdb322fabe",
"Type": "STATELESS",
"Capacity": 100,
"RuleGroupStatus": "ACTIVE"
}
}

Stateless 규칙의 수정

Management Console 을 이용하면 직관적인 UI 를 이용하여 편리하게 기존의 규칙을 수정할 수 있겠지만 이 포스팅의 목적은 CLI 의 사용이므로 CLI 를 이용해서 규칙을 수정해보도록 하겠습니다. AWS CLI 에는 Rule Group 을 수정할 수 있는 “update-rule-group” 이라는 AWS CLI 옵션이 있습니다. 다만, 이 옵션은 특정 Rule 을 추가하거나 수정하는 것이 아닌 Rule Group 을 변경하는 명령이므로 Rule Group 전체에 대한 변경 사항이 반영된 JSON 파일을 기반으로 하여야 합니다. 예를 들면, 위에서 만들어진 StatelessRuleGroup-1 에 새로운 규칙을 추가하고 싶다면 아래와 같이 기존에 생성한 Rule Group 내 규칙이 삭제되지 않도록 기존의 규칙을 포함한 새로운 규칙을 추가한 JSON 파일을 이용하여야 합니다.

{
"RulesSource": {
"StatelessRulesAndCustomActions": {
"StatelessRules": [
{
"RuleDefinition": {
"MatchAttributes": {
"Sources": [
{
"AddressDefinition": "1.1.1.1/32"
}
],
"Destinations": [
{
"AddressDefinition": "2.2.2.2/32"
}
],
"SourcePorts": [
{
"FromPort": 0,
"ToPort": 65535
}
],
"DestinationPorts": [
{
"FromPort": 80,
"ToPort": 80
}
],
"Protocols": [
6
]
},
"Actions": [
"aws:pass"
]
},
"Priority": 1
},
{
"RuleDefinition": {
"MatchAttributes": {
"Sources": [
{
"AddressDefinition": "1.1.1.2/32"
}
],
"Destinations": [
{
"AddressDefinition": "3.3.3.3/32"
}
],
"SourcePorts": [
{
"FromPort": 0,
"ToPort": 65535
}
],
"DestinationPorts": [
{
"FromPort": 80,
"ToPort": 80
}
],
"Protocols": [
6
]
},
"Actions": [
"aws:pass"
]
},
"Priority": 2
}
],
"CustomActions": [

]
}
}
}

여기서 중요한 점 한가지는 Rule Group 을 변경하는 “update-rule-group” 옵션은
“ update-token” 과 함께 사용이 되는데 이 “update-token” 은 아래와 같은 “describe-rule-group” 명령을 통해 리턴되는 Rule Group 정보의 첫째줄에 포함이 되어 있습니다.

aws network-firewall describe-rule-group --rule-group-name StatelessRuleGroup-1 --type STATELESS

따라서, 기존의 Rule Group 을 변경하기 위해서는 반드시 “describe-rule-group” 명령을 이용하여 최신의 Update Token 값을 확인한 후에 그 값을 기반으로 명령이 수행되어야 합니다.

정확한 Update Token 값을 확인하였다면 추가된 규칙을 포함하는 파일을 이용하여 아래와 같이 명령어를 입력합니다.

aws network-firewall update-rule-group --update-token "1ca839f7-0ede-4a03-b61b-cb9e48aab7b1" --rule-group-name "StatelessRuleGroup-1" --type STATELESS --rule-group file://stateless-rule-2.json

명령이 정상적으로 이뤄졌다면 아래와 같이 기존의 Stateless Rule Group 에 새로운 규칙이 추가되어 있는 것을 확인하실 수 있습니다.

Stateful 규칙의 생성

Stateful Rule Group 도 CLI 를 이용하여 생성 및 수정하는 방법은 사용할 수 있는 옵션의 차이만 있을 뿐 Stateless Rule Group 과 동일합니다.

Stateless Rule Group 을 생성할 때 사용하였던 방식과 마찬가지로 요구사항에 맞는 ANF 규칙을 JSON 파일로 저장한 후 AWS CLI 로 새로운 Rule Group 생성을 아래의 각 정책별(IP 차단 정책, Domain 차단 정책, IPS 정책)로 만들 수 있습니다.

IP 기반 차단 정책

“출발지 1.1.1.1/32 IP 에서 목적지 2.2.2.2/32 로 HTTP 접속(TCP Port 80) 을 차단한다.”

아래의 내용을 JSON 파일로 저장합니다. 파일명은 stateful-rule-1.json 로 하겠습니다.

{
"RulesSource": {
"StatefulRules": [
{
"Action": "DROP",
"Header": {
"Protocol": "TCP",
"Source": "1.1.1.1/32",
"SourcePort": "Any",
"Direction": "FORWARD",
"Destination": "2.2.2.2/32",
"DestinationPort": "80"
},
"RuleOptions": [
{
"Keyword": "sid:1"
}
]
}
]
}
}

새로운 Stateful Rule Group 생성을 위해 아래의 명령을 입력합니다.

aws network-firewall create-rule-group --rule-group-name "StatefulRuleGroup-1" --type STATEFUL --rule-group file://stateful-rule-1.json --capacity 100

CLI 가 정상적으로 실행되면 아래와 같이 JSON 파일에서 정의한 규칙을 포함한 새로운 Stateful Rule Group 이 생성되어 있는 것을 확인할 수 있습니다.

Domain 차단 정책

“www.example.com 에 대한 접속을 허용한다.”

아래의 내용을 JSON 파일로 저장합니다. 파일명은 stateful-rule-2.json 로 하겠습니다.

{
"RulesSource": {
"RulesSourceList": {
"Targets": [
"www.example.com"
],
"TargetTypes": [
"HTTP_HOST",
"TLS_SNI"
],
"GeneratedRulesType": "ALLOWLIST"
}
}
}

새로운 Stateful Rule Group 생성을 위해 아래의 명령을 입력합니다.

aws network-firewall create-rule-group --rule-group-name "StatefulRuleGroup-2" --type STATEFUL --rule-group file://stateful-rule-2.json --capacity 100

CLI 가 정상적으로 실행되면 아래와 같이 JSON 파일에서 정의한 규칙을 포함한 새로운 Stateful Rule Group 이 생성되어 있는 것을 확인할 수 있습니다.

IPS 기반 정책

“외부에서 유입되는 트래픽 중 목적지가 10.0.1.0/24 네트워크와 10.0.2.19 호스트 그리고 목적지 포트가 80, 8080 인 것에 한하여 HTTP Request Method 가 HEAD 인 경우 차단한다.”

아래의 내용을 JSON 파일로 저장합니다. 파일명은 stateful-rule-3.json 로 하겠습니다.

{
"RuleVariables": {
"IPSets": {
"HTTP_SERVERS": {
"Definition": [
"10.0.1.0/24",
"10.0.2.19"
]
}
},
"PortSets": {
"HTTP_PORTS": {
"Definition": [
"80",
"8080"
]
}
}
},
"RulesSource": {
"RulesString": "drop tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:\"IPS Rule TEST\"; flow:to_server; http_request_line; content:\"HEAD\"; sid:123; rev:1;)"
}
}

새로운 Stateful Rule Group 생성을 위해 아래의 명령을 입력합니다.

aws network-firewall create-rule-group --rule-group-name "StatefulRuleGroup-2" --type STATEFUL --rule-group file://stateful-rule-3.json --capacity 100

CLI 가 정상적으로 실행되면 아래와 같이 JSON 파일에서 정의한 규칙을 포함한 새로운 Stateful Rule Group 이 생성되어 있는 것을 확인할 수 있습니다.

위 화면에 나타난 것처럼 Management Console 에서는 IPS 정책에 변수로 지정된 HTTP_SERVERS 나 HTTP_PORTS 등의 정보는 출력되지 않습니다. 따라서, 변수가 활용된 IPS 규칙의 상세한 설정을 확인하기 위해서는 AWS CLI 의 describe-rule-group 명령어를 이용하여 확인하시기 바랍니다.

감사합니다.

--

--

JIPA
JIPA

Written by JIPA

Always Day 1. Security is job zero.

No responses yet