방화벽

Violet_Evgadn·2023년 4월 27일
1

네트워크

목록 보기
32/37

방화벽

방화벽이란?

방화벽을 알아보기 전 방화벽의 영어 이름인 Firewall을 분석해 보자.

현실에서 Firewall은 "불을 막는 벽"이라는 의미로 화재가 났을 때 다른 곳으로 불이 번지지 않게 하는 벽이라는 의미이다.

네트워크에서는 "불"에 해당하는 것이 "공격용 패킷"이라고 생각하면 된다. 방화벽을 통해 다른 곳에서 전달되는 공격용 패킷을 막음으로써 보안적으로 안전한 환경을 만드는 소프트웨어라고 유추할 수 있다.

방화벽은 다른 네트워크에서 송신된 패킷을 확인한 후 정해진 규칙에 따라 패킷을 허용하거나 차단하는 소프트웨어를 말한다.

방화벽 정책은 단순히 트래픽을 차단시키는 일반 수준의 정책부터 적합하지 않은 패킷이 왔을 때 로그를 남기는 고급 수준의 정책까지 다양하게 설정할 수 있으며, 방화벽은 이렇게 미리 정해둔 규칙에 따라 패킷의 흐름을 제어한다고 보면 된다.

방화벽이 통과시킬 패킷과 차단할 패킷을 선별하는 방법은 여러 가지가 존재하며, 선별 방식에 따라 패킷 필터링형, 애플리케이션 게이트웨이형, 서킷 게이트웨이형으로 구분할 수 있다.

어떤 방법을 사용하더라도 방화벽의 목적을 수행할 수 있지만 성능, 가격, 사용 편의성 등의 이유로 지금은 "패킷 필터링형"이 가장 많이 보급되어 있으므로 이에 초점을 맞춰 공부해 보자.

방화벽으로 막을 수 없는 공격

방화벽은 어디까지나 송신지 및 수신지를 보고 패킷의 차단 여부를 판단하는 소프트웨어이기 때문에 위험한 패킷을 모두 차단할 수 있는 것은 아니다.

예를 들어 공개용 웹 서버의 경우 모든 사람에게 패킷을 받을 수 있게 설정되어 있으므로 악의적인 사용자가 해당 웹 서버 중 열린 포트로 바이러스 등을 담은 패킷을 송신할 수 있는 것이다.

즉, 방화벽은 송/수신지를 통해 패킷을 차단할 뿐 패킷의 내용이 위험한지는 판단할 수 없다는 것이다.

그리고 이런 상황에 대해 두 가지 대처법이 있다.

첫 번째는 웹 서버 소프트웨어의 버그를 고쳐 보안 구멍을 막는 것이다.

웹 서버 소프트웨어 버그 중 위험성이 높은 것은 보안 구멍을 통해 정보가 노출되기 쉬우므로 항상 새로운 버전으로 소프트웨어를 갱신하여 보안 구멍을 막는 것이 중요하다.

두 번째는 패킷의 내용을 조사하여 위험한 데이터가 포함되어 있는지 판단하는 장치나 소프트웨어를 방화벽과는 별도로 준비하는 방법이다. 방화벽의 옵션으로 이러한 기능을 제공하는 것도 있다.

단지 이 해결 방법 또한 웹 서버에 버그가 숨어있는데 관리자가 찾지 못했을 경우 소프트웨어가 패킷이 위험한지를 적절히 판단할 수 없기 때문에 패킷을 차단할 수 없는 상황이 생긴다.

즉, 미지의 위험성에는 대처할 수 없으므로 발견된 버그를 고치는 첫 번째 방법이 병행되어야 한다.


패킷 필터링형 방화벽의 조건 설정

아래에서 설명할 순서는 사실 그렇게 큰 의미를 가지지는 않는다.
단지, 아래에서 설명한 대로 이해하는 것이 가장 쉬울 것 같아 번호를 붙여 놓은 것이니 번호에 큰 신경을 쓰지 않아도 된다.

또한 위 상황에서 등록된 조건 중 어떠한 조건에도 해당되지 않는 패킷이 흐를 경우 방화벽이 무조건 패킷을 차단한다고 가정하자.

1. 수신처 IP 주소 / 송신처 IP 주소

패킷 필터링형 방화벽은 수신처 IP 주소 및 송신처 IP 주소를 조건으로 설정함으로써 통과시킬 패킷을 선별할 수 있다.

먼저 수신처 IP 주소 설정에 대해 알아보자.

사용자는 공개 서버용 LAN에 존재하는 웹 서버에 접속하고 싶을 것이다. 즉, 인터넷을 통해 패킷이 전달되면 전달된 패킷이 방화벽을 통과하여 공개 서버용 LAN에 도착해야 한다는 것이다.

따라서 방화벽에 "192.0.2.0/24"의 수신처 IP 주소를 가진 패킷은 통과하도록 조건을 설정해 두는 것이다.

이 경우 사용자가 웹 서버에 접근하기 위한 요청 패킷을 날렸을 때 방화벽에선 IP 헤더의 수신처 IP 주소를 검사할 것이고 "192.0.2.0/24"로 설정되어 있을 수신처 IP 주소는 방화벽에 설정된 조건에 의하여 통과할 수 있기 때문에 패킷이 웹 서버로 전달될 수 있는 것이다.

이제 송신처 IP 주소 설정에 대해 알아보자.

이전에 말했듯 TCP를 통한 네트워크 통신에서 사용자가 웹 서버 측에 요청 패킷을 보냈다면 웹 서버가 사용자 측에 응답 패킷을 보냄으로써 네트워크를 통한 통신이 가능해진다.

즉, 웹 서버 측에서도 인터넷으로 패킷을 송신할 수 있어야 하는 것이다.

웹 서버 측에서 인터넷(최종 목적지는 사용자)으로 패킷을 보내기 위해선 송신처 IP 주소를 "192.0.2.0/24"로 설정해놔야 할 것이다.

방화벽 조건으로 송신처 IP 주소를 설정했다면 웹 서버가 패킷을 송신하는 경우 방화벽은 패킷의 IP 헤더 중 송신처 IP 주소가 "192.0.2.0/24"의 값을 가졌다는 것을 확인할 것이며, 이는 등록된 조건에 의하여 통과시키도록 설정해 놨기 때문에 정상적으로 웹 서버로부터 인터넷으로 패킷이 흐를 수 있는 것이다.

송신처 IP 주소 및 수신처 IP 주소를 설정한 방화벽 조건을 표로 나타내면 아래와 같을 것이다.

참고로 맨 아래의 "- - 차단"은 만약 패킷의 제어 정보가 위 표의 조건에 존재하지 않을 경우 선택되는 행이다.

즉, 방화벽은 패킷을 차단한다.

2. 수신처 포트 번호 / 송신처 포트 번호

송신처 IP 주소 및 수신처 IP 주소만 설정할 경우 문제가 존재하는데, 애플리케이션을 사용할 때 필요하지 않은 포트로도 접근할 수 있다는 것이다.

웹 사이트를 개발하다 보면 애플리케이션과 애플리케이션이 사용하는 DB를 동일한 웹 서버에 저장하는 경우가 많다.

이때 대부분 "80", 혹은 "443" 포트로 애플리케이션에 접근할 수 있고 "3306" 포트로 DB에 접근할 수 있다.

그런데 서버 관리자 입장에서는 사용자는 "80"이나 "443" 포트로는 접근할 수 있어야 하지만 "3306" 포트로 접근하는 것은 탐탁지 않다.

만약 사용자도 "3306" 포트를 통해 웹 서버에 접근할 수 있다면 사용자가 다이렉트로 애플리케이션이 사용하는 DB에 접근할 수 있다는 의미이며 이는 보안적으로 매우 큰 허점이기 때문에 DB에 대한 추가 보안 처리를 수행해 줘야 하는 것이다.

이런 경우를 막기 위해 방화벽 조건으로 수신처 포트 번호를 설정하는 것이다.

서버 입장에서는 일반 유저가 "80"(혹은 "443") 포트를 제외한 다른 포트로 접근할 이유가 전혀 없다. 따라서 이 2개를 수신처 포트 번호로써 조건을 추가한다면 다른 포트를 통한 웹 서버 접근을 방화벽에서 미리 차단할 수 있는 것이다.

쉽게 말하자면 "192.0.2.0/24:80"의 설정값을 가진 패킷은 방화벽을 통과하겠지만 "192.0.2.0/24:3306"의 설정값을 가진 패킷은 방화벽을 통과하지 못할 것이다.

송신처 포트 또한 웹 서버에서 모든 포트로 패킷을 송신할 수 있다면 보안 상 허점이 생길 수 있으므로 설정해 두는 것이다.

이전에 TCP 커넥션에 대해 잘 공부했다면 바로 이해 가겠지만, 유저가 보낸 패킷의 수신처 포트 번호는 곧 웹 서버가 보낼 패킷의 송신처 포트 번호이다.

이는 TCP 통신을 수행하기 위해선 먼저 소켓 사이를 커넥션으로 연결하는데 이때 사용하는 포트 번호는 커넥션이 유지되는 동안 고정되어 있는 값으로 양쪽 프로토콜 스택에 저장되어 있기 때문이다.

송신처 포트 번호와 수신처 포트 번호까지 설정한 방화벽 조건은 아래와 같을 것이다.

3. TCP 컨트롤 비트

송/수신처 IP 주소 및 포트 번호를 설정했지만 아직 조건이 부족한데 바로 웹 서버에서 인터넷 측으로 액세스 하는 동작을 정지시켜야 하기 때문이다.

예전에는 웹 서버에서 인터넷 측으로 액세스 할 수 있도록 설정한 경우가 많았다.

하지만 지금은 서버에 기생하고 있다 다른 서버에 보내짐으로써 다른 서버까지 감염시키는 부정 소프트웨어가 있기 때문에 웹 서버에서 인터넷측으로 액세스 하는 것을 막아 만약 현재 웹 서버가 바이러스에 감염되었더라도 이를 다른 웹 서버까지 퍼뜨리지 않기 위해 이런 설정을 수행하고 있다.

TCP 컨트롤 비트를 통해 웹 서버에서 인터넷으로 접근하지 못하게 하는 방법을 알기 위해선 TCP 커넥션 과정에 대해 더 자세히 알아야 한다.

이전에 설명했지만 TCP를 통해 통신을 수행하기 위해선 소켓 사이의 커넥션을 만들어야 한다.

그리고 이 커넥션을 만들기 위하여 패킷의 송/수신지는 3-way Handshake 과정을 수행한다.

이때 3-way Handshake의 가장 첫 번째 과정은 "ACK=0, SYN=1"으로 TCP 컨트롤 비트를 설정한 패킷을 연결 상대에게 보내는 것이다.

그리고 이를 반대로 생각하자면 웹 서버가 TCP 컨트롤 비트를 "ACK=0, SYN=1"으로 설정한 패킷을 보낼 수 없다면 어떠한 커넥션도 생성할 수 없을 것이며 커넥션을 만들 수 없다는 것은 곧 인터넷을 통한 패킷 송/수신이 불가능해진다는 것을 의미한다.

따라서 ACK=0, SYN=1인 컨트롤 비트를 가진 송신 패킷을 차단함으로써 웹 서버가 인터넷에 접속하려는 것을 막을 수 있다.

그럼 이렇게 설정할 경우 웹 서버에 액세스 하는 패킷, 즉 유저가 인터넷을 통해 웹 서버에 접근하는 경우는 어떻게 될까?

일단 유저가 보낸 패킷은 수신처 IP 주소 및 수신처 포트 번호에 해당하는 방화벽 조건이 있으므로 정상적으로 통과할 것이다.

이젠 웹 서버는 유저에게 응답 패킷을 보낼 텐데, 이때 응답 패킷은 무조건 ACK=1 값을 가진다.

즉, "ACK=0, SYN=1"인 컨트롤 비트라는 조건에 맞지 않는 것이다.

따라서 송신처 IP 주소 및 송신처 포트 번호만 설정한 방화벽 조건에 따라 동작할 것이며 방화벽은 이 경우 패킷을 통과시키기로 설정해 놨기 때문에 정상적으로 응답 패킷이 사용자에게 갈 것이다.

응답 패킷을 제외하고서도 요청에 대한 결괏값을 보내는 패킷이나 연결을 끊는 패킷 또한 "ACK=0, SYN=1"으로 TCP 컨트롤 비트 값이 설정되지는 않는다.

즉, TCP 컨트롤 비트를 추가로 설정한 방화벽 조건을 넣더라도 유저가 웹 서버에 접근하는 동작에는 전혀 영향을 끼치지 않는 것이다.

컨트롤 비트를 설정한 방화벽 조건은 아래와 같다.

추가 설명

위에서 설명한 송/수신처 IP 주소 및 포트 번호, TCP 컨트롤 비트 외에도 송신처 MAC 헤더나 프로토콜 번호 등을 사용하여 더욱 세밀하게 패킷의 흐름을 제어할 수 있다.

여러 가지 조건을 통해 패킷을 통과시킬지 차단할지 결정했다면 차단할 패킷일 경우 버리고 버렸다는 기록을 남긴다. 버린 패킷 중에는 부정 침입의 흔적을 나타내는 것이 있으므로 이를 분석하여 침입자의 수법을 밝혀 향후 부정 침입 대책에 도움이 될 수 있기 때문이다.

만약 패킷을 통과시킬 경우 이후 동작은 라우터와 동일하다. 방화벽은 다음 중계 기기 혹은 목적지인 웹 서버로 패킷을 전달하여 패킷을 중계하는 동작을 수행한다.

이런 면에선 방화벽이란 패킷을 통과시킬지 차단할지 결정하는 라우터라 해도 큰 문제는 없다.

실제로 복잡한 조건 설정이나 버린 패킷의 기록을 저장하지 않는다면 패킷 필터링 기능을 가진 라우터를 방화벽으로 사용할 수 있다.

방화벽 조건을 설정할 때 위험한 것을 차단하고 그 외는 통과시키는 방법을 사용할 경우 미지의 송신처에서 오는 위험한 패킷을 통과시킬 가능성이 존재한다.

따라서 일반적으로 필요한 패킷만 통과시키고 그 외의 것은 전부 차단하는, 마치 위에서 설명한 것과 같은 방식으로 방화벽 조건을 설정하는 것이 일반적이다.

하지만 이렇게 조건 설정을 해도 방화벽에서 통과시킬 패킷과 차단할 패킷을 완전히 선별할 수 없는 경우도 있는데 DNS 서버에 대한 액세스가 대표적이다.

이전에 말했듯 DNS는 UDP를 사용하여 정보를 교환하는데 UDP는 TCP와 달리 접속 단계를 수행하지 않는다.

즉, 3-way Handshake나 4-way Handshake 같은 연결 및 연결 끊기 동작을 수행하지 않기 때문에 TCP처럼 컨트롤 비트에 의해 액세스 방향을 판별할 수 없다.

이런 경우는 어느 정도 위험을 감수하고 애플리케이션의 패킷을 모두 통과시키거나 불편을 감수하고 애플리케이션에 오는 패킷을 모두 차단하는 방법을 선택해야 한다.

물론 이는 패킷 필터링용 방화벽에 해당하며 다른 방법을 사용할 경우 UDP를 사용해도 액세스 방향을 판단할 수 있는 경우도 있다.

사내 LAN

이렇게만 보면 방화벽 구조가 간단해 보이지만 위 이미지처럼 방화벽에 사내 LAN과 공개 서버용 LAN이 따로 연결되어 있을 경우 방화벽 설정은 조금 더 어려워진다.

이 경우 인터넷과 공개 서버용 LAN 사이를 흐르는 패킷에 대한 조건뿐 아니라 (인터넷 - 사내 LAN), 혹은 (사내 LAN - 공개 서버용 LAN) 사이를 흐르는 패킷에 대한 조건도 설정해야 하기 때문이다.

이때 설정하는 조건이 서로 악영향을 끼치지 않도록 주의해야 한다.

또한 사내 LAN을 사용할 경우 패킷 필터링형 방화벽은 주소 변환의 기능도 가지고 있으므로 이에 대한 설정도 필요하다.

따라서 패킷의 시점과 종점을 조건으로 지정한 후 주소 변환이 필요한 경우 주소 변환을 하고 그렇지 않다면 주소 변환을 하지 않도록 설정해야 한다.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글