리눅스는 오픈소스의 장점으로 인해, 중소기업의 서버 플랫폼으로 사용되고 있다. 리눅스는 오픈소스이기 때문에 사용자들 스스로 신속하게 버그나 취약점을 발견해 업데이트하기 때문에 더 안정적일 수 있다는 의견이 있다. 하지만 관리자가 리눅스의 파워 유저가 아니라면, 리눅스의 보안 문제가 발생했을 때 좀처럼 관리하기 힘들다. 이 글을 통해, 리눅스 보안에 적합한 몇가지 명령어와 툴을 이용해 리눅스 보안에 접근해 본다.
Part 3. 사고 대응과 모니터링
아무리 보안 설정을 하고 접근 통제를 했다 하더라도 웹 등 허용된 포트를 통해서 또는 예상치 못한 방법으로 비정상적인 접근이 발생할 수 있다. 이런 경우 어떻게 대응해야 하는지에 대해 살펴보자. 물론 어떤 환경이고 어떤 현상인가에 따라 대응 방법도 많이 달라질 수 있을 것이다. 다음에서 제시하는 방법은 가장 기본적이면서 필수적인 절차인데, 몇 가지 기본적인 명령어 사용만으로도 많은 정보를 확인할 수 있다는 것을 알 수 있다.
ps를 사용한 모니터링
먼저 ps는 리눅스를 사용하는 사용자라면 모두 아는 명령어일 것이다. 현재 시스템에 떠 있는 프로세스에 대한 정보를 확인해 볼 수 있는데, 적어도 서버 관리자라면 ps 실행시 보이는 프로세스가 어떤 프로그램인지, 또한 어떤 프로그램이 비정상적인 프로세스인지 분간할 수 있어야 할 것이다. 다음과 같은 경우 nobody 권한으로 작동중인 프로세스를 검색한 것인데, 제일 아래쪽에 ./shell이라는 이상한 프로세스가 있는 것을 알 수 있다. 일단 nobody 권한이므로 웹에서 실행한 것임을 알 수 있다.
# ps aux|grep nobody
nobody 22593 0.0 0.2 8520 5612 ? S Feb21 2:19 /www/bin/httpd
nobody 18963 0.0 0.2 8276 5296 ? S Feb26 0:46 /www/bin/httpd
nobody 28705 0.0 0.2 8208 5352 ? S 06:00 0:10 /www/bin/httpd
nobody 19956 0.0 0.2 8188 5280 ? S 07:46 0:12 /www/bin/httpd
nobody 27036 0.0 0.2 8132 5192 ? S 08:05 0:12 /www/bin/httpd
nobody 27042 0.0 0.2 8200 5300 ? S 08:05 0:13 /www/bin/httpd
nobody 3353 0.0 0.0 1440 276 ? S 13:52 0:00 ./shell
이 프로세스가 어떤 것인지 확인하기 위해 다음과 같이 확인해 보니 exe -> /tmp/shell*인 것으로 보아 /tmp 디렉토리에 있는 shell이라는 파일을 실행한 것임을 알 수 있다.
# ls -la /proc/3353/
total 0
dr-xr-xr-x 3 nobody nobody 0 Feb 28 18:41 ./
drwx------ 448 root root 0 Feb 1 21:58 ../
-r--r--r-- 1 nobody nobody 0 Feb 28 18:41 cmdline
-r--r--r-- 1 nobody nobody 0 Feb 28 18:41 cpu
lrwxrwxrwx 1 nobody nobody 0 Feb 28 18:41 cwd -> //
-r-------- 1 nobody nobody 0 Feb 28 18:41 environ
lrwxrwxrwx 1 nobody nobody 0 Feb 28 18:41 exe -> /tmp/shell*
dr-x------ 2 nobody nobody 0 Feb 28 18:41 fd/
/tmp/shell 파일을 읽어보니 원격에서 셸을 실행하는 프로그램임을 알 수 있었다. 현재 시스템에서 어떤 포트가 떠있는지 확인하기 위해 다음과 같이 실행했다.
# netstat -lnp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 3353/shell
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 23763/mysqld
tcp 0 0 0.0.0.0:29999 0.0.0.0:* LISTEN 910/ipgClient
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 14432/httpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1118/proftpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 982/sshd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 7008/sendmail
이와 같이 실행해 보니 8000번 포트에 리슨하고 있는 것을 알 수 있다. 혹시나 해서 8000번으로 접속해 보니 다음과 같이 ID/패스워드를 인증 절차없이 바로 로그인이 가능한 것을 알 수 있다.
# telnet 0.0.0.0 8080
Trying 0.0.0.0...
Connected to 0.0.0.0.
Escape character is '^]'.
-bash-2.05b$
비정상적인 프로그램임을 확인했으므로 해당 프로세스를 죽이고, 해당 파일 역시 삭제해야 한다.
# kill -9 3353 (/tmp/shell의 pid)
# rm -f /tmp/shell
아울러 가능하다면 로그 등을 살펴보아 어떤 방법으로 nobody 권한을 획득했는지 체크하기 바란다. 이와 같은 경우 비정상적인 파일이 nobody 권한이었지만 이미 root 권한을 획득했는지 여부는 알 수 없다. 따라서 혹 시스템에 다른 이상은 없는지 root 권한으로 백도어 등은 없는지 확인해야 한다. 이를 위해서 여러 프로그램을 활용할 수 있는데, 대표적인 프로그램에 대해 살펴보도록 하자.
먼저 유용하게 사용할 수 있는 프로그램으로 rootcheck라는 것이 있다. 이 프로그램은 시스템의 전반적인 보안 점검을 하고자 할 때 유용하게 활용할 수 있는데, 다음과 같은 기능을 제공한다.
·LKM rootkit 에서 사용되는 숨겨진 포트나 파일점검
·인터페이스의 promisc 여부 점검
·패스워드 파일 점검
- 암호가 없는 계정이 있는지 확인
- 셸(shell)이 있는 시스템계정이 있는지 확인
·httpd.conf나 inetd.conf, xinetd.conf, sshd_conf 등의 설정 파일 점검
- 설정 파일에 수상한 목록이 있는지 확인
- 잘못 설정돼 있는지 확인
·삭제된 로그파일 등 로그 파일 관련 수상한 점 점검
·/proc과 ps를 점검해 숨김(hidden) 프로세스 여부 점검
·알려진 루트킷(rootkit) 존재 여부 확인
·기타 수상한 파일이나 디렉토리 및 퍼미션 등 점검
- suid/sgid 파일 점검
- history 파일이 /dev/null 등에 링크돼 있는지 확인
- 몇몇 바이너리의 변경 날짜 확인
ootcheck의 홈페이지(www.ossec.net/rootcheck)에 접속 후 최신 버전의 패키지를 다운로드받아 설치하면 된다 (화면 15).
설치된 디렉토리에서 다음과 같이 실행하면 사용할 수 있는 옵션이 나온다.
# ./rootcheck.pl --help
RootCheck 0.4
OptiOptions available:
--help Shows this menu
--checkfiles Only check the files
--checkbin Only check the binaries
--checkports Only check the ports
--checkif Only check the interfaces
--checkpasswd Only check the passwd db
--checklogs Only check the logs
--checkprocess Only check the process
--logfile=xx Write the results in a different file
--html Log in html
--silent Dont print anything.
--terminal Print on the terminal.
--email=xx@xx.com Send the result to your email.
--smtpserver=xx.com You need to specify when sending
to your email.
각자 환경에 맞게 적당한 옵션을 줘 스캔을 한 결과는 현재 디렉토리에 저장된다. suid 파일에 대한 정보는 suidfiles.txt에, 모든 파일은 logfiles.txt에, 시스템 배너는 banners.txt에, 스캔 결과는 result.txt에 각각 저장된다. 그리고 종합적인 결과는 result.txt에 저장되는데, 이 파일을 살펴 시스템이 무결한지를 확인하기 바란다.
더불어 꼭 살펴봐야 할 프로그램으로 chkrootkit이라는 것이 있다. 이 프로그램은 이름이 뜻하는 대로 시스템 내에 rootkit 존재 여부를 체크해 주는데, 특히 특정 바이너리 파일의 변조 여부를 정확하게 체크할 수 있다. 최근에 root 권한을 획득한 이후에는 ps나 netstat 등 각종 바이너리 파일을 변조해 특정 프로세스나 접속 정보 등을 보이지 않도록 하는 경우가 많은데 이같은 경우 많은 도움을 받을 수 있다.
chkrootkit의 홈페이지(http://www.chkrootkit.org/)에 접속 후 최신 버전의 패키지를 다운로드와 설치하면 된다.
설치된 디렉토리에서 ./chkrootkit -h를 실행하면 사용할 수 있는 옵션이 나오는데, 옵션없이 ./chkrootkit을 실행하면 다음과 같이 바이너리 파일과 rootkit 설치 여부에 대해 스캔을 시작한다.
지금까지 세 가지 원칙에 따라 몇 가지 명령어와 툴의 사용방법에 대해 알아봤다. 해킹 기술도 하루가 다르게 변화하므로 새로운 기법과 툴은 계속 나올 것이고, 이에 대응하는 툴과 명령어 등도 물론 변화하겠지만 그러나 보안을 강화하기 위한 이 세 가지 큰 원칙은 변함없이 지속될 것이다. 따라서 어디에서부터 무엇을 해야 할지 모르겠다면 이 원칙에 따라 하나씩 하나씩 구체적인 설정을 해 나간다면 안전한 리눅스 서버를 운영할 수 있게 될 것이다.
'Operating System > Linux' 카테고리의 다른 글
| Linux Security How-To (개요) (0) | 2007/06/16 |
|---|---|
| Linux Security How-To (소개) (0) | 2007/06/16 |
| Linux Security How-To (색인) (0) | 2007/06/09 |
| 각 OS Version 및 정보 숨기는 법 (0) | 2007/06/05 |
| Apache에 SSL Module 추가 (0) | 2007/05/22 |
| 손에 잡히는 Linux Security ③ (0) | 2007/05/22 |
| 손에 잡히는 Linux Security ② (0) | 2007/05/22 |
| 손에 잡히는 Linux Security ① (0) | 2007/05/12 |
| portsentry를 이용한 Port Scan 검사 및 방어 Program (0) | 2007/05/12 |
| sendmail을 이용한 Mail Server 설정하기 (0) | 2007/05/12 |
| 보안점검 명령어 (0) | 2007/05/10 |