10년동안 시스템 관리자로 일한 경력을 가진 필자의 한 친구는 "유닉스 플랫폼에서 보안을 제대로 하겠다는 것은 모순"이라고 자신있게 말한다. 사실 윈도우 NT 등 다른 플랫폼에서도 이는 마찬가지로 어려운 일일 것이다. 누군가 시스템에 접근하겠다고만 마음먹으면 언젠가는 들어올 수 있을지 모른다. 하지만 그렇다고 해서 아무런 조치를 취하지 않고 내버려 둘 수만은 없는 일이다. 이 기사는 일상적인 해킹 피해를 방지하기 위한 몇 가지 도움말을 제공한다. 단 DSL 등을 이용해 컴퓨터가 인터넷에 직접 연결돼 있는 경우, 이 기사보다는 리눅스 라우터 프로젝트(Linux Router Project)나 GNAT 등에 기반한 에지 라우터(edge router)나 파이어월 등에 대한 정보가 보다 도움이 될 것이다.이 기사는 리눅스 운영체제가 노트북에 장착돼 있을 경우, 혹은 리눅스 장비가 회사의 파이어월 내부에 있거나 혹은 대학교의 LAN에 접속돼 있을 경우 등을 가정한 것이다. 이 기사가 당신의 민감한 정보가 유출되는 것을 방지하고, 직업의 안전을 도모하며, 데이터를 보호하는 데 도움이 되기를 바란다. 다음은 리눅스 시스템에서 보안을 구현하는 데 있어서 중요한 토픽들과 함께 유의할 점을 정리한 것이다. 리눅스 보안의 기본 사항깨끗한 상태에서 시작하기시스템이 가장 깨끗한 상태에서 보안 시스템과 정책을 실시하는 것이 가장 효과적이다. 만일 시스템이 많이 낡았다면, 바이러스나 기타 시스템 침입 사실이 눈에 띄지 않을 확률이 보다 높다. 예를 들어 통상적으로 사용하는 프로그램들이 트로이 목마 역할을 하면서 비밀리에 작업을 하고 있을 수도 있는 것이다.따라서 시스템의 보안 유지를 위해 좋은 방법 중 하나는 데이터만 백업받고 OS(Operating System)를 다시 깐 뒤 다시 데이터를 복구시키는 것이다.최신 버전 유지하기사용하고 있는 소프트웨어의 최신 버전을 유지하는 것은 보안 문제를 미연에 방지할 수 있는 가장 좋은 방법 중 하나다.리눅스 커뮤니티에서는 버그나 기타 문제점들에 대한 해결책이 매우 빨리 등장한다. 필자의 경우는 ‘apt-get update; apt-get upgrade’ 명령어를 통해 사용중인 소프트웨어의 최신 업그레이드를 거의 매일 실시하는 것을 좋아한다. 단 이는 모든 종류의 배포판을 지원하지 않을 수도 있다.파티션 설정하기시스템을 포맷하고 파티션을 설정할 때, /var 와 /tmp는 루트 파일 시스템과 동일 파티션 내에 두지 않도록 한다. /var는 로그 파일을 포함하므로 그 크기가 매우 빨리 늘어나며, 따라서 파일 시스템 공간 활용에 지장을 줄 수도 있다. /tmp는 일반적으로 유저에게 쓰기 권한이 있으므로(writable) 이것 역시 그 크기가 빨리 늘어나는 특성이 있다. 많은 유저들은 /var를 별도의 파티션에 배정하며, /tmp는 /var/tmp의 심볼릭 링크로 지정해 준다. 또한 /home과 /usr/local 역시 별도의 파티션에 각각 위치시키는 것도 좋은 방법 중 하나다. 이렇게 함으로써 필요한 경우 시스템을 다시 인스톨하는 과정이 쉬워질 수 있다. nosuid 옵션으로 /home 디렉토리 마운트하기시스템을 사용하고 있는 유저들이 있는 경우, /home에 별도의 파티션을 배정하고 nosuid 옵션을 적용시킨다. 이렇게 함으로써 /home 디렉토리상에 있는 바이너리들이 수퍼유저 오너 혹은 그룹 아이덴티티를 가지고 작동하는 것을 방지할 수 있다.이를 셋업시키기 위해서는 /etc/fstab의 컬럼에 nosuid를 추가하면 된다. 시스템을 단순하게 유지시키기초기 인스톨 시에는 가장 최소한의 프로그램만을 인스톨시키도록 한다. 제대로 설정(configuration)되지 않았거나, 관리자가 잘 알지 못하는 프로그램의 경우 항상 보안상의 허점으로 작용할 가능성이 높기 때문이다.이는 특히 NFS나 삼바(Samba) 등 네트워킹에 기반한 프로그램일 경우 더 하며, 게임의 경우도 마찬가지다. 게임의 경우 보다 높은 시스템 리소스를 활용하기 위해 수퍼유저 권한을 가지고 구동시키는 일이 잦다.리눅스용 소프트웨어는 찾기도 쉽고, 인스톨하기도 쉬우므로 가장 좋은 방법은 반드시 필요한 최소한의 소프트웨어만 인스톨시키는 것이다. 커스텀 커널 만들기어떤 리눅스 시스템이든 간에 최소한의 프로토콜과 드라이버만을 지원하는 커스텀 커널을 컴파일함으로써 보안성을 보다 높일 수 있다.ZDNet의 Help & How-To 코너를 통해, 리눅스 2.2 커널을 컴파일 하는 방법에 대한 도움말을 얻을 수 있다. 커널을 컴파일한다는 것은 매우 어려운 작업처럼 들리나, 실은 매우 쉬운 작업에 속한다. 커스텀 커널은 부팅 시간을 보다 빠르게 해주고, 사용 가능한 메모리를 늘려준다. (커널상에 존재하는 것들은 버추얼 메모리를 절대로 사용할 수 없다.)가장 큰 장점 중 하나는 앞에서도 언급한 바와 같이 가장 최소한의 드라이버와 프로토콜만을 지원함으로써 해커들이 침투할 수 있는 가능성을 조금이나마 줄여준다는 점이다.뿐만 아니라, 기타 더 향상된 보안 기능도 추가로 컴파일할 수 있다. 이런 추가 보안 기능의 대부분은 make xconfig 인터페이스에서 제공하는 Help dialog를 통해 알 수 있다. 또한 커널 소스 패키지를 설치한 다음 /usr/src/linux/Documentation을 통해 추가적인 정보를 얻을 수 있다. 예를 들어, bash의 ulimits 명령어를 통해 할 수 있는 것과 유사하게 global filesystem limits를 컴파일할 수 있다는 사실을 알고 있었는가? 이를 위해서는 limits.h 파일을 편집해주고 재컴파일 시키면 된다. 퍼미션 배우기퍼미션 에러를 방지하기 위해 모든 것을 chmod 777로 지정하거나 프로그램을 루트에서 구동시키는 경우도 많을 것이다. 이렇게 하는 것은 문제점을 야기시킬 확률이 높다. 유닉스 상에서 퍼미션에 대해 배우기란 어려운 일임에는 틀림없지만 가장 기본이 되는 것 중의 하나인 동시에 많은 도움을 준다.퍼미션이 파일 단위가 아닌 디렉토리 단위에는 어떻게 다르게 작용하는 지에 대해서 알아두는 것이 필요하다. 또한 chattr 매뉴얼 페이지를 보기 바라며, 특히 ‘스틱키 비트(sticky bit)’가 디렉토리 퍼미션에 어떤 영향을 주는 지 알아보도록 한다.BIOS에 패스워드 걸기플로피 디스켓만 가지고서도 당신의 시스템을 재부팅 시키고 루트 권한으로 로그온하거나 파일 시스템을 마운트시킬 수 있다. 만일 이러한 것에 대해 걱정된다면 1) BIOS 셋팅을 다시 해줌으로써 플로피 디스크나 CD-ROM으로 부팅하는 것을 방지하거나2) BIOS 상에 패스워드를 걸어주거나3) 컴퓨터 케이스 자체에 물리적으로 잠금장치(lock)를 하는 방법 등을 쓰면 된다.이렇게 하는 것은 최소한 해커가 침입하는 데 걸리는 시간을 연장시키는 효과가 있다. 코로케이션 서비스 제공업체들도 서버에 물리적인 락을 걸어두는 방법을 사용하고 있다.부트 매니저에 패스워드 걸기또 한 가지 가능한 해킹의 형태는 해커가 당신의 리눅스 시스템에 접근해 시스템을 리부팅 시키고, 부트 프롬프트상에서 ‘single’이라고 입력하는 것이다.가장 최근 버전의 리눅스를 제외하고는 이렇게 하면 패스워드를 자세하게 물어보지도 않고 루트 셀로 부팅된다. 이것을 방지하기 위해서는 부트 로더(boot loader)에 대한 보안 방법을 사용하는 것을 고려하라.릴로(LILO)는 각각의 이미지에 대해 각각 다른 부트 패스워드를 지정할 수 있도록 해준다. 이를 위해서는 lilo.conf 파일에 다음과 같은 것을 첨가해 주도록 한다. promptpassword="패스워드"그런 다음, chmod 600/etc/lilo.conf 명령어를 통해 슈퍼유저만이 패스워드를 읽고 나머지 사람들은 누구도 읽을 수 없도록 하며, /sbin/lilo를 실행시켜 부트맵을 재인스톨한다. 또한 chattr 명령어를 통해 lilo.conf에 ‘immutable bit’(/etc/passwd 등 기타 중요 파일에도 immutable bitfmf 설정할 수 있다)를 지정할 수 있다. 전원을 차단한 후 복구하는 경우에 시스템 리부팅을 할 수 있도록 하기 위해서는 lilo를 실행시키기 전에 lilo.conf 파일에 restricted를 첨가해 주도록 한다. Restricted를 부가하면 부트 타임 변수(이를 테면 single이나 root=/dev/fd0 등)를 입력하려고 할 때만 시스템이 패스워드를 물어보도록 할 수 있다.부팅에 대해 부가적으로 알아둘 사항은, 파워 서플라이 이상 등으로 인해 발생하는 소위 '커널 패닉(kernel panic)'이 발생될 경우다. 이 때 리눅스 시스템은 기본적으로(default) 시스템이 그냥 멈춰 버린다.다음과 같은 명령어를 통해 시스템 패닉이 발생할 때도 컴퓨터가 멈춰 서는 것이 아니라 재부팅할 수 있도록 할 수 있다. (패닉 버추얼 파일의 위치는 커널 버전에 따라 다르다)echo 1 > /proc/sys/kernel/panic 콘솔에도 보안 정책 실시하기버추얼 콘솔에서 X를 시작할 경우 (단 X상에서 로그인 화면을 제공하는 xdm이나 gdm을 시작시키지 않는 경우), 당신이 시스템을 사용하지 않을 때 단순히 xlock이나 xlockmore 명령어만을 통해 시스템에 락(lock)을 걸어 놓는 것은 충분하지 않다.이렇게 하는 것은 X를 런칭시킨 콘솔에 대해서는 아무런 보안을 하는 것이 아니기 때문이다. 이를 위해 vlock 명령어를 쓰거나, 혹은 X를 런칭시킨 콘솔을 포함, 모든 콘솔에서 로그아웃하는 것이다. (이를 위해 Ctrl-Alt-F[n], Ctrl-Z, bg, exit, Ctrl-F7 등의 방법을 사용할 수 있다)업타임(Uptime)과 로그 파일 분석하기만일 시스템이 어떤 이유에서인지 모르지만 스스로 재부팅됐다면, 그 이유를 알기 위해 로그 파일을 참조하도록 한다. 로그는 흔히 /var나 /var/log 디렉토리에 있으므로 해당 디렉토리에 가 보도록 한다. tail 명령어는 로그의 끝부분(tail end)만을 보기 위해 유용한 명령어다. 로그를 분석하는 것은 시스템 관리자에게 좋은 습관 중 하나다. SUID 프로그램 등 관찰, 분석하기SUID/SGID 프로그램은 개인 혹은 그룹이 슈퍼유저 권한을 가지고 운영하는 프로그램을 말한다. 이런 프로그램은 다양한 보안 문제를 가지고 있는 것으로 알려져 있다. 데비안을 포함한 일부 배포판에서는 SUID/SGID 프로그램에 대해 계속 관심을 갖도록 한다. Suid 로그는 /var/log 디렉토리에서 볼 수 있다. 만일 시스템에 suidmanager 패키지가 인스톨돼 있다면 아마 /etc 디렉토리에서 SUID/SGID 프로그램의 리스트를 나열한 suid.conf 파일을 찾을 수 있을 것이다. 이것을 아래와 같은 find 명령어의 결과와 비교해 본다면 도움이 될 것이다.root# find / -type f ( -perm -04000 -o -perm -02000 ) 또한 아무 소유자가 없거나 그룹 아이디가 없는 파일을 알아보기 위해서는 아래의 명령어를 사용해 보도록 한다.find / -nouser -o -nogroup -print 마지막으로, 어떤 유저든 입력을 행할 수 있는 파일 종류 역시 다음의 명령어 등을 통해 알아보도록 한다. find / -perm -2 ! -type l -ls 트립와이어(Tripwire) 인스톨하기만일 보안에 더 많은 관심이 있다면 트립와이어(Tripwire) 인스톨을 검토해 보도록 한다. 만일 이를 사용하고자 한다면 중요한 시스템 파일을 깨끗한 소스상에서 불러내 재인스톨시켜야 할 것이다. 그런 후 Database Generation 모드상에서 트립와이어를 실행시킨다. 이로 인해 발생되는 일방적인 데이터 저장 방식(one-way hash)은 CD-ROM이나 쓰기 보호된 플로피 디스크 등 '읽기 전용' 매체에 저장하도록 한다.트립와이어를 인스톨시킨 후, 만일 어떤 침입자가 들어왔는지 의심스러울 경우에는 인테그리티 체킹(Integrity Checking) 모드상에서 트립와이어를 실행해보도록 한다. 이렇게 하면 트립와이어 프로그램은 모든 것을 다시 해시(re-hash) 시켜 원래 저장된 정보와 비교해 보도록 한다. 이를 통해 트로이 목마 바이러스 등 여러 가지 요인에 의해 변경됐거나 바뀐 파일을 찾을 수 있을 것이다. 또한 트립와이어를 crontab에서 실행시켜, 시스템상의 변경 사항에 대한 업데이트 뉴스를 메일로 보내도록 할 수도 있다. e-메일 암호화하기만일 당신이 e-메일을 보낼 때 아직도 디지털 서명을 이용하지 않고 있다면 시대를 앞서가고 있다고 하기는 힘들 것이다. 공개키 방식의 암호화를 처음 접하는 경우라면 정확히 이해하기가 쉽지 않다. 예를 들어 PGP(Pretty Good Privacy)의 경우 리드미 파일이 35,000 단어 정도로 매우 길다.하지만 그럼에도 불구하고, 암호화에 대해 지식을 갖는 것은 매우 유용한 일이다. 암호화를 거치지 않고 인터넷상에서 완전 노출된 텍스트 형태로 보내는 정보는 상대방이 가로채거나 유출하기 매우 쉽기 때문이다.PGP는 그 이름(상당히 괜찮은 프라이버시 라는 뜻)이 겸손하게 느껴질 정도로 강력한 기능을 제공하지만, 라이선싱 문제와 몇 가지 기술적인 문제들로 인해 그다지 환영받고 있지 못한 실정이다. 리눅스를 사용하고 있다면 GNU 프라이버시 가드(GNU Privacy Guard; GnuPG)를 이용하기 바란다. GnuPG는 PGP와 완전 호환성을 갖추고 있으나, 특허에 기반한 RSA 암호화 기술에 의존하고 있지 않으며, 미국 외 지역에서 사용하는데 법적으로 문제가 없다. 또한 GnuPG의 가장 좋은 점 중의 하나는 매뉴얼의 길이가 PGP만큼 길지 않다는 것이다. GnuPG는 MIME 기반의 첨부 파일도 효과적으로 지원하는 등의 이유로 인해 최근 점점 더 인기를 더해가고 있는 메일 프로그램인 Mutt을 위해 GnuPG를 셋업하는 방법에 대해서도 HowTo 매뉴얼을 제공하고 있다. 리눅스 도큐멘테이션 프로젝트를 통해 더 많은 정보를 얻을 수 있다. 강력한 패스워드의 생성리눅스 보안에 있어서 패스워드는 매우 중요한 역할을 차지한다. 리눅스는 매우 강력한 난수 생성 기능을 제공, 강력한 패스워드를 생성할 수 있도록 해 준다. 이를 위해 아래의 명령어를 사용할 수 있다. head -c 6 /dev/random