10. 서버 보안

 

   통계적으로 리눅스 서버호스팅을 사용하고 있는 사용자의 대부분이 리눅스의 open source 라는 장점

   보다는 단지 비용문제로 인해서 리눅스를 선택하게 되는 사용자가 많고, 그로 인해서 많은 관리자들이

   리눅스에 대한 경험이 없거나 있어도 기초적인 수준만을 유지하고 있는 경우가 많다.

   이로인해서 보안이 취약하게 되며, 소중한 자료들이 해커들이나 악성코드로 인해서 유실되고 있으며,

   침해당한 서버가 다른 서버로의 해킹 경로로 사용되고 있어서 그 문제점이 심각하다.


     그래서 이번 chapter에서는 기본적인 서버 보안에 대해서 알아보도록 한다.


    

 10.1 사용하지 않는 포트(데몬)를 막자.

   리눅스가 설치되고 나면 사용하지 않는 포트가 기본으로 열려있는 것들이 있다.

   이런 포트들을 막아서 사용하지 않도록 하는 것도 보안의 한 방법이다.

   chkconfig 명령으로 데몬의 실행을 막을수도 있고, 간단하게 ntsysv라고 치면 텍스트 그래픽모드

   에서 데몬의 실행 유무를 결정할 수 있다.

 

< 그림 10-1 ntsysv 실행 화면 >

 

  ntsysv를 실행시키면 많은 데몬이 현재 서버에 설치되어 있음을 알수 있을 것이다.

  이중에서 서버에서 동작 시켜야 하는 데몬을 알아보자.

 

데 몬 이 름

설     명

crond*

  관리자가 지정한 프로그램을 특정시간에 주기적으로 실행시켜 주는 데몬

  (백업 chapter에서 설명한 day백업을 하기 위해서는 반드시 실행이 되어야한다.)

imapd

  imapd 데몬으로 imap을 사용할때는 체크해 주어야 한다.

ipop3d

  mail서버로 사용하여 사용자가 메일을 받아가고자 할때 사용하는 데몬으로 받는   mailserver로 운영할 경우에 반드시 열어줘야 한다.

iptables*

  서버내에 기본적인 방화벽을 구성할 때 사용한다. 반드시 동작하도록 한다.

ipchains

  커널버전이 2.4대로 넘어오면서 iptables가 등장하면서 잘 사용하지 않지만 기존에   ipchains에 익숙한 관리자라면 iptables보다 ipchains을 선택한다.

kudzu

  부팅시에 새로운 하드웨어를 검색하여 설정을 해주는 데몬으로 데스크탑으로 리눅스  를 데스크탑용으로 사용하지 않는다면 부팅시에 시간만 빼앗기므로 동작시키지 않는  다. 하드웨어 변경이 잦은 관리자라면 체크해 둔다.

named

  서버를 DNS서버로 구축하여 사용한다면 체크를 해야 한다. DNS서버로 사용하지 안

  는다면 체크를 해제한다.

network*

  설정된 네트워크 인터페이스가 부팅시 동작을 할수 있도록 하는 것으로 리눅스를 서

  버로 운영하는 관리자라면 반드시 체크 ( 반드시 체크!!! )

nfs

  NFS 서버(다른 서버의 하드를 자신의 서버로 마운트하여 자신의 하드처럼 운영)로   운영할 때 사용할때는 체크, 하지만 운영하지 않을시에는 보안상 취약하므로 체크하

  지 않는다.

portmap

  RPC(Remote Procedure Call)로서 원격연결에 사용하는 데몬으로 NFS, NIS을 사용

  할때는 체크, 하지만 사용하지 않을 때에는 보안상 체크를 해제한다.

random*

  시스템에 필요한 난수 발생 및 저장을 하는 스크립트 이다.

proftpd

  proftpd 데몬으로 rpm으로 proftp가 설치시에, proftp-inetd, proftp-standalon 모드  를 선택할수 있다. (호스트웨이에서는 기본적으로 proftp-inetd로 설정된다.)

sendmail

  sendmail을 사용하여 메일을 전송할 때 사용하는 것으로 메일서버로 사용하지 않는

  다면 체크하지 않는다.

snmpd*

  MRTG를 사용하여 트래픽을 측정하기 위해 서버의 트래픽 정보를 가져올수 있도록

  동작하는 데몬, 호스트웨이에서의 트래픽 측정을 위해서 반드시 열어둔다.

sshd*

  부팅시 SSH를 동작시켜 서버의 원격접속을 가능하게 한다. 반드시 체크

syslog*

  시스템 로그를 기록하는 데몬으로 /var/log/ 디렉토리밑에 시스템의 로그를 기록하   게 한다. 반드시 체크

telnet

  원격접속을 위한 데몬이지만 보안상 취약하여 SSH로 대치된다.

  관리자의 관리 재량에 의해서 체크 유무를 결정한다. ( 사용을 권하지 않음 )

xinetd*

  슈퍼데몬으로 proftpd, pop3d, imapd 등의 데몬들을 관장한다. 체크한다.

< 표 10-1 일반적인 데몬 과 그 설명 >


     

   표 10-1에서 데몬 이름 옆에 “*” 있는 데몬은 반드시 실행 체크해줘야 하는 데몬이고, 그 외 기타 나머지 데몬들은 설명에도 나와 있듯이 조건이 맞는다면 체크를 하여 사용하면 된다.

   그 외 더 필요한 데몬들은 관리자의 필요성에 따라 체크하여 사용하면 된다.


   많은 데몬을 실행시키게 되면 많은 포트가 열리게 되므로 보안상 취약하게 되므로 꼭 서버 운영에 필요한 데몬만을 실행시키도록 한다.

 

10.2. 명령어 사용 제한

   리눅스에서 사용하는 명령어들 중에서는 root 사용자 뿐만 아니라 일반 사용자들이 사용할수 있는 명령들 중에서 시스템 정보를 볼수 있는 명령어 들이 있다. 이들 명령어들은 일반 사용자들도 시스템의 상황을 볼수 있어서 도움을 주기도 하지만, 간혹 나쁜 의도의 사용자들에 의해서 시스템의 취약점을 노출하는 경로로도 사용된다.

   그래서 이런 명령어들을 root만이 사용가능하도록, 일반 사용자들은 사용하지 못하도록 권한을 수정하는 것이 좋다.

   여기서는 root 및 일반 관리계정인 zmnkh 계정에게 그 사용권한을 부여하고 나머지 사용자들은 사용하지 못하도록 설정을 하는 방법 및 설정할 명령어들에 대해서 알아보도록 한다.


  1) zmnkh 사용자에게 명령을 사용할 수 있는 권한 부여 

 

< 그림 10-2 /etc/group 의 wheel그룹에 zmnkh를 추가한 그림 >


 

   그림 10-2처럼 함으로써 zmnkh는 root와 같은 그룹인 wheel에 속하게 된다.

 

< 그림 10-3 zmnkh이 속한 그룹 확인 >


  그림 10-3처럼 “id" 명령으로 wheel그룹에 속했는지 확인한다.


 

  2) 명령어 사용제한 

 

  #!/bin/bash

  chgrp wheel /usr/bin/finger

  chgrp wheel /usr/bin/nslookup

  chgrp wheel /usr/bin/gcc

  chgrp wheel /usr/bin/suidperl

  chgrp wheel /usr/bin/whereis

  chgrp wheel /usr/bin/cc

  chgrp wheel /usr/bin/c++

  chgrp wheel /usr/bin/make

  chgrp wheel /usr/bin/pstree

  chgrp wheel /usr/bin/rlog

  chgrp wheel /usr/bin/rlogin

  chgrp wheel /usr/bin/which

  chgrp wheel /usr/bin/who

  chgrp wheel /usr/bin/w

  chgrp wheel /bin/mail

  chgrp wheel /usr/sbin/sendmail

  chgrp wheel /usr/lib/sendmail

  chgrp wheel /usr/bin/top

  chgrp wheel /usr/bin/free

  chgrp wheel /usr/bin/last

  chgrp wheel /usr/bin/lynx

  chgrp wheel /usr/bin/wget

  chgrp wheel /etc/hosts

  chgrp wheel /bin/ps

  chgrp wheel /etc/hosts.deny

  chgrp wheel /etc/hosts.allow

  chgrp wheel /etc/named.conf

  chgrp wheel /bin/df

  chgrp wheel /bin/grep

  chgrp wheel /bin/egrep

  chgrp wheel /bin/ping

  chgrp wheel /bin/netstat

  chgrp wheel /usr/bin/ftp

  chgrp wheel /usr/bin/ncftp

  chgrp wheel /usr/bin/suidperl

  chgrp wheel /usr/bin/whereis

  chgrp wheel /usr/bin/rz

  chgrp wheel /usr/bin/sz

 

 

  chmod 750 /usr/bin/finger

  chmod 750 /usr/bin/nslookup

  chmod 750 /usr/bin/gcc

  chmod 750 /usr/bin/suidperl

  chmod 750 /usr/bin/whereis

  chmod 750 /usr/bin/cc

  chmod 750 /usr/bin/c++

  chmod 750 /usr/bin/make

  chmod 750 /usr/bin/pstree

  chmod 750 /usr/bin/rlog

  chmod 750 /usr/bin/rlogin

  chmod 750 /usr/bin/which

  chmod 750 /usr/bin/who

  chmod 750 /usr/bin/w

  chmod 750 /bin/mail

  chmod 750 /usr/sbin/sendmail

  chmod 750 /usr/lib/sendmail

  chmod 750 /usr/bin/top

  chmod 750 /usr/bin/free

  chmod 750 /usr/bin/last

  chmod 750 /usr/bin/lynx

  chmod 750 /usr/bin/wget

  chmod 750 /etc/hosts

  chmod 750 /bin/ps

  chmod 750 /etc/hosts.deny

  chmod 750 /etc/hosts.allow

  chmod 640 /etc/named.conf

  chmod 750 /bin/df

  chmod 750 /bin/grep

  chmod 750 /bin/egrep

  chmod 750 /bin/ping

  chmod 750 /bin/netstat

  chmod 750 /usr/bin/ftp

  chmod 750 /usr/bin/ncftp

  chmod 750 /usr/bin/suidperl

  chmod 750 /usr/bin/whereis

  chmod 750 /usr/bin/rz

  chmod 750 /usr/bin/sz

< 표 10-2 퍼미션을 변경할 명령어들과 명령어들의 그룹 변경 >


  <표 10-2>처럼 함으로 인해서 일반사용자들은 해당 명령어들을 사용할 수가 없으며, root와 zmnkh 사용자만이 <표 10-2>에 나열된 명령어들을 사용할수 있게 된다.

 

< 그림 10-4 퍼미션 제한이 걸린 파일 실행 >


  그림 10-4는 표 10-2에서 설정한 ps명령을 ls로 확인하고 wheel그룹에 속하지 않은 사용자와 wheel그룹에 속한 zmnkh사용자의 ps명령 실행 결과를 보여주는 그림이다.

  manpage 유저가 ps명령을 사용 했을때에는 명령어 사용이 거부 되었지만, 관리자로 지정한 zmnkh가 명령어를 사용했을때에는 명령어의 사용 할 수가 있다.


  이처럼 사용할수 있는 명령어의 제한을 둠으로써 서버의 보안을 좀더 강화시킬수가 있다.

 

  Ps. 웹호스팅 서버를 운영하는 관리자라면 위의 명령어를 모두 제한하면 안된다. 물론 제한을 해도

  상관은 없겠지만 서버에 접속하는 사용자의 불편함을 초래할 수가 있으므로 관리자의 재량에 따라

  명령어의 권한을 조정한다. 하지만 서버에 직접 들어와서 작업하는 사용자들은 그리 많지 않다.

 

 

3) 불필요한 계정 사용자 삭제


리눅스 서버를 초기 세팅해놓으면 시스템 운영에 필요 없는 계정들이 default로 생성되게 된다.

이들 계정은 해커들에 의해서 사용될 수 있으므로 서버 관리에 필요 없는 계정들은 삭제한다.

 

# 삭제할 계정들은 다음과 같다. (구축된 시스템마다 약간의 차이가 있을 수 있다.)

  userdel adm

  userdel lp

  userdel shutdown

  userdel halt

  userdel news

  userdel uucp

  userdel operator

  userdel game

  userdel gopher

  userdel ftp

  userdel rpm

  userdel xfs (x-windows를 사용한다면 지우지않는다.)

  userdel postgres  

  groupdel adm

  groupdel lp

  groupdel games

  groupdel gopher

  groupdel ftp

  groupdel dip

  groupdel rpm

  groupdel xfs (x-windows를 사용한다면 지우지 않는다.)

  groupdel postgres

 

 

   서버에 rcp 등으로 되어있는 계정이 존재한다면, nfs나 원격 접속을 사용하지 않는다면 rcp관련 계정   도 삭제한다.

   그리고 삭제하지 않고, 사용하지 않는 계정들은 /etc/passwd를 vi로 open한뒤에 쉘(/bin/bash) 등으로 지정된 부분을 /bin/false로 변경하여 그 계정으로는 서버에 접속을 하지 못하도록 설정을 변경해 놓는다.


  4). 파일 변경 제한

   /etc 디렉토리 안의 설정파일들은 시스템의 정보를 담고 있기 때문에 노출되었을때 시스템의 정보를 고스란히 파일 열람자에게 알려주게 된다.

   이런 파일들을 일반 사용자들이 읽을 수 있는 권한을 제한하고 변경할수 있는 권한을 제한함으로써 보안을 강화시킬수가 있다.


   여기서는 파일에 퍼미션을 변경하는 방법과 파일을 변경시킬 수 없도록 속성을 설정하는 부분을 간단히 알아보도록 하겠다.


  # 파일 퍼미션 변경


  위의 리눅스 명령 퍼미션 변경을 참고하여 설정을 변경할 수 있다.

  우선 시스템 정보를 가지고 있는 파일을 선별해야 한다.

  (기본적으로 hosts, hosts.allow, hosts.deny, passwd, shadow, sysctl.conf, lilo.conf, group,

  service  파일등을 시스템 정보를 가지고 있는 파일들이라 할 수 있겠다.)

 

  chmod 640 hosts.allow

  chgrp wheel hosts.allow

 

  명령으로 root는 읽고 쓰기가 가능하며, 관리자 그룹인 wheel은 읽기만 가능하도록 설정해 놓았다.

   일반 사용자들은 이 파일을 읽을수 없다.


  # 파일을 변경 시킬 수 없도록 속성 설정

 

  chattr +i /etc/hosts.allow (설정)

  chattr -i /etc/hosts.allow (해제)

 

  이렇게 함으로써 hosts.allow 파일은 root이외에는 설정된 내용을 수정하지 못하도록 속성을

  변경하였다.

  혹시나 hosts.allow를 수정할 수 있는 권한을 가진 유저라도 chattr -i /etc/hosts.allow를 하기전

  까지는 hosts.allow의 내용을 변경할 수가 없다.


  물론 root 권한을 획득하고, chattr -i 명령어 까지 알게 된다면 어쩔 도리가 없지만, 해커가 루트권

  한을 취득하기 전까지는 충분히 안전할 수 있다.

  여기까지는 보안에서도 서버 사용자에 대한 내부보안에 대해서 알아보았다.

  이제 다음 장에서 알아볼 보안 방법은 서버의 외부에 대한 보안 설정이다.

  서버 외부의 설정은 서버 내부의 설정보다 훨씬 까다로우며 설정을 잘못하면 시스템이 정상적으로 운영이 되지 않거나 서비스가 제대로 되지 않는 경우가 발생할 수 있으므로 충분히 읽어보고 이해를 한후에 외부 보안 설정을 적용하도록 한다.


 

10-2. tcpwrapper로 서버 IP제한


  tcpwrapper는 말그대도 tcp접속에 대한 보호, 방어수단이다.

  tcpwrapper가 설치가 되어있다면 (호스트웨이에서는 기본 설치) hosts.allow, hosts.deny로

  서버에서  제공하는 서비스 별로 허용하는 IP를 제한할 수가 있다.

  서비스 별로 접속할수 있는 IP를 제한 한다는 것은 불특정 다수에 대한 공격에서 벗어날 수 있는 방법이

  기 때문에 보안상 아주 유리하다.


  이번 장에서는 hosts.allow, hosts.deny를 설정하여 서버 보안을 하는 방법에 대해서 알아보도록 하겠

   다.

  hosts.allow는 tcp 접속을 허용하는 설정을 하는 부분이고, hosts.deny는 tcp 접속을 차단하고자 하는

  설정이다.

  먼저 기본적으로 알아두어야 할 것은 hosts.allow, hosts.deny에서 ssh나 telnet을 차단하는 설정부분

  을 잘못하면 관리자역시 접속하지 못하는 경우를 만나게 되므로 반드시 관리자의 접속 IP는 개방을 시

  켜둔후에 설정을 저장하도록 한다.

 

  #hosts.allow 설정

  cat /etc/hosts.allow

  ====================================

  in.telnetd: 211.239.151.21 211.221.211.100/120

  sshd: ALL (유동아이피의 경우를 대비해서 모두 접속이 가능하게 해둔다)

  in.ftpd: ALL

  ipop3d: ALL

  ====================================

 

    위의 hosts.allow 설정은 만약 telnet을 사용하게 될 때에는 지정된 아이피로만 접속이 가능하게

    하고, SSH, FTP, POP접속은 모두 허용을 한 설정이다.

 

  # hosts.deny 설정

  cat /etc/hosts.deny

  ===================================

  ALL: ALL : ( echo -e "\n \

  Process\:\t   %d (pid %p)\n \  

  User\:\t   %u\n \

  Host\:\t   %c\n \

  Date\:\t   $(date)\n \" | mail -s " 경고! 불법 접속 “ hkim@hostway.co.kr ) &

  ALL: 211.211.211.211

  ===================================

 

   위의 hosts.deny 설정은 hosts.allow에서 허용한 서버스 이외의 모든 tcp 접속과 211.211.211.211

    IP에 대해서는 차단하고 접속 시도가 있을시에 탐지하여 접속 정보를 메일로 전송하라는 설정이다.


   위의 설정대로 하게 된다면 서버는 상당히 고립된 상태가 되며, 수많은 메일이 관리자에게 전송이 되어질 것이다. 경고 메일을 많이 받는 것도 경고에 대해서 둔감해질 수 있는 지름길이므로 관리자는 전체 서비스에 대해서 차단을 하는 것보다는 아래처럼 특정 데몬에 대해서 차단을 하는 방법을 택해야 할 것이다.

 

ALL: in.telnetd : ( echo -e "\n \

  이하 동일 ) &

ALL: sshd : (echo -e "\n \

  이하 동일 ) &

 

   hosts.deny에서 사용할 수 있는 있도록 지정된 변수는 표와 같다.

 

변  수

설               명

%a

  address ( clinet의 IP 주소 값을 가지고 있다. )

%A

  address ( server의 IP 주소 값을 가지고 있다. )

%c

  client info ( username을 알 수 있으면, username@hostname 의 값을 가지고  

  있으나 알 수 없을 때에는 hostname 이나 IP 주소 값을 가지게 된다. )

%d

  deamon name ( clinet가 접속할 때 호출한 데몬의 이름을 가지고 있다. )

%h

  hostname ( client의 hostname 값을 가지고 있으나 hostname을 알 수가   

  없을 때에는 IP주소 값을 가진다 )

%H

  hostmane ( server의 hostname 값을 가지고 있으나, hostnam을 알수가

  없을때에는 IP주소 값을 가진다. )

%p

  데몬의 프로세서 값을 가진다.

%s

  서버의 정보를 가지고 있다 ( daemon@host 형태 )

%u

  client의 user name 값이나 unknown 값을 가지고 있다.

%%

  % 문자를 표현한다.

< 표 10-2 hosts.deny에서 사용할 수 있도록 지정된 변수들 >

 

  지금까지 tcpwrapper에 의한 서버 보안을 알아보았다.  

  다음은 이번 보안의 가장 핵심이 되는 IPTABLES을 이용한 보안에 대해서 알아보도록 하겠다.


 

10-3. IPTABLES를 이용한 보안

   본 문서의 순서대로 해서 IPTABLES 까지 왔다면 기본 보안은 모두 마치고 서버에 기본적으로 설치되어 있는 프로그램을 이용하여 할수 있는 보안의 중급정도의 보안 수준까지 끌어올렸다고 할 수가 있겠다.


   “리눅스 보안과 완벽 솔루션” 이란 책에서는 iptables을 다음과 같이 소개하고 있다.

 

“iptables는 리눅스에서는 처음으로 상태 추적 기겁이 도입된 방화벽인데 상태추적 방화벽

  이란 이전의 리눅스 기반의 방화벽에서는 탐지가 불가능했던 스텔스 스캔을 탐지 및 차단

  하는등 상당한 기술적 진보를 이룬 지능형 방화벽을 뜻한다. 또한 iptables는 방화벽을 통과

  하는 각각의 연결을 메모리에 저장하므로 레이팅 제한(ratiing limiting)을 이용하여 대부분의

  서비스거부 공격도 차단할수 있다.”


    이 번장에서는 유용하면서도 무료로 제공되고 있는 iptables에 대해서 알아보자.

  

    ▶ 사용 명령어


     ○ 체인 제어 명령

     사용법 iptables [-NXPLFZ] [chain명]

IPTABLES 옵션

설                 명

-N

  새로운 chain 생성 ( --new-chain )

-P

  체인의 정책 변경 ( --policy )

-L

  체인에 적용된 정책 리스트 출력 ( --list )

-F

  체인에 적용된 정책 지우기 ( --flush)

-X

  비어있는 체인 제거 ( --delete-chain )

-E

  체인의 이름을 변경 ( --rename-chain )

-Z

  체인내의 패킷과 바이트의 카운트를 0으로 리셋 ( --zero )

-A

  체인에 새로운 필터링 규칙을 추가하기 (  --append )

-I

  체인의 특정 지점에 필터링 규칙 삽입 ( --Insert )

-R

  체인의 특정 지점의 필터링 규칙을 교환 ( --replace )

-D

  체인의 특정 지점의 필터링 규칙을 제거 ( --delete )

     

    ○ 파라미터

IPTABLES 파라미터

설                 명

-p

( --protocol )

  프로토콜을 지정

  tcp, udp, icmp or all( 모든 프로토콜)을 지정

  !(not)를 통해서 역의 결과를 만들 수도 있다.

  -p tcp (tcp 프로토콜을 사용하는)

  -p ! tcp ( tcp 프로토콜을 사용하지 않는)

-s

( --source )

  패킷을 발생시키는 발생지

  !(not)을 통해서 역의 결과 도출 가능

  -s 211.239.151.21 ( 211.239.151.21을 패킷 발생지로 하는 )

  -s ! 211.239.151.21 ( 패킷 발생지를 211.239.151.21으로 하는  

  것을 제외하고 )

--sport

( --source-port )

  패킷을 발생시킨 발생지에서 접속해온 포트 ! 사용 가능

  --sport 21 ( 21번 포트에서 발생한 패킷 )

-d

( --destination )

  패킷이 도착하는 지점. 사용법은 souece와 동일

--dport

( --destination-port )

  패킷의 도착지 포트,  사용법은 sport와 동일

  포트가 연속적으로 여러 개일 경우 ‘-‘ 로 표현할 수 있다

  (20-22 → 20, 21, 22를 의미)

-j

( --jump )

  필터링 규칙에 의해 적용되는 패킷을 target으로 보낸다.

-i

( --in-interface )

  패킷이 들어올 때 경로가 되는 인터페이스를 지정. !(not) 사용가능

  interface = lo ( localhost ), eth0 ( 랜카드 한개일 경우),

  -i eth0 ( 설정된 랜카드를 통해서 들어오는)

-o

( --out-interface )

  패킷이 나갈 때 경로가 되는 인터페이스를 지정 ! 사용가능

  -o eth0 ( 랜카드로 나가는 패킷을 지정 )

  -o ! eth0 ( 랜카드로 나가는 패킷을 제외하고)

-f

( --fragment )

  패킷이 한번에 전달되지 못할만큼 크기가 클 때 패킷을 여러개로   

  나누어서 (분절) 여러개의 패킷으로 전달할 때 사용. 이들 패킷은  

  목적지에 도착해서 재구성되어 전체 패킷이 된다. !(not) 가능

-c

( --set-counters )

  INSERT(-I), APPEND(-A), REPLACE(-R) 명령을 사용하는 동안

  규칙의 패킷과 바이트의 카운터를 초기화 시킨다.


     ※ 참고 그 외 기타 옵션으로 -m (match)를 사용해서 확장시킬수 있는 옵션이 있으나,

        그것은 개인적으로 알아보기 바라며 여기에서는 설명하지 않는다.


  < 사용법 >

  iptables -[ADC] chain rule-specification [options]

  iptables -[RI] chain rulenum rule-specification [options]

  iptables -D chain rulenum [options]

  iptables -[LFZ] [chain] [options]

  iptables -[NX] chain

  iptables -P chain target [options]

  iptables -E old-chain-name new-chain-name

    # chain - INPUT, OUTPUT, FORWARD or 직접 생성한 chains

    # rulenum - 규칙이 생성된 순서 (순서대로 1,2... )

    # rule-specification - 파라미터를 사용하여 만들어진 규칙 (필터링 규칙)

    # target - ACCEPT, DROP, QUEUE, RETURN

 


   이제 기본적인 것은 모두 알아보았고, 실제 필터링 적용을 통한 예제로서 앞에서 배운 명령과 옵션을 익혀 보도록 하자.


   < 적용하고자 하는 방화벽 예 >

 

 기본 정책을 DROP으로 선택한다.

 새로운 체인을 생성하여 들어오는 패킷에 대한 필터링 체인으로 사용한다.

 로컬에서 발생하는 패킷은 모두 허용한다.

 웹서비스를 하는 80번 포트는 모든 사람이 접속할 수 있도록 허용한다.

 ftp와 ssh는 211.239.0.2에서만 접속할 수 있도록 한다.

 snmp 사용을 위해서 snmp udp(161) 포트를 mrtg서버에서만 접속할 수 있도록 허용한다.

 허용된 ip에서만 211.239.0.2 에서만 서버로 ping이 가능하도록 설정한다.

 서버에서는 모든 곳으로 ping이 되도록 허용한다.

 domain resolve를 위해서 dns(53) 포트를 모두에게 허용한다.

 mysql을 모두에게 허용한다.

 Foward는 하지 않는다.

 클래스별 비공인 아이피가 외부에서 접속되는 것과 외부로 나가는 것을 막는다.

 허용하지 않은 모든 tcp, udp, icmp의 입/출입을 막는다.

    # 서버의 IP : 211.239.0.0

    # MRTG server IP : 211.239.0.1

    # 원격 접속하는 IP : 211.239.0.2

 


  < 방화벽 규칙에 따른 필터링 적용 예 >

 

  iptables -P INPUT DROP

  iptables -P OUTPUT DROP

  iptables -P FOWARD DROP  

  iptables -N NEWINPUT

  iptables -F

  iptables -A NEWINPUT -i lo -j ACCEPT

  iptables -A NEWINPUT -i eth0 -p tcp -s 0/0 -d 0/0 --dport 80 -j ACCEPT

  iptables -A NEWINPUT -i eth0 -p tcp -s 211.239.0.2 -d 211.239.0.0 \

  --dport 20-22 -j ACCEPT

  iptables -A NEWINPUT -i eth0 -p udp -s 211.239.0.1 --dport 161 -j ACCEPT

  iptables -A NEWINPUT -i eth0 -p tcp -s 0/0 -d 0/0 --dport 3306 -j ACCEPT

  iptables -A NEWINPUT -i eth0 -p udp -s 0/0 -d 0/0 --dport 53 -j ACCEPT

  iptables -A NEWINPUT -i eth0 -p icmp -s 211.239.0.2 \

  --icmp-type echo-request -d 211.239.0.0 -j ACCEPT

 

 

  iptables -A NEWINPUT -i eth0 -s 0.0.0.0/8 -j DROP

  iptables -A NEWINPUT -i eth0 -s 127.0.0.0/8 -j DROP

  iptables -A NEWINPUT -i eth0 -s 169.254.0.0/16 -j DROP

  iptables -A NEWINPUT -i eth0 -s 192.0.2.0/24 -j DROP

  iptables -A NEWINPUT -i eth0 -s 224.0.0.0/3 -j DROP

  iptables -A NEWINPUT -i eth0 -p tcp -j DROP

  iptables -A NEWINPU -i eth0 -p udp -j DROP

  iptables -A NEWINPUT -i eth0 -p icmp -j DROP

  iptables -A INPUT -i eth0 -p all -s 0/0 -j NEWINPUT

  iptables -A OUTPUT -o lo -j ACCEPT

  iptables -A OUTPUT -o eth0 -p tcp ! --syn -s 0/0 -d 0/0 -j ACCEPT

  iptables -A OUTPUT -o eth0 -p tcp -s 211.239.0.0 -d 211.239.0.2 -j ACCEPT

  iptables -A OUTPUT -o eth0 -p tcp -s 0/0 -d 0/0 3306 -j ACCEPT

  iptables -A OUTPUT -o eth0 -p udp -s 0/0 -d 0/0 --dport 53 -j ACCEPT

  iptables -A OUTPUT -o eth0 -p icmp -s 211.239.0.0 --icmp-type echo-request \

  -d 0/0 -j ACCEPT

  iptables -A OUTPUT -o eth0 -s 0.0.0.0/8 -j DROP

  iptables -A OUTPUT -o eth0 -s 127.0.0.0/8 -j DROP

  iptables -A OUTPUT -o eth0 -s 169.254.0.0/16 -j DROP

  iptables -A OUTPUT -o eth0 -s 192.0.2.0/24 -j DROP

  iptables -A OUTPUT -o eth0 -s 224.0.0.0/3 -j DROP

  iptables -A OUTPUT -o eth0 -p tcp -j DROP

  iptables -A OUTPUT -o eth0 -p udp -j DROP

  iptables -A OUTPUT -o eth0 -p icmp -j DROP 

< 방화벽 규칙에 따른 설정 예 >

 

   위의 규칙대로 설정하면 지정된 IP (211.239.0.2)를 제외하고는 외부에서는 WebService이외에는 아무것도 허용되지 않으므로 보안상으로는 좋지만, 서버가 고립되게 된다.

   위의 설정은 iptables의 설정 방식과 파라미터의 사용법을 알고자 예제로 만들어 놓은 것이므로

   관리자는 iptables의 명령과 파라미터를 이용 각자의 서버에 알맞은 정책을 설정하면 된다.

   단순한 명령과 동일한 파라미터가 반복되는 방식이므로 쉽게 사용할 수 있을 것이다.


   iptables에 대한 자세한 사용설명서는 서버에서 “man iptables“ 하면 볼 수 있다.