back to top
-6.9 C
New York
일요일, 12월 22, 2024

Buy now

[우분투 서버] UFW 방화벽 설정으로 서버 보안 강화하기(업데이트)

우분투 20.04나 18.04를 이용해 우분투 서버 운영 시 UFW 방화벽 설정 및 포트 변경 등 기본 서버 보안 세팅에 대한 이야기 입니다.

1. 우분투(Ubuntu) 18.04 설치 시리즈를 시작하며

2018년 초에 발표된 우분투(Ubuntu) 18.04는 기존 우분투 버젼과 같은 것 같으면서도 미묘하게 다른 점이 있습니다.

근래 서버 운영체제로 우분투(Ubuntu) 18.04를 설치해보면서 얻었던 삽질기를 기반으로 우분투(Ubuntu) 18.04에서 서버를 안전하게 설치하는 방법에 대한 고민을 나누어 보도록 하겠습니다.

오늘은 서버 설치 시 초기 단계에 해당하는 방화벽 설정에 대해서 다루어 보겠습니다.

#1. root 대신할 사용자 등록 및 권한 부여하기

#2. UFW 방화벽 설정으로 서버 보안 강화하기(업데이트)

2. 우분투(Ubuntu) 18.04에서 방화벽 설정

방화벽 설정은 기본적으로 iptables을 사용해 설정합니다. 방화벽 설정 관련 강력하고 여러 문제에 유연하게 대처할 수 있는 방법들을 제시하고 있죠.

문제는 이 iptables 규칙 설정이 조금 까다로워서 많은 공부가 필요하다는 점입니다.

그래서 이 방화벽 보안 규칙을 단순하면서도 강력함을 잃지 않게 방화벽을 적용할 수 있도록 만들어 주는 것이 UFW(Uncomplicated Firewall)입니다.

iptables에서 가장 많이 사용하고 필요한 기능들을 쉽게 적용할 수 있도록 만들어주는 거라 볼 수 있는데요. 그렇기 때문에 iptables만큼 복잡한 보안 옵션을 설정하기에는 다소 한계가 있습니다.

UFW는 기본적으로 쉽고, 간편하게 기본 보안 설정을 할 수 있도록 만들어주기 때문에 복잡한 보안 옵션대신 간결하면서 강력한 보안 설정을 한다면 사용할만합니다.

보안이라 예외를 많이 둘수록, 옵션을 많이 둘수록 구멍이 생길 수 있으니 차라리 아주 간단하면서도 명확한 설정이 더욱 더 강력할 수 있습니다.

즉 보안의 기본은 들어올 수 있는 방안을 최소화하고, 어쩔 수 없이 열어야하는 길(포트)도 최소화 하는 것입니다.

이러한 작업을 쉽게 해줄 수 있는게 UFW(Uncomplicated Firewall)라고 할 수 있습니다.

ufw 설치은 아주 간단합니다.

apt-get install ufwCode language: PHP (php)

2.1. IPv6를 사용할 것인지 결정

대부분 IPv4를 사용하지만 IPv6를 사용하는 경우에는 이를 사용할 수 있는지 확인합니다.

우분투 18.04를 설치 시 이는 기본으로 설정되어 있습니다. 일반적으로 사용하지 않는다면 IPv6를 사용하지 않토록 설정 합니다.

보안의 기본은 허용 범위를 하나라도 줄이는 것입니다.

nano /etc/default/ufw
Code language: PHP (php)

위에서 편집기를 nano를 사용했는데요. 편집기는 nano말고 vi등 쓰기 편한 것으로 대체하면 됩니다.

여기에서 IPV6=yes로 되어 있는데요. yes를 no로 변경하면 됩니다.

이를 저장하면 바로 UFW(Uncomplicated Firewall)가 작동하면서부터 이러한 세팅은 적용이 됩니다.

2.2. UFW 기본 세팅으로 돌아가자

뒤에서 진행할 SSH 포트 변경을 진행하려면 UFW 기본 세팅 상태에서 진행되어야 합니다.

기존은 나가는 것은 전부 허용하고 들어오는 것은 전부 막는 것입니다.

ufw default deny incoming
ufw default allow outgoing
Code language: PHP (php)

2.3. UFW 적용 전 SSH 포트를 정리하자

이전 우분투 버젼에서는 UFW 적용후에도 SSH 포트를 22번에서 다른 포트로 변경이 어렵지 않았는데요.

우분투 18.04에서는 UFW 적용 후에는 SSH 포트 변경이 쉽지 않더군요. 결국 포기하고 22번 포트를 사용하다 최근 대규모 공격을 받고 말았습니다.

다행히 큰 피해를 입지는 않았지만 종일 마을을 졸이기는 했습니다.

서버 보안 중요성을 새삼 일깨워 준 루트에 갑자기 생긴 파일 하나 – basic_passwords.txt

UFW를 가동시키기 전에 우선 SSH 포트를 설정합니다. SSH 포트 설정은 두가지 방법이 있죠

ufw allow ssh  
 
또는 
 
ufw allow 22
Code language: PHP (php)

이러면 SSH 포트로 22번을 사용하는 것입니다. 이는 누구에게나 알려진 포트이므로 SSH 공격에 쉽게 노출 되겠죠 그래서 다른 포트를 사용하는 방법을 적용합니다.

먼저 SSH 포트로 사용할 숫자를 정해 포트를 허용합니다. 수치는 15342와 같이 1만이 넘는 자신이 기억하기 쉬운 수치로 정합니다.

ufw allow 15342Code language: PHP (php)

그 다음에 sshd_config 편집 모드로 전환합니다.

nano /etc/ssh/sshd_configCode language: PHP (php)

sshd_config 편집 상태로 들어가 보면 #Port 22로 막혀있는데요.

이는 Port22는당연직이기 때문에 굳이 표시하지 않은 것 같습니다.

여기에서 #Port 22에서 #을 없애고 22번을 15342로 바꾸든지 아니면 그 아래줄에 Port 15342를 넣든지 상관은 없이 새로운 포트를 반영해주면 됩니다.

#Port 22
Port 15342
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
 
또는 
 
Port 15342
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::Code language: PHP (php)

이렇게 포트를 변경한 후 ssh 서비스를 재시작 합니다.

service ssh restartCode language: PHP (php)

위에서와 같이 SSH 포트를 변경했으면 UFW를 가동시킵니다. UFW 가동은 가단한 아래 명령어로 가능합니다.

service ssh restartCode language: PHP (php)

2.4. 다른 접속 포트를 허용하자

웹서버를 운영하려면 기본적으로 80포트와 443포트는 열어 놓아야 합니다.

이와같이 반드시 열어야할 포트를 설정합니다. 저는 단순화하기 위해서 80과 443만 열었습니다.

ufw allow 80
 
ufw allow 443Code language: PHP (php)

사용하는 환경에 따라서 일정 포트 범위를 열어야 하는 경우도 있죠.

X11 접속을 위해서는 포트를 6000~6007번 포트를 사용해야합니다 이럴 경우 아래와 같은 명령어를 사용합니다.

ufw allow 6000:6007/tcp
ufw allow 6000:6007/udpCode language: PHP (php)

또 특정 포트에 특정 IP만 허용토록 설정할 수 있습니다. SSH 포트에 특정 IP만 접속토록 허락하는 방법입니다.

아래는 22번 포트에 203.203.203.203 IP만 허용하는 방법입니다.

ufw allow from 203.203.203.203 to any port 22Code language: PHP (php)

또 IP를 범위로 한정해서 허용할 수도 있습니다.

예를 들어 203.203.203.203에서 203.203.203.250까지의 IP를 허용할수도 있고, 이들 포트가 22번같은 특정 포트에 접속할 수 있다고 허용할 수 있습니다

ufw allow from 203.203.203.203/250
 
ufw allow from 203.203.203.203/250 to any port 22Code language: PHP (php)

2.6. 접속 포트를 불허하는 경우

위에서와 같이 접속을 허용했지만 상황이 변경되어 접속을 불허하는 경우도 생기겠죠.

이렇 경우는 deny 명령을 사용합니다. 예를 들어 22번 포트를 불허한다면 아래와 같이 사용합니다.

ufw deny 22Code language: PHP (php)

특정 IP 접속을 불허한다면 마찬가지로 from + IP 명령을 사용합니다.

ufw deny from 203.203.203.203Code language: PHP (php)

2.6. UFW 룰 삭제하기

위에서 정한 룰을 삭제하는 것은 delete를 사용합니다.

ufw delete allow 80Code language: PHP (php)

2.7. UFW 룰 상태를 보기

UFW 룰이 어떻게 세팅되어 있는지를 확인하는 명령입니다.
이때는 status 명령을 사용합니다.

ufw status  
또는
ufw status numberedCode language: PHP (php)

위 명령어 중 ufw status numbered은 UFW룰 번호를 알려주는데요. 이 번호를 이용해 ufw 룰을 지울 수 있습니다.

만역 3번 룰을 지우겠다고하면 아래처럼 사용할 수 있습니다.

ufw delete 3Code language: PHP (php)

2.8. ping 금지

일반적으로 서버를 구성한 경우 핑(ping) 허용하는 경우가 많습니다.

우선 속도 체크를 할 때 기본적으로 ping 속도 체크가 기본이기도 하죠.

다음으로는 서버 등이 작동하는지를 체클할 때 ping을 때려서 반응이 있으면 서버가 기본적으로 작동한다고 판단하기도 합니다.

그러다보니 우분투 기본 방화벽인 UFW의 기본 설정도 ping 요청을 허용하고 있습니다.

그런데 해킹 목적으로 네트워크 침입을 시도 시 핑(Ping)을 통해 특정 서버가 살아있는지 확인하는 경우가 많고, 고전적이긴 하지만 DDOS 공격 시 무한 핑(ping) 요청으로 서버를 무력화를 시도하는 경우도 있기때문에 핑(ping)을 허용하지 않는 게 좋다고 합니다.

이를 위해서는 방화벽 정책을 변경해 줍니다. 변경해야하는 설정 파일은 아래 경로에 있는 /before.rules을 수정합니다.

nano /etc/ufw/before.rulesCode language: PHP (php)

아래 명령에서 ACCEPT를 DROP으로 변경하거나 삭제해 줍니다.

  -A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT  → DROP으로 변경
  -A ufw-before-input -p icmp --icmp-type source-quench -j ACCEPT   → DROP으로 변경
  -A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT   → DROP으로 변경
  -A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT   → DROP으로 변경
  -A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT   → DROP으로 변경Code language: PHP (php)

before.rules, 특정 ip 블락시키기

위에서 특정 ip를 deny를 이용해 블락시킬 수도 있지만 이 경우 먼저 정의된 ufw 룰에 따라 작동되지 않을 수 있습니다.

예를들어 443포트에 모든 ip 접속을 허용해 놓았다면 특정 ip를 중지시켜도 443포트에서는 특정 ip 블럭이 작동하지 않은 경우가 발생한다고 합니다.

모든 보안 설정은 앞서 정의한 룰에 따르기 때문입니다. 그렇기 때문에 ufw 룰보다 더 우선적으로 적용하는 before.rules을 만들어져 있습니다.

before.rules에서 적용된 룰이 적용된 후 ufw 룰이 적용됩니다. 그렇기 때문에 특정 ip를 막을 때는 before.rules에서 막는 것이 더 확실합니다.

먼저 before.rules 편집 화면으로 이동합니다.

nano /etc/ufw/before.rulesCode language: PHP (php)

before.rules 편집 화면에서 # End required lines가 적힌 줄을 찾습니다. 그다음에 차단할 IP를 다음과 같은 룰에 따라 추가한 다음 저장합니다.

# End required lines
-A ufw-before-input -s 41.104.8.106  -j DROPCode language: PHP (php)

만약 여러개의 ip를 추가하고 싶다면 ip다음에 컴마(,)로 구분해줍니다.

-A ufw-before-input -s 41.104.8.106,41.109.68.211,176.63.1.110,85.26.151.114,47.75.84.112,181.188.66.190,206.189.66.165,103.83.174.130,178.238.232.85,198.136.62.200  -j DROPCode language: PHP (php)

이 다음 ufw를 재 가동시킵니다.

ufw reload
Code language: PHP (php)

참고

spot_img

Latest articles

Related articles

spot_img