게이트웨이에 보안 강화하기
작성자 정보
- 웹관리자 작성
- 작성일
컨텐츠 정보
- 7,827 조회
- 0 추천
- 목록
본문


|


By Chris Stoddard
| |||||||||||||||
들어가며 지난 기사에서 우리는 꼭 필요한 패키지만 리눅스 박스에 설치했다. (만약 여러분이 이전 기사를 읽지 않았다면 지금 읽는게 좋겠다. 이 기사는 지난 호 기사를 바탕으로 쓰여졌기 때문이다) 이제는 여러분의 게이트웨이 머신을 보안 요새로 만들기 위해 세부적인 일들을 다룰 차례다. 여러분이 먼저 알아 두어야 할 것은 ‘완전한 보안이란 없다’는 것이다. 기업들이 네트워크 보안만을 전적으로 책임지는 IT 부서에 엄청난 투자를 하지만 여전히 그들의 네트워크가 조롱당하는 현실을 보면 이런 상황을 쉽게 알 수 있다. ‘완전한 보안이란 없다’는 말을 믿고 따르는게 여러분 건강에 좋을 것이다. 이 글에서 우리가 추구하는 진짜 목표는 믿을만한 사람은 믿고, 스크립트 키디(Script Kiddies)는(완전히 막지는 못하더라도) 함부로 접근하지 못하게 하면서 혹시 침입을 당하더라도 크랙하는 속도를 최대한 늦춰서 우리가 큰 피해를 입기 전에 그들을 발견하는 것이다. 이상적으로는, 리눅스를 설치하자마자 (시스템이 인터넷에 연결되기 전에) 이런 작업들을 끝내는 것이다. 이 문서는 여러분이 리눅스를 설치하고, 다양한 환경설정 파일들을 편집하며 루트로 로긴하는 방법을 이미 알고 있다는 가정에서 시작한다. 서버와 방화벽 머신을 따로 두면, 침입자가 여러분의 서버 깊숙이 침투해서, 여러분의 방화벽 시스템 깊숙한 곳 여기저기를 쑤시고 다니기 시작해서, 안쪽 네트워크에 그 악당들이 손대기 전에 아마 발견할 수 있을 것이다.
시스템 업데이트와 보안에 대한 권고 컴퓨터 보안 세계에서는 ‘아는 것이 힘’이다. 솔직하게 말해서 보안에 관한 모든 이슈들은 전문가에 의해 발견된 것이 아니다. 언제나 크래커들이 먼저 알아내고, 보안 전문가라는 이들은 이미 당한 다음에 항상 한 발짝 늦게 대처한다. 여러분은 새로운 문제가 발생할 때, 최소한의 패키지만 업데이트하도록 시스템 정보를 잘 알고 있어야 한다. “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” 아래 문장들을 그 안에 써 넣는다: (텍스트 버전이다)
이제 이 파일을 저장하고 편집기를 끝낸 뒤에, “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 명령으로 잠근다.
/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 파일을 열어 아래 줄들을 모두 지워버린다:
/etc/rc.d/rc.local 파일을 저장하고 닫기 전에 우리 시스템이 ping이나 traceroute 같은 ICMP 요청에 응답하지 않도록 설정하기 위해 #!/bin/sh 줄 바로 아래에 다음 라인들을 써 넣는다:
이 명령 줄은 여러분의 시스템을 바깥에서는 볼 수 없도록 만들어 줄 것이다: 스크립트 키디들은 그들이 찾을 수 없는 서버는 크랙할 수 없으므로 이 설정은 많은 도움이 된다(스크립트 키디는 지정한 IP 범위 안에서 열려있는 서버들을 ICMP나 닫히지 않은 로긴으로 알아낸다) 두 번째 줄은 여러분의 시스템을 SYN DOS(SYN 서비스 거부) 공격으로부터 지켜준다. 입력을 끝냈으면 파일을 저장하고 끝낸다. 하나 알아 둘 것이 있다: 이런 설정은 여러분의 시스템에 ping을 보내는 것을 막아주지만, IP 포워딩이나 ssh 같은 다른 기능들에는 전혀 영향을 미치지 않는다. 마지막으로 이 파일을 잠근다. /etc/hosts.conf 바깥에서 감행되는 공격에 대처할 방호체계를 구축하는 동안 /etc/host.conf 파일 마지막 줄에 다음 라인을 추가해야 한다:
이 설정은 여러분의 네트워크 바깥의 시스템이 여러분의 LAN 안쪽에 있는 시스템인 것처럼 출발지 주소를 가장해서 들어오는 경우 모든 요청을 거부하도록 만든다. 이런 종류의 공격을 IP 속이기(IP Spoofing)이라 부르며 흔히 서비스 거부 공격(DoS)와 함께 사용된다. 설정이 끝났으면 secure-it으로 파일을 잠근다. 그 밖에 다른 파일들은 굳이 바꾸어야 하는 것은 아니지만 반드시 잠가둘 필요는 있다: 만약 여러분이 패스워드를 바꾸거나 새로운 유저를 추가할 계획이라면 /etc/fstab 이 파일은 시스템이 부트될 때 어떤 드라이브가 있으며, 파티션이 어떤 마운트 포인트에 마운트되어야 하는지를 알려준다. 만약 여러분이 커다란 파티션 하나를 통째로 루트 파티션으로 설정하거나 /home과 /tmp 파티션으로 쪼개도록 설정하지 않았다면 이 섹션을 건너 뛰고 다음 장으로(디스크 쿼터 섹션) 건너 뛰어도 좋다. /home과 /tmp는 root 이외의 유저도 읽거나 쓸 수 있는 파일시스템이기 때문에 중요한 영역이다. 우리가 하려는 작업은 유저들이 이들 파티션에서 할 수 있는 일을 제한하려는 것이다. /home에서는 SUID 프로그램이나 장치를 만들 수 없게 할 것이다. 그리고 /tmp에서는 어떤 프로그램도 실행할 수 없게 만들어야 한다. 우리는 이런 설정을 위해 /etc/fstab 파일을 변경할 것이다. 내 시스템에서 /etc/fstab 파일은 아래와 같은데 아마 여러분의 것도 비슷할 것이다:
/home과 /tmp 줄을 다음과 같이 바꾼다:
Disk Quota 만약 여러분이 /home 디렉토리에 파티션을 나누어 주었다면 아래 설정을 선택적으로 사용할 수 있다. 하지만 여러분의 하드 드라이브를 쪼개지 않고 통째로 루트파티션에 설정했다면 디스크 쿼터 시스템을 반드시 사용해야 한다. 디스크 쿼터 시스템은 유저가 드라이브 스페이스를 함부로 탕진하거나 계정을 훔쳐 들어온 침입자가 여러분의 하드 드라이브를 쓰레기로 가득 채우는 못된 짓을 예방한다. /etc/fstab에서 기본적인 라인은 다음과 같을 것이다:
이런 값을 아래처럼 바꾼다:
그리고 /etc/rc.d/rc.local 파일에 다음 줄들을 추가한다:
이제 “touch /quota.user”라고 쓰고 “chmod 700 /quota.user” 명령을 적용한 다음 시스템을 다시 부트한다. 그럼, 쿼터에 대한 에러 메시지 몇 개가 나타날지도 모르겠다. 뭐 무시하고 지나가자. 시스템이 완전히 가동되면 유저 계정에 대해서만 쿼터를 설정해야 한다. “edquota -u username” 명령에서 “username”이란 문자열만 적당한 유저 이름으로 바꾸어서 실행한다. 이 명령은 vi 텍스트 에디터를 불러와서 다음과 같은 메시지들을 보여준다:
블록 제한에 따라 유저가 사용할 수 있는 드라이브 공간을 KB 단위로 유저가 사용할 수 있는 공간을 정한다. inode 설정에 따라 유저가 가질 수 있는 파일의 총 수를 제한한다. 소프트 제한은(Soft limits) 주어진 크기를 넘어섰을 때 사용자에게 경고하고. 하드 제한은(hard limits) 더 이상 공간을 할당하지 않고 멈춘다. 이 머신에서 MP3 파일들을 전송하는 등 제한을 높일 만큼 아주 중요한 이유가 없는 한 여러분은 제한 수위를 낮게 설정하라고 권하고 싶다. 10 MB 디스크 공간과 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 파일을 열면 아마 다음과 같은 목록이 보일 것이다.
왼쪽에 보이는 것들이 각 파일의 퍼미션이다: “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,
시스템 무결성 점검 Checking system integrity 마지막으로 할 일은 여러분의 시스템이 이상한 일이 생기거나 조금이라도 바뀔 때 여러분에게 경고하도록 설정하는 것이다. 만약 어떤 침입자가 몰래 들어와서 트로얀을 심고 새로운 계정을 만든다면, 어떤 것들이 바뀌었는지 시스템이 우리에게 알려주도록 만들고 싶을 것이다. 이런 일을 하는 좋은 프로그램들이 몇 가지 있는데 내가 써본 것 가운데 가장 쉬운 도구는 fcheck이다.(http://sites.netscape.net/fcheck/fcheck.html 에서 가져다 쓸 수 있다) 아래에서 이 프로그램을 설치하고 조율하는 방법을 소개한다. 설치와 설정이 끝나면 여러분은 최소한 하루에 한 번 이 프로그램을 실행해서 그 결과를 루트 디렉토리에 남기기를 바랄 것이다. 이렇게 주기적으로 작업하려면 crond를 사용한다. “crontab -e”명령으로 cron 작업에 다음과 같이 추가한다:
점검할 경로는 여러분 자신의 것으로 적절하게 바꾸어서 쓴 다음 저장하고 끝낸다. 이제부터는 매일 밤 12시 1분에 fcheck가 실행되어서 /root/fcheck.txt 파일에 점검 결과를 저장할 것이다. fcheck가 여러분이 손대지 않은 파일에서 변경된 흔적을 찾았다면 즉시 그 패키지를 시스템에서 지워버리고 RedHat CD에서 다시 설치해야 한다. 여러분 자신이 파일을 바꾸어야 할 때가 있다면 “fcheck -ca” 명령을 다시 실행하고 또다른 베이스라인을 구성할 필요가 있다.
마치며 인터넷에 시스템을 연결하는 것은 그나마 안전하다. 모든 작업이 끝나면 여러분은 시스템의 보안상태를 테스트해야 하는데 Gibson Research Corporation에서는 포트 스캔 서비스를 제공한다. 이상적인 세계에서 모든 포트는 스텔스 모드로 있어야 한다. 여러분의 IP 주소에서는 어떤 요청이 포트로 들어와도 응답하지 않고, 마치 어떤 시스템도 연결되지 않은 것처럼 바깥에 보여야 한다. 문제가 될 만한 포트는 닫혀 있어야 하는데, 이 것은 응답은 하되 어떤 요청도 받아들이지 않는 것을 뜻한다: 포트를 닫아도 어떤 종류의 공격에는 안전하지 못할 것이다. 열린 포트는 당연히 안전하지 못하다. 여러분의 시스템에 열린 포트가 있다면 당장 inetd.conf 파일로 돌아가서 모든 설정을 지워버려야 한다. 그리고 아파치나 wu-ftpd, 또는 그 밖의 데몬들이 설치되어 있는지 확인하고 ipchains 설정을 다시 살펴서 패킷들을 제대로 걸러내는지 확인해야 한다. 침입자가 개인적인 용도로 포트를 열지나 않았는지 주기적으로 점검하는 것도 좋은 생각이다. 이제 많은 설정들을 마치고 다시 확인까지 했지만, 이 것이 리눅스 보안의 끝이 아니라 단지 출발점일 뿐이라는 것을 말해두고 싶다. 나는 매우 기본적인 보안 방법들만을 여러분에게 제안한 것으로 훨씬 더 많은 일들이 아직 남아 있다. 더 전문적인 솔루션을 바깥에서 찾아보는 것은 여러분이 보호해야 할 대상이 무엇이냐에 달려 있다. 집에서 개인적으로 구축한 서버라면 이 글에서 소개한 것만으로도 쓸만 하겠지만 아무리 작은 네트워크라도 상업적인 것이라면 데이터를 안전하게 보호해야 할 것이고 여러분은 가능한 한 많은 보안 이슈와 기능들을 배우고 익혀야 할 것이다.
Copyright 2000, Chris Stoddard |
관련자료
-
이전
-
다음