▒ Doly의 CentOS7 강좌28 12. 네트워크 보안설정 12.1 firewalld (1/2)
CentOS7부터 많은 부분이 통합되고 추상화 되었다. CentOS6까지 방화벽 설정파일을 변경하고 iptables 서비스를 재시작하여 방화벽 규칙을 설정하였다면, CentOS7은 방화벽 규칙을 관리하는 데몬(firewalld)가 작동되고 이 방화벽 데몬이 제공하는 DBUS API를 통해 방화벽을 제어한다. GUI환경에서는 firewall-config를 이용하여 방화벽설정을 할 수 있으며, CUI환경에서는 firewall-cmd를 이용하여 방화벽 설정을 할 수 있다. 방화벽을 제어하려는 별도 어플리케이션을 개발할 때도 filrewalld API를 사용하면 설정파일 변경에 따른 각 방화벽 관리 어플리케이션과의 충돌을 피할 수 있다.
firewalld에서 사용되는 용어, GUI 프로그램인 firewall-config, CUI 프로그램인 firewall-cmd에 대해 알아보겠다.
12.1.1. firewalld에서 사용되는 용어
일반적인 서비스 오픈을 위해서는 앞에서 설명한 정도 방화벽 사용법을 알면 될 것이다. CentOS7에서 도입된 firewalld에 대해 자세히 보면 런타임, 영구적, 영역, 서비스등의 용어들이 사용되는 것을 알 수 있다.
① 설정 : 런타임(run time)
런타임(실행시간)에만 설정한다는 것이다. 즉, 설정 내역이 메모리에 상주되어 있어 적용은 되지만, Firewalld를 다시 불러오거나, 시스템을 재시작 하면 설정된 내역은 지워지게 된다.
② 설정 : 영구적(permanent)
영구적으로 설정한다는 것이다. 즉, Firewalld를 다시 불러오는 경우 영구적으로 설정된 내역에서 불러오고, 시스템 재시작시 영구적 설정에서 불러와 방화벽을 설정하게 된다. 앞의 http, https 허용 예에서도 영구적 설정을 하였다. 런타임 설정내역을 저장할 수 있는 방법을 제공하지 않기 때문에 영구적 설정으로 관리하는 것이 효율적이다.
③ 영역(zone)
네트워크 연결 신뢰도에 따라 영역을 구분하여 사용할 수 있다. 기본 영역은 public이며 영역을 추가/편집/삭제(일부영역 편집/삭제 불가)할 수 있다. 이 영역을 활용하면 네트워크 상황에 따라 여러 가지 잘 정의된 방화벽룰을 효율적으로 사용할 수 있다. 예를 들면 일반적인 환경에서는 public영역을 초기 구축 단계에서 모든 접속을 허용해야 할 경우 trusted영역을, 시스템 운영중 외부접속 차단을 위해 work영역 또는 drop, block영역을 사용할 수 있다.
기본적으로 정의된 영역에 대해 알아보자.
(/usr/lib/firewalld/zones/*.xml파일 참고)
[참 고]
REJECT와 DROP
방화벽 설정에서 패킷을 거부(reject) 또는 폐기(drop)할 수 있다. 거부와 폐기의 차이는 다음과 같다.
REJECT(거부) : 패킷을 받으면 거부한다는 ICMP패킷을 보내게 된다. 기본은 port-unreachable이며 icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited, icmp-admin-prohibited등을 선택해서 거부할 수 있다.
DROP(폐기) : 패킷을 받으면 아무런 응답을 하지 않고 버린다.
④ 서비스(service)
각 서비스별 정의된 프로토콜, 포트, 모듈, 목적지에 대해 정의가 된 서비스이다. 여기서 서비스는 /etc/service에 명시된 내용과는 조금 다르다. firewalld의 서비스는 /usr/lib/firewalld/services/*.xml 파일에 명시되어 있다. 여러 서비스 중 ftp 서비스 파일(ftp.xml) 내용을 살펴보자.
~]# cat /usr/lib/firewalld/services/ftp.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>FTP</short>
<description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description>
<port protocol="tcp" port="21"/>
<module name="nf_conntrack_ftp"/>
</service>
위 내용을 보면, FTP 서비스에 대한 설명과 프로토콜(tcp), 포트(21)가 명시되어 있고, FTP passive 모드를 위해 사용하는 nf_conntrack_ftp 모듈이 설정되어 있다. FTP 서비스를 선택하게되면 nf_conntrack_ftp 모듈이 로드된다.
12.1.2. 방화벽 GUI 설정 (firewall-config)
firewalld의 GUI인터페이스인 firewall-config에 대해 알아보기 이전에 웹서버를 운영하기 위해 HTTP, HTTPS 포트를 허용하는 방법에 대해 알아보자.
실행위치 : 프로그램 > 잡다 > 방화벽
또는 터미널 창에서 firewall-config 입력
다음과 같은 화면을 볼 수 있다.
위 그림은 방화벽 설정프로그램 실행 시 처음 나타는 화면이다.
위 그림과 같이 좌측 상단 설정:에는 런타임에서 영구적으로 변경한다. 좌측 영역 중에서 public을 선택(기본 영역이 public)하고 우측 서비스탭에서 http, https를 찾아 체크한다.
설정 완료 후 Firewalld를 다시 읽어 적용시켜보자.
옵션 -> Firewalld 다시 불러오기를 선택한다. 설정에서 런타임으로 변경하여 확인하면 적용된 것을 볼 수 있다.
방화벽 오픈 여부를 위해 다른 리눅스 컴퓨터에서 다음과 같이 확인해 보자.
~]# nmap 192.168.0.201 -p 443,80,22,25
Starting Nmap 5.21 ( http://nmap.org ) at 2015-03-24 19:57 KST
Nmap scan report for 192.168.0.201
Host is up (0.00041s latency).
PORT STATE SERVICE
22/tcp open ssh
25/tcp filtered smtp
80/tcp closed http
443/tcp closed https
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds
nmap명령어를 방화벽 설정 내역을 확인할 수 있다. 22/tcp(SSH)는 오픈된 것이 확인되고, 25/tcp(SMTP)는 filtered되었다. 웹서비스 포트 80/tcp(HTTP), 443/tcp(HTTPS)는 방화벽에서 차단된 것은 아니지만 닫혀 있다고 나타난다. 상태에 대해 설명하면 다음과 같다.
12.1.2.1. 영역(zone) 변경
앞에서 설명한 영역은 다음과 같은 방법으로 변경할 수 있다.
상단 메뉴에서 옵션(O)을 선택하고 기본 영역 변경을 선택하면 우측 그림과 같이 영역 목록이 나타나고 변경하고자하는 영역을 선택한 다음 확인(O)을 선택하면 기본 영역이 변경된다. 변경 확인은 아래 그림과 같이 하단 상태바에서 확인할 수 있다.
기본 영역 변경은 Firewalld를 다시 불러오지 않아도 변경내역이 적용되니 주의해야 한다.
12.1.2.2. 서비스(service) 수정
미리 정의된 서비스를 편집하여 사용해 보도록 하자. 리눅스 서버 접속을 위해 SSH를 가장 많이 사용한다. 많이 사용되는 만큼 인터넷에 공개된 서버의 경우 사전(dictionary) 공격을 통해 접속정보를 획득하려는 시도가 많이 일어난다. 이러한 접근 시도를 회피하기 위해 SSH 기본포트(tcp/22)를 1024이후 잘 알려지지 않은 포트로 변경한다. 이러한 경우 SSH 서비스에 대한 서비스 포트 또한 변경이 되어야 하기에 다음과 같이 방화벽 설정을 변경해 보도록 하자.
상단에 서비스 탭을 선택하고 서비스 리스트 중 ssh서비스를 찾아 선택한다. 우측에 포트 및 프로토콜 탭을 보면 포트(22) 프로토콜(tcp)이 있으며 이를 선택하고 아래 편집(E)을 클릭하여 위 화면과 같이 변경하고자는 포트를 입력한다. 필자는 SSH포트로 15322를 입력하였고 확인버튼을 눌러 설정하였다.
설정 후 위 그림과 같이 포트가 변경된 것을 확인할 수 있다.
설정 완료 후 Firewalld를 다시 읽어야 적용된다.
옵션 -> Firewalld 다시 불러오기를 선택한다. 런타임에서도 적용된 것을 확인할 수 있다.
12.1.2.3. 포트 및 프로토콜 직접 추가
앞에서 다뤘던 서비스를 이용하여 방화벽을 관리하기도 하지만, 앞 예와 같이 미리 정의된 서비스의 포트를 변경하는 경우는 포트 및 프로토콜을 직접 추가하는 것이 방화벽 관리에 더 효율적일 수 있다. SSH 포트를 변경한 경우 서비스 리스트에서는 바로 확인하기 어렵기 때문에 서버를 이전하는 경우 실수할 수 있다.
VNC접속을 위해 포트 및 프로토콜을 직접 추가해 보도록 하자.
위 그림과 같이 좌측 상단에 설정:에는 런타임에서 영구적으로 변경한다. 좌측 영역 중에서 public을 선택하고 우측 탭에 포트탭을 선택하고 하단 추가버튼을 클릭하여 포트를 추가한다.
“포트/포트 범위:” 5900-5910
“프로토콜:” tcp 선택
과 같이 설정한다. 이는 TCP 5900~5910포트로 서버에 들어오는 패킷을 허용한다는 것이다.
설정 완료 후 Firewalld를 다시 읽어 적용시켜보자.
옵션 -> Firewalld 다시 불러오기를 선택한다. 런타임에서도 적용된 것을 확인할 수 있다.
12.1.2.4. 마스커레이딩(Masquerading)
리눅스 시스템을 인터넷 공유 목적의 라우터 기능을 사용하기 위해 마스커레이딩 기능을 활성화 시킨다.
마스커레이딩을 사용하기 위해 공인망, 사설망 네트워크 구성을 미리 해 두어야 한다.
위 그림과 같이 좌측 상단에 설정:에는 런타임에서 영구적으로 변경한다. 좌측 영역 중에서 public을 선택하고 우측 탭에 마스커레이딩(Masquerading)을 선택하고 마스커레이딩 영역을 체크한다.
설정 완료 후 Firewalld를 다시 읽어 적용시켜보자.
옵션 -> Firewalld 다시 불러오기를 선택한다. 런타임에서도 적용된 것을 확인할 수 있다.
12.1.2.5. 포트 포워딩(port forwarding)
앞에서 마스커레이딩 설정으로 인터넷 공유 라우터를 설정한 경우 외부에서 공인IP로 접속되는 연결에 대해서 포트에 따라 내부 서버로 연결시킬 수 있는 포트 포워딩 기능을 사용할 수 있다.
또, 시스템으로 들어오는 포트를 포워딩하여 로컬의 다른 포트로 포워딩할 수 있다. 시스템의 각 서비스들은 보안을 위해 일반 사용자 권한으로 서비스를 실행하기를 권장한다. 예를 들어 Tomcat은 JSP 컨테이너이면서 웹서버 기능을 가지고 있다. Tomcat은 일반 사용자 계정으로 실행할 것을 권장한다. 하지만, HTTP기본포트 80을 사용할 경우 root권한이 아니면 80포트를 Bind할 수 없다. 이러한 경우 포트포워딩을 사용하여 80포트로 접속되는 패킷을 로컬의 8080(Tomcat의 기본 HTTP 포트)포트로 포워딩 시킴으로 root권한 없이 80포트를 사용하여 웹서비스를 할 수 있다.
80포트로 접속되는 패킷을 8080포트로 포워딩 설정해 보자.
위 그림과 같이 좌측 상단에 설정:에는 런타임에서 영구적으로 변경한다. 좌측 영역 중에서 public을 선택하고 우측 탭에 포트 포워딩탭을 선택하고 하단 추가버튼을 클릭하여 추가한다.
소스 “포트/포트 범위:” 80
로컬포트 포워딩 체크
대상 “포트/포트 범위:” 8080
으로 설정한다. 설정완료 후 확인(O)을 클릭한다.
설정된 내역을 다음과 같이 확인할 수 있다.
설정 완료 후 Firewalld를 다시 읽어 적용시켜보자.
옵션 -> Firewalld 다시 불러오기를 선택한다. 런타임에서도 적용된 것을 확인할 수 있다.
12.1.2.6. ping 응답 하지 않기
시스템의 네트워크 상태를 확인하기 위해 ping명령어를 이용하여 응답 테스트를 한다. ping은 네트워크 확인을 위해 유용하게 사용되지만, 악의적으로 패킷크기를조절하여 네트워크의 과다한 트래픽을 유발하기도 한다. 이러한 공격을 차단하기 위해 ping에 대해 응답하지 않도록 설정하는 경우가 있다.
다음은 ICMP 프로토콜 중 ping에 대해 응답하지 않게 설정하고 있다.
위 그림과 같이 좌측 상단에 설정:에는 런타임에서 영구적으로 변경한다. 좌측 영역 중에서 public을 선택하고 우측 탭에 ICMP필터탭을 선택하고 echo-request 를 체크한다.
설정 완료 후 Firewalld를 다시 읽어 적용시켜보자.
옵션 -> Firewalld 다시 불러오기를 선택한다. 런타임에서도 적용된 것을 확인할 수 있다.
12.1.2.7. 직접 방화벽 규칙 넣기
리눅스 방화벽 iptables는 막강한 확장기능을 제공한다. firewalld에서 제공되는 기능은 확장 기능 중 일부만 사용할 수 있으며, 원하는 확장 기능 사용을 위해 다음과 같은 방법으로 직접 입력하여 사용할 수 있는 인터페이스가 제공된다.
웹서버를 대상으로 DOS공격이 많이 발생된다. 특정 클라이언트 IP에서 접속이 많이 발생된다면 특정 클라이언트 IP 차단을 위해 사용하는 모듈이 connlimit이다.
다음은 connlimit를 사용하여 DOS공격을 막도록 설정해 보겠다.
먼저 메인 메뉴에서 보기(V)를 선택하여 직접설정을 선택한다. 직접 입력을 선택하면 위 그림과 같이 √표시가 생기고, 다음 그림과 같이 직접 설정 탭이 새롭게 생긴 것을 확인할 수 있다.
좌측 상단에 설정:에는 런타임에서 영구적으로 변경한다. 좌측 탭 중에서 직접 설정을 선택한다. 중간에 통과 규칙 탭을 선택하고 아래 추가(A)를 클릭하여 규칙을 추가한다.
“ipv:” ipv4
“인수:” -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 -j REJECT
과 같이 설정하고, 확인(O)를 클릭한다.
위 그림과 같이 규칙이 추가된 것을 확인할 수 있다. 위와 같이 설정되면 하나의 클라이언트 IP에서 16회 이상 연결이 시도되면 거부(Reject)하는 설정이다.
설정 완료 후 Firewalld를 다시 읽어 적용시켜보자.
옵션 -> Firewalld 다시 불러오기를 선택한다. 런타임에서도 적용된 것을 확인할 수 있다.
이상으로 28번째 강좌를 마무리 합니다. CentOS7의 새로운 기능중에 하나가 firewalld이다. CentOS6의 방화벽관리도구와 비슷하지만, 아직 기능면에서 부족함이 있네요. 간단하게 보안설정하기에는 아주 좋을 것이라 생각합니다. 리눅스 기초명령어들은 본 강좌에서 다루지 않겠습니다. CentOS 7의 다양한 기능에 대해서 중점적으로 다루겠습니다. 2015년 4월 16일(목) 열심히 뛰는 도리(Doly)였습니다.^^
#################################################
* 본 강좌는 언제든 갱신될 수 있으며, 원글은 www.linux.co.kr 강좌>리눅스>Doly의 연재강좌 에서 수정됩니다.
* 본 강좌의 일부 또는 전체를 인용하실 경우, 반드시 출처를 밝혀 주시기 바랍니다.
* 수정이력 :
2015.4.16(목): 최초작성