UFW(Uncomplicated Firewall) 소개
어플리케이션이 구동되는 서버는 서비스를 위하여 통신 포트를 외부에 노출해야 하지만, 이 때 보안 취약점에 유의해야 한다. 모든 포트를 노출해서는 안되며, 노출되는 포트 또한 특정 사용자(IP Address Range)에게만 허용이 되야 한다.
Linux Kernel 에 있는 '네트워크 패킷 필터(이하 Netfilter)' 라는 내부 패킷 필터링 시스템(Network framework)을 통해, 위와 같은 네트워크 패킷에 대한 접근 제어를 수행할 수 있다.
이 'Netfilter' 와 인터페이스 하기 위해 가장 많이 사용되는 툴이 iptables 이다. 그런데 iptables 의 경우 범용성으로 인해 사용 난이도가 다소 높은, 다시말해 러닝커브가 높은 편이다.
이에 대해 Ubuntu 와 같은 Debian 계열 Linux OS는 UFW(Uncomplicated Firewall)라는 방화벽 관리 프로그램을 제공한다. 이름그대로 복잡하지 않은 방화벽이라고 볼 수 있는데, iptables 에 대한 간단한 프론트엔드 인터페이스라고 볼 수 있다.
UFW 설치
UFW 의 설치는 데비안 계열에서 사용되는 패키지 관리자인, apt 를 사용한다.
$ sudo apt-get update
$ sudo apt-get install -y ufw
Reading package lists... Done
Building dependency tree
Reading state information... Done
ufw is already the newest version (0.36-0ubuntu0.18.04.2).
ufw set to manually installed.
The following package was automatically installed and is no longer required:
libnuma1
Use 'sudo apt autoremove' to remove it.
0 upgraded, 0 newly installed, 0 to remove and 17 not upgraded.
설치 후 systemctl 을 통하여 활성화/비활성화 제어를 할 수 있다.
$ sudo systemctl status ufw
● ufw.service - Uncomplicated firewall
Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled)
Active: active (exited) since Tue 2022-09-20 02:15:46 UTC; 10min ago
Docs: man:ufw(8)
Main PID: 401 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 4660)
CGroup: /system.slice/ufw.service
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
$ sudo systemctl disable ufw
$ sudo systemctl enable ufw
$ sudo systemctl start ufw
systemctl 로 ufw 를 활성화 시켜 놓아도, ufw 규칙 적용에 대한 활성화는 하단의 ufw 명령어를 사용한다.
UFW 상태 확인 및 활성화
- $ sudo ufw status : ufw 규칙 상태 확인
- $ sudo ufw enable : ufw 규칙 활성화. 활성화 시 기존 ssh 연결이 단절될 수 있음
- $ sudo ufw disable : ufw 규칙 비활성화
$ sudo ufw status
Status: inactive
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
$ sudo ufw status
Status: active
상단과 같이 ufw status 명령의 결과 'status: inactive' 로 표시될 경우 방화벽 규칙을 로드하지 않았으며 아직 방화벽을 활성화하지도 않은 상태이다.
UFW 기본 규칙(Default Rule) 추가 및 삭제
보안을 위해, 다음의 ufw 기본 규칙을 설정한다.
- outgoing packet : ALL ALLOW. 밖으로 나가는 패킷은 모두 허용
- incoming packet : ALL DENY. 안으로 들어오는 패킷은 모두 거부
기본 방화벽 규칙을 설정하는 방식은 다음과 같다.
▼ ALL ALLOW. 밖으로 나가는 패킷은 모두 허용
$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'
(be sure to update your rules accordingly)
$
▼ ALL DENY. 안으로 들어오는 패킷은 모두 거부
$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)
$
UFW Rule 추가 및 삭제
기본 규칙 이외에는 다음의 명령어를 사용하여 원하는 방화벽 규칙을 설정할 수 있다.
- TCP Rule 추가 : $ sudo ufw [allow/deny] [포트번호]/tcp
- UDP Rule 추가 : $ sudo ufw [allow/deny] [포트번호]/udp
- TCP/UDP Rule 추가 : $ sudo ufw [allow/deny][포트번호]
▼ Rule 추가 : TCP 80 포트 허용
$ sudo ufw allow 80/tcp
▼ Rule 추가 : TCP 443 포트 거부
$ sudo ufw deny 443/tcp
▼ Rule 추가 : TCP/UDP 53 포트 허용
$ sudo ufw allow 53
규칙 추가 사용 예) status 명령에 'numbered' 파라미터를 추가하면 번호를 붙여 출력한다.
$ sudo ufw allow 80/tcp
Rule added
Rule added (v6)
$ sudo ufw deny 443/tcp
Rule added
Rule added (v6)
$ sudo ufw allow 53
Rule added
Rule added (v6)
$
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 80/tcp ALLOW IN Anywhere
[ 2] 443/tcp DENY IN Anywhere
[ 3] 53 ALLOW IN Anywhere
[ 4] 80/tcp (v6) ALLOW IN Anywhere (v6)
[ 5] 443/tcp (v6) DENY IN Anywhere (v6)
[ 6] 53 (v6) ALLOW IN Anywhere (v6)
$
규칙의 삭제는, 추가 명령어의 앞에 delete를 추가한다.
- TCP Rule 삭제 : $ sudo ufw delete [allow/deny] [포트번호]/tcp
- UDP Rule 삭제 : $ sudo ufw delete [allow/deny] [포트번호]/udp
- TCP/UDP Rule 삭제 : $ sudo ufw delete [allow/deny] [포트번호]
▼ Rule 삭제 : TCP 443 포트 거부
$ sudo ufw delete deny 443/tcp
▼ Rule 삭제 : TCP 80 포트 허용
$ sudo ufw delete allow 80/tcp
▼ Rule 삭제 : TCP/UDP 53 포트 허용
$ sudo ufw delete allow 53
규칙 삭제 사용 예) 없는 규칙을 삭제하려 할 경우 경고 메세지를 출력한다.
$ sudo ufw delete deny 80/tcp
Could not delete non-existent rule
Could not delete non-existent rule (v6)
$
$ sudo ufw delete allow 80/tcp
Rule deleted
Rule deleted (v6)
$
$ sudo ufw delete allow 53
Rule deleted
Rule deleted (v6)
$
$ sudo ufw delete deny 443/tcp
Rule deleted
Rule deleted (v6)
$
$ sudo ufw status
Status: active
$
Service 명을 이용한 규칙 설정
포트 번호가 아니라, 실제 포트가 노출되어 사용되고 있는 서비스의 이름으로도 규칙을 설정할 수 있다. 하단의 파일 내용을 확인하여 서비스 이름을 확인할 수 있다.
$ sudo cat /etc/services
서비스 이름을 통하여 다음과 같이 규칙을 추가하거나 삭제 가능하다.
- $ sudo ufw [allow/deny] [서비스이름]
서비스 명을 통한 규칙 추가/삭제의 사용 예). 동일 서비스에 대하여 allow, deny 규칙을 차례로 추가할 경우 뒤의 규칙으로 덮어쓰여(override) 진다.
$ sudo ufw allow ssh
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
$ sudo ufw deny ssh
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22/tcp DENY Anywhere
22/tcp (v6) DENY Anywhere (v6)
$ sudo ufw delete deny ssh
Rule deleted
Rule deleted (v6)
IP 를 이용한 규칙 설정
다음과 같이 IP를 지정하여 특정 IP에 대한 패킷 통신을 허용/거부할 수 있다.
- $ sudo ufw [allow/deny] from [IP 주소]
사용 예
$ sudo ufw allow from 192.168.80.13
Rule added
$ sudo ufw deny from 192.168.81.14
Rule added
$ sudo ufw status
Status: active
To Action From
-- ------ ----
Anywhere ALLOW 192.168.80.13
Anywhere DENY 192.168.81.14
$
UFW 상세 설정
위 IP를 통한 규칙에 추가로 포트 번호 등을 지정하여 상세한 설정을 할 수 있다. 사용 예제는 하단과 같다.
$ sudo ufw allow from 172.16.221.5 to any port 22 proto tcp
Rule added
$ sudo ufw deny from 172.16.221.5 to any port 22 proto tcp
Rule updated
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22/tcp DENY 172.16.221.5
$ sudo ufw delete deny from 172.16.221.5 to any port 22 proto tcp
Rule deleted
$ sudo ufw status
Status: active
$
'소프트웨어 아키텍처 > Linux' 카테고리의 다른 글
[Ubuntu 보안] AppArmor 기본 개념과 설정 (0) | 2022.10.07 |
---|---|
strace 를 통한 syscall 확인과 seccomp (0) | 2022.09.22 |
Linux - sudo 와 su 명령어의 차이 (0) | 2022.09.08 |
TLS 인증서 (3) - openssl 을 통해 key, csr, crt 파일 만들기 (0) | 2022.06.17 |
TLS 인증서 (2) - 신뢰할 수 있는 인증서 (0) | 2022.06.16 |
댓글