ClamAV(Clam AntiVirus)는 공개용 백신으로 윈도우즈, 리눅스, OS X 용 버젼들이 있다.
실시간 탐지가 되지 않는 백신이므로 시스템을 주기적으로 스캐닝하여 바이러스를 탐지해야만 한다.
리눅스 시스템 운영시 크게 3가지 이유로 백신이 필요 할 수 있다.
1) 웹서버를 운영하는 경우 웹쉘 관련 스크립트(php, jsp)나 악성코드 등을 탐지
2) 윈도우즈 시스템을 위한 파일서버(SMB, FTP, 웹업로드)를 운영할 경우 윈도우즈 OS에 영향을 미치는 바이러스 등을 탐지
3) 메일서버 운영시 메일(첨부파일등)의 악성코드 등을 탐지 (여기서는 다루지 않았다.)
0. 테스트 환경
OS : CentOS 4.x 32bit
ClamAV Version : clamav-0.97.7.tar.gz
1. clamav 소스 다운로드
http://sourceforge.net/projects/clamav/files/clamav
2. 유저 생성
groupadd -g 555 clamav
useradd -g 555 -M -s /sbin/nologin -c "ClamAntiVirus" clamav
3. 설치
./configure --enable-static --prefix=/usr/local/clamav --disable-zlib-vcheck ; make ; make install
(참고 : 메일서버 운영할 경우 메일 감시를 위해선 configure시 --enable-milter 옵션을 준다.)
4. 디렉토리 생성
mkdir /usr/local/clamav/db
mkdir /usr/local/clamav/log
chown clamav.clamav /usr/local/clamav/db
chown clamav.clamav /usr/local/clamav/log
chmod 700 /usr/local/clamav/db
chmod 700 /usr/local/clamav/log
mkdir /var/run/clamav (없으면 만들것. clamd.socket 파일이 생성된다.)
5. iconv 라이브러리 링크
ln -s /usr/local/lib/libiconv.so.2 /usr/lib
--> 아래 에러 방지
error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory
6. 설정
vi /usr/local/clamav/etc/clamd.conf
#Example --> 주석처리
LocalSocket /var/run/clamav/clamd.socket
FixStaleSocket yes
TCPSocket 3310
TCPAddr 127.0.0.1
MaxThreads 20
User clamav
LogFile /usr/local/clamav/log/clamd.log
LogTime yes
PidFile /usr/local/clamav/log/clamd.pid
DatabaseDirectory /usr/local/clamav/db
DetectBrokenExecutables yes
vi /usr/local/clamav/etc/freshclam.conf
#Example --> 주석처리
DatabaseMirror database.clamav.net
DatabaseDirectory /usr/local/clamav/db/
UpdateLogFile /usr/local/clamav/log/freshclam.log
DatabaseOwner clamav
NotifyClamd /usr/local/clamav/etc/clamd.conf
7. 바이러스 DB 업데이트 (처음 스캔전에 실행해야 한다. cron에 넣어 주기적인 업데이트)
/usr/local/clamav/bin/freshclam
8. 스캔하기
1) home 디렉토리(하위포함)를 스캔하여 감염된 파일 화면 출력
/usr/local/clamav/bin/clamscan -riv /home
2) home 디렉토리(하위포함)를 스캔
/usr/local/clamav/bin/clamscan -rv /home
9. crontab
00 23 * * * /usr/local/clamav/bin/freshclam --quiet
00 00 * * * CurrTime=`date +%Y-%m-%d""_%T` ; /usr/local/clamav/bin/clamscan -rv --move=/home/infected /home | awk '{now=strftime("%F %T"); print now, " ", $0}' >& /usr/local/clamav/log/"$CurrTime"_clamscan.log
00 12 * * * find /home/infected/* -mtime +14 -user root -exec rm -f {} \; ; find /usr/local/clamav/log/* -mtime +30 -user root -exec rm -f {} \;
--> 위 cron을 해석하자면,
1) 매일 23시에 바이러스 DB 업데이트
2) 매일 00시에 /home 디렉토리를 스캔하여 감염된 파일을 /home/infected 디렉토리에 옮긴다.
스캐닝한 리스트는 /usr/local/clamav/log 디렉토리에 현재시각_clamscan.log 형태로 남긴다. 또한 스캐닝한 리스트의 디렉토리 경로 앞에 현재시각을 마킹.
3) 매일 12시에 /home/infected 디렉토리 내의 수정된지 14일이 넘은 root 소유권 파일들을 삭제한다.
그리고 /usr/local/clamav/log 디렉토리내의 수정된지 30일이 넘은 root 소유권 파일들을 삭제한다.
* 감염된 파일이 이동되어 보관되는 /home/infected 디렉토리를 만들어 줘야 한다.
감염된 파일을 이동 시켜서 일정기간 남겨두는 이유는 오진 등으로 인해 파일이 원치않게 삭제되는것을 방지하기 위해서다.
그리고 스캔한 파일 리스트(디렉토리경로를포함)를 뽑아두는 이유는 오탐된 데이터 복구시 경로를 알아야 수월하기 때문이다.