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

게이트웨이에 보안 강화하기

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

icon01.giftitle68.gif

By Chris Stoddard
번역 : 윤봉환/el@linuxlab.co.kr

 

Introduction

리눅스 가제트 51호에(리눅스 월드 2000년 4월호) 실린 “케이블 모뎀과 IP 매스커레이딩을 이용한 사설 네트워크”라는 제목의 기사에서 보안이 잘 된 리눅스 기반 게이트웨이를 설치하는 방법을 설명했다. 저자는 보안은 안전한 설치에서 시작한다는 뛰어난 생각에서, 깨끗한 리눅스 설치부터 시작하라고 제안하는데, 이것은 이 글의 주제이기도 하다. 설치를 마쳤을 때, 비록 파일 관리를 위해 MC(Midnight Commander)는 넣겠지만, X Windows 없이, 약 130MB에 스왑공간을 더한 아주 날씬한 시스템이 될 것이다.

나는 두 가지 가정을 할 것이다. 첫째, 여러분은 리눅스를 설치할 줄 알고, 사용하는 방법을 잘 안다. 둘째, 나는 여러분이 게이트웨이 컴퓨터를 케이블 모뎀이나 DSL, 또는 다른 매체를 통해 인터넷에 고정적으로 연결하고, ftp, telnet, 웹서버 등 어떤 것도 사용되지 않도록 설정한다고 가정한다.

 

What you will need

내 머신은 오래된 Dell Optiplex 466/MXe 컴퓨터이다. 이 놈은 16MB RAM, 512MB 하드 드라이브, 사운드 카드와 4배속 IDE CDROM이 장착된 486 DX2 66 머신이다. 나는 50달러를 들여 486DX4 100, 40MB 시스템으로 업그레이드 했다. 사운드 카드는 없애고 대신 네트워크 카드 두 개를 더 장착했고, 스커지(SCSI) 카드를 꽂고 320MB 스커지 하드 드라이브를 설치했다. 게이트웨이 머신으로 사용하기 위한 최소 사양은, 486, 16MB 램, 200MB 하드 드라이브, 네트워크 카드 두 개, 그리고 설치를 위해 CDROM, 또는 네트워크 인스톨을 이용할 수도 있다. RedHat Linux 6.x 배포본도 필요하다. 다른 배포판을 사용해도 되지만 이 글에서 나는 RedHat만 다룰 것이다. 모니터는 설치할 때에만 필요할 뿐, 일단 설치가 끝나고 부트되고 나면 Openssh 원격접속을 통해 관리할 수 있다.

시작하기 전에, ftp://ftp.redhat.com/에(또는 ftp://ftp.bora.net/pub/Linux/)가서 아래 패키지를 다운받아 플로피 디스크에 복사해 넣는다;

e2fsprogs-1.17-1.i386.rpm
initscripts-4.63-1.i386.rpm
lynx-2.8.2-3.i386.rpm
pam-0.68-8.i386.rpm
 

譯註: 영문버전을 사용해야 하는가?

서버는 굳이 한글을 지원하지 않아도 된다. 특히 이 글에서 소개하는 게이트웨이 머신에서는 더 그렇다. 관리자들은 몇 가지 이유를 들어 한글 패치된 배포판 보다는 영문판이 더 안전하다고 말한다. 어느 쪽을 선택하든 보안 관련 이슈에 늘 귀를 기울이고 제 때에 보안 패치를 적용하는 것이 중요하다. 여러분이 한글판을 꼭 사용하고 싶다면 패치가 가장 잘 제공되는 배포판을 사용하는 것이 좋다.

 

여러분이 RedHat 6.2를 사용한다면, 앞서 파일들은 필요없다. ftp://thermo.stat.ncsu.edu/pub/openssh-usa 사이트에 가서 다시 파일들을 받고, 디스크에 복사해 넣는다; 

·openssh-1.2.3-1us.i386.rpm
·openssh-clients-1.2.3-1us.i386.rpm
·openssh-server-1.2.3-1us.i386.rpm
·openssl-0.9.5a-1us.i386.rpm

 

설치, 그리고 환경설정

나는 기본 설정을 벗어나는 주제에 대해서만 다룰 것이다.

1. ‘custom install’을 선택한다. Disk Druid 화면을 만나면 아래처럼 파티션을 구성한다.
 

Partitio    Minimumsiz    % of total    Mine
                  40 M              10         75 MB
/boo             5 M              5 M         5 MB
/hom         100 M              25       200 MB
/tm             40 M              10         75 MB
/us            220 M              45       320 M  1
/va             40 M              10%       75 MB
swa            64 M          2X RAM      80 M  2

 

    ① 간단하게, 나는 SCSI 드라이브를 통째로 사용했다.

    ② 사실 여러분은 실제 램과 같거나 작은 크기로 스왑 파티션을 만들면 된다.
         나는 여러분이 나중에 웹이나 ftp 사이트를 설정할 경우를 가정해서 더 큰 값을 썼다.

    이 표는 여러분의 하드 드라이브를 어떻게 나누어야 하는지, 최소한의 경우에 사용할
    윤곽을 대강 보여준다. 여러분의 하드 드라이브가 512MB 보다 크면, swap과 /boot
    뒤에 퍼센테이지를 사용한다. 여러분의 드라이브가 512MB 보다 작으면, 스왑 파티션과
    루트 파티션만 만든다. 이렇게 하면, 침입자가 들어와도 /tmp나 /home 디렉토리에 큰
    파일들을 잔뜩 넣어서 하드 드라이브를 넘치게 만들지 못할 것이다. 또, /etc/fstab 파일에
    서 /tmp와 /home 디렉토리에 nosuid와 nodev 옵션을 덧붙이는 등 재미있는 일들을 할
    수도 있다. 어떤 이들은 진짜 유저가 있다면 모를까, 이 경우에는 이렇게 많을 필요가
    없는데 어째서 /home 파티션에 그렇게 큰 덩어리를 바치냐고 묻을 것이다. 답하자면,
    리모트 시스템과 파일을 주고 받거나, MP3 공유, 또는 다른 작업파일들을 두는 장소로
    쓰일 것이다.

2. 설치할 ‘components’를 선택할 때, ‘Networked Workstation’, ‘Network Management
    Workstation’,‘Utilities’만 고르고, ‘Select Individual Packages’를 선택한다.
    만약 여러분이 RedHat6.2를 사용하고 업데이트된 RPM 패키지들을 다운로드하지
    않는다면 Lynx도 선택한다.

    제외할 패키지 목록이다: git, finger, ftp, fwhois, ncftp, rsh, rsync, talk,
    telnet ghostscript, ghostscript-fonts, mpage, rhs-printfilters arpwatch, bind-utils,
    knfsd-clients, procinfo, rdate, rdist, screen, ucd-snmp-utils, chkfontpath, yp-tools,
    XFree86-xfs, lpr, pidentd, portmap, routed, rusers, rwho, tftp, ucd-snmp, ypbind,
    XFree86-libs, libpng, XFree86-75dpi-fonts, urw-fonts

3. 시스템이 리부트된 다음, root로 로그인하고 다음 명령들을 써 넣어서 설치과정에서 뺄 수
    없었던 패키지들을 지운다.

    rpm -e --nodeps pump mt-st eject bc mailcap apmd
    kernel-pcmcia-cs getty_ps setconsole setserial raidtools
    rmt sendmail

    또, inuxconf, kudzu, kbdconfig, authconfig, timeconfig, mouseconfig, ntsysv,
    setuptool 등 여러분의 기술 수준에서 의존하는 여러가지 관리도구들을 제거하는 것으로
    고려하고 있을지도 모르겠다. 이런 패키지들은 모두 rsh이나 XFree86처럼(필요도 없는
    것들이) 보안에 문제가 있다.

4. 여러분이 RedHat에서 내려받은 모든 RPM 패키지들을 플로피 두 장에 복사해 넣는다.
    새로 설치된 머신에 디스크를 넣고, mount -t msdos/dev/fd0 /mnt/floppy 명령으로
    플로피 드라이브를 마운트한 다음 rpm -Uvh/mnt/floppy/*.rpm 명령으로 파일들을
    설치한다.

5. Openssh 파일들을 모두 플로피 디스크에 복사하고 새로 설치된 시스템에 다시 넣는다.
    mount -t msdos/dev/fd0 /mnt/floppy 명령으로 플로피 디스크를마운트 한 다음
    rpm -ivh /mnt/floppy/open* 명령으로 설치한다. /etc/ssh 디렉토리로 옮겨가서
    sshd.config 파일을 연다.
    “PermitRootLogin yes” 줄을 찾아서 값을 no로 바꾼다. 리모트 시스템에서 root 권한으로
    시스템에 로그온 하는 것을 막기 위해서 이다. 여러분이 root로 원격접속해야 한다면,
    일반 사용자로 로그온 한 다음 su - 명령으로(뺄셈기호를 꼭 넣는다) root 권한을 얻는다.

 

마지막으로 주의할 것들

나는 방화벽 설정에 대해서는 자세히 다루지 않을 것이다. 또, “케이블 모뎀과 IP 매스커레이딩을 이용한 사설 네트워크”은 훌륭한 글이지만, 다음 두 가지를 제안하려 한다.

나는 보안적인 관점에서 DNS 서비스는 방화벽에 두지 말고, 클라이언트 각각이 ISP의 DNS를 사용하도록 설정하거나 네트워크 안의 다른 머신이 DNS 서버 역할을 하도록 설정하는 것이 좋다고 생각한다. 더해서, 방화벽 머신에서 inetd를 통해 실행할 서비스들을 설정할 필요가 없다고 생각하는데, 어차피 ssh 포트인 22번 포트만 열리기 때문이다. 나는 대개 inetd.conf 파일은 지우고 “touch /etc/inetd.conf” 명령을 사용해서 아무 것도 없이 빈 파일로 만들어 둔다.

만약 여러분이 시스템에 둘이나 셋, 혹은 그 이상의 사용자를 둔다면, Web proxy/caching 프로그램으로 Squid를 사용하고 싶을지도 모르겠다. 이 프로그램은 자주 방문하는 웹사이트 문서들의 사본을 로컬 머신에 남겨 속도를 빠르게 한다. 또, 집에 나이 어린 사용자들이 있을 때, 웹사이트들을 블로킹하는데 사용되기도 한다. 여러분이 Squid를 사용하기로 마음 먹었다면, 적어도 1GB 이상의 하드 드라이브와 32MB 램, 그리고 486DX2/66 이상 프로세서는 가질 것을 권한다. Squid는 RedHat CD에서 설치할 수 있다. Squid 대신, 역시 프록시 프로그램인 Junkbuster를 설치할 수도 있다. Junkbuster는 웹사이트들의 캐시를 만들지 않으므로 더 큰 하드 드라이브나 램, 더 빠른 프로세서는 필요 없다. 대신 여러분이 사이트에 빠르게 연결할 수 있도록 배너광고와 여러분에 대한 정보를 긁어 가는 짓들을 막는다. Junkbuster는 http://www.waldherr.org/junkbuster에서 가져올 수 있다.

쉽게 방화벽을 구성하려면, Seawall이나 pmfirewall 같은 프로그램을 다운받는다. 이 프로그램들은 간편하게 디자인된 ipchains 기반 방화벽 프로그램으로, 둘 다 사용해 보았는데 모두 믿을만 했다. Seawall이나 pmfirewall을 사용하면 ipchains를 공부하는 귀찮은 일에서 벗어날 수 있다. Seawall은 설정하기가 까다롭지만, 더 많은 설정 옵션들이 있고, pmfirewall은 설정하기 더 쉽지만, 옵션이 적다.

 

마치며

이제 “케이블 모뎀과 IP 매스커레이딩을 이용한 사설 네트워크”로 돌아가서 게이트웨이 설정을 마치자. 이 글은 믿을만한 출발점을 간단하게 제시할 뿐, 모든 설정을 끝낸 것은 아니며 리눅스 보안의 모든 것도 아니라는 것을 기억하기 바란다. 관리자를 위한 리눅스 보안 튜토리얼을 (http://packetstorm.sercuify.com/papers/unix/Securing-Optimizing-RH-Linux-1_2.pdf) 다운받아 살펴본다. 이 문서는 475 페이지나 되지만, 처음 두 챕터만 읽을 만한 가치가 있다.




icon01.giftitle74.gif

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

 

 

들어가며

지난 기사에서 우리는 꼭 필요한 패키지만 리눅스 박스에 설치했다. (만약 여러분이 이전 기사를 읽지 않았다면 지금 읽는게 좋겠다. 이 기사는 지난 호 기사를 바탕으로 쓰여졌기 때문이다) 이제는 여러분의 게이트웨이 머신을 보안 요새로 만들기 위해 세부적인 일들을 다룰 차례다.

여러분이 먼저 알아 두어야 할 것은 ‘완전한 보안이란 없다’는 것이다. 기업들이 네트워크 보안만을 전적으로 책임지는 IT 부서에 엄청난 투자를 하지만 여전히 그들의 네트워크가 조롱당하는 현실을 보면 이런 상황을 쉽게 알 수 있다. ‘완전한 보안이란 없다’는 말을 믿고 따르는게 여러분 건강에 좋을 것이다.

이 글에서 우리가 추구하는 진짜 목표는 믿을만한 사람은 믿고, 스크립트 키디(Script Kiddies)는(완전히 막지는 못하더라도) 함부로 접근하지 못하게 하면서 혹시 침입을 당하더라도 크랙하는 속도를 최대한 늦춰서 우리가 큰 피해를 입기 전에 그들을 발견하는 것이다. 이상적으로는, 리눅스를 설치하자마자 (시스템이 인터넷에 연결되기 전에) 이런 작업들을 끝내는 것이다.

이 문서는 여러분이 리눅스를 설치하고, 다양한 환경설정 파일들을 편집하며 루트로 로긴하는 방법을 이미 알고 있다는 가정에서 시작한다.
그리고, 여러분이 방화벽 시스템을 설정하고 그 안에서 DNS, DHCP, web, ftp나 telnet 서버를 운영하지 않을 것이라 가정한다. 여러분이 이런 서비스들 가운데 어떤 것이라도 운영할 계획이라면 물리적으로 다른 머신에 설치하는 게 좋겠다. DMZ를 여러분의 네트워크에 설치하면 비록 그 시스템에 보안장치가 되어 있더라도 네트워크 바깥의 다른 시스템들로부터 접속을 허용한다.

서버와 방화벽 머신을 따로 두면, 침입자가 여러분의 서버 깊숙이 침투해서, 여러분의 방화벽 시스템 깊숙한 곳 여기저기를 쑤시고 다니기 시작해서, 안쪽 네트워크에 그 악당들이 손대기 전에 아마 발견할 수 있을 것이다.

 

시스템 업데이트와 보안에 대한 권고

컴퓨터 보안 세계에서는 ‘아는 것이 힘’이다. 솔직하게 말해서 보안에 관한 모든 이슈들은 전문가에 의해 발견된 것이 아니다. 언제나 크래커들이 먼저 알아내고, 보안 전문가라는 이들은 이미 당한 다음에 항상 한 발짝 늦게 대처한다.

여러분은 새로운 문제가 발생할 때, 최소한의 패키지만 업데이트하도록 시스템 정보를 잘 알고 있어야 한다. “rpm -qa > packages.txt” 명령은 여러분의 시스템에 설치된 패키지 목록과 버전 번호를 파일로 만들어두는데, 이 목록을 이용해 다음에 레드햇의 웹사이트에 가서 새로운 패키지를 가져오면 된다. 레드햇 웹사이트에서 제공하는 보안 권고 안을 보고, 그들이 제안하는대로 여러분의 시스템을 손본다.

문제가 생기기 전에 조금이라도 먼저 손쓰고 싶다면 BugTraq와 CERT 메일링 리스트에 가입하는 게 좋다.

 

물리적인 보안 Physical Security

이 기사는 가정용 케이블 모뎀 유저를 대상으로 쓴 글이므로 물리적인 보안은 특별히 다루지 않겠다. 혹시 아이가 있거나 호기심 많은 베이비 시터가 있어 걱정된다면 바이오스에서 패스워드를 잠그는 방법이 있다.

 

유저 계정과 패스워드

여러분이 네트워크를 통해 게이트웨이 시스템에 접근하려면 루트 계정과 특별 계정들 외에 유저 계정 하나는 꼭 있어야 한다(레드햇 계열의 모든 배포판은 기본적으로 루트계정으로부터 텔넷을 막아둔다). 그리고, 유저와 루트 계정 모두 좋은 패스워드를 반드시 가지고 있어야 한다.

좋은 패스워드란 최소한 여덟 글자보다 길고, 소문자와 대문자, 숫자 등을 섞어서 사전에서 찾을 수 없는 문자열이다. 패스워드는 때때로 바꿔주는 것도 좋은 생각인데 포스트 잇 따위에 적어서 모든 사람들이 볼 수 있는 곳에(예를 들어 모니터에) 붙이는 일은 절대 해서는 안된다.

여러분의 네트워크에 연결된 컴퓨터마다 서로 다른 패스워드를 넣어두면 비록 한 시스템이 침입자에게 뚫리더라도 다른 시스템은 안전할 것이다. 이렇게 해 두면 패스워드를 크랙하는데 시간이 더 오래 걸리므로 여러분이 크래커를 발견했을 때 아직 많은 피해를 입지 않았을 것이다.

같은 줄을 따라가다 보면 특별한 목적을 가진 계정 몇 개를 볼 수 있다. 이런 계정들은 리눅스 배포판을 설치할 때 기본적으로 설치되는데 우리 목적에는 전혀 도움이 안될 뿐만 아니라 보안을 위협하는 틈이 될 수도 있다. 그래서 우리는 userdel 명령을 이용해서 이런 계정들을 지울 것이다. userdel 명령의 기본문법은 “userdel username”으로 username 자리에는 여러분에게 필요 없는 계정을 넣으면 된다. 우리가 지울 계정들은: adm, lp, sync, shutdown, halt, news, uucp, operator, games, gopher, ftp이다.

그리고 관련된 그룹들도 groupdel 명령으로 제거해야 한다. 문법은 userdel 명령과 같다. 우리가 지울 그룹들은: adm, lp, news, uucp, games, dip, pppusers, popusers, slipusers이다.

 

환경을 설정하는 파일들

더 말할 것도 없이 정말 중요한 섹션이다. 엉성하게 구성된 설정 파일들은 모든 시스템에서 가장 치명적인 틈이다. 이 섹션에서 여러분은 같은 명령들은 계속해서 써 넣어야 하는데 그런 작업들이 귀찮다면 http://linuxlab.co.kr/~el에서 아래 내용을 가져다가 셸 스크립트로 만들어 써도 좋다.

우리가 하려는 일은 각 파일들을 조율한 다음에 첫 번째 모든 파일들의 소유자를 root로 바꾸고; 두 번째 루트 유저만이 읽고 쓸 수 있게 퍼미션을 바꾼다; 그리고 세 번째, 루트 유저라 하더라도 이 값들을 바꿀 수 없게 만든다. 이렇게 해 두면 우연한 실수로 설정파일들을 지우거나 바꿀 수 없게 보호한다. 그리고 이 파일들이 보안 틈새로 링크되는 것을 막을 수 있다.

“touch secure-it”이라 쓰고 또 “chmod +x secure-it”이라 쓴 다음 여러분이 좋아하는 텍스트 에디터로 이 파일을 열어서(예를 들어 “vi secure-it” 아래 문장들을 그 안에 써 넣는다: (텍스트 버전이다)
 

#!/bin/sh

# 소유자를 루트로 바꾼다.
chown root.root $1
# 오직 루트만이 접근할 수 있도록 퍼미션을 바꾼다.
chmod 600 $1

# 파일을 바꿀 수 없게 만든다.
chattr +i $1

 

譯者註: chattr
chattr 명령은 ext2 파일시스템에서 파일 속성(attribute)을 바꾸는데 사용한다.

chattr [ -RV ] [ -v version ] [ mode ] files...

모드는 +-=[ASacdisu] 형식으로 표시한다. ‘+’ 기호는 선택한 속성을 지정한 파일에 더한다. ‘-’ 기호는 지정한 속성을 제거한다. 그리고 ‘=’ 기호는 지정한 속성만을 남긴다.

`ASacdisu’ 문자열은 각각 선택할 수 있는 속성을 나타낸다: 접근 시간을 고치지 않기(A), 업데이트 동기화(S), 덧붙이기만 하기(a), 압축된(c), 변경하지 못하게(i), 덤프하지 않기(d), 안전한 삭제(s), 지워지지 않게(u)

-R 옵션은 서브 디렉토리까지 설정 값을 적용한다. -V 옵션은 상세한 정보를 출력한다.

 

이제 이 파일을 저장하고 편집기를 끝낸 뒤에, “cp secure-it /usr/sbin” 명령으로 /usr/sbin 아래 복사해 넣는다. 이제부터는 “secure-it filename” 명령으로 설정 파일들을 손 쉽게 잠글 수 있다.

/etc/exports

이 파일은 여러분과 같은 네트워크에 있는 다른 시스템에게 로컬 파일시스템을 NFS 드라이브로 마운트할 수 있다고 알린다. 이 파일은 반드시 비어 있어야 하며, 혹시 무엇인가 들어 있다면 “rm/etc/exporrts” 명령으로 지우고 “touch /etc/exports” 명령으로 비어있는 파일을 새로 만든다. 그리고 “secure-it /etc/exports” 명령으로 잠근다.

/etc/inetd.conf

이 파일은 대부분의 TCP/IP 서비스를 시작하는 출발점이다. 우리가 열어 둘 서비스는 ssh--inetd랑 상관 없이 실행된다-- 밖에 없으므로 이 파일은 비워 두는 것이 좋다. “rm /etc/inetd.conf” 명령으로 지우고 “touch /etc/inetd.conf” 명령으로 빈 파일을 새로 만든다. 그리고 “secure-it /etc/inetd.conf” 명령으로 잠근다.

/etc/hosts.deny

이 파일은 여러분의 시스템에서 제공하는 TCP/IP 서비스를 사용할 수 없다고 다른 시스템에 알린다. 우리는 /etc/hosts.allow 파일에 등록된 유저 외에는 모든 접속을 거부할 것이므로 이 파일을 열어서 아래 라인을 /etc/hosts.deny 파일에 넣는다. 그리고 역시 secure-it 명령으로 잠근다.
 

ALL: ALL

 

/etc/hosts.allow

이 파일에는 inetd.conf에서 시작하는 서비스들을 허용할 시스템을 등록한다. inetd.conf 파일이 비어 있으므로 이 파일도 역시 비어 있는게 좋겠다. “rm /etc/hosts.allow” 명령으로 파일을 지우고 “touch /etc/hosts.allow” 명령으로 비어있는 파일을 새로 만든다. 그리고 “secure-it /etc/hosts.allow” 명령으로 잠근다.

/etc/rc.d/rc.local

다음으로 할 일은 여러분의 시스템이 바깥에 너무 많은 정보를 알리지 않도록 단속하는 일이다. 닫히지 않은 로그온이나 ICMP 패킷을 통해 여러분의 시스템 정보가 흘러나갈 수 있는데, 먼저 /etc/issue와 /etc/issue.net 파일을 지운다. 그 다음 텍스트 에디터로 /etc/rc.d/rc.local 파일을 열어 아래 줄들을 모두 지워버린다:
 

echo “” > /etc/issue
echo “$R” >> /etc/issue
echo “Kernel $(uname -r) on $a $SMP$
(uname -m)” >> /etc/issue
cp -f /etc/issue /etc/issue.net
echo >> /etc/issue

 

/etc/rc.d/rc.local 파일을 저장하고 닫기 전에 우리 시스템이 ping이나 traceroute 같은 ICMP 요청에 응답하지 않도록 설정하기 위해 #!/bin/sh 줄 바로 아래에 다음 라인들을 써 넣는다:
 

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

 

이 명령 줄은 여러분의 시스템을 바깥에서는 볼 수 없도록 만들어 줄 것이다: 스크립트 키디들은 그들이 찾을 수 없는 서버는 크랙할 수 없으므로 이 설정은 많은 도움이 된다(스크립트 키디는 지정한 IP 범위 안에서 열려있는 서버들을 ICMP나 닫히지 않은 로긴으로 알아낸다) 두 번째 줄은 여러분의 시스템을 SYN DOS(SYN 서비스 거부) 공격으로부터 지켜준다. 입력을 끝냈으면 파일을 저장하고 끝낸다.

하나 알아 둘 것이 있다: 이런 설정은 여러분의 시스템에 ping을 보내는 것을 막아주지만, IP 포워딩이나 ssh 같은 다른 기능들에는 전혀 영향을 미치지 않는다.

마지막으로 이 파일을 잠근다.

/etc/hosts.conf

바깥에서 감행되는 공격에 대처할 방호체계를 구축하는 동안 /etc/host.conf 파일 마지막 줄에 다음 라인을 추가해야 한다:
 

nospoof on

 

이 설정은 여러분의 네트워크 바깥의 시스템이 여러분의 LAN 안쪽에 있는 시스템인 것처럼 출발지 주소를 가장해서 들어오는 경우 모든 요청을 거부하도록 만든다. 이런 종류의 공격을 IP 속이기(IP Spoofing)이라 부르며 흔히 서비스 거부 공격(DoS)와 함께 사용된다.

설정이 끝났으면 secure-it으로 파일을 잠근다.

그 밖에 다른 파일들은 굳이 바꾸어야 하는 것은 아니지만 반드시 잠가둘 필요는 있다:
/etc/services, /etc/passwd,/etc/shadow,/etc/group,/etc/gshadow.

만약 여러분이 패스워드를 바꾸거나 새로운 유저를 추가할 계획이라면
/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow 파일에서 “chattr -i filename” 명령을 실행해야 한다.

/etc/fstab

이 파일은 시스템이 부트될 때 어떤 드라이브가 있으며, 파티션이 어떤 마운트 포인트에 마운트되어야 하는지를 알려준다. 만약 여러분이 커다란 파티션 하나를 통째로 루트 파티션으로 설정하거나 /home과 /tmp 파티션으로 쪼개도록 설정하지 않았다면 이 섹션을 건너 뛰고 다음 장으로(디스크 쿼터 섹션) 건너 뛰어도 좋다.

/home과 /tmp는 root 이외의 유저도 읽거나 쓸 수 있는 파일시스템이기 때문에 중요한 영역이다. 우리가 하려는 작업은 유저들이 이들 파티션에서 할 수 있는 일을 제한하려는 것이다. /home에서는 SUID 프로그램이나 장치를 만들 수 없게 할 것이다. 그리고 /tmp에서는 어떤 프로그램도 실행할 수 없게 만들어야 한다. 우리는 이런 설정을 위해 /etc/fstab 파일을 변경할 것이다. 내 시스템에서 /etc/fstab 파일은 아래와 같은데 아마 여러분의 것도 비슷할 것이다:
 

/dev/hda1   /         ext2   defaults 1 1
/dev/hda9   /boot   ext2   defaults 1 2
/dev/cdrom /mnt/cdrom   iso9660 noauto,owner,ro 0 0
/dev/hda5   /home ext2    defaults 1 2
/dev/hda6   /tmp   ext2    defaults 1 2
/dev/sda1   /usr    ext2     defaults 1 2
/dev/hda7   /var    ext2     defaults 1 2
/dev/hda8   swap  swap   defaults 0 0
/dev/fd0     /mnt/floppy    msdos noauto,owner     0 0
none /proc  proc   defaults0 0
none /dev/pts       devpts gid=5,mode=620           0 0

 

/home과 /tmp 줄을 다음과 같이 바꾼다:
 

/dev/hda5 /home ext2 rw,nosuid,nodev 1 2
/dev/hda6 /tmp ext2 rw,nosuid,nodev,noexec 1 2

 

Disk Quota

만약 여러분이 /home 디렉토리에 파티션을 나누어 주었다면 아래 설정을 선택적으로 사용할 수 있다. 하지만 여러분의 하드 드라이브를 쪼개지 않고 통째로 루트파티션에 설정했다면 디스크 쿼터 시스템을 반드시 사용해야 한다. 디스크 쿼터 시스템은 유저가 드라이브 스페이스를 함부로 탕진하거나 계정을 훔쳐 들어온 침입자가 여러분의 하드 드라이브를 쓰레기로 가득 채우는 못된 짓을 예방한다. /etc/fstab에서 기본적인 라인은 다음과 같을 것이다:
 

/dev/hda1 / ext2 defaults 1 1

 

이런 값을 아래처럼 바꾼다:
 

/dev/hda1 / ext2 defaults,usrquota 1 1

 

그리고 /etc/rc.d/rc.local 파일에 다음 줄들을 추가한다:
 

/sbin/quotacheck -avug
/sbin/quotaon -avug

 

이제 “touch /quota.user”라고 쓰고 “chmod 700 /quota.user” 명령을 적용한 다음 시스템을 다시 부트한다. 그럼, 쿼터에 대한 에러 메시지 몇 개가 나타날지도 모르겠다. 뭐 무시하고 지나가자. 시스템이 완전히 가동되면 유저 계정에 대해서만 쿼터를 설정해야 한다. “edquota -u username” 명령에서 “username”이란 문자열만 적당한 유저 이름으로 바꾸어서 실행한다. 이 명령은 vi 텍스트 에디터를 불러와서 다음과 같은 메시지들을 보여준다:
 

Quotas for user username:
/dev/hda1: blocks in use: 7, limits (soft = 0, hard = 0)
inodes in use: 6, limits (soft = 0, hard = 0)

 

블록 제한에 따라 유저가 사용할 수 있는 드라이브 공간을 KB 단위로 유저가 사용할 수 있는 공간을 정한다. inode 설정에 따라 유저가 가질 수 있는 파일의 총 수를 제한한다. 소프트 제한은(Soft limits) 주어진 크기를 넘어섰을 때 사용자에게 경고하고. 하드 제한은(hard limits) 더 이상 공간을 할당하지 않고 멈춘다.

이 머신에서 MP3 파일들을 전송하는 등 제한을 높일 만큼 아주 중요한 이유가 없는 한 여러분은 제한 수위를 낮게 설정하라고 권하고 싶다. 10 MB 디스크 공간과 100 개의 파일 정도면 되지 않을까?

필요한 라인들을 편집해서 이렇게 만들었다면 저장하고 끝낸다.
 

Quotas for user username:
/dev/hda1: blocks in use: 7, limits (soft = 5120, hard = 10240)
inodes in use: 6, limits (soft = 50, hard = 100)

 

소프트 제한을 5 MB 디스크 공간에 50 개 파일로 설정했으며 하드 제한은 10 MB 디스크 공간에 100 개 파일로 설정했다.

/etc/rc.d/init.d/*

다음으로 우리는 /etc/rc.d/init.d 디렉토리에 들어 있는 모든 스타트업 스크립트가 안전한 퍼미션을 가지도록 설정해야 한다. “chmod -R 700 /etc/rc.d/init.d/*” 명령을 실행하자.

 

SUID Programs

그리고 우리는 시스템에 있는 모든 SUID 파일들을 반드시 찾아야만 한다. 이런 파일들은 실행되는 순간 루트 사용자의 권한을 얻을 수 있는 프로그램들로 아주 심각한 보안상의 위협이 된다. 말썽꾸러기들은 이들 프로그램을 이용해서 버퍼 오버플로우 공격을 하거나 트로얀으로 바꿔치기를 한다.

모든 SUID 프로그램을 찾으려면 “ls -alF `find / -perm -4000` > /root/suid.txt” 명령을 실행한다. 명령 실행이 끝나고 /root/suid.txt 파일을 열면 아마 다음과 같은 목록이 보일 것이다.
 

-rwsr-xr-x 1 root root 35168 Sep 22 23:35 /usr/bin/chage
-rwsr-xr-x 1 root root 36756 Sep 22 23:35 /usr/bin/gpasswd
-r-xr-sr-x 1 root tty 6788 Sep 6 18:17 /usr/bin/wall
-rwsr-xr-x 1 root root 33152 Aug 16 16:35 /usr/bin/at
-rwxr-sr-x 1 root man 34656 Sep 13 20:26 /usr/bin/man
-r-s--x--x 1 root root 22312 Sep 25 11:52 /usr/bin/passwd
-rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/suidperl
-rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/sperl5.00503
-rwxr-sr-x 1 root slocate 24744 Sep 20 10:29 /usr/bin/slocate
-rws--x--x 1 root root 14024 Sep 9 01:01 /usr/bin/chfn
-rws--x--x 1 root root 13768 Sep 9 01:01 /usr/bin/chsh
-rws--x--x 1 root root 5576 Sep 9 01:01 /usr/bin/newgrp
-rwxr-sr-x 1 root tty 8328 Sep 9 01:01 /usr/bin/write
-rwsr-xr-x 1 root root 21816 Sep 10 16:03 /usr/bin/crontab
-rwsr-xr-x 1 root root 5896 Nov 23 21:59 /usr/sbin/usernetctl
-rwsr-xr-x 1 root bin 16488 Jul 2 10:21 /usr/sbin/traceroute
-rwxr-sr-x 1 root utmp 6096 Sep 13 20:11 /usr/sbin/utempter
-rwsr-xr-x 1 root root 14124 Aug 17 22:31 /bin/su
-rwsr-xr-x 1 root root 53620 Sep 13 20:26 /bin/mount
-rwsr-xr-x 1 root root 26700 Sep 13 20:26 /bin/umount
-rwsr-xr-x 1 root root 18228 Sep 10 16:04 /bin/ping
-rwxr-sr-x 1 root root 3860 Nov 23 21:59 /sbin/netreport
-r-sr-xr-x 1 root root 26309 Oct 11 20:48 /sbin/pwdb_chkpwd

 

왼쪽에 보이는 것들이 각 파일의 퍼미션이다: “s” 문자가 SUID 비트가 설정되어 있다는 것을 나타낸다. SUID 비트를 없애면 루트 사용자만 그 프로그램을 실행해서 작업할 수 있다. 하지만 어떤 프로그램이 SUID 비트를 안전하게 끌 수 있는 대상인지 결정해야 한다-- 많은 SUID 프로그램들에게 일반적인 작업수행을 위해 SUID 비트가 필요하다. 물론 많기는 하지만, 어떤 방법을 써서라도 루트 사용자만 프로그램을 실행할 수 있도록 설정해야 한다.

아무튼 “chmod a-s filename” 명령을 사용하면 SUID 비트를 끌 수 있다. 이 단계에서 다음 프로그램은 SUID 비트를 제거할 것을 권한다: /usr/bin/chage, /usr/bin/gpasswd, /usr/bin/wall, /usr/bin/chfn, /usr/bin/chsh, /usr/bin/newgrp,
 /usr/bin/write, /usr/sbin/usernetctl, /usr/sbin/traceroute, /bin/mount, /bin/umount, /bin/ping, /sbin/netreport.

 

시스템 무결성 점검 Checking system integrity

마지막으로 할 일은 여러분의 시스템이 이상한 일이 생기거나 조금이라도 바뀔 때 여러분에게 경고하도록 설정하는 것이다. 만약 어떤 침입자가 몰래 들어와서 트로얀을 심고 새로운 계정을 만든다면, 어떤 것들이 바뀌었는지 시스템이 우리에게 알려주도록 만들고 싶을 것이다. 이런 일을 하는 좋은 프로그램들이 몇 가지 있는데 내가 써본 것 가운데 가장 쉬운 도구는 fcheck이다.(http://sites.netscape.net/fcheck/fcheck.html 에서 가져다 쓸 수 있다) 아래에서 이 프로그램을 설치하고 조율하는 방법을 소개한다.

설치와 설정이 끝나면 여러분은 최소한 하루에 한 번 이 프로그램을 실행해서 그 결과를 루트 디렉토리에 남기기를 바랄 것이다. 이렇게 주기적으로 작업하려면 crond를 사용한다. “crontab -e”명령으로 cron 작업에 다음과 같이 추가한다:
 

1 0 * * * /usr/local/fcheck/fcheck -a > /root/fcheck.txt

 

점검할 경로는 여러분 자신의 것으로 적절하게 바꾸어서 쓴 다음 저장하고 끝낸다. 이제부터는 매일 밤 12시 1분에 fcheck가 실행되어서 /root/fcheck.txt 파일에 점검 결과를 저장할 것이다. fcheck가 여러분이 손대지 않은 파일에서 변경된 흔적을 찾았다면 즉시 그 패키지를 시스템에서 지워버리고 RedHat CD에서 다시 설치해야 한다. 여러분 자신이 파일을 바꾸어야 할 때가 있다면 “fcheck -ca” 명령을 다시 실행하고 또다른 베이스라인을 구성할 필요가 있다.

 

마치며

인터넷에 시스템을 연결하는 것은 그나마 안전하다. 모든 작업이 끝나면 여러분은 시스템의 보안상태를 테스트해야 하는데 Gibson Research Corporation에서는 포트 스캔 서비스를 제공한다. 이상적인 세계에서 모든 포트는 스텔스 모드로 있어야 한다. 여러분의 IP 주소에서는 어떤 요청이 포트로 들어와도 응답하지 않고, 마치 어떤 시스템도 연결되지 않은 것처럼 바깥에 보여야 한다. 문제가 될 만한 포트는 닫혀 있어야 하는데, 이 것은 응답은 하되 어떤 요청도 받아들이지 않는 것을 뜻한다: 포트를 닫아도 어떤 종류의 공격에는 안전하지 못할 것이다.

열린 포트는 당연히 안전하지 못하다. 여러분의 시스템에 열린 포트가 있다면 당장 inetd.conf 파일로 돌아가서 모든 설정을 지워버려야 한다. 그리고 아파치나 wu-ftpd, 또는 그 밖의 데몬들이 설치되어 있는지 확인하고 ipchains 설정을 다시 살펴서 패킷들을 제대로 걸러내는지 확인해야 한다. 침입자가 개인적인 용도로 포트를 열지나 않았는지 주기적으로 점검하는 것도 좋은 생각이다.

이제 많은 설정들을 마치고 다시 확인까지 했지만, 이 것이 리눅스 보안의 끝이 아니라 단지 출발점일 뿐이라는 것을 말해두고 싶다. 나는 매우 기본적인 보안 방법들만을 여러분에게 제안한 것으로 훨씬 더 많은 일들이 아직 남아 있다.

더 전문적인 솔루션을 바깥에서 찾아보는 것은 여러분이 보호해야 할 대상이 무엇이냐에 달려 있다. 집에서 개인적으로 구축한 서버라면 이 글에서 소개한 것만으로도 쓸만 하겠지만 아무리 작은 네트워크라도 상업적인 것이라면 데이터를 안전하게 보호해야 할 것이고 여러분은 가능한 한 많은 보안 이슈와 기능들을 배우고 익혀야 할 것이다.

 

Copyright 2000, Chris Stoddard
Published in Issue 55 of Linux Gazette,
July 2000

관련자료

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

공지사항


뉴스광장


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