방화벽 구축 실무 지침

이상호 : shlee@apdns.com / LPI, Inc (http://www.lpi.org)한국어(http://lpi.apit.edu) 싸이트 운영

 

 

    TIS Firewall Toolkit을 이용하여 방화벽을 구축하는데 필요한 정보 및 셋업파일 구성에 대해 다룬다.

 

1. TIS-FWTK

    각 서비스별로 IP주소를 이용한 접근제어를 하기 위한 netacl 모듈과 각 서비스별 프락시로 구성되어 있으며, 각 프락시는 인증기능이 부여될 수 있다.
    이러한 각 서비스 모듈은 서비스를 제공하기 위한 보안 정책을 정의한 netperm-table 파일을 참조하여 서비스 제공여부를 결정하고 서비스 접속거부 및 허용에 대한 관련 기록을 남긴다.

    가. NETACL

    netacl은, 서버에서 사용되는 다양한 TCP 기반의 서비스에 대한 접근의 정도를 결정해 주는 네트워크 접근 제어 프로그램이다. 예를 들면, 만약 어떤 인가된 사용자에 대해 방화벽 시스템으로의 telnet 접근을 허용하고 싶다면 netacl과 적당한 규칙을 적용하여 해당 기능을 가능토록 할 수 있습니다. 물론 ftp와 rlogin 서비스에도 마찬가지로 적용할 수 있다.

    나. TELNET-GW

    telnet 프락시인 tn-gw는 원하는 서버로의 telnet 서비스에 대한 유일한 경로를 제공하는데, 많은 네트워크 환경에서 시스템 관리자가 내부망으로 방화벽 호스트를 통한 telnet 접근을 허용하지 않을 때 사용한다. netacl과는 다르게 telnet 프락시는 방화벽으로의 직접 접근을 제공하지 않는다. 즉, netacl을 경유하는 telnet은 방화벽 호스트로의 접근이 허용되지만, 프락시를 경유하는 telnet은 단지 로깅 제어를 갖는 경로만을 제공받게 되는 것이다.

    방화벽 시스템의 관리자는 종종 방화벽 호스트의 원격 관리를 위한 접근 경로와 프락시 telnet을 구축해야 하는 딜레마에 빠질 수가 있는데, 이는 /etc/services 파일과 /etc/inetd.conf 파일을 수정하여 실제의 telnetd를 telnet의 표준 TCP 포트와는 다르게 설정하고, 프락시를 telnet의 표준 TCP 포트에 설정함으로써 해결할 수 있다. 아울러, 이 경우에는 보안을 위해 netcal 등의 접근 제어가 필요하다.

    다. FTP-GW

    FTP 프락시인 ftp-gw는, 방화벽 호스트를 통과하는 사설 네트워크 또는 공용 네트워크로의 FTP 트래픽을 허용하는데, telnet 프락시와 마찬가지로 방화벽으로 표준 FTP 포트를 경유하는 FTP 접근이 감지되면 프락시의 수행이 시작된다.

    방화벽 호스트로 사용되는 시스템이 FTP 서비스를 제공하게 하는 것은 별로 좋지 않은 생각이다. 가장 좋은 방법은 별도의 FTP 서버를 운용하는 것이지만, 시스템의 원격 관리를 위해 FTP 서비스가 필요할 경우 telnet 서비스의 경우와 마찬가지로 /etc/services 파일과 /etc/inetd.conf 파일을 수정하여 실제의 ftpd를 FTP의 표준 TCP 포트와는 다르게 설정하고, 프락시를 FTP의 표준 TCP 포트에 설정하여 사용할 수도 있습니다. 물론 이 경우에도 netcal 등의 접근 제어가 필요하다.

    라. SMTP-GW

    방화벽 호스트를 통과하는 메일의 올바른 전송을 위해서는 smap과 smapd로 불리는 2개의 프락시가 필요하다. 이 중 smap은 SMTP의 최소 버전만을 구현한 클라이언트의 기능을 담당하게 되는데, 네트워크로부터의 메시지를 받아 들여 이를 디스크에 저장함으로서 후에 smapd가 저장된 메시지를 재전송하도록 하는 역할을 수행한다. 프락시로 동작되는 smap은, chroot된 상태에서 non-privileged 프로세스로 수행되도록 설계되어 있으므로 일반적인 privileged 메일러에 비해 높은 수준의 보안성을 제공하게 된다.

    smapd 데몬은, smap에 의해 저장된 메일의 저장 영역을 주기적으로 검사하여 수집된 메일의 수신자에게 해당 메일을 전달하도록 하는 역할을 수행하게 되는데, 이 때 메일의 전송은 sendmail이라는 MTA(Mail Transfer Agent)에 의해 이루어지며 전송이 완료된 메일 메시지는 삭제된다. 만일 메일 전송이 불가능할 경우 smapd는 메일이 저장되어 있는 영역을 재구성하여 후에 있을 재전송에 대비하게 된다.

    마. PLUG-GW

    TCP 기반의 서비스 중에서 사용자에게 투명성 있는 서비스(NNTP, POP)를 제공하기 위해 플러그 보드 형태의 plug-gw 프락시를 제공하고 있다.

    바. 인증서버

    인증기능은 선택기능으로써 각 프락시에서 이 기능을 사용할 수 있다. 지원 가능한 인증방식은 “Bellcore’s S/KEY”을 많이 사용한다.

    사. 기타 tools

    현재 TIS Firewall Toolkit이 갖는 리포팅 기능은 어느정도 충실하다고 볼 수 있으나, 문자 기반의 리포팅 형태를 취하고 있으므로 리포팅된 보고서의 분석이 다소 어려울 수도 있을 것이다
    본 문서에서는 RLOGIN-GW, 인증서버, 기타 툴에 관련 사항은 제외될 것이다.

     

2. 베스쳔 호스트

    일반적으로 베스쳔 호스트(Bastion Host)란 네트워크 보안에 가장 중요한 방화벽 호스트를 말한다. 대부분이 2개의 패킷 필터링 라우터 사이의 리눅스(유닉스) 시스템을 베스쳔 호스트라고 한다. 외부 라우터는 인터넷과 베스쳔 사이의 트래픽만 허락된다. 내부 라우터는 내부네트웍과 베스쳔 사이의 트래픽만이 허락된다.

    2.1 리눅스를 베스천 호스트로 구축

    가. 머신 자체 보안 수준을 높인다.

    알려진 모든 시스템 관련 버그들을 수정하여 간결하고 무결한 시스템 상태로 만든다. 그리고 시스템 로그 기록을 활용한다.

    나. 필요 없는 모든 서비스를 중지시킨다.

    리눅스 머신이 동작하는데 반드시 필요한 서비스만 남기고 나머지는 중지시킨다. 일반적으로 베스쳔 호스트를 구축하기 위해 사용을 중지시켜야 할 서비스들은, (NFS, RPC, 부팅, BSD의 ‘r’ 명령어, routed, fingerd, uucpd, rwhod, lpd) 등으로서 이들 서비스는 베스쳔 호스트에서 제공하지 않는 것이 안전합니다.

    다. 불필요한 사용자 계정을 모두 삭제한다.

    꼭 필요한 경우가 아니면 베스쳔 호스트 내의 사용자 계정은 모두 삭제시켜야 한다. 사용자 계정이 존재하지 않는 베스쳔 호스트가 높은 수준의 보안 수준을 제공할 수 있기 때문이다.

    라. 중요치 않은 파일과 명령은 지운다.

    특히 setuid/setgid 프로그램들은 해커들의 주요 공격 대상이 되므로 반드시 삭제해야 할 것이다.
    삭제해야 할 프로그램을 찾기 위한 방법은 다음과 같다.
    [nic@fw nic]# find / -type f -perm -040000 -o -perm -02000  -ls

    마. IP Forwarding기능, Source Routing기능을 없앤다.

    커널이 제공하는 기능 중 다음과 같은 몇가지의 기능은 보안의 위험성을 가지고 있는데, 이들 기능이 우선적으로 제거되어야 할 것이다. (IP forwarding OFF, IP Masquerading OFF, NFS, RPC 관련 기능)
    만약, 베스쳔 호스트가 듀얼-홈드 호스트로 구축되었으면 IP 포워딩 기능을 삭제해야한다.
     

    [nic@fw nic]#  cat /proc/sys/net/ipv4/ip_forward
    0

     

    [nic@fw nic]#  grep “FORWARD_IPV4” /etc/sysconfig/network
    FORWARD_IPV4 = no

     

    바. 보안점검 도구를 이용하여 보안취약성을 제거한다.

    2.2 FWTK 컴파일하기

    Makefile.config 파일을 만들고 컴파일 관련 환경변수를 설정하여 컴파일한다.
     

    [nic@fw nic]# cd /usr/local/src/fwtk
    [nic@fw nic]# cp Makefile.config.linux Makefile.config

 

    [nic@fw nic]#  vi Makefiel.config
    # 시스템에 설치되어있는 컴파일러 선택
    CC=cc
    # 실행 파일들을 저장하기 위한 디렉토리 지정
    DEST=/usr/local/etc
    # FWTK 소스 디렉토리
    FWTKSRCDIR=/usr/local/src/fwtk
    # 데이터베이스 지정
    DBMLIB=-lgdbm
    # 프록시 관련 서비스 디렉토리 지정
    DIRS= smap smapd netal plug-gw ftp-gw

     

    2.3 서비스 관련 파일을 수정한다.

    FWTK 요소 대부분은 inetd 데몬에 의해서 수행되고 또한 inetd 데몬은 inetd.conf 파일을 참조하도록 되어 있다.
    따라서 외부에서 네트웍 서비스가 요청되었을 때 inetd가 방화벽 요소들을 수행하기 위해서는 “inetd.conf” 파일을 수정해야한다. 또한 네트웍 서바스를 제공하기 위헤서는 각 서비스에 대한되는 포트 번호가 필요하고, 각 서비스가 사용하는 프로토콜 또한 필요하다.

    2.4 접근제어 규칙을 정의한다.

    netperm-table에는 어떠한 네트웍/호스트에 대해서 서비스를 제공할 것인지 아닌지를 결정하기 위한 접근제어 규칙을 정의하게 된다. 이 파일의 위치는 기본적으로 “/usr/local/etc/” 이고 “:”(콜론)의 왼쪽은 서비스 이름을 나타내고 오른쪽은 허용 네트웍 및 관련 정보들을 기술하게 된다.

    2.5 방화벽 기능 시험

    방화벽의 기능을 시험하는 방법은 같은 이더넷 상에 있는 호스트를 이용하여 그 기능을 점검할 수 있다. 앞서 정의했던 접근제어 규칙을 이용하여 시험할 수 있다. 다른 네트웍 서비스에 대해서도 같이 테스트할 수 있다.

     

3. 실전 응용 계층 방화벽 구축하기

    R1 : 외부라우터
    R2 : 내부라우터
    B1: 베스쳔호스트 (WWW / FTP 서버)
    B2 : 베스쳔호스트 (SMTP/ 2nd Nameserver)
    S1 : BBS
    S2 : MAIL HUB, 1st  Nameserver, POP3
    S3 : NAT (ipchains)
    S4 : 파일서버
    DB : RDBMS
    C1... : 클라이언트 PC

    R1, R2에서 패킷필터링 규칙과 베스쳔호스트에 관련 프록시 서버를 구축하여 접근제어 규칙을 적용시킨다. 그리고 관련 설정 파일은 이 글의 마직막 부분을 참고하기 바란다.

    3.1 네트워크 접근 제어

    통상적으로 규칙의 이름은 netacl- 과 해당 서비스의 이름을 조합하여 사용하게 되는데, 서비스가 in.ftpd일 경우에는 netacl-in.ftpd로 규칙의 이름을 설정한다.
     

    netacl-in.telnetd: permit-hosts 127.0.0.1 -exec /usr/sbin/in.telnetd
    netacl-in.telnetd: permit-hosts 210.217.111.* -exec /usr/sbin/in.telnetd
    netacl-in.telnetd: permit-hosts * -exec /usr/local/etc/tn-gw
    netacl-in.ftpd:   permit-hosts 210.217.111.* -exec /usr/sbin/in.ftpd
    netacl-in.ftpd:   permit-hosts unknow -exec /bin/cat /usr/local/etc/noftp.txt
    netacl-in.ftpd:   permit-hosts * -exec /home/ftp /usr/sbin/in.ftpd
    netacl-in.fingerd: permit-hosts 210.217.111.* -exec /usr/sbin/in.fingerd
    netacl-in.fingerd: permit-hosts unknow -exec /bin/cat/ /usr/local/etc/nofinger.txt

     

    위의 예에서는, netacl이 특정 서브넷 상의 호스트에게만 서비스가 허용되도록 구성되었고, 유효한 DNS 이름을 가지지 않은 시스템으로부터의 연결은 특정한 파일을 출력하도록 구성되었으며, 또한 위에서 언급된 호스트 이외의 모든 네트워크로부터의 FTP 서비스 요청은, 특정 디렉토리 상에서 별도의 FTP 서버를 사용하도록 하였으므로 별도의 FTP 서버에서 제공 서비스를 제한할 수 있다.

    3.2 Telnet 프락시 운용

    tn-gw 프로그램이 inetd 데몬에 의해 기동되게 되는데, 다음과 같이 /etc/inetd.conf 파일을 수정한다.
     

    telnet stream tcp nowait root /usr/local/etc/tn-gw tn-gw

     

    inetd이 활성화되며 클라이언트와 실제 털넷 서버 사이에서 털넷 서비스의 중계 역할을 하며 서비스를 제공시 네트웍/호스트에 대한 접근제어 및 로그기록을 갖는다.

    tn-gw를 위하여 netperm-table에 다음과 같이 접근 규칙을 설정한다.
     

    tn-gw : userid bin
    tn-gw : directory /home
    tn-gw : prompt “KRWEB@telnet-gw>”
    tn-gw : denial-msg       /usr/local/etc/tn-deny.txt
    tn-gw : welcome-msg   /usr/local/etc/tn-welcome.txt
    tn-gw : help-msg          /usr/local/etc/tn-help.txt
    tn-gw : denydest-msg   /usr/local/etc/tn-denydest.txt
    tn-gw : timeout             3600
    tn-gw : deny-hosts       unkown
    tn-gw : permit-hosts     210.217.111.*  210.217.112.*
    tn-gw : permit-hosts     210.217.112.*  -dest
    bbs.krweb.co.kr  -dest  !*  -passok  -xok


    접근규칙

    도메인 이름을 DNS에서 발견할 수 없을 경우 접속을 거부한다.
    210.217.111.0 및 210.217.112.0 네트워크로부터의 접근만을 허용한다.
    210.217.112.0 네트워크로부터 요구된 접속 중 bbs.krweb.co.kr로의 접속만을 허용하고 이외의 접속 요구는 모두 거부한다.

    telnet 프락시를 통한 접속

    인가된 네트웍에서 접근
     

    [nic@ns nic]$ telnet fw.krweb.co.kr
    Trying 210.217.111.10
    Connected to fw.krweb.co.kr.
    Escape character is ‘^]’.

    ******************** < 환 영 > ************************
    KRWEB의 방화벽 Telnet Proxy에 접속되신 것을 환영합니다.
    명령어 도움말은 ? 입니다
    *******************************************************

    KRWEB@telnet-gw>connect nownuri.net
    Not permitted to connect to nownuri.net
    KRWEB@telnet-gw>connect linux.krweb.co.kr
    Trying 210.217.111.5
    Connected to linux.krweb.co.kr.
    Escape character is ‘^]’.
    login:_

     

    위의 예에서, *.krweb.co.kr을 제외한 모든 호스트로의 접근이 금지되도록 규칙이 설정되어 있으므로 nownuri.net의 telnet 접근은 금지되며 linux.krweb.co.kr로의 접근만 허용된다.

    인가되지 않은 네트웍에서 접근
     

    [nic@xxx nic]$ telnet fw.krweb.co.kr
    Connecting to fw.krweb.co.kr ...
    **************** < 주   의 > *****************************
    당신은 인가(인증)되지 않은 네트웍에서 접속을 하였습니다.
    본 털넷 서비스를 허가하지 않습니다.
    *********************************************************
    Connection closed by foreign host

     

    위의 예에서는, 인가되지 않은 네트웍에서 접근할 때 접근 거부 메시지 파일을 출력하고 연결을 끊는다.

    3.3 FTP 프락시 운용

    다음과 같이 /etc/inetd.conf 파일을 수정하여 원하는 프락시 동작을 구현한다.
     

    ftp stream tcp nowait root /usr/local/etc/ftp-gw ftp-gw

     

    ftp-gw의 경우도 tn-gw의 경우와 마찬가지로 netperm-table에 설정되어 있는 접근 규칙에 따라 접속 허용 여부를 판별하게 된다.

    ftp-gw를 위하여 netperm-table에 다음과 같이 접근 규칙을 설정한다.
     

    ftp-gw:  denial-msg      /usr/local/etc/ftp-deny.txt
    ftp-gw:  welcome-msg  /usr/local/etc/ftp-welcome.txt
    ftp-gw:  help-msg         /usr/local/etc/ftp-help.txt
    ftp-gw:  denydest-msg  /usr/local/etc/ftp-baddest.txt
    ftp-gw:  timeout            3600
    ftp-gw:  deny-hosts      unknown
    ftp-gw:  permit-hosts    210.217.111.* 210.217.112.*                                    -log { retr stor }
    ftp-gw:  permit-hosts    * -authall -log { retr stor }

    접근 규칙

    규칙이 적용되게 되면 도메인 이름을 DNS에서 발견할 수 없을 경우 접속이 거부되며, 210.217.111 및 210.217.112 네트워크로부터의 접근을 허용하게 된다. 아울러 인증 옵션이 있는 경우, 인증 과정을 통과하여 접근하도록 한다.
    모든 파일 전송에 대한 정보가 로그 기록으로 남게 된다.
    ftp 프락시를 통한 접근

    인증 옵션이 없는 경우 (인가된 네트웍에서 접속)
     

    [nic@ns nic]$ ftp fw
    Connected to fw.krweb.co.kr
    220-
    220-
    220- 방화벽 FTP Proxy 에 접속되신 것을 환영합니다.
    220- 사용자id@호스트명 (예, test@someplace.net)
    Name (firewall:test): test@someplace.net
    331-(----GATEWAY CONNECTED TO someplace.net----)
    331-(220 hen FTP server (UNIX(r) System V Release 4.0) ready.)
    331 Password required for knwook.
    Password:
    230 User knwook logged in.
    ftp>

     

    인증 옵션이 없는 경우 (인가되지 않은 네트웍에서 접근)
     

    [nic@xxx nic]$ ftp fw   
    Connected to fw.krweb.co.kr.
    500-
    500-**************<주의>****************
    500-FTP 서비스를 사용할 수 업습니다.
    500-고객지원센터  e-mail:helpme@krweb.co.kr
    500
    ftp>

     

    인증 옵션이 있는 경우
     

    [nic@ns nic]$ ftp fw   
    Connected to fw.krweb.co.kr.
    220-
    220-
    220-방화벽 FTP Proxy 에 접속되신 것을 환영합니다.
    220-사용자 인증이 끝나면, 아래와 같이 입력하여 주십시오.
    220-use 사용자id@호스트명 (예, use test@someplace.net)
    Name (firewall:nic): nic
    331 Enter authentication password for nic
    Password:
    230 User authenticated to proxy
    ftp> use test@someplace.net
    331-(----GATEWAY CONNECTED TO someplace.net----)
    331-(220 hen FTP server (UNIX(r) System V Release 4.0) ready.)
    331 Password required for test.
    Password:
    230 User test logged in.
    ftp>

     

    먼저 FTP 프락시의 사용자 인증 절차가 끝나면, “use user@
    site”의 형식에 맞추어 원하는 사이트로의 FTP 접근을 시도하게 된다.

    3.4 sendmail 프락시 운용

    ① smtp 클라이언트의 설치

    smap 클라이언트는 방화벽 호스트의 smtp 포트로 접속 요청이 전달될 때마다 동작한다.
    다른 프락시들과 마찬가지로 /etc/inetd.conf 파일에 다음과 같이 설정한다.
     

    smtp  stream  tcp  nowait  root  /usr/local/etc/smap  smap

     

    inetd.conf 파일을 수정한 후에는 inetd 데몬을 재시작하여 smap을 활성화한다.
    그리고 smtp 포트를 수동으로 검사해 본다.
     

    [nic@ns nic]$ telnet fw 25   
    Trying 210.217.111.5...
    Connected to fw.krweb.co.kr.
    Escape character is ‘^]’.
    220 firewall SMTP/smap Ready.
    quit
    221 Closing connection
    Connection closed by foreign host.
    $

     

    smtp 클라이언트의 구성
    smap 클라이언트는 netperm-table내에 smap으로 시작하는, 자신을 위한 접속 규칙에 따라 동작을 하게 된다.
     

    smap:              userid         smtp
    smap:              directory      /var/spool/smap
    smap:              timeout       3600
    smap:           maxbytes       10000
    smap:           maxrecip        20

     

    ② smtpd 에플리케이션의 설치

    접속 요구에 따라 inetd로부터 기동되는 smap과는 달리, smapd는 /etc/rc3.d/S88smapd 스크립트 파일을 작성하여 시스템의 부팅시에 자동 기동되도록 설정합니다. 이 경우, 기존의 sendmail 동작을 데몬 모드에서 제거해야 한다.
     

    #/etc/rc.d/init.d/sendmail stop
    or
    # ntsysv     →       sendmail 제거

     

    아울러 파일 편집기를 사용, Sxx(xx는 숫자)smapd 스크립트 파일을 새로 작성합니다.
     

    # vi S88smapd   
    echo “Starting Firewall Mail Processor ...”
    /usr/local/etc/smapd

     

    sendmail이 데몬 모드로 동작하지 않기 때문에, 배달이 불가능하여 누적된 메시지들은 주기적으로 불려지는 sendmail에 의해 배달되도록해야 한다. 이를 위해 다음 라인을 crontab에 추가한다.
     

    0, 30 * * * * /usr/lib/sendmail -q > /dev/null 2>&1

     

    위의 라인을 추가함에 따라 smapd 에플리케이션에 의해 성공적으로 전달되지 못한 메시지들이 이후에라도 안정적으로 전달됨을 보장하게 됩니다.

    smapd 에플리케이션의 구성
    smapd 에플리케이션은, 주기적으로 메일 큐를 읽어 원격 시스템으로 배달하게 되는 동작을 수행한다.
     

    smapd:  executable /usr/local/etc/smapd
    smapd:  sendmail    /usr/lib/sendmail
    smapd:  userid                         smtp
    smapd:  directory    /var/spool/smap
    smapd:  baddir                   /var/spool/smap/bad
    smapd:  wakeup          900

     

    smapd를 위한 DNS 구성
    방화벽 시스템을 통과하는 메일이 성공적이고 정확하게 전달되기 위해서는 SMTP 메일이 보내어지는 곳이 구분되도록 MX 레코드가 지역 DNS 파일 내에서 알려져야 할 필요가 있다. 이러한 작업은 MX나 메일 익스체인저 추가, 네트워크 도메인이나 지역의 DNS 제공자에 등록 등에 의해 가능합니다.  

    위의 출력 내용은 nslookup 명령어를 실행하여 얻은 것입니다. 출력 내용 중 메일 익스체인저가 다음과 같이 등록되어 있음을 알 수 있다.
     

    [nic@ns nic]# nslookup
    Default Server:  ns.krweb.co.kr
    Address:  210.217.111.1

    > set q=mx
    > krweb.co.kr
    Server:  ns.krweb.co.kr
    Address:  210.217.111.1

    krweb.co.kr      preference = 10, mail exchanger = mail.krweb.co.kr
    krweb.co.kr      preference = 1. Mail exchanger = fw.krweb.co.kr
    krweb.co.kr      nameserver = ns2.krweb.co.kr
    krweb.co.kr      nameserver = ns.krweb.co.kr
    mail.krweb.co.kr  internet address = 210.217.111.3
    fw.krweb.co.kr    internet address = 210.217.111.5
    ns2.krweb.co.kr  internet address = 210.217.111.2
    ns.krweb.co.kr    internet address = 210.217.111.1
    >

     

    도메인 krweb.co.kr로의 메일이 호스트로부터 보내어진 경우를 생각해보면, 해당 호스트는 먼저 krweb.co.kr 도메인 자체에서의 위치를 탐색하게 된다. 어느 호스트가 먼저 접속될지를 결정하기 위한 규칙은 매우 간단하다.
    위의 예에서는, 주어진 email에 대해 방화벽 호스트인 fw.krweb.co.kr가 우선권이 1이므로 가장 먼저 접속된다.
    권고하고 싶은 설정은, 방화벽 호스트로 사용되는 시스템이 가장 낮은 우선권을 갖도록 함으로써 외부와 직접적으로 접속되는 시스템이 없도록 한다. 만약 가장 낮은 우선권을 가진 시스템이 서비스 처리가 불가능할 경우, 다음 시스템이 접촉되게 됩니다: 위 경우에는 mail.krweb.co.kr이 해당된다. 메일이 mail.krweb.co.kr에게 배달되면, mail.krweb.co.kr 상의 sendmail 데몬이 해당 메일을 가장 낮은 우선권을 갖는 fw.krweb.co.kr 시스템으로 전달해야 할 책임이 있다. 아울러 sendmail의 동작은 원격 머신 상의 sendmail.cf 파일에 의해 제어된다.

    3.5 pop 프락시 운용.

    방화벽이 POP 서비스를 위한 접속을 수용하도록 하기 위해서는, inetd가 POP 포트로부터의 접속 요청이 있을 때마다 plug-gw를 실행시킬 수 있도록 /etc/inetd.conf 파일을 수정해야 한다.
     

    pop        stream          tcp
            nowait root /usr/local/etc/plug-gw        plug-gw 110

           

    방화벽을 통과하는 POP 서비스를 제공받기 위해서는 netperm-table에 plug-gw를 위한 구성을 추가해야 하는데, POP 포트는 /etc/services 파일에 110로 설정되므로 다음과 같은 설정으로 구현이 가능하다.
     

    plug-gw : port 110 210.217.112.* -plug-to 210.217.111.110

     

    이 라인은, 210.217.112 네트웍으로부터의 포트 110
    (POP)로 접수된 임의의 연결은 210.217.111.110로 접속됨을 알려주고 있다. 그리고 MUA (Mail User Agent) 프로그램에서 POP 서버를 방화벽 시스템으로 설정한다.

    3.6 http proxy 운용

    본 문서에서는 TIS-FWTK의 HTTP-GW을 사용하지 않고, 대신에 웹전용 프록시 서버를 사용하겠다.
    웹전용 프록시 프로그램은 squid 이다.

    사이트 접근 제한
    사이트 접근 제한은 ACL(Access Control List)을 사용하여 정의하며 ACL은 사이트 접속 법칙을 정의한 변수의 나열이라 생각하면 된다.

    HTTP Proxy를 설정한 파일은 /usr/local/squid/etc/
    squid.conf에 있다.
    이 파일의 중간 아랫 부분에 ACL에 대한 정의가 있다.
    ACL을 정의한 다음엔 반드시 http_access 구문을 사용하여 정의한 ACL을 활성화 시켜 주어야 한다.
     

    (/usr/local/squid/etc/squid.conf 파일 예제)
    # cache 관련 설정 부분은 생략됨
    #----------------------------------
    #
    # 접근 설정 (ACL = 접근제어제한)
    # 불건전한 사이트를 들어가지 못하도록 금지할 사이트를 설정해 주는
       부분이다.
    #
    # 사용 방법
    #
    # acl aclname acltype string1 ...
    # acl aclname acltype “file” ...
    #
    # 1) ip-address에 설정된 클라이언트들이 http를 사용하지 못하게 한다.
    #    ‘0.0.0.0/0.0.0’이면 모두 허용.
    # acl aclname src      ip-address/netmask ... (clients IP address)
    # acl aclname src      addr1-addr2/netmask ... (addresses 범위)
    #
    # 2) ip-address에 설정된 사이트를 접속하지 못하게 한다.
    # acl aclname dst      ip-address/netmask ... (URL host’s IP address)
    #
    # 3) foo.com이라는 도메인을 가진 클라이언트의 http 접속을 불허한다.
    # acl aclname srcdomain   foo.com ... (taken from reverse DNS lookup)
    #
    # 4) foo.com이라는 도메인을 사이트의 접속을 금지 시킨다.
    # acl aclname dstdomain   foo.com ... (taken from the URL)
    #
    # 5) h1:m1에서 h2:m2 시간에는 클라이언트의 http 접속을 불허한다.
    #    day-abbrevs는 금지할 요일도 지정할 수 있다.
    # acl aclname time     [day-abbrevs]  [h1:m1-h2:m2]
    #       day-abbrevs:
    #               S - Sunday
    #               M - Monday
    #               T - Tuesday
    #               W - Wednesday
    #               H - Thursday
    #               F - Friday
    #               A - Saturday
    #       h1:m1 must be less than h2:m2
    #
    # 6) http://www로 시작되는 URL의 접속을 불허한다. (앞에 반드시 ^ 필요)
    #    (^가 붙지 않으면 URL의 끝부분을 의미한다)
    # acl aclname url_regex  ^http://www    # regex matching on whole URL
    #
    # 7) gif파일은 전송되지 않게 한다.
    # acl aclname urlpath_regex  \.gif$ ... # regex matching on URL path only
    #
    # 8) 특정 포트로의 접속을 불허한다.
    # acl aclname port     80 70 21 ...
    #
    # 9) HTTP와 FTP의 사용을 불허한다.
    # acl aclname proto    HTTP FTP ...
    #
    # 10) HTML에서의 다음의 method가 들어간 라인의 실행을 금한다.
    # acl aclname method   GET POST ...
    #
    # ---------------------------------
    # 예)
    # 앞부분이 sex으로 시작되는 URL을 금지시키고자 할때
    # --> acl denysex url_regex ^http://sex
    # 뒷부분이 adult.com으로 시작되는 URL을 금지시키고자 할때
    # --> acl denyadult url_regex adult.com
    #
    #----------------------------------
    acl manager proto cache_object
    acl localhost src 127.0.0.1/255.255.255.255
    acl all src 0.0.0.0/0.0.0.0

    acl SSL_ports port 443 563
    acl Dangerous_ports port 7 9 19
    acl CONNECT method CONNECT

    # 관리자가 새로운 ACL을 정의한다.
    acl sexsite01 url_regex ^
    http://come.to/ladyx

    acl sexsite02 url_regex ^http://sexygirl.com

    acl sexsite03 url_regex ^http://www.korean-babes.com

    #####################################
    ####################################
    #
    # 위에서 정의된 ACL을 여기서 실제로 동작될 수 있도록 설정한다.
    # (allow는 허가고 deny는 불허가를 뜻한다)
    #
    # 위에서 정의된 ACL은 반드시 동작가능하도록 여기를 설정한다!!
    #
    # HTTP 포트로의 접근:
    #     http_access allow|deny [!]aclname ...
    #
    # ICP 포트로의 접근:
    #     icp_access  allow|deny [!]aclname ...
    #
    # 예) 위에서 정의한 denysex 이라는 ACL 이름을 Enable 시킬때.
    # ---> http_access deny denysex
    #
    ###################################

    # Only allow access to the cache manager functions from the local host.
    http_access deny manager !localhost
    http_access deny CONNECT !SSL_ports
    http_access deny Dangerous_ports

    # 위에서 정의한 ACL의 허가/불허를 결정한다.
    http_access deny sexsite001
    http_access deny sexsite002
    http_access deny sexsite003
    ###################################

    # Allow everything else
    http_access allow  all

    # Reply to all ICP queries we receive
    icp_access  allow  all

     

4. 보안정책 만들기

    네트워크관리자가 라우터를 이용한 방화벽을 구성하고자 할 때 가장 우선적으로 수립되어야 할 것은 인터넷서비스의 제공범위와 종류이다.
    다음과 같은 제공범위와 서비스를 정의할 수 있다.

    외부 사용자에 대해
     ·웹 / 파일전송 서비스를 제공
     ·인가된 네트웍에서는 내부 서버에 telnet 및 e-mail 서비스를 이용
     ·그 외의 인터넷 서비스는 제한
     

    보안정책

    제한여부

    S_PORT

    D_PORT

    S_IP

    D_IP

    BBS

    허용

    > 1023

    23

    지점

    210.217.111.6

    FTP

    허용

    > 1023

    21

    Any

    210.217.111.5

    WEB

    허용

    > 1023

    80

    Any

    210.217.111.4

    SMTP

    제한

    > 1023

    25

    지점

    210.217.111.3

    POP

    허용

    > 1023

    110

    지점

    210.217.111.3

    DNS

    허용

    > 1023

    53

    지점

    210.217.111.1

    기타

    제한

    > 1023

    > 1023

    Any

    210.217.111/24

     

    내부 사용자에 대해
    ·불건전 사이트접속을 제한
      (단, 해당 사이트의 네트웍 주소를 알고 있어야 가능하다.)
    ·그 외 인터넷서비스를 이용
     

    보안정책

    제한여부

    S_PORT

    D_PORT

    S_IP

    D_IP

    서인싸이트

    제한

    > 1023

    80

    210.217.111/24

    성인싸이트

    DB

    허용

    > 1023

    3306

    210.217.111/24

    210.217.111.88

    기타

    허용

    > 1023

    > 1023

    210.217.111/24

    Any

     

    라우터의 ACL을 만들기 위해 필요한 정보

    TCP/IP를 기반으로한 IP 패킷 내부에는 반드시 “source ip address, destination ip address, source port, destination port”에 관한 정보를 가지고 있으며, 라우터는 이 정보들을 조합하여 특정 패킷을 필터링한다.

    시스코 라우터에서 access-list 구성

    내부사용자의 패킷에 대한 기본적인 ACL정의
    RT(config)# access-list 101 permit tcp any any established
    RT(config)# access-list 101 permit tcp any any gt 1023
    RT(config)# access-list 101 permit udp any any gt 1023
    RT(config)# access-list 101 permit tcp 210.217.111.0 0.0.0.255 host 210.217.111.88 eq 3306
    RT(config)# access-list 101 permit udp 210.217.111.0 0.0.0.255 host 210.217.111.88 eq 3306

    외부사용자에 대한 보안정책 ACL 정의
    RT(config)# access-list 101 permit tcp any host 210.217.111.4 eq 80
    RT(config)# access-list 101 permit tcp any host 210.217.111.5 eq 20
    RT(config)# access-list 101 permit tcp any host 210.217.111.5 eq 21

    지점에 대한 보안정책 ACL 정의
    RT(config)# access-list 101 permit tcp 210.217.112.0 0.0.0.255 host 210.217.111.6 eq 23
    RT(config)# access-list 101 permit tcp 210.217.112.0 0.0.0.255 host 210.217.111.3 eq 25
    RT(config)# access-list 101 permit tcp 210.217.112.0 0.0.0.255 host 210.217.111.1 eq 53
    RT(config)# access-list 101 permit udp 210.217.112.0 0.0.0.255 host 210.217.111.1 eq 53
    RT(config)# access-list 101 permit tcp 210.217.112.0 0.0.0.255 host 210.217.111.1 eq 110
    RT(config)# access-list 101 permit udp 210.217.112.0 0.0.0.255 host 210.217.111.1 eq 110

    성인 site에 대한 보안정책 ACL 정의
    RT(config)# access-list 101 deny tcp 203.255.112.0 0.0.0.255 host 206.251.29.11 eq www
    그외 허가되지않은 패킷에 대한 보안정책 ACL 정의
    RT(config)# access-list 101 deny ip any any

    방화벽에서 인터넷 서비스 필터링 일반 규칙

    여기에서는 스크린 서브넷 구조의 가장 일반적인 방화벽 구조에서 인터넷 서비스 필터링에 대하여 알아보고자 한다.

     

서비스 환경 설정

    Telent
    패킷 필터링을 통하여 외부로 나가는 털넷을 제공한다.
    프락시를 통하여 외부에서 내부로 들어오는 털넷을 제공한다(단 bbs로 한정).

    ftp
    패킷 필터링을 통하여 외부로 나가는 파일전송서비스를 제공한다.
    프락시를 통하여 외부에서 내부로 들어오는 ftp을 제공한다(단 익명 ftp로 한정).
    프락시를 통하여 인증된 사용자만 사용

    Smtp
    베스쳔 호스트를 통하여 직접 들어오는 메일들의 DNS MX 레코드들을 제공한다.
    베스쳔 호스트를 통하여 메일을 밖으로 보내는 내부 컴퓨터에 대한 환경을 설정한다.
    내부의 메일 서버로 들어오는 메일을 보내도록, 그리고 목적하는 곳으로 메일을 보낼 수 있도록 베스쳔 호스트의 환경을 설정한다.

    http
    패킷 필터링을 통하여 외부로 나가는 웹 서비스를 제공한다.
    프락시를 통하여 불건전 웹 사이트를 배제한다.
    공개 웹서버를 경계선 네트웍에 위치한다.

    Dns
    경계선에 위치하는 베스쳔호스트에 2차 네임서버를 운영하고, 내부 네트웍에 1차 네임서버를 운영한다.

    패킷 필터링 규칙

    우리는 가상의 라우터에서 우리가 가정한 필터링 규칙에 대하여 아래와 같은 것들을 제공한다.
    - 들어오고 나가는 패킷을 구분한다.
    - 출발지, 목적지의 주소 및 포트 그리고 페킷의 형태를 구별할 수 있다.
    - TCP 패킷에 대하여 ACK 비트가 조합인지 아니지를 필터링해준다.
    - 규칙은 순서대로 적용된다.
     

    [nic@fw nic]# cat /usr/local/etc/netperm-table
    # Netacl rules:
    netacl-in.telnetd: permit-hosts 127.0.0.1
             -exec /usr/sbin/in.telnetd
    netacl-in.telnetd: permit-hosts 210.217.111.*
             -exec /usr/sbin/in.telnetd
    netacl-in.telnetd: permit-hosts *
             -exec /usr/local/etc/tn-gw
    netacl-in.ftpd:   permit-hosts 210.217.111.*
             -exec /usr/sbin/in.ftpd
    netacl-in.ftpd:   permit-hosts unknow
             -exec /bin/cat /usr/local/etc/noftp.txt
    netacl-in.ftpd:   permit-hosts *
             -exec /home/ftp /usr/sbin/in.ftpd
    #
    # Telnet gateway rules:
    tn-gw:             userid            bin
    tn-gw:             directory        /home/telnet
    tn-gw:         denial-msg        /usr/local/etc/tn-deny.txt
    tn-gw:         welcome-msg    /usr/local/etc/tn-welcome.txt
    tn-gw:         timeout              3600
    tn-gw:         prompt               “KRWEB>”
    tn-gw:         permit-hosts       210.217.111.* -auth -passok
    tn-gw:         permit-hosts       210.217.111.* 210.217.112.* -auth
    #
    # FTP gateway rules:
    ftp-gw:        userid                bin
    tn-gw:         directory            /home/ftp
    ftp-gw:        denial-msg        /usr/local/etc/ftp-deny.txt
    ftp-gw:        welcome-msg    /usr/local/etc/ftp-welcome.txt
    ftp-gw:        timeout              3600
    ftp-gw:        permit-hosts    210.217.111.* -authall -dest
    !202.30.113.2
    ftp-gw:        permit-hosts    210.217.115.* -auth  stor  -log

    #
    # SMAP/SMAPD rules:
    smap, smapd:      userid         smtp
    smap, smapd:      directory     /var/spool/smap
    smap:                 timeout       3600
    smapd:               executable   /usr/local/etc/smapd
    smapd:               sendmail     /usr/lib/sendmail
    #
    # Auth server rules:
    authsrv:               permit-hosts     127.0.0.1
    #
    # Auth client rules:
    *:             authserver       127.0.0.1       7777
    #
    # END.

     

    [nic@fw nic]# cat /etc/inetd.conf
    #
    ftp              stream  tcp  nowait  root  /usr/local/etc/ftp-gw     ftp-gw
    ftp-adm      stream  tcp  nowait  root  /usr/local/etc/netacl      in.ftpd
    telnet          stream  tcp  nowait  root  /usr/local/etc/tn-gw      tn-gw
    telnet-adm  stream  tcp  nowait  root  /usr/local/etc/netacl      in.telnetd
    smtp           stream  tcp  nowait  root  /usr/local/etc/smap       smap
    pop            stream  tcp  nowait  root   /usr/local/etc/plug-gw  plug-gw pop
    finger          stream  tcp  nowait  roor  /usr/local/etc/netacl      in.fingerd
    authsrv        stream  tcp  nowait  root  /usr/local/etc/authsrv    authsrv
    time            stream  tcp  nowait  root  /usr/sbin/tcpd               in.timed
    time            dgram  udp   wait    root   /usr/sbin/tcpd              in.timed

      

    [nic@fw nic]# cat /etc/services
    ftp                21/tcp
    retr stor
    ftp-adm        2021/tcp
    telnet            23/tcp
    telnet-adm    2023/tcp
    smtp             25/tcp          
    pop              110/tcp
    ...

     

    내부라우터 패킷 필터링
     

규칙

출발지주소

목적지주소

출발지포트

목적지포트

ACK set

정책

TELNET

내부
외부

외부
내부

1023이상
23

23
1023이상

Any
Yes

허가
허가

FTP-1

내부
외부
내부
외부

외부
내부
외부
내부 

1023이상
21
1023이상
1023이상

21
1023이상
1023이상
1023이상

Any
Yes
Any
Yes

허가
허가
허가
허가

FTP-2

내부
베스쳔
베스쳔
내부

베스쳔
내부
내부
베스쳔 

1023이상
21
1023이상
1023이상

21
1023이상
1023이상
1023이상

Any
Yes
Any
Yes

허가
허가
허가
허가

SMTP-1

내부
베스쳔

베스쳔
내부

1023이상
25

25
1023

Any
Yes

허가
허가

SMTP-2

베스쳔
메일허브

메일허브
베스쳔

1023이상
25

25
1023이상

Any
Yes

허가
허가

HTTP

내부
베스쳔

베스쳔
내부

1023이상
80

80
1023이상

Any
Yes

허가
허가

DNS-1

내부

베스쳔

53

53

(UDP)

허가

DNS-2

베스쳔

내부

53

53

(UDP)

허가

DNS-3

내부
베스쳔 

베스쳔
내부

1023이상
53

53
1023이상

Any
Yes

허가
허가

DNS-4

베스쳔
내부

내부
베스쳔 

1023이상
53

53
1023이상

Any
Yes

허가
허가

DEFAULT

ANY
ANY

ANY
ANY

ANY
ANY

ANY
ANY

ANY
ANY

거부
거부

     

    외부라우터 패킷 필터링
     

규칙

출발지주소

목적지주소

출발지포트

목적지포트

ACK set

정책

TELNET

내부
외부

외부
내부

1023이상
23

23
1023이상

Any
Yes

허가
허가

FTP-1

내부
외부
내부
외부

외부
내부
외부
내부

1023이상
21
1023이상
1023이상

21
1023이상
1023이상
1023이상

Any
Yes
Any
Yes

허가
허가
허가
허가

FTP-2

Any
베스쳔
베스쳔
Any

베스쳔
Any
Any
베스쳔

1023이상
21
1023이상
1023이상

21
1023이상
1023이상
1023이상

Any
Yes
Any
Yes

허가
허가
허가
허가

SMTP-1

Any
베스쳔

베스쳔
Any

1023이상
25

25
1023

Any
Yes

허가
허가

SMTP-2

베스쳔
Any

Any
베스쳔

1023이상
25

25
1023이상

Any
Yes

허가
허가

HTTP-1

베스쳔
Any 

Any
베스쳔

1023이상
Any

Any
1023이상

Any
Yes

허가
허가

HTTP-2

Any
베스쳔

베스쳔
Any

1023이상
80

80
1023이상

Any
Yes

허가
허가

DNS-1

베스쳔

Any

53

53

(UDP)

허가

DNS-2

Any

베스쳔

53

53

(UDP)

허가

DNS-3

Any
베스쳔 

베스쳔
Any

Any
53

53
Any

(UDP)
(UDP)

허가
허가

DNS-4

베스쳔
Any

Any
베스쳔 

1023이상
53

53
1023이상

Any
Yes

허가
허가

DNS-5

Any
베스쳔
베스쳔

베스쳔
Any
내부

1023이상
53
100

53
1023이상
1023

Any
Yes
Yes

허가
허가
허가

DEFAULT

ANY
ANY

ANY
ANY

ANY
ANY

ANY
ANY

ANY
ANY

거부
거부

     

결론

    스크린 서브넷 구조는 혼자서도 설치할 수 있는 가장 일반적인 파이어얼 구조일 것이다.
    그리고 TCP_WRAPPERS, IPCHAINS 와 같은 방화벽 관련 프로그램도 이 구조에 포함한다면 보다나은 보안정책을 만들수 있을 것이다.
    방화벽이 보안에 첨병인 것은 누구나 알고 있는 사실이지만 시스템 관리자의 노력도 중요한 부분을 차지한다.




▲ top

home으로...