UFW 방화벽 설정으로 리눅스 서버 보안 강화


리눅스 | 2018-12-30 22:12 | 댓글 | 10,734 회


안녕하세요.

핀코인입니다.

핀코인은 대부분의 쇼핑몰과 마찬가지로 리눅스 서버를 기반으로 합니다. 우리나라 중소형 쇼핑몰은 모두 리눅스 기반/PHP 솔루션이라고 봐도 거의 무방할 정도입니다.

임대형 쇼핑몰 솔루션이 아니라 설치형 쇼핑몰 솔루션을 이용한다면 리눅스 서버의 기본적인 방화벽 설정을 해둘 필요가 있습니다.

과거에는 ipchains/iptables와 같이 복잡한 넷필터 방화벽 도구를 사용해야 했습니다. 하지만 실무적으로는 매우 간단한 구성만 필요한데도 알아야 할 배경지식이 만만치 않았습니다. 리눅스 시스템과 네트워크에 대한 깊은 이해가 필요했기 때문입니다.

그러한 복잡함, 어려움을 해결해주기 위해서 우분투/데비안 배포판에 UFW(uncomplicated firewall)이 등장합니다. uncomplicated라는 말처럼 정말 복잡하지 않고 쉽게 기본 방화벽 설정을 할 수 있습니다.

UFW 사용법을 설명하기 전에 보안을 위한 기본 전략을 생각해봅시다.

  1. 꼭 필요한 서비스 포트만 열어둔다.
  2. 내부 비공개 서비스 포트는 기본값이 아닌 임의 포트로 변경한다.
  3. 특정 컴퓨터 IP에서만 내부 비공개 서비스 포트로 접속한다.

위와 같은 전략을 세우고 UFW 설정하는 요령을 살펴봅시다.

1. 꼭 필요한 서비스 포트만 열어둔다.

이제는 웹서비스를 위해서 80(HTTP)는 제공하지 않고 443(HTTPS) 포트만 제공하는 것으로도 충분합니다. 하지만 쇼핑몰 운영을 위해서 서드파티 쪽에서 80 포트로 접근을 요구하는 경우가 있습니다. 예를 들어, 네이버 쇼핑파트너존 입점하면 아무리 서비스 일체를 HTTPS로 제공하더라도 크롤링하는 상품 이미지는 80 포트로 제공해야 합니다. (상당히 불합리한 정책이라고 생각하지만 네이버에서 광고/영업하려면 어쩔 수 없이 복잡한 서버 설정을 해야 합니다.)

우리는 먼저 UFW를 시스템에서 사용하도록 허용 설정합니다.

sudo ufw enable

이제 UFW의 편리함을 엿볼 수 있는 부분인데 Nginx를 사용하는 경우에 아래와 같이 한 줄로 80/443 포트를 모두 허용합니다.

sudo ufw allow 'Nginx Full'

UFW는 이렇게 앱(사전 룰셋)을 제공하므로 매우 편리합니다.

2. 내부 비공개 서비스 포트는 기본값이 아닌 임의 포트로 변경한다.

80(HTTP), 443(HTTPS) 외에도 22(SSH), 3306(MySQL), 5432(PostgreSQL) 포트는 개발자의 작업을 위해 열려 있어야 합니다. 하지만 이 포트를 누구나 접근할 수 있다면 보안상 좋지 않습니다. 우리는 22, 3306, 5432 포트 기본값 대신에 추측하기 어려운 임의 포트로 변경해야 합니다.

일반적으로 사용 가능한 포트는 0~65535 범위의 값입니다. 그러나 예약 포트 범위 0~1023, 동적 포트 범위 49152~65535를 제외한 즉, 1024~49151 범위에서 임의값을 포트 번호로 고릅니다. 대략 49000을 넘지 않는 5자리 수로 지정하면 좋을 것 같습니다.

그러나 SSH, MySQL, PostgreSQL 서비스의 포트를 변경하는 내용은 UFW에 대한 내용이 아닙니다. 이는 별도로 서비스별로 기본 포트를 변경하는 문서를 찾아봐야 합니다.

단, 여기서는 임의로 바꾼 포트를 어떻게 허용할지 다룹니다. 먼저 아래와 같이 UFW가 편의를 위해 미리 제공하는 앱 프로필을 확인할 수 있습니다.

sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

보시는 것처럼 OpenSSH 서비스를 위한 기본 앱 프로필도 제공합니다만 이를 허용한다면 22번 포트가 열리는 것입니다. 저희는 기본 포트값을 22222와 같이 임의로 변경하기로 했습니다. 따라서 우리는 아래와 같이 TCP 포트 22222번 임의 포트를 허용해야 합니다.

sudo ufw allow 22222/tcp

굳이 udp를 열어둘 필요가 없으므로 tcp로 명시합니다.

3. 특정 컴퓨터 IP에서만 내부 비공개 서비스 포트로 접속한다.

내부 비공개 서비스의 포트를 기본값이 아닌 임의 포트 번호로 변경하면 1차적인 보안 위험이 많이 줄어듭니다. 그러나 포트스캔 등의 방법으로 열린 포트를 확인할 수 있기 때문에 누구나 접속할 수 있도록 내버려두는 것은 그리 좋은 방법이 아닙니다.

따라서 사무실/집 같은 작업 장소의 특정 컴퓨터 IP에서만 내부 비공개 서비스 포트로 접근할 수 있도록 해주는 것이 좋습니다.

예를 들어, 123.45.123.45 IP에서만 22222 TCP 포트로 접속을 허용하려면 아래와 같이 명령합니다.

ufw allow from 123.45.123.45 to any port 2222 proto tcp

만약에 작업 장소가 변경될 경우에 기존 IP 허용 주소는 삭제하고 새로 접속 허용해야 합니다. 규칙을 삭제하는 명령어는 allow 앞에 delete를 추가하기만 하면 됩니다.

ufw delete allow from 123.45.123.45 to any port 2222 proto tcp

올바르게 설정이 되었는지 아래와 같이 확인할 수 있습니다.

sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To                         Action      From
--                         ------      ----
Nginx Full                 ALLOW       Anywhere
22345/tcp                  ALLOW       182.230.167.250
55432/tcp                  ALLOW       182.230.167.250
22345/tcp                  ALLOW       112.169.209.62
55432/tcp                  ALLOW       112.169.209.62
Nginx Full (v6)            ALLOW       Anywhere (v6)

요즘은 이메일, DNS 서비스를 직접 설치하는 것보다도 다른 업체의 서비스를 이용하는 경우가 많습니다. 따라서 들어오는(incoming) 연결은 HTTP, HTTPS, SSH 그리고 데이터베이스 정도만 위와 같이 서비스해도 실무적으로 충분합니다.

웹 방화벽을 써야 하는 이유 (부제: cloudflare를 쓰는 이유) 게시물을 한 번 읽어보시고 네트워크 방화벽과 함께 웹 방화벽을 반드시 사용하시기 바랍니다.

쇼핑몰을 비롯한 웹서비스에서 방화벽 설정은 가장 기본으로 기존에 여러분이 쓰시던 상품권 쇼핑몰의 보안 과연 믿을 수 있는지 먼저 생각해보세요. 저희 핀코인은 항상 여러분이 저렴하고 편리하게 그리고 "안전하게" 상품권 구매하실 수 있도록 최선을 다합니다.

대한민국 1등 온라인 상품권 쇼핑몰 핀코인!

감사합니다.


#웹방화벽 #방화벽 #우분투 #데비안 #ufw


관련 게시물

blog comments powered by Disqus