2013년 11월 26일 화요일

「리눅스에서의 개인정보 보호·보안」필수 체크리스트

Henry Kingman (Help & How-To) 2001/02/13

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 옵션(Mount /home With nosuid Option ?)
시스템을 사용하고 있는 유저들이 있는 경우, /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 파일에 다음과 같은 것을 첨가해 주도록 한다.

prompt
password="패스워드"

그런 다음, 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 | mimencode

만일 어떤 이유에서든 간에 당신의 컴퓨터가 mimencode 명령을 지원하지 않는다면 (예 : 메일 툴 패키지가 장착돼 있지 않은 경우 등) 위의 명령어 대신 아래의 명령어를 사용할 수 있다.

패스워드 점검
만일 당신의 패스워드가 너무 단순하다고 생각되면 크랙(Crack)이나 존 더 리퍼(John the Ripper) 혹은 요즘 유행하는 기타 다른 프로그램들을 다운로드 받은 후, 이를 /etc/passwd 파일을 상대로 실행시켜 본다.

Rootshell.com, Insecure.org, phrack.com 등 유닉스 상의 보안 관련 정보를 전문으로 제공하는 사이트를 참조하기 바란다.

만일 섀도우 패스워드를 사용하고 있다면 pwconv와 pwunconv 유틸리티를 유용하게 사용할 수 있을 것이다.

리눅스 상에서의 보안 및 개인정보 보호에 대한 정보를 더 얻기 위해서는 리눅스 개인정보 및 보안 가이드(Linux Privacurity Guide)를 참조하도록 한다.

PAM 이용해 강력한 패스워드 적용하기
최근의 리눅스 배포판은 PAM(Pluggable Authentication Modules)을 이용, 인증 기능을 필요로 하는 모든 프로그램상에서 보다 강화된 인증 기능을 제공한다.

PAM의 기능 중 하나는 사용자가 쉽고 단순한 패스워드를 만드는 것을 방지하는 패스워드 난이도 점검(password strength checker) 기능이다. PAM은 또한 생체인식 등 기타 강력한 사용자 인증 시스템을 지원하기도 한다.

더 자세한 것은 시스템 관리자를 위한 리눅스-PAM 가이드(Linux-PAM Guide for System Administrators)를 참조하도록 한다.


FTP, 텔넷 및 기타 데몬 비활성화 시키기
텔넷과 FTP는 암호를 텍스트 형태로 네트워크를 통해 전송하기 때문에 스니핑의 표적이 될 수 있다. 이를 위해 ssh나 scp 등 최신의 툴을 사용할 수 있다. SSLtelnet/SSLftp 등도 사용 가능하지만 아직까지 그다지 널리 사용되고 있지는 않다.

SSH는 텔넷보다 더 뛰어난 기능을 제공한다. 예를 들어 remote X 세션을 투명하게 처리함으로써, 유저가 ssh를 통해 다른 머신에 접근, 해당 머신상에서 X 애플리케이션을 구동시키고 그 결과 나온 디스플레이를 로컬X 서버로 전송시킨다. 이를 테스트해보기 위해 X term에서 ssh로 당신의 ISP에 로그온한 뒤 xeyes & 등의 명령어를 입력하는 방법을 시도해 보도록 한다.

SSH는 윈도우나 매킨토시 등의 클라이언트 시스템에서도 사용 가능하다. 단 SSH의 라이선스는 약간의 문제점이 있다. 따라서 만일 상용 유저라면 BSD의 OpenSSH나 LSH의 사용을 고려해 보는 것도 좋을 것이다.

inted.conf 파일을 편집함으로써 텔넷과 FTP를 비활성화시킬 수 있다. 그 전에 /etc/motd(이는 message of the day를 뜻함)에 메시지를 언급함으로써 접근하는 유저들에게 메시지를 전달할 수 있다.

이 파일은 유저가 로그온해서 가장 처음 보게 되는 파일이다. 따라서 관리자는 "이 컴퓨터의 불법적인 사용은 금지돼 있으며, 이 컴퓨터상에서 당신의 행동은 모두 로그로 남을 것이다" 등 약간의 경고성 메시지가 나타나게 할 수도 있다.

Inetd는 모든 포트에 귀를 기울이는 역할을 한다. 만일 포트에서 어떤 신호가 감지되면 Inetd는 /etc/services와 /etc/inted에 연락, 해당 서비스를 시작하게 한다. 만일 inted.conf에서 어떤 서비스를 제외시키면 inted는 이에 신경쓰지 않는다.

텔넷과 FTP 외에도 다음의 것들을 비활성화시킬 수 있다.

discard
daytime
chargen
gopher
shell
login
exec
talk
tftp
finger
netstat
systat

inted를 끊고(hang up) 재시동시키면 inted.conf 파일을 읽은 뒤, 보다 접근이 제한된 상태로 남아있게 된다.

killall -HUP inted


rc.d 데몬 없애기
rc.d 파일에 포함된 부트스트랩 스크립트로 인해 몇몇 네트워킹 데몬이 구동될 수 있다. 보통 이러한 파일들은 /etc/init.d(데비안의 경우) 혹은 /etc/rc.d/init.d(레드햇의 경우) 등에 포함된 스크립트의 심볼릭 링크인 경우가 많다.

만일 init.d에 포함된 스크립트로 인해 원치 않는 프로그램이 가동된다면, 스크립트를 리네임시킴으로써 심볼릭 링크를 끊는 방법을 택하도록 한다. 이를 위해

linuxbox$ mv /etc/init.d/samba /etc/init.d/Samba.

등의 명령어를 시도해 본다.

만일 해당 서비스가 한시적으로 구동되도록 하려면 스크립트를 매뉴얼로 실행시키면 된다.

tcpwrappers로 남아있는 서비스 보호하기
inetd.conf를 사용해 현재 사용하지 않는 서비스를 걸러낸 다음에는, tcpwrappers(tcpd) 프로그램을 이용해 현재 구동중인 서비스를 보호할 수 있다.

tcpd를 셋업시키는 방법에는 여러 가지가 있지만 (man tcpd를 통해 자세한 사항을 참조할 수 있다) 결과는 모두 동일하다.

서비스 리퀘스트가 도착하면 inetd 데몬은 해당 서비스 대신 tcpd를 호출하게 된다. 그렇게 되면 tcpd는 몇 가지 사항을 확인하고, syslog.conf의 셋업에 맞춰(역시 man syslog.conf와 man syslogd 참조) 리퀘스트를 로그시키며, 액세스 컨트롤을 실시한다 (man host_access 참조).

이러한 모든 것이 문제없이 처리되면 리퀘스트를 해당 서비스로 보내 실행한다.

포트 스캔하기
자신의 시스템을 한번쯤 해커의 입장에서 살펴보고자 한다면 nmap을 인스톨하고 nmap localhost를 시도해 본다.

nmap은 또한 자신 시스템의 모든 subnet과 네트워크를 둘러보기 위해 사용될 수 있다. 이렇게 하는 것은 사용되지 않고 있는 고정 IP를 찾아내는 데 유용한 방법이다.

하지만 다른 사람의 네트워크에 이를 적용하는 것은 그다지 좋지 않은 생각이다. 해킹에 예민한 네트워크 어드민들은 포트 스캔을 적대적인 행위로 간주하기도 하며, 따라서 당신이 포트 스캔을 실시하는 것을 알아낸다면 당신을 접근 거부 리스트(denial list)에 올려놓을 것이다.

NOLOGIN 옵션
만일 시스템에 침입자가 있다고 판단되면 시스템에 임시로 /etc/nologin 파일을 생성함으로써 액세스를 막아놓도록 한다.

이 파일이 존재하면 루트(root) 외에 다른 사람들은 로그인할 수 없게 되며, 다른 사람들에게는 이 파일의 내용이 보여지게 된다. @



http://www.zdnet.co.kr/biztech/network/article.jsp?id=34194

댓글 없음:

댓글 쓰기