번역자 : 문태준 ( taejun@taejun.pe.kr http://tunelinux.pe.kr http://
taejun.pe.kr http://database.sarang.net )
번역자 첨부 : 본 문서는 리눅스 시스템을 보호하기 위한 기본적인 정책에
대해 설명을 한다. 양은 적지만 핵심적인 부분에 대해서 잘 언급하고 있으
며 예제를 통해 설정사항을 참고할 수 있다. 이 글을 쓴 저자의 홈페이지
를 방문하면 여러 가지 유용한 자료들이 있다. KLDP에서 리눅스 보안 하우
투 등과 갈이 해서 보면 좋을 것이다. 본 번역글의 오역으로 인한 피해에
대해서는 본인이 책임을 지지 않으며 번역자의 이름과 출처를 밝히면 어느
곳이든 옮길 수 있다. 단 상업적인 목적으로 사용시는 번역자의 허락을 받
아야한다.
전세계의 많은 회사에서 업무에 리눅스를 도입하고 있다. 인터넷에서 주요
한 서비스를 제공하게 되면서 또한 공격 목표가 되기도 한다. 이러한 리눅
스 시스템을 보호하기 위해 여기서는 리눅스 시스템의 기본적인 보안에 대
해 설명한다. 여기서 제공하는 예제는 레드햇 6.0에 기반한 것이지만 대부
분의 다른 리눅스 배포판에도 적용할 수 있다.
설치
시스템 보안을 시작하는 가장 좋은 단계는 운영체제 설치 시점이다. 새로
구축하는 시스템이기 때문에 이전에 설치했던 것을 신뢰할 필요는 없다.
시스템을 새로 설치함으로서 시스템의 완전성을 보증할 수 있다. 시스템을
네트웍에서 분리시키자. 시스템을 활동중인 네트웍이나 인터넷에 연결해서
잠재적으로 위험가능성에 두고 싶지는 않을 것이다. 나는 개인적으로 인터
넷에 연결된 15분동안 script kiddie 에 의해 해킹당하는 것을 목격하였
다. 중요한 파일과 패치를 뒤에 설치하기 위해 다른 한 대의 컴퓨터가 더
필요하다. 이 컴퓨터를 이용해 인터넷에서 파일을 받고 구축할 시스템에
파일을 전송하거나 CDROM으로 굽자.
분리된 네트웍에 시스템을 두었다면 이제 시작하자. 첫 번째로는 운영체제
를 선택해야한다. 레드햇 6.0의 경우 워크스테이션, 서버, 커스텀(기본값)
의 세가지 옵션이 있다. 커스텀을 추천하는데 설치할 서비스를 선택할 수
있고 파티션을 원하는대로 나눌 수 있다. 최소한의 패키지를 선택하는 것
이 좋으며 이럴 경우 관리하기가 가장 편리하다. 설치한 소프트웨어가 적
을수록 보안관련된 문제가 적게 발생할 것이다. 뉴스나 리얼 오디오 서버
가 필요없으면 설치를 하지 않는다는 말이다. 리눅스가 좋은 것은 나중에
패키지를 추가하는 것이 쉽다는 것이다. 어떤 설치방법을 택했든 상관없이
매뉴얼 페이지와 하우투 문서는 설치한다. 온라인 맨 페이지와 문서는 주
요한 정보자원중의 하나로 시스템에 문제를 발생시킬 일은 거의 없다.
커스텀을 선택하였다면 파티션을 나누어야한다. 나는 가능한한 루트 파티
션을 크게 잡는 것을 좋아하며 모든 것을 여기에 넣는다. 그러면 나중에
공간이 부족한 일이 생기지 않을 것이다. 그러나 루트 드라이브를 보호하
기 위해 몇가지 파티션이 더 필요하다. 루트 파티션에 로그나 이메일등의
자료를 넣으면 시스템을 붕괴시킬 가능성이 있는 서비스 거부 공격(DOS)에
처할 위험이 있다.
그래서 나는 언제나 /var 파티션을 분리할 것을 추천한다. 여기에는 모든
시스템 로그와 이메일이 들어간다. /var 파티션을 분리해서 루트 파티션이
꽉 차는 것을 막을 수 있다. /var 에 400MB 이상이 필요하다. (메일처리가
많다면 값을 더 늘린다) 또한 로그를 엄청나게 남기는 특정한 애플리케이
션을 위해 몇 개의 파티션을 더 만들 필요가 있으며 사용자가 많다면 /hom
e 도 필요하다. 이런 단계를 거치면 파티션은 다음과 같을 것이다:
/ - 기타 모든 데이타
/var - 400 MB
swap - (일반적으로 256MB 사용)
설치후 재부팅하고 나서 추천되고 있는 보안 패치를 설치해야한다. 레드햇
의 경우 Red Hat''s errata support site에서 보안 패치를 찾을 수 있다.
패치는 시스템을 보호하기 위해 중요하며 항상 업데이트해야한다. bugtr
aq@securityfocus.com 또는 redhat-watch-list-request@redhat.com 는 버
그와 시스템 패치를 찾는데 훌륭한 정보가 된다. 이러한 패치를 하지 않는
다면 시스템이 손쉽게 손상받을 수 있다. 패치를 하는 경우 리눅스 시스템
을 분리된 네트웍에 두어야 한다는 것을 명심하자. 레드햇의 경우 rpm을
다운받았다면 다음의 명령으로 쉽게 업데이트할 수 있다. wu-ftpd 의 보안
업데이트 예제는 다음과 같다.
rpm -Uvh wu-ftpd-2.6.0-1.i386.rpm
이미 네트웍에 연결되어 있는 시스템의 경우 다음과 같이 ftp에서 rpm을
받아 설치할 수 있다.
rpm -Uvh ftp://updates.redhat.com/5.2/i386/wu-ftpd-2.6.0-1.i386.rpm
레드햇 6.1에서는 ''up2date'' 라는 패치용 유틸리티가 있다. 이 유틸리티를
사용할 것을 강력하게 추천한다. 로컬 시스템에서 운영할 경우 어떤 rpm을
업데이트할지 결정하고 레드햇 웹사이트에서 다운받아서 설치를 한다. 조
건에 맞게 변경하기 좋고 사용하기도 쉽다.
서비스 제거
패키지와 패치를 설치하고 재부팅했다면 이제 운영체제 보안을 설정한다.
서비스 제거, 로그 기록하기, 주요 파일 변경, TCP 래퍼 설정 등으로 시스
템을 보호할 수 있다. 먼저 서비스를 제거한다.
기본적으로 리눅스는 많은 유용한 서비스를 실행하는 강력한 운영체제이
다. 그러나 대부분의 서비스가 불필요하고 잠재적인 보안 위협에 접해있
다. 첫 번째로 /etc/inetd.conf를 수정한다. 이 파일은 /usr/sbin/inetd
대몬에서 어떤 서비스를 처리할지 지정한다. 기본적으로 /etc/inetd.conf
는 다양한 서비스로 구성되어 있으며 대부분 ftp 와 텔넷만 필요하다. 불
필요한 서비스에 주석을 달아서 제거할 수 있다. (example A). inetd에
의해 실행되는 서비스의 대부분이 심각한 보안위협이 될 수 있는데 popd,
imapd, rsh 등이 있다. 다음의 명령을 통해 어떤 서비스를 설정했는지 확
인하자. (다음 명령은 주석처리 하지 않은 서비스를 보여준다)
grep -v "^#" /etc/inetd.conf
다음 단계는 .rc 스크립트로서 init 프로세스에서 어떤 서비스를 실행할지
결정한다. 레드햇의 경우 /etc/rc.d/rc3.d (Gnome이나 KDE와 같은 GUI로
자동 부팅하는 경우에는 /etc/rc.d/rc5.d) 디렉토리에서 스크립트를 찾을
수 있다. 스크립트 시작을 멈추려면 대문자 S를 소문자 s 로 바꾸면 된다.
소문자 s 를 대문자 S 로 바꾸면 다시 손쉽게 스크립트를 시작할 수 있다.
레드햇에 들어있는 유틸리티를 이용한다면 "/usr/sbin/setup" 명령을 치고
"System Services" 를 고른후 부팅시 시작할 서비스를 고른다. 또다른 프
로그램으로는 chkconfig 가 있는데 대부분의 배포판에 들어있다. 다음의
시작 스크립트는 기본적으로 설치가 되지만 시스템을 운영하는데는 중요하
지 않다. 필요없다면 스크립트를 off로 하자. 이름앞의 숫자는 초기화 순
서번호로서 배포판과 버전에 따라 다르다. 대문자 S 대신 대문자 K로 시작
하는 스크립트는 이미 운영중인 서비스를 죽이는데 유용하다.
S05apmd (랩탑에서만 필요)
S10xntpd (Network time protocol)
S11portmap (NIS나 NFS와 같은 rpc 서비스에 필요)
S15sound (사운드 카드 설정 저장)
S15netfs (nfs 클라이언트로 nfs 서버에서 파일시스템 마운팅에 필요)
S20rstatd (모든 r 서비스를 실행하지 않는 것이 좋다. 원격 사용자에
게 너무 많은 정보를 주기 때문이다)
S20rusersd
S20rwhod
S20rwalld
S20bootparamd (디스크없는 클라이언트에서 사용하며 이런 취약한 서비스
가 필요하지는 않을 것이다)
S25squid (Proxy server)
S34yppasswdd (NIS 서버에서 필요하며 매우 취약한 서비스이다)
S35ypserv (NIS 서버에서 필요하며 매우 취약한 서비스이다)
S35dhcpd (dhcp server daemon)
S40atd (cron과 비슷하며 at 서비스에 사용하며 필요하지 않다)
S45pcmcia (랩탑에서만 필요)
S50snmpd (SNMP 대몬으로 원격 사용자에게 시스템의 상세한 정보를 줄
수 있다)
S55named (DNS server. DNS를 설정한다면 BIND의 가장 최신 버전으로
업데이트해야한다. http://www.isc.org/bind.html)
S55routed (RIP, 정말로 필요하지 않으면 운영하지 말자)
S60lpd (Printing services)
S60mars-nwe (Netware file and print server)
S60nfs (NFS 서버에 사용하며 절대적으로 필요한게 아니라면 돌리지
말자)
S72amd (AutoMount daemon, 원격 파일 시스템 마운트에 사용)
S75gated (OSPF와 같은 다른 라우팅 프로토콜을 운영하는데 필요)
S80sendmail (없어도 이메일을 보낼 수 있으며 메일을 받거라 릴레이를
못할 뿐이다)
S85httpd (Apache webserver, 최신 버전으로 업데이트 할 것을 추천.
http://www.apache.org/)
S87ypbind (NIS 클라이언트라면 필요)
S90xfs (X font server)
S95innd (News server)
S99linuxconf (브라우저를 이용 원격으로 리눅스 시스템 설청하는데 필
요)
시작 스크립트를 변경하기 전에 얼마나 많은 서비스를 현재 사용하고 있는
지 확인한다.
ps aux | wc -l
설치를 마치고 시작 스크립트를 off 한다음 위 명령어를 다시 치고 얼마나
많은 서비스 숫자가 줄었는지 비교해본다. 서비스를 적게 실행할수록 좋
다. 또한 다음 명령을 통해 어떤 서비스가 여전히 돌고 있는지 확인하자.
netstat -na --ip
로그기록과 시스템 변경하기(Tweaking )
가능한한 많은 서비스를 제거했다면 로그기록을 하도록 설정한다. 모든 시
스템 로그는 /var/log에 남는다. 기본적으로 리눅스는 훌륭하게 로그기록
을 남기는데 ftp만 예외다. ftp 로그기록에는 두가지 옵션이 있으며 /etc/
ftpaccess 파일이나 /etc/inetd.conf 파일을 수정한다. 나는 /etc/inetd.c
onf 를 수정하길 더 좋아하는데 왜냐, 간단하기때문이다. 모든 ftp 세션에
대해 전체 로그기록을 나기려면 다음과 같이 수정한다.
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L
-i -o
--- From the man pages ---
If the -l option is specified, each ftp session is logged in the sysl
og
If the -L flag is used, command logging will be on by default as soon
as the ftp server is invoked. This will cause the server to log a
ll USER commands, which if a user accidentally enters a password for
that command instead of the username, will cause passwords to be logg
ed via syslog.
If the -i option is specified, files received by the ftpd(8) server w
ill be logged to the xferlog(5).
If the -o option is specified, files transmitted by the ftpd(8) serve
r will be logged to the xferlog(5).
--- snip snip ---
다음은 시스템 설정 변경하기이다. 여기에는 다양한 파일 관리가 포함된
다. 먼저 할 것은 /etc/passwd 파일을 안전하게 하는 것이다. 첫 번째로
쉐도우 비밀번호를 사용한다. 쉐도우 비밀번호는 루트만 접근할 수 있는
파일에 해쉬값을 넣어 모든 사용자의 비밀번호를 저장한다. 사용자의 비밀
번호에 쉽게 접근하여 크랙하는 것을 방지한다(해커가 가장 먼저 찾는 것
중 하나임). 레드햇 6.0에서는 쉐도우 비밀번호 사용이 기본이다. 우리가
해야 할 것은 루트로 다음 명령을 치는 것이다. 그러면 자동으로 비밀번호
를 /etc/shadow 파일로 변환한다. 이것이 시스템의 보안을 유지하는데 가
장 중요한 것중 하나라고 생각한다.
pwconv
두 번째로는 패스워드 파일에서 대부분의 기본 시스템 계정을 없앤다. 리
눅스에서는 우리에게 불필요한 다양한 시스템 활동을 위한 계정을 제공한
다. 이런 계정이 필요없다면 없애자. 계정이 많을수록 시스템에 접속하기
가 쉽다. "news" 계정을 예로 들어보자. 뉴스 서버인 nntp 를 실행하지 않
느다면 계정이 필요없다. (/etc/cron.hourly에서 "news" 사용자를 찾기 때
문에 이 파일도 업데이트해야한다) 또한 익명 ftp를 운여하지 않으면 "ftp
" 계정도 없앤다. 맨 페이지에서는 다음과 같이 설명한다.
man ftpd:
Ftpd authenticates users according to four rules.
4) If the user name is ``anonymous'''' or ``ftp'''', an anon
ymous ftp account must be pre-sent in the password file (user ``ftp''
''). In this case the user is allowed to log in by specifying any pas
sword (by convention this is given as the client host''s name).
나의 /etc/passwd 파일 예저는 다음과 같다. example C.
우리는 또한 /etc/ftpusers 파일을 변경하길 원할 것이다. (example D).
이 파일에 등록되어 있는 계정은 ftp 에 접속할 수 없다. 주요 계정인 roo
t, bin 등의 계정으로 ftp 세션 연결하는 것을 제한한다. 리눅스는 이 파
일을 기본적으로 가지고 있다. 루트가 ftp로 접속할 수 없도록 루트 계정
이 들어있는지 확인하자. ftp 접속에 필요한 계정이 이 파일에 들어있지
않은지도 확인하자.
또한 루트는 텔넷 접속을 할 수 없도록 되어있는지 확인한다. 다른 사용자
로 시스템에 접속한 후 su를 이용 루트로 바꾸면 된다. /etc/securetty 파
일에서 루트가 접속할 수 있는 tty를 설정한다. 이 파일에 오직 tty1, tty
2만 되어있다면 루트는 지역적인 접근만 가능하다. ttyp1, ttyp2는 pseudo
터미널로 루트가 원격으로 텔넬 접속을 할 수 있도록 한다. (example E).
마지막으로 /etc/issue 파일을 만든다. 이 파일은 텔넷 로그인했을 때 나
오는 아스키 텍스트 배너이다. (example B). 어떤 사용자든 시스템에 로그
인할 때 나오는 정보이다. 동일한 내용을 계속 보여주길 원하면 /etc/rc.d
/init.d/S99local 파일을 수정한다. 기본적으로 리눅스는 재부팅할때마다
새로운 /etc/issue 파일을 만든다.
서버에 연결하기
원격으로 관리를 하는 경우 서버연결을 안전하게 하는 것이 중요하다. 보
통 시스템 관리와 파일 업로드를 위해 원격으로 접근하는데 이 경우 통신
이 암호회되어야한다. 여기서는 ssh 와 TCP 래퍼에 대해 설명하겠다.
나는 ssh를 좋아하는데 ssh는 방화벽과 시스템 사이의 모든 통신을 암호화
한다. tcp 래퍼는 네트웍 트래픽에서 스니핑하는 것을 막지는 못한다. 네
트웍상에서 사용자가 타이핑하는 것(비밀번호 포함) keystrokes 을 모두
모니터링할 수 있다. 방화벽과의 통신을 다른 사람이 모니터링하는 것을
막고자한다면 텔넷/ftp 대신 ssh를 사용하길 추천한다. ssh는 모든 통신을
암호화하며 안전한 방법으로 파일 업로드와 시스템 관리를 할 수 있다. ss
h는 tcp 래퍼와 비슷하게 독자적인 로그기록기능을 가지고 있고 접속 제한
을 할 수 있다. 소스와 ssh 클라이언트 및 서버 대몬을 포함해 ssh에 대한
더 자세한 정보는 ssh here 에서 찾자. 나는 라이센스 제한이 있는 2.x
버전보다는 1.2.x 버전을 추천한다. 또다른 ssh 프로그램으로는 Openssh
가 있다.
TCP 래퍼는 암호화를 지원하지 않지만 시스템에 접속하는 사용자에 대해
로그를 남기고 제어할 수 있다. inetd 서비스를 통해 실행되는 telnet, ft
p 등을 감싸는 프로그램이다. tcp 래퍼를 이용 시스템에서 inetd 연결에
대한 래퍼를 수행한후 모든 시도에 대해 로그를 남기고 접근 권한 목록에
맞는지 확인을 한다. 연결이 허용되면, tcp 래퍼는 연결을 텔넷등과 같은
적당한 프로그램으로 연결한다. 접근 권한 목록에 의해 연결이 거부당하면
연결이 끊어진다. 다행히도 리눅스에 TCP 래커는 이미 설치되어 있기 때
문에 /etc/hosts.allow 와 /etc/hosts.deny 파일을 수정하기만 하면 된다.
이 파일에서 사용자의 접근 허가, 거부를 할 수 있다. 물론 TCP 래퍼는
배너를 보여주거나 safe_finger 같은 다른 프로그램을 불러올 수 있다. 문
법은 상대적으로 간단하다. /etc/hosts.allow 파일에 접속을 허용할 ip 주
소나 네트웍을 적어주면 된다. /etc/hosts.deny 파일에 접속을 거부할 ip
나 네트웍을 적어주면 된다. 기본적으로 리눅스는 모든 곳에서 접속을 허
용하고 있으며 이 파일을 수정해야한다. tcp 래퍼로 작업을 할 경우 두가
지를 추천한다.
시스템이나 도메인 이름 대신 ip 주소 사용
/etc/hosts.deny 에 모든 것을 거부하는 것으로 설정한다(ALL). 그러고나
서 특정한 사이트에 대해 /etc/hosts.allow을 이용 접속을 허용한다.
이에 대한 예제 example F. TCP 래퍼를 어떻게 사용할지에 대해 더 많은
자료가 필요하면 Intrusion Detection을 이용한다.
진정한 편집증(Paranoid)을 위하여
위에서 설명한 것은 절대적으로 필요한 것이라 생각을 한다. 다음 단계를
통해 시스템 보안을 극대화해보자. 불행히도 시스템은 100% 안전할 수 없
고 그럴 수도 없다. 그래서 더 완벽한 보안을 위해 몇가지 단계를 추가했
다.
먼저 wheel 그룹을 만든다. wheel 그룹은 /bin/su 와 같은 강력한 명령을
실행할 수 있는 개별적인 사용자 그룹이다. 이러한 명령에 접근할 수 있는
사용자를 제한해서 시스템 보안을 향상시킬 수 있다. /etc/group 파일을
수정해서 wheel 그룹을 추가하고 시스템 관리자를 이 그룹에 넣는다. 그러
고나서 /bin/su와 같은 주요한 시스템 파일을 변경한다. 그룹 소유권을 wh
eel로 바꾸고 소유자와 그룹만 실행가능하도록 허가권을 바꾼다. (특정한
프로그램의 경우 suid 와 guid를 보존하고 있어야한다) /bin/su의 겨우 다
음과 같이 한다:
/bin/chgrp wheel /bin/su
/bin/chmod 4750 /bin/su
두 번째로는 .rhosts, .netrc, /etc/hosts.equiv 파일에 락을 걸어 사용못
하게 한다. r 명령은 시스템에 접그하는데 이러한 파일을 이용한다. 락을
걸어 이러한 파일을 사용하지 못하게 하기 위해서 touch로 파일을 만들고
허가권을 0으로 바꾼다. 그러면 누구도 이 파일을 생성하거나 변경할 수
없다. 예제를 보자.
/bin/touch /root/.rhosts /root/.netrc /etc/hosts.equiv
/bin/chmod 0 /root/.rhosts /root/.netrc /etc/hosts.equiv
세 번째로 /etc/shadow에 crypt(3) 함수 대신 MD5 hashes를 사용하도록 설
정한다. 비밀번호 파일을 크랙하기 힘들도록 암호화한다. 이건 PAM 모듈을
수정함으로써 수행된다. PAM (Pluggable Authentication Modules) 은 애플
리케이션에서 사용자를 인증하는데 어떠한 방법을 택할 것인지를 가능하게
하는 공유 라이브러리 모음이다. PAM에 대해 더 상세하게 알려면 다음 사
이트를 참고하자. ftp://ftp.us.kernel.org/pub/linux/libs/pam/Linux-PAM
-html/pam.html
예전에는 MD5 hashes를 사용하기 위해 바꾸려면 PAM 모듈을 수동으로 변경
해야했다. 그런데 레드햇 6.0 이후 버전에서는 setup 유틸리티에서 MD5 ha
shes를 선택할 수 있다. setup 명령을 치고 "authentication configuratio
n"에서 선택을 하면 된다. 여기서 MD5 hashes를 선택한다. 그러나 MD5 has
hes는 사용자가 비밀번호를 다시 입력하기 전에는 효과를 발휘하지 못한
다. setup 유틸리티가 없는 배포판(레드햇 5.2 이전)을 가진 경우에는 여
전히 PAM 모듈을 수동으로 변경해야 한다. (example G).
bash를 사용하는 경우 나는 .bash_history 파일을 선호하지 않는다. 다른
사람(루트 포함)이 내가 사용했던 명령을 알기를 원하지 않는다. 그래서
내 .bash_profile에 다음과 같이 설정했다:
HISTFILESIZE=0
이건 .bash_history 파일에 아무것도 기록을 하지 않는다는 의미이다. 나
는 HISTSIZE 환경변수를 이용 여전히 히스토리 기능을 이용하여 명령을
다시 불러 사용하지만 명령어 히스토리는 .bash_history 파일에 기록을 하
지는 않는다.
마지막으로 물리적인 접근으로부터 시스템을 보호하는 것이다. BIOS에 비
밀번호를 설정할 수 있다. 또한 /etc/lilo.conf 에 xxx 라는 비밀번호를
설정(password=xxx)하여 부팅시 시스템에 비밀번호 보안을 할 수 있다. 그
렇지만 기억해야 할 것은 누군가가 시스템에 물리적으로 접근할 수 있다면
시스템을 보호할 방법이 없다.
IPChains
IPChains를 다루지 않고 리눅스 보안을 이야기할 수 없다. ipchains는 2.
2.x 이상 버전의 커널에 함께 있는 기능으로 패킷 필터링 소프트웨어이다.
레드햇 6.0 이상 버전을 운영하는 경우 리눅스 설치시 함께 설치된다. IPC
hains는 시스코 접근 권한 목록과 비슷한데 리눅스 시스템에서 들어오고
나가는 패킷을 제어할 수 있다. 주로 방화벽 애플리케이션으로 사용되며
단일 리눅스 시스템에서도 시스템을 보호하는데 사용할 수 있다. 단일 시
스템을 보호하기 위해 처음 시작시 다른 곳에서 시도하는 TCP 연결은 거부
하도록 IPChains를 설정한다. 모든 UDP, ICMP 연결을 허용한다. 마지막으
로 거부된 모든 연결을 로그에 기록하여 다른 사람이 어디에서 무엇을 했
는지를 알 수 있도록 설정한다. 그런데 브로드캐스트/멀티캐스트 트래픽은
시스템 로그를 빠르게 채우기 때문에 거부하지만 로그에 기록하지는 않는
다. 단일 시스템을 보호하기 위해 IPChains를 설정한 경우는 다음과 갈다.
bash# ipchains -L
Chain input (policy DENY):
target prot opt source destination ports
DENY all ------ 0.0.0.0 anywhere n/a
DENY all ------ anywhere 255.255.255.255 n/a
DENY all ------ anywhere BASE-ADDRESS.MCAST.NET/8 n/a
ACCEPT tcp !y---- anywhere anywhere any -> any
ACCEPT udp ----l- anywhere anywhere any -> any
ACCEPT icmp ----l- anywhere anywhere any -> any
DENY all ----l- anywhere anywhere n/a
Chain forward (policy ACCEPT):
Chain output (policy ACCEPT):
이에 대한 설정 파일을 보려면 example H를 보자. 단일 시스템에서 방화벽
용으로 IPChains를 사용하는 방법은 IPChains HOWTO를 참고하기 바란다.
결론
리눅스 시스템(레드햇 배포판)을 보호하는데 관련된 기본적인 단계를 짚어
보았다. 안전한 시스템을 구축하는 기본은 최소한의 소프트웨어를 설치하
고 TCP 래퍼, IPChains와 갈은 보안설정을 하며 쉐도우 비밀번호를 사용하
는 것이다. 이에 추가해 몇가지 작업이 있는데 tripwire (시스템 바이너리
변화 모니터링)와 swatch (자동화된 로그 모니터링 및 경고 프로그램)등이
있다. 또한 단계적으로 리눅스 시스템을 자동으로 보호하도록 하는 펄 스
크립트인 Bastille Linux를 사용해볼 것을 추천한다. 기억해야 할 것은 어
떤 시스템도 100% 안전할 수는 없다. 그렇지만 위에서 말한 작업을 진행하
면 보안 위협을 상당히 줄일 수 있다.
저자 소개
Lance Spitzner 는 집에서 유닉스 시스템을 운영하는 법에 대해 배우는 것
을 좋아한다. 그는 이전에 Officer in the Rapid Deployment Force 에 있
었으며 여러 가지 일을 했다. 그에게 연락을 하려면 lance@spitzner.net을
이용하면 된다.
* :맥노턴님에 의해서 게시물 이동되었습니다 (2002-07-28 16:14)
taejun.pe.kr http://database.sarang.net )
번역자 첨부 : 본 문서는 리눅스 시스템을 보호하기 위한 기본적인 정책에
대해 설명을 한다. 양은 적지만 핵심적인 부분에 대해서 잘 언급하고 있으
며 예제를 통해 설정사항을 참고할 수 있다. 이 글을 쓴 저자의 홈페이지
를 방문하면 여러 가지 유용한 자료들이 있다. KLDP에서 리눅스 보안 하우
투 등과 갈이 해서 보면 좋을 것이다. 본 번역글의 오역으로 인한 피해에
대해서는 본인이 책임을 지지 않으며 번역자의 이름과 출처를 밝히면 어느
곳이든 옮길 수 있다. 단 상업적인 목적으로 사용시는 번역자의 허락을 받
아야한다.
전세계의 많은 회사에서 업무에 리눅스를 도입하고 있다. 인터넷에서 주요
한 서비스를 제공하게 되면서 또한 공격 목표가 되기도 한다. 이러한 리눅
스 시스템을 보호하기 위해 여기서는 리눅스 시스템의 기본적인 보안에 대
해 설명한다. 여기서 제공하는 예제는 레드햇 6.0에 기반한 것이지만 대부
분의 다른 리눅스 배포판에도 적용할 수 있다.
설치
시스템 보안을 시작하는 가장 좋은 단계는 운영체제 설치 시점이다. 새로
구축하는 시스템이기 때문에 이전에 설치했던 것을 신뢰할 필요는 없다.
시스템을 새로 설치함으로서 시스템의 완전성을 보증할 수 있다. 시스템을
네트웍에서 분리시키자. 시스템을 활동중인 네트웍이나 인터넷에 연결해서
잠재적으로 위험가능성에 두고 싶지는 않을 것이다. 나는 개인적으로 인터
넷에 연결된 15분동안 script kiddie 에 의해 해킹당하는 것을 목격하였
다. 중요한 파일과 패치를 뒤에 설치하기 위해 다른 한 대의 컴퓨터가 더
필요하다. 이 컴퓨터를 이용해 인터넷에서 파일을 받고 구축할 시스템에
파일을 전송하거나 CDROM으로 굽자.
분리된 네트웍에 시스템을 두었다면 이제 시작하자. 첫 번째로는 운영체제
를 선택해야한다. 레드햇 6.0의 경우 워크스테이션, 서버, 커스텀(기본값)
의 세가지 옵션이 있다. 커스텀을 추천하는데 설치할 서비스를 선택할 수
있고 파티션을 원하는대로 나눌 수 있다. 최소한의 패키지를 선택하는 것
이 좋으며 이럴 경우 관리하기가 가장 편리하다. 설치한 소프트웨어가 적
을수록 보안관련된 문제가 적게 발생할 것이다. 뉴스나 리얼 오디오 서버
가 필요없으면 설치를 하지 않는다는 말이다. 리눅스가 좋은 것은 나중에
패키지를 추가하는 것이 쉽다는 것이다. 어떤 설치방법을 택했든 상관없이
매뉴얼 페이지와 하우투 문서는 설치한다. 온라인 맨 페이지와 문서는 주
요한 정보자원중의 하나로 시스템에 문제를 발생시킬 일은 거의 없다.
커스텀을 선택하였다면 파티션을 나누어야한다. 나는 가능한한 루트 파티
션을 크게 잡는 것을 좋아하며 모든 것을 여기에 넣는다. 그러면 나중에
공간이 부족한 일이 생기지 않을 것이다. 그러나 루트 드라이브를 보호하
기 위해 몇가지 파티션이 더 필요하다. 루트 파티션에 로그나 이메일등의
자료를 넣으면 시스템을 붕괴시킬 가능성이 있는 서비스 거부 공격(DOS)에
처할 위험이 있다.
그래서 나는 언제나 /var 파티션을 분리할 것을 추천한다. 여기에는 모든
시스템 로그와 이메일이 들어간다. /var 파티션을 분리해서 루트 파티션이
꽉 차는 것을 막을 수 있다. /var 에 400MB 이상이 필요하다. (메일처리가
많다면 값을 더 늘린다) 또한 로그를 엄청나게 남기는 특정한 애플리케이
션을 위해 몇 개의 파티션을 더 만들 필요가 있으며 사용자가 많다면 /hom
e 도 필요하다. 이런 단계를 거치면 파티션은 다음과 같을 것이다:
/ - 기타 모든 데이타
/var - 400 MB
swap - (일반적으로 256MB 사용)
설치후 재부팅하고 나서 추천되고 있는 보안 패치를 설치해야한다. 레드햇
의 경우 Red Hat''s errata support site에서 보안 패치를 찾을 수 있다.
패치는 시스템을 보호하기 위해 중요하며 항상 업데이트해야한다. bugtr
aq@securityfocus.com 또는 redhat-watch-list-request@redhat.com 는 버
그와 시스템 패치를 찾는데 훌륭한 정보가 된다. 이러한 패치를 하지 않는
다면 시스템이 손쉽게 손상받을 수 있다. 패치를 하는 경우 리눅스 시스템
을 분리된 네트웍에 두어야 한다는 것을 명심하자. 레드햇의 경우 rpm을
다운받았다면 다음의 명령으로 쉽게 업데이트할 수 있다. wu-ftpd 의 보안
업데이트 예제는 다음과 같다.
rpm -Uvh wu-ftpd-2.6.0-1.i386.rpm
이미 네트웍에 연결되어 있는 시스템의 경우 다음과 같이 ftp에서 rpm을
받아 설치할 수 있다.
rpm -Uvh ftp://updates.redhat.com/5.2/i386/wu-ftpd-2.6.0-1.i386.rpm
레드햇 6.1에서는 ''up2date'' 라는 패치용 유틸리티가 있다. 이 유틸리티를
사용할 것을 강력하게 추천한다. 로컬 시스템에서 운영할 경우 어떤 rpm을
업데이트할지 결정하고 레드햇 웹사이트에서 다운받아서 설치를 한다. 조
건에 맞게 변경하기 좋고 사용하기도 쉽다.
서비스 제거
패키지와 패치를 설치하고 재부팅했다면 이제 운영체제 보안을 설정한다.
서비스 제거, 로그 기록하기, 주요 파일 변경, TCP 래퍼 설정 등으로 시스
템을 보호할 수 있다. 먼저 서비스를 제거한다.
기본적으로 리눅스는 많은 유용한 서비스를 실행하는 강력한 운영체제이
다. 그러나 대부분의 서비스가 불필요하고 잠재적인 보안 위협에 접해있
다. 첫 번째로 /etc/inetd.conf를 수정한다. 이 파일은 /usr/sbin/inetd
대몬에서 어떤 서비스를 처리할지 지정한다. 기본적으로 /etc/inetd.conf
는 다양한 서비스로 구성되어 있으며 대부분 ftp 와 텔넷만 필요하다. 불
필요한 서비스에 주석을 달아서 제거할 수 있다. (example A). inetd에
의해 실행되는 서비스의 대부분이 심각한 보안위협이 될 수 있는데 popd,
imapd, rsh 등이 있다. 다음의 명령을 통해 어떤 서비스를 설정했는지 확
인하자. (다음 명령은 주석처리 하지 않은 서비스를 보여준다)
grep -v "^#" /etc/inetd.conf
다음 단계는 .rc 스크립트로서 init 프로세스에서 어떤 서비스를 실행할지
결정한다. 레드햇의 경우 /etc/rc.d/rc3.d (Gnome이나 KDE와 같은 GUI로
자동 부팅하는 경우에는 /etc/rc.d/rc5.d) 디렉토리에서 스크립트를 찾을
수 있다. 스크립트 시작을 멈추려면 대문자 S를 소문자 s 로 바꾸면 된다.
소문자 s 를 대문자 S 로 바꾸면 다시 손쉽게 스크립트를 시작할 수 있다.
레드햇에 들어있는 유틸리티를 이용한다면 "/usr/sbin/setup" 명령을 치고
"System Services" 를 고른후 부팅시 시작할 서비스를 고른다. 또다른 프
로그램으로는 chkconfig 가 있는데 대부분의 배포판에 들어있다. 다음의
시작 스크립트는 기본적으로 설치가 되지만 시스템을 운영하는데는 중요하
지 않다. 필요없다면 스크립트를 off로 하자. 이름앞의 숫자는 초기화 순
서번호로서 배포판과 버전에 따라 다르다. 대문자 S 대신 대문자 K로 시작
하는 스크립트는 이미 운영중인 서비스를 죽이는데 유용하다.
S05apmd (랩탑에서만 필요)
S10xntpd (Network time protocol)
S11portmap (NIS나 NFS와 같은 rpc 서비스에 필요)
S15sound (사운드 카드 설정 저장)
S15netfs (nfs 클라이언트로 nfs 서버에서 파일시스템 마운팅에 필요)
S20rstatd (모든 r 서비스를 실행하지 않는 것이 좋다. 원격 사용자에
게 너무 많은 정보를 주기 때문이다)
S20rusersd
S20rwhod
S20rwalld
S20bootparamd (디스크없는 클라이언트에서 사용하며 이런 취약한 서비스
가 필요하지는 않을 것이다)
S25squid (Proxy server)
S34yppasswdd (NIS 서버에서 필요하며 매우 취약한 서비스이다)
S35ypserv (NIS 서버에서 필요하며 매우 취약한 서비스이다)
S35dhcpd (dhcp server daemon)
S40atd (cron과 비슷하며 at 서비스에 사용하며 필요하지 않다)
S45pcmcia (랩탑에서만 필요)
S50snmpd (SNMP 대몬으로 원격 사용자에게 시스템의 상세한 정보를 줄
수 있다)
S55named (DNS server. DNS를 설정한다면 BIND의 가장 최신 버전으로
업데이트해야한다. http://www.isc.org/bind.html)
S55routed (RIP, 정말로 필요하지 않으면 운영하지 말자)
S60lpd (Printing services)
S60mars-nwe (Netware file and print server)
S60nfs (NFS 서버에 사용하며 절대적으로 필요한게 아니라면 돌리지
말자)
S72amd (AutoMount daemon, 원격 파일 시스템 마운트에 사용)
S75gated (OSPF와 같은 다른 라우팅 프로토콜을 운영하는데 필요)
S80sendmail (없어도 이메일을 보낼 수 있으며 메일을 받거라 릴레이를
못할 뿐이다)
S85httpd (Apache webserver, 최신 버전으로 업데이트 할 것을 추천.
http://www.apache.org/)
S87ypbind (NIS 클라이언트라면 필요)
S90xfs (X font server)
S95innd (News server)
S99linuxconf (브라우저를 이용 원격으로 리눅스 시스템 설청하는데 필
요)
시작 스크립트를 변경하기 전에 얼마나 많은 서비스를 현재 사용하고 있는
지 확인한다.
ps aux | wc -l
설치를 마치고 시작 스크립트를 off 한다음 위 명령어를 다시 치고 얼마나
많은 서비스 숫자가 줄었는지 비교해본다. 서비스를 적게 실행할수록 좋
다. 또한 다음 명령을 통해 어떤 서비스가 여전히 돌고 있는지 확인하자.
netstat -na --ip
로그기록과 시스템 변경하기(Tweaking )
가능한한 많은 서비스를 제거했다면 로그기록을 하도록 설정한다. 모든 시
스템 로그는 /var/log에 남는다. 기본적으로 리눅스는 훌륭하게 로그기록
을 남기는데 ftp만 예외다. ftp 로그기록에는 두가지 옵션이 있으며 /etc/
ftpaccess 파일이나 /etc/inetd.conf 파일을 수정한다. 나는 /etc/inetd.c
onf 를 수정하길 더 좋아하는데 왜냐, 간단하기때문이다. 모든 ftp 세션에
대해 전체 로그기록을 나기려면 다음과 같이 수정한다.
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L
-i -o
--- From the man pages ---
If the -l option is specified, each ftp session is logged in the sysl
og
If the -L flag is used, command logging will be on by default as soon
as the ftp server is invoked. This will cause the server to log a
ll USER commands, which if a user accidentally enters a password for
that command instead of the username, will cause passwords to be logg
ed via syslog.
If the -i option is specified, files received by the ftpd(8) server w
ill be logged to the xferlog(5).
If the -o option is specified, files transmitted by the ftpd(8) serve
r will be logged to the xferlog(5).
--- snip snip ---
다음은 시스템 설정 변경하기이다. 여기에는 다양한 파일 관리가 포함된
다. 먼저 할 것은 /etc/passwd 파일을 안전하게 하는 것이다. 첫 번째로
쉐도우 비밀번호를 사용한다. 쉐도우 비밀번호는 루트만 접근할 수 있는
파일에 해쉬값을 넣어 모든 사용자의 비밀번호를 저장한다. 사용자의 비밀
번호에 쉽게 접근하여 크랙하는 것을 방지한다(해커가 가장 먼저 찾는 것
중 하나임). 레드햇 6.0에서는 쉐도우 비밀번호 사용이 기본이다. 우리가
해야 할 것은 루트로 다음 명령을 치는 것이다. 그러면 자동으로 비밀번호
를 /etc/shadow 파일로 변환한다. 이것이 시스템의 보안을 유지하는데 가
장 중요한 것중 하나라고 생각한다.
pwconv
두 번째로는 패스워드 파일에서 대부분의 기본 시스템 계정을 없앤다. 리
눅스에서는 우리에게 불필요한 다양한 시스템 활동을 위한 계정을 제공한
다. 이런 계정이 필요없다면 없애자. 계정이 많을수록 시스템에 접속하기
가 쉽다. "news" 계정을 예로 들어보자. 뉴스 서버인 nntp 를 실행하지 않
느다면 계정이 필요없다. (/etc/cron.hourly에서 "news" 사용자를 찾기 때
문에 이 파일도 업데이트해야한다) 또한 익명 ftp를 운여하지 않으면 "ftp
" 계정도 없앤다. 맨 페이지에서는 다음과 같이 설명한다.
man ftpd:
Ftpd authenticates users according to four rules.
4) If the user name is ``anonymous'''' or ``ftp'''', an anon
ymous ftp account must be pre-sent in the password file (user ``ftp''
''). In this case the user is allowed to log in by specifying any pas
sword (by convention this is given as the client host''s name).
나의 /etc/passwd 파일 예저는 다음과 같다. example C.
우리는 또한 /etc/ftpusers 파일을 변경하길 원할 것이다. (example D).
이 파일에 등록되어 있는 계정은 ftp 에 접속할 수 없다. 주요 계정인 roo
t, bin 등의 계정으로 ftp 세션 연결하는 것을 제한한다. 리눅스는 이 파
일을 기본적으로 가지고 있다. 루트가 ftp로 접속할 수 없도록 루트 계정
이 들어있는지 확인하자. ftp 접속에 필요한 계정이 이 파일에 들어있지
않은지도 확인하자.
또한 루트는 텔넷 접속을 할 수 없도록 되어있는지 확인한다. 다른 사용자
로 시스템에 접속한 후 su를 이용 루트로 바꾸면 된다. /etc/securetty 파
일에서 루트가 접속할 수 있는 tty를 설정한다. 이 파일에 오직 tty1, tty
2만 되어있다면 루트는 지역적인 접근만 가능하다. ttyp1, ttyp2는 pseudo
터미널로 루트가 원격으로 텔넬 접속을 할 수 있도록 한다. (example E).
마지막으로 /etc/issue 파일을 만든다. 이 파일은 텔넷 로그인했을 때 나
오는 아스키 텍스트 배너이다. (example B). 어떤 사용자든 시스템에 로그
인할 때 나오는 정보이다. 동일한 내용을 계속 보여주길 원하면 /etc/rc.d
/init.d/S99local 파일을 수정한다. 기본적으로 리눅스는 재부팅할때마다
새로운 /etc/issue 파일을 만든다.
서버에 연결하기
원격으로 관리를 하는 경우 서버연결을 안전하게 하는 것이 중요하다. 보
통 시스템 관리와 파일 업로드를 위해 원격으로 접근하는데 이 경우 통신
이 암호회되어야한다. 여기서는 ssh 와 TCP 래퍼에 대해 설명하겠다.
나는 ssh를 좋아하는데 ssh는 방화벽과 시스템 사이의 모든 통신을 암호화
한다. tcp 래퍼는 네트웍 트래픽에서 스니핑하는 것을 막지는 못한다. 네
트웍상에서 사용자가 타이핑하는 것(비밀번호 포함) keystrokes 을 모두
모니터링할 수 있다. 방화벽과의 통신을 다른 사람이 모니터링하는 것을
막고자한다면 텔넷/ftp 대신 ssh를 사용하길 추천한다. ssh는 모든 통신을
암호화하며 안전한 방법으로 파일 업로드와 시스템 관리를 할 수 있다. ss
h는 tcp 래퍼와 비슷하게 독자적인 로그기록기능을 가지고 있고 접속 제한
을 할 수 있다. 소스와 ssh 클라이언트 및 서버 대몬을 포함해 ssh에 대한
더 자세한 정보는 ssh here 에서 찾자. 나는 라이센스 제한이 있는 2.x
버전보다는 1.2.x 버전을 추천한다. 또다른 ssh 프로그램으로는 Openssh
가 있다.
TCP 래퍼는 암호화를 지원하지 않지만 시스템에 접속하는 사용자에 대해
로그를 남기고 제어할 수 있다. inetd 서비스를 통해 실행되는 telnet, ft
p 등을 감싸는 프로그램이다. tcp 래퍼를 이용 시스템에서 inetd 연결에
대한 래퍼를 수행한후 모든 시도에 대해 로그를 남기고 접근 권한 목록에
맞는지 확인을 한다. 연결이 허용되면, tcp 래퍼는 연결을 텔넷등과 같은
적당한 프로그램으로 연결한다. 접근 권한 목록에 의해 연결이 거부당하면
연결이 끊어진다. 다행히도 리눅스에 TCP 래커는 이미 설치되어 있기 때
문에 /etc/hosts.allow 와 /etc/hosts.deny 파일을 수정하기만 하면 된다.
이 파일에서 사용자의 접근 허가, 거부를 할 수 있다. 물론 TCP 래퍼는
배너를 보여주거나 safe_finger 같은 다른 프로그램을 불러올 수 있다. 문
법은 상대적으로 간단하다. /etc/hosts.allow 파일에 접속을 허용할 ip 주
소나 네트웍을 적어주면 된다. /etc/hosts.deny 파일에 접속을 거부할 ip
나 네트웍을 적어주면 된다. 기본적으로 리눅스는 모든 곳에서 접속을 허
용하고 있으며 이 파일을 수정해야한다. tcp 래퍼로 작업을 할 경우 두가
지를 추천한다.
시스템이나 도메인 이름 대신 ip 주소 사용
/etc/hosts.deny 에 모든 것을 거부하는 것으로 설정한다(ALL). 그러고나
서 특정한 사이트에 대해 /etc/hosts.allow을 이용 접속을 허용한다.
이에 대한 예제 example F. TCP 래퍼를 어떻게 사용할지에 대해 더 많은
자료가 필요하면 Intrusion Detection을 이용한다.
진정한 편집증(Paranoid)을 위하여
위에서 설명한 것은 절대적으로 필요한 것이라 생각을 한다. 다음 단계를
통해 시스템 보안을 극대화해보자. 불행히도 시스템은 100% 안전할 수 없
고 그럴 수도 없다. 그래서 더 완벽한 보안을 위해 몇가지 단계를 추가했
다.
먼저 wheel 그룹을 만든다. wheel 그룹은 /bin/su 와 같은 강력한 명령을
실행할 수 있는 개별적인 사용자 그룹이다. 이러한 명령에 접근할 수 있는
사용자를 제한해서 시스템 보안을 향상시킬 수 있다. /etc/group 파일을
수정해서 wheel 그룹을 추가하고 시스템 관리자를 이 그룹에 넣는다. 그러
고나서 /bin/su와 같은 주요한 시스템 파일을 변경한다. 그룹 소유권을 wh
eel로 바꾸고 소유자와 그룹만 실행가능하도록 허가권을 바꾼다. (특정한
프로그램의 경우 suid 와 guid를 보존하고 있어야한다) /bin/su의 겨우 다
음과 같이 한다:
/bin/chgrp wheel /bin/su
/bin/chmod 4750 /bin/su
두 번째로는 .rhosts, .netrc, /etc/hosts.equiv 파일에 락을 걸어 사용못
하게 한다. r 명령은 시스템에 접그하는데 이러한 파일을 이용한다. 락을
걸어 이러한 파일을 사용하지 못하게 하기 위해서 touch로 파일을 만들고
허가권을 0으로 바꾼다. 그러면 누구도 이 파일을 생성하거나 변경할 수
없다. 예제를 보자.
/bin/touch /root/.rhosts /root/.netrc /etc/hosts.equiv
/bin/chmod 0 /root/.rhosts /root/.netrc /etc/hosts.equiv
세 번째로 /etc/shadow에 crypt(3) 함수 대신 MD5 hashes를 사용하도록 설
정한다. 비밀번호 파일을 크랙하기 힘들도록 암호화한다. 이건 PAM 모듈을
수정함으로써 수행된다. PAM (Pluggable Authentication Modules) 은 애플
리케이션에서 사용자를 인증하는데 어떠한 방법을 택할 것인지를 가능하게
하는 공유 라이브러리 모음이다. PAM에 대해 더 상세하게 알려면 다음 사
이트를 참고하자. ftp://ftp.us.kernel.org/pub/linux/libs/pam/Linux-PAM
-html/pam.html
예전에는 MD5 hashes를 사용하기 위해 바꾸려면 PAM 모듈을 수동으로 변경
해야했다. 그런데 레드햇 6.0 이후 버전에서는 setup 유틸리티에서 MD5 ha
shes를 선택할 수 있다. setup 명령을 치고 "authentication configuratio
n"에서 선택을 하면 된다. 여기서 MD5 hashes를 선택한다. 그러나 MD5 has
hes는 사용자가 비밀번호를 다시 입력하기 전에는 효과를 발휘하지 못한
다. setup 유틸리티가 없는 배포판(레드햇 5.2 이전)을 가진 경우에는 여
전히 PAM 모듈을 수동으로 변경해야 한다. (example G).
bash를 사용하는 경우 나는 .bash_history 파일을 선호하지 않는다. 다른
사람(루트 포함)이 내가 사용했던 명령을 알기를 원하지 않는다. 그래서
내 .bash_profile에 다음과 같이 설정했다:
HISTFILESIZE=0
이건 .bash_history 파일에 아무것도 기록을 하지 않는다는 의미이다. 나
는 HISTSIZE 환경변수를 이용 여전히 히스토리 기능을 이용하여 명령을
다시 불러 사용하지만 명령어 히스토리는 .bash_history 파일에 기록을 하
지는 않는다.
마지막으로 물리적인 접근으로부터 시스템을 보호하는 것이다. BIOS에 비
밀번호를 설정할 수 있다. 또한 /etc/lilo.conf 에 xxx 라는 비밀번호를
설정(password=xxx)하여 부팅시 시스템에 비밀번호 보안을 할 수 있다. 그
렇지만 기억해야 할 것은 누군가가 시스템에 물리적으로 접근할 수 있다면
시스템을 보호할 방법이 없다.
IPChains
IPChains를 다루지 않고 리눅스 보안을 이야기할 수 없다. ipchains는 2.
2.x 이상 버전의 커널에 함께 있는 기능으로 패킷 필터링 소프트웨어이다.
레드햇 6.0 이상 버전을 운영하는 경우 리눅스 설치시 함께 설치된다. IPC
hains는 시스코 접근 권한 목록과 비슷한데 리눅스 시스템에서 들어오고
나가는 패킷을 제어할 수 있다. 주로 방화벽 애플리케이션으로 사용되며
단일 리눅스 시스템에서도 시스템을 보호하는데 사용할 수 있다. 단일 시
스템을 보호하기 위해 처음 시작시 다른 곳에서 시도하는 TCP 연결은 거부
하도록 IPChains를 설정한다. 모든 UDP, ICMP 연결을 허용한다. 마지막으
로 거부된 모든 연결을 로그에 기록하여 다른 사람이 어디에서 무엇을 했
는지를 알 수 있도록 설정한다. 그런데 브로드캐스트/멀티캐스트 트래픽은
시스템 로그를 빠르게 채우기 때문에 거부하지만 로그에 기록하지는 않는
다. 단일 시스템을 보호하기 위해 IPChains를 설정한 경우는 다음과 갈다.
bash# ipchains -L
Chain input (policy DENY):
target prot opt source destination ports
DENY all ------ 0.0.0.0 anywhere n/a
DENY all ------ anywhere 255.255.255.255 n/a
DENY all ------ anywhere BASE-ADDRESS.MCAST.NET/8 n/a
ACCEPT tcp !y---- anywhere anywhere any -> any
ACCEPT udp ----l- anywhere anywhere any -> any
ACCEPT icmp ----l- anywhere anywhere any -> any
DENY all ----l- anywhere anywhere n/a
Chain forward (policy ACCEPT):
Chain output (policy ACCEPT):
이에 대한 설정 파일을 보려면 example H를 보자. 단일 시스템에서 방화벽
용으로 IPChains를 사용하는 방법은 IPChains HOWTO를 참고하기 바란다.
결론
리눅스 시스템(레드햇 배포판)을 보호하는데 관련된 기본적인 단계를 짚어
보았다. 안전한 시스템을 구축하는 기본은 최소한의 소프트웨어를 설치하
고 TCP 래퍼, IPChains와 갈은 보안설정을 하며 쉐도우 비밀번호를 사용하
는 것이다. 이에 추가해 몇가지 작업이 있는데 tripwire (시스템 바이너리
변화 모니터링)와 swatch (자동화된 로그 모니터링 및 경고 프로그램)등이
있다. 또한 단계적으로 리눅스 시스템을 자동으로 보호하도록 하는 펄 스
크립트인 Bastille Linux를 사용해볼 것을 추천한다. 기억해야 할 것은 어
떤 시스템도 100% 안전할 수는 없다. 그렇지만 위에서 말한 작업을 진행하
면 보안 위협을 상당히 줄일 수 있다.
저자 소개
Lance Spitzner 는 집에서 유닉스 시스템을 운영하는 법에 대해 배우는 것
을 좋아한다. 그는 이전에 Officer in the Rapid Deployment Force 에 있
었으며 여러 가지 일을 했다. 그에게 연락을 하려면 lance@spitzner.net을
이용하면 된다.
* :맥노턴님에 의해서 게시물 이동되었습니다 (2002-07-28 16:14)