강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

홈 네트워크를 위한 보안 설정

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

icon01.giftitle35.gif

번역 : 윤봉환 el@linuxlab.co.kr

 

홈 네트워크를 위한 보안은 물론 당신의 책임이다. 당신이 검색되고 혹시 공격당했을 때, 말할 것도 없이 모든 툴 들이 크래커들과 스크립트 키디들(script kiddies)에게 이용될 수 있는 도구들이다.

나는 개인적으로 5분 미만의 시간동안 모뎀을 통해 접속하는데, 그 짧은 시간에도 포트가 스캔되어왔다. 만약 “x” 공격을 당해서 그 것을 막았다면, 내일 당신은 또 “y” 공격을 당하게 되겠지만, ISP는 제대로 신경도 쓰지 않는다. 그러나 다행히도, 당신이 자신의 네트워크 보안을 확실하게 향상할 수 있는 몇 가지 방법이 있다.

 

Disclaimer:

이 기사는 단행본, 하우투 문서들, 맨 페이지, 유즈넷 뉴스그룹, 그리고 셀 수 없는 시간을 키보드와 씨름하며 수집한 정보를 제공한다. 이는 모든 주제에 대해 통달했다는 것을 뜻하지는 않지만, 초급자가 중급 사용자가 되는 발판은 될 것이다. 모든 예제들은 우리 홈 네트워크로부터 그대로 가져왔으므로 우리가 아는 한 잘 동작한다.

 

이 가이드를 어떻게 사용할까?

◐[Enter]처럼 각 괄호에 담긴 단어들은 키보드에서 그 키를 누르거나, 마우스 1번 버튼을
   누르라는 뜻이다.

◐{your name here}처럼 구불구불한 괄호 안에 담긴 단어들은 사용자가 입력해야 할 “진짜”
   데이터에 대응하는 데이터를 뜻한다.

◐이택릭체로(기울어진) 쓰여진 텍스트는 사용자 자신이 셸 프롬프트에 써넣어야 할 명령을
   뜻한다.

 

필요한 것들(Prerequisites)

이 가이드는 커널 2.2.0이나 그 이상에, tcp 랩퍼(wrapper)와 ipchains가 설치되었고, 등록되었거나 사적인 도메인 이름을 선택했으며, 인터넷으로부터 당신의 머신을 “숨기기”위해 IP 매스커레이드를 사용하며, 그리고 일정하게 인터넷에 연결할 수 있다고 가정한다.

 

왜 나를 크랙하는가?

우리 대부분은, 크래커가 그의 시간 가운데 단 한 순간이라도, 이렇게 시시한 우리 시스템에 허비하지 않을 것이라고 확신한다. 그에 더해, 인터넷에 연결되어 있는 컴퓨터들이 모두 다 크랙되고 있을 확률은 사실상 전무하다. 그런 생각들은 아마 5년 전에는 옳은 판단이었을 것이다. 하지만 스크립트 키디(script kiddies)가 나타나고는 더 이상 옳은 생각이 아니다. 그 도구들은, 컴퓨터를 켤 줄만 안다면, 누구라도 먹이감을 찾아 매우 쉽게 시스템을 크랙하도록 만들어준다.

 

그들이 당신의 홈 시스템을 크랙하려 할지 모르는 두 가지 중요한 까닭이 있다.

다른 시스템을 정복하는 전율(thrill), 그리고 다른 시스템을 공격하기 위해 당신의 ISP 계정을 사용하기 위한 정보를 얻으려는 것이다. 어느 날, 정부기관에서 찾아와서는 왜 안기부에 침입하는데 당신의 ISP 계정이 사용되었는지를 조사한다면, 삶이 정말 고통스럽게 될 것이다.

아래 정보는 Lance Spitzne의 훌륭한 기사(articles) 시리즈로부터 가져온 것이다.  이 기사들은 당신이 지금껏 보안을 가볍게 여겨왔다면 정신이 번쩍 들게 할 것이다.

 

스크립트 키디 방법론은 간단하다.

먼저, 보안이 약한 특정한 컴퓨터를 찾아서 이용하기 위해 인터넷을 스캔한다. 대부분의 도구들은 사용자가 개입할 필요 없이 자동화되어 있다. 당신이 그 도구를 실행하고, 며칠이 지나면 당신에게 원하는 결과를 돌려준다.
각각의 사용방법이 똑같지 않은 것처럼 똑같은 도구는 없다. 그렇지만, 대부분의 도구들은 비슷한 방법들을 사용한다. 먼저, 스캔될 수 있는 IP 데이터베이스를 만든다. 그 다음, 그런 IP에서 특정한 취약점을 스캔한다.

그들이 취약한 시스템을 찾고 루트(root) 권한을 얻기만 하면, 첫 번째 단계로 보통 자신의 자취를 지운다. 그들은 당신의 시스템이 해크되었다는 사실은 물론, 그들의 행적에 대한 어떤 로그도 볼 수 없다는 것조차 당신이 모르도록 조심한다. 이처럼, 그들은 다른 네트워크를 스캔하거나, 당신 시스템을 눈에 띄지 않고 살피기 위해 흔히 당신의 시스템을 사용한다.

그리고, 그 다음에 이어지는 것은 안 좋은 소식: 당신이 크랙되었다면 CERTR 조정 센터는 오직 한 가지 방법을 제시한다: 손상된 모든 것을 다시 설치하라고!!

 

방화벽 머신:

이론적으로 당신의 방화벽은 단지 당신의 보안을 위한 전용 머신이어야 한다. 당신에게 오직 486 급의 성능만이 필요하다고 가정하면, 이 것은 그리 어려운 일이 아니다. 단지 당신의 방화벽을 구축하기 위해 컴퓨터를 사용한다면 일반적으로 공격당하는 모든 프로세스 - imap, ftp, sendmail, 등을 셧다운할 수 있다.

간단한 방법은 당신이 필요한 모든 프로그램이 담겨 있고, 램 디스크를 통해 실행하는 부트 디스크(boot floppy)를 만드는 것이다. 그런 방법은, 만약 당신이 크랙된다면, 단지 머신을 리부트하는 것으로 충분하다. 그리고 하드 드라이브 없이도 이 방법은 매우 훌륭하게 동작한다(이렇게 설정하려면 리눅스 라우터 프로젝트(LRP)를 살펴본다).
그러나, 이 기사를 쓰기 위하여 필자는, 당신의 주 서버가 방화벽으로 설정되었고, 지난달 기사인 DNS와 SendMail을 따라해 보았다고 가정한다.

 

무엇을 막을 것인가!

당신의 컴퓨터를 크랙하는 방법은 수백가지, 어쩌면 수천 가지가 넘을 것이다. 그리고, 각각의 침투 수단에 대해 방어방법을 필요로 한다. 우리는 여기서 모든 분야를 다루지 않는다. 단지 가장 흔한 공격들로부터 당신의 머신을 안전하게 보호하는 기본적인 사항들을 설명한다.

ip spoofing
tcp wrappers
ipchains

 

여기서 다루지 않는 것

·물리적 보안(physical security)
·당신이 사용하는 특별 프로그램(specific programs you run)
·데이터 암호화(encrypting data)

 

IP 속이기 (IP Spoofing)

가장 좋은 정보는 IPChains 하우투로부터 가져왔다:

IP 속이기(IP Spoofing)는 다른 호스트로부터 보내지도록 요청한 패킷을, 공격하고 있는 호스트에서 보내는 기법이다. 패킷 필터링이 출발지 주소(source address)를 바탕으로 목적지를 결정하면서부터, IP 속이기는 멍청한 필터들을 이용해왔다. 또한 SYN 공격, Teardrop, 죽음의 Ping(Ping of Death), 그리고 그와 비슷한 방법을 사용하는 공격자들이 자신을 숨기기 위해 사용하기도 한다(그런 것들이 무엇인지 모르더라도 너무 걱정할 필요는 없다).

【역자주: 멍청한 필터】
패킷 필터링 규칙에서 출발지 포트가 어떤 서비스와 연결되도록 설정되었다면, 출발지 컴퓨터를 제어할 수 있는 사람은(root 권한을 가진사람, 혹은 네트워킹이 가능한 모든 PC) “멍청한 필터”가 허용한 출발지 주소를 가지고 원하는 모든 프로그램(클라이언트, 서버)를 실행할 수 있다.

IP 속이기로부터 보호하는 가장 좋은 방법은 Source Address Verification이라 불리는 방법인데, 라우팅 코드만으로 완성되는 것이며 방화벽은 절대 아니다. 다음과 같은 명령으로 rp_filter라는 이름을 가진 파일을 찾아본다.

ls -l /proc/sys/net/ipv4/conf/all/rp_filter [Enter]

이 파일이 있다면, 부트할 때마다 Source Address Verification이 작동되도록 설정하는 것이 좋다. 그렇게 설정하려면, 아래 줄들을 당신의 init 스크립트에 (Redhat 기반의 배포판에서는 /etc/rc.d/rc.sysinit 스크립트를 사용한다) 삽입한다.

# This is the best method: turn on Source Address Verification and get
# spoof protection on all current and future interfaces.
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
echo -n “Setting up IP spoofing protection...”
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done
echo “done.”
else
echo PROBLEMS SETTING UP IP SPOOFING PROTECTION.  BE WORRIED.
echo “CONTROL-D will exit from this shell and continue system startup.”
echo
# Start a single user shell on the console
/sbin/sulogin $CONSOLE
fi

만약 당신이 이런 방법을 사용할 수 없다면, 모든 인터페이스를 보호하는 규칙을 당신이 직접 써넣으면 된다. 물론 각각의 인터페이스에 대한 지식이 필요하다. 특히 2.1 커널은 127.으로 시작하는 모든 주소로부터 보내지는 패킷 요청을 자동으로 거부하므로, 로컬 루프백 인터페이스, lo는 쓰지 않는 것이 좋다.

 

TCP Wrappers

우리는 Rob Sellars와 그의 뛰어난 기사(記事): TCP Wrappers 덕분에, 허술한 문들을 잠그고 컴퓨터에 보안 카메라를 설치하게 되었다.

 

어떻게 “TCP wrappers”를 동작하게 할 것인가?

많은 프로그램들은 어쩌다 사용될 뿐, 그 외에는 불필요한 오버헤드를 발생할 것이므로 항상 나서서 동작하지는 않는다. inetd 프로그램이 이런 방법으로 네트워크 서비스 프로그램을 관리한다. 어떤 사용자가 당신의 컴퓨터에 연결하려고 할 때에는, 한 쌍의 데이터를 만드는데: ip 주소와 포트번호(역자주: ip 주소와 포트번호의 조합을 소켓이라 부른다)가 그것으로, Inetd는 연결하려는 그 포트 번호를 /etc/services에서 찾아보고, 다시 /etc/inetd.conf 파일에서 일치하는 서비스를 찾는다. 그런 다음에 서비스(프로그램)를 실행한다.

tcp 랩퍼에서, inetd는 호출된 실제 서비스 프로그램을 실행하는 대신 tcpd 데몬을 실행하는 속임수를 사용한다.  tcpd는 /etc/hosts.allow와 /etc/hosts.deny 파일에 설정된 규칙들에 따라 소켓을 점검한다. tcpd는 규칙에 따라 연결을 허가하고 서비스 데몬을 실행하거나, 또는 접속을 거부한다.

【NOTE】 tcp wrapper는 단지 inetd를 불러오는 일만 한다!  메일(sendmail), 웹(apache), 그리고 도메인 네임 서비스(named)는 inetd를 사용하지 않으므로 tcp wrapper로 보호할 수 없다.

tcp wrapper가 설치되었는지 점검해 본다. 대부분 배포판들은(distributions) tcp wrapper를 기본적으로 설치한다.  tcp wrapper가 설치되었는지 알아보는 가장 쉬운 방법은 /etc/inetd.conf 파일을 열어 보는 것이다.  만약 tcp wrapper가 설치되지 않았다면 일반적으로 다음과 같은 줄을 볼 수 있다.

없다면 이렇게:
ftp    stream  tcp     nowait  root    /usr/sbin/ftpd       ftpd -l -a

그리고 만약 tcp wrapper가 설치되어 있다면, 이렇게 쓰여 있다:
ftp    stream  tcp     nowait  root    /usr/sbin/tcpd      ftpd -l -a

진한 글씨로 쓰여진 부분이 다른 값이다. tcp wrapper가 설치되어 있다면, tcpd 실행에 필요한 규칙들을 설정하는 /etc/host.allow와 /etc/host.deny 파일을 반드시 편집해야 한다.

/etc/hosts.allow와 /etc/hosts.deny는 당신의 컴퓨터 네트워크 서비스 접근을 제한한다. tcp wrapper의 장점 가운데 하나는 당신의 컴퓨터 네트워크에 접근을 통제하고, 접속 실패나 성공을 기록할 수 있다는 것이다.  또한 사용자 호스트이름을 기초로 확실한 동작을 수행할 수 있다.

어떤 이가 당신의 컴퓨터에서 어떤 네트워크 서비스에 연결하려고 시도할 때, tcp wrapper(tcpd)는 /etc/hosts.allow 파일을 읽어 연결을 시도하는 사람의 호스트이름과 일치하는 규칙이 있는지 확인하고, 만약 /etc/hosts.allow 파일에 접속을 허용하는 규칙이 없다면, tcpd는 다시 /etc/hosts.deny 파일을 읽어 호스트이름에 대해 접속을 거부하는 규칙이 있는지 찾아본다. 만약 어떤 파일에도 허가나 거부에 관한 내용이 없다면, 기본적으로 접속이 허용된다.
규칙을 정할 때에는 어떻게 동작할 지 그 순서가 중요하다. “hosts.allow”가 먼저 읽혀지고, “hosts.deny”의 내용은 무시된다. 앞으로 보게 되겠지만, hosts.allow는 기록된 특정한 머신으로부터 요청된 연결을 허용할 서버를 알려줄 것이다. 그러나 hosts.deny를 통해서는 어떤 이유에서든 접속을 거부할 서버를 알린다.

아래 예제들에서 우리는 모든 finger 요청을 거부할 것이고, lamers.edu 호스트 모든 사용자의 telnet 접근을 막을 것이다. hosts.allow/hosts.deny 파일을 편집할 때에는 다음 형식을 따른다:

service: hostname : options

예를 들어 /etc/hosts.allow 파일은 다음과 같은 모습이다:

*****************************************************
ipop3d: ALL: ALLOW
in.telnetd: .myschool.edu : ALLOW
*****************************************************

【주의】 위 두 가지 규칙에서, 각각의 규칙은 반드시 한 줄에 기록되어야 한다. 한 줄 이상으로 되었다면 옳은 포맷으로 고쳐야한다.

첫 줄에서 “ipcp3d”는 서비스이고, 호스트이름은 모든 호스트이름에 규칙을 적용한다는 뜻으로 “ALL”을 사용했고, 마지막으로 tcpd에 연결을 “ALLOW”한다고 말해준다.

이어서 나오는 두 번째 규칙은 첫 번째와 같은 형식인데, “myschool.edu”에 속한 사용자들에 대해서만 telnet을 허용한다.

다시: 각각의 규칙은 엔터가 없이 한 줄에 기록되어야 한다.

위 예제들은 tcp wrapper 사용 규칙을 설명하기 위한 것이다. 아래는 내 서버에서 사용하는 /etc/hosts.allow 파일이다:

*****************************************************
# allow connections from my local network
ALL: ALL@127.0.0.1 : ALLOW
# allow all connections from computers on my network
ALL: ALL@192.168.124.1 : ALLOW
ALL: ALL@192.168.124.10 : ALLOW
ALL: ALL@192.168.124.11 : ALLOW
ALL: ALL@192.168.124.20 : ALLOW
*****************************************************

이 파일은 서비스 이름 대신에 ip 주소를 이용하여 사용권한을 허용한다. (역자주: 패킷 필터링 규칙에서는 이름 대신 반드시 ip 주소를 사용하도록 한다)  홈 네트워크이므로, 모든 컴퓨터들은 신뢰할 수 있고, 등록되어 있다.  분명히, ip 속이기에 대처하기 위해서는 수정이 필요하거나, 아니면 이 방법은 안전하지 않다.  나는 외부로부터 요청되는 모든 연결을 거부하고, 무슨 일이 있었는지 나에게 메시지를 보내 알려주기를 바란다.  내 /etc/hosts.deny는 다음과 같다:

******************************************************
ALL:ALL : spawn (echo Attempt from %h %a to %d
at `date` | tee -a /var/log/tcp.deny.log
|mail jpollman@kulai.org )
******************************************************

이 것은 한 줄에 쓰여져야 한다. 모든 것이 잘 되었다면, 나는 이 설정으로부터 일 주일에 두 번 정도, 다음과 같은 email을 받게 될 것이다.

Attempt from gw.webec.com 209.98.44.94 to in.ftpd at Mon Jul 5 21:44:54 EDT 1999

 

IP Chains

방화벽을 구축하는 방법을 이해하려면 한 컴퓨터로부터 다른 컴퓨터로 데이터가 이동하는 방법을 이해해야한다.  나는 가장 좋은 설명을 IP Chains HOWTO에서 보았다.

네트워크를 거쳐가는 모든 트래픽은 패킷 형태로 보내진다. 예를 들어, 이 패키지를 다운로드한다면 당신은 각각의 크기가 1460 바이트인 36 개의 패킷들을 받게 될 것이다(숫자가 항상 일정한 것은 아니다).

각각의 패킷은 그 첫 부분에 어디로 가야하고, 어디로부터 왔는지, 패킷 형식은 무엇이며 그 밖에 필요한 세부적인 관리정보가 기록되어 있다. 이런 정보들이 기록된 패킷의 첫 부분을 헤더(header)라 부른다. 패킷의 나머지 부분은 일반적으로 바디(body)라 불리며, 전송되는 실제 데이터를 담고있다.
TCP처럼 웹 트래픽, 메일, 그리고 원격로그인에 사용되는 어떤 프로토콜들은, ‘연결(connection)’지향으로 사용되는데 -- 실제 데이터가 담긴 패킷들을 보내기 전에 ‘연결을 바란다’, ‘좋다’, ‘고맙다’는 말을 주고받으며 패킷들에 대해 여러 가지를 설정한다 (특별한 헤더와 함께).  그 다음에 패킷들을 정상적으로 서로 교환한다.

패킷 필터는 그들이 통과시켜야할 패킷의 헤더를 살피고, 전체 패킷의 운명을 결정하는 소프트웨어의 한 부분이다.  패킷 필터는 패킷을 거부(deny)하거나 (다시 말하면, 마치 전혀 수신된 적이 없었던 것처럼 패킷을 버린다), 패킷을 허용(accept)하거나 (즉, 패킷을 그대로 통과시킨다), 또는 패킷을 거절(reject)한다(deny와 비슷하지만, packet의 출발지에 그렇게 처리했다고 알려준다).

Linux에서, 패킷 필터링은 커널 자체에서 만들어지며, 패킷으로 할 수 있는 몇 가지 트릭이 있지만, 헤더를 살펴보고 패킷의 운명을 결정하는 일반적인 원칙은 마찬가지이다.

한가지 문제는 같은 도구로(“ipchains”) 매스커레이딩(masquerading)과 투명한 프락싱(transparent proxying) 모두를 제어한다는 것이다.  비록 이들은 패킷 필터링의 개념적인 분류이지만(현재 리눅스 성과물은, 그들이 밀접한 관련이 있다는 생각 때문인지, 둘 사이 경계를 흐려놓는다)

【역자주】 방화벽에서 투명성(transparent)은 그 역할을 수행하는 서버를 사용자들이 볼 수 없다는 것을 뜻한다. 사용자들은 방화벽을 통해서 실제 호스트로 들어오거나, 외부로 나갈 수 있지만 마치 바로 접속한 것처럼 방화벽 머신은 볼 수가 없다(그 사이에서 무슨 일들이 있는지 모르는 것이다!). 마치 SF 영화에 나오는 레이저 문처럼 없는 줄 알았는데, 빠지직…

어쨌든, ipchains는 패킷의 헤더로부터 포트 요청을 살피고, 그 다음에 어떻게 처리해야할 지 결정하기 위해 규칙을 찾아본다.  규칙을 검사하는 것은 어떻게 동작하는지 이해하는 가장 쉬운 방법이다. 아래는 내 방화벽에서 pop3 파트에 사용하는 규칙이다:

ipchains -A input -p tcp -j ACCEPT -s   \
192.168.124.0/24 -d 0.0.0.0/0 110
ipchains -A input -p tcp -j DENY -d 0.0.0.0/0 -s   \
192.168.124.0/24 110

-A input: 다른 입력 규칙을 위해 이 규칙을 추가한다
              (다시 말하면, 다른 규칙들을 지우지 않는다).
-p tcp: tcp 프로토콜을 사용한다.
  ACCEPT/DENY: 글자 뜻 그대로이다.
-s: 데이터 패킷의 출발지(source).
-d: 데이터 패킷의 목적지(destination).
  0.0.0.0/0 뜻은: 어떤 곳이든, 그리고 192.168.124.0/24는 내 네트워크 주소이다.

【역자주】 아마, 이미 알고 있겠지만 192.168.으로 시작하는 ip 주소는 사설 네트워크 내부에서만 사용할 수 있는 주소이다.

위에서 말한 첫 번째 규칙은: 로컬 네트워크로부터 그 밖의 다른 어떤 곳으로든 포트 110을 향해 가는 모든 데이터를 허가한다.
두 번째 규칙은: 다른 어떤 곳으로부터 로컬 네트워크의 110번 포트로 들어오는 어떤 패킷도 거부한다.

간단한 말이지만, 당신이 자신의 ip 주소를 모른다면 - 인터넷에 다이얼 업으로 연결할 때처럼? 그리고 각각의 포트를 동시에 사용할 수 있도록 설정하고 있다면?
다행히도 우리는 도움을 얻을 수 있다. Ian Hall-Beyer는 최소한의 설정만으로 당신의 리눅스박스를 정리할 수 있도록 돕는 세 개의 걸출한 스크립트를 함께 넣어두었다.  아래는 그의 Readme 파일이다:

1) 당신 개인의 네트워크 셋업에 적당한 스크립트를 고른다.

masquerade:
내부적으로 RFC1918 네트워크를 따르는 시스템들.

standalone:
네트워크에 연결된 싱글 머신들, 보안을 강화하려고 할 때.

routable:
라우팅할 수 있는 서브넷의 표준 네트워크 게이트웨이 시스템

2) 사용할 스크립트를 /usr/sbin 디렉터리에 복사해 넣고 아래와 같이
    스크립트 변수들을 편집한다.

LOCALIF: http://linux.freediskspace.com/files/42180/
(Masquerade/Standalone)

이것은 당신이 IP 네트워크에 연결되기 위한 인터페이스이다. 모뎀과 시리얼 포트 ISDN TA에서 이 것은 일반적으로 ppp0라는 인터페이스 이름을 가진다.
그렇지 않다면, 이더넷 인터페이스를 엑세스 장치로 사용하여 연결한다.

   INTERNALNET: (Routable/Masquerade)
    *network* 주소와 당신의 네트워크에서 게이트웨이에 사용하는
    비트매스크 또는 도트(.)로 구분된 매스크 등으로 적합한 호스트매스크
    를 설정한다.

3) 만약 당신이 전화선을 통해 연결되어 있다면, 연결된 후에 실행될
    스크립트를 ip-up 항목에 추가한다.  당신이 만약 네트워크에 항상
    연결되어 있다면 스크립트는 rc.local 로부터 실행될 것이다.

4) 파일 퍼미션을 바꾼다:

chmod 755 /etc/masquerade[Enter]

파일을 편집한 다음, Masquerade/Standalone에 필요한 것 하나를 실행한다. 나는 /etc/ppp/ip-up (또는 Redhat 기반의 시스템에서 사용하는 ip-up.local) 스크립트를 통해 실행하는 방법을 추천한다.  Ian은 perl과 gtk 인터페이스로 더 쉽게 사용할 수 있도록 만드는 중이다.

Copyright ⓒ 1999, JC Pollman and Bill Mote
Published in Issue 46 of Linux Gazette, October 1999

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,070 명
  • 현재 강좌수 :  35,986 개
  • 현재 접속자 :  329 명