(http://www.digimoon.net/)
참고링크:
http://khaidoan.wikidot.com/php-clamav
http://www.howtoforge.com/scan_viruses_with_php_clamavlib
오픈소스 안티바이러스 백신으로 유명한 ClamAV는 대개 sendmail, qmail 등의 메일서버 에이전트와의 연동을 통해 바이러스 첨부파일을 차단할 수 있는 용도로 널리 알려져 있다.
주로 메일서버와의 연동에 대한 정보만 널리 알려져 있을 뿐 다른 서비스와의 연동 방법은 좀처럼 많이 알려져 있지 않은 편이다.
ClamAV를 호출할 수 있는 API를 제공하는 C언어 기반으로 작성된 php extension이 있는데 php-clamav가 그것이다.
http://php-clamav.sourceforge.net/
php-clamav를 설치하면 php로 만들어진 홈페이지를 통해 업로드되는 모든 첨부파일을 ClamAV로 스캔한 뒤 파싱 처리할 수 있게 된다.
이는 실로 놀라운 방법이 아닐 수 없다. ClamAV의 DB만 뒷받침된다면 대부분의 바이러스, 백도어, 웹쉘 등을 php단에서 차단할 수 있게 되는 것이다. 제로보드4와 같이 보안이 취약한 php 게시판을 어쩔 수 없이 이용해야 하는 경우 좋은 대안이 될 수 있을 것이다.
php-clamav extension을 사용하려면 당연히 ClamAV가 설치되어 있어야 한다.
RHEL/CentOS의 경우 third party repository로 rpmforge를 추가해 두면 yum으로 간편하게 설치할 수 있다
아래 URL에서 자신의 OS에 맞는 rpmforge 저장소를 받아 설치 (rpm -ivh)
http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS//rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
http://apt.sw.be/redhat/el4/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el4.rf.i386.rpm
http://apt.sw.be/redhat/el4/en/x86_64/rpmforge/RPMS/rpmforge-release-0.3.6-1.el4.rf.x86_64.rpm
http://apt.sw.be/redhat/el3/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el3.rf.i386.rpm
http://apt.sw.be/redhat/el3/en/x86_64/rpmforge/RPMS/rpmforge-release-0.3.6-1.el3.rf.x86_64.rpm
http://apt.sw.be/redhat/el2.1/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el2.rf.i386.rpm
http://apt.sw.be/redhat/9/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.rh9.rf.i386.rpm
http://apt.sw.be/redhat/8.0/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.rh7.rf.i386.rpm
http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS//rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
http://apt.sw.be/redhat/el4/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el4.rf.i386.rpm
http://apt.sw.be/redhat/el4/en/x86_64/rpmforge/RPMS/rpmforge-release-0.3.6-1.el4.rf.x86_64.rpm
http://apt.sw.be/redhat/el3/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el3.rf.i386.rpm
http://apt.sw.be/redhat/el3/en/x86_64/rpmforge/RPMS/rpmforge-release-0.3.6-1.el3.rf.x86_64.rpm
http://apt.sw.be/redhat/el2.1/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el2.rf.i386.rpm
http://apt.sw.be/redhat/9/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.rh9.rf.i386.rpm
http://apt.sw.be/redhat/8.0/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.rh7.rf.i386.rpm
yum 설치
[root@localhost ~]# yum -y install clamav clamav-devel clamav-db clamd
/etc/clamd.conf, /etc/freshclam.conf 설정
[root@localhost ~]# cat /etc/clamd.conf
LogFile /var/log/clamav/clamd.log
LogTime yes
LogSyslog yes
LogVerbose yes
PidFile /var/run/clamav/clamd.pid
TemporaryDirectory /var/tmp
DatabaseDirectory /var/clamav
LocalSocket /tmp/clamd.socket
FixStaleSocket yes
ScanMail yes
[root@localhost ~]# cat /etc/freshclam.conf
DatabaseDirectory /var/clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogSyslog yes
PidFile /var/run/freshclam.pid
DatabaseOwner clamav
DatabaseMirror db.kr.clamav.net
DatabaseMirror db.local.clamav.net
NotifyClamd /etc/clamd.conf
[root@localhost ~]#
LogFile /var/log/clamav/clamd.log
LogTime yes
LogSyslog yes
LogVerbose yes
PidFile /var/run/clamav/clamd.pid
TemporaryDirectory /var/tmp
DatabaseDirectory /var/clamav
LocalSocket /tmp/clamd.socket
FixStaleSocket yes
ScanMail yes
[root@localhost ~]# cat /etc/freshclam.conf
DatabaseDirectory /var/clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogSyslog yes
PidFile /var/run/freshclam.pid
DatabaseOwner clamav
DatabaseMirror db.kr.clamav.net
DatabaseMirror db.local.clamav.net
NotifyClamd /etc/clamd.conf
[root@localhost ~]#
ClamAV 서비스 시작
[root@localhost ~]# /etc/rc.d/init.d/clamd start
freshclam 커맨드로 바이러스 DB 업데이트
[root@localhost ~]# freshclam
ClamAV update process started at Tue Jan 24 12:19:21 2012
main.cvd is up to date (version: 54, sigs: 1044387, f-level: 60, builder: sven)
Downloading daily-14343.cdiff [100%]
Downloading daily-14344.cdiff [100%]
Downloading daily-14345.cdiff [100%]
Downloading daily-14346.cdiff [100%]
daily.cld updated (version: 14346, sigs: 76235, f-level: 63, builder: guitar)
bytecode.cld is up to date (version: 163, sigs: 39, f-level: 63, builder: edwin)
Database updated (1120661 signatures) from db.kr.clamav.net (IP: 211.239.150.206)
Clamd successfully notified about the update.
[root@localhost ~]#
ClamAV update process started at Tue Jan 24 12:19:21 2012
main.cvd is up to date (version: 54, sigs: 1044387, f-level: 60, builder: sven)
Downloading daily-14343.cdiff [100%]
Downloading daily-14344.cdiff [100%]
Downloading daily-14345.cdiff [100%]
Downloading daily-14346.cdiff [100%]
daily.cld updated (version: 14346, sigs: 76235, f-level: 63, builder: guitar)
bytecode.cld is up to date (version: 163, sigs: 39, f-level: 63, builder: edwin)
Database updated (1120661 signatures) from db.kr.clamav.net (IP: 211.239.150.206)
Clamd successfully notified about the update.
[root@localhost ~]#
아래 URL에서 php-clamav extension 소스를 받는다.
http://sourceforge.net/projects/php-clamav/
컴파일 설치
[root@localhost ~]# tar xvzf php-clamav_0.15.6.tar.gz
[root@localhost ~]# cd php-clamav-0.15.6
[root@localhost php-clamav-0.15.6]# /usr/local/php/bin/phpize
[root@localhost php-clamav-0.15.6]# ./configure --with-clamav
[root@localhost php-clamav-0.15.6]# make
[root@localhost php-clamav-0.15.6]# make install
[root@localhost ~]# cd php-clamav-0.15.6
[root@localhost php-clamav-0.15.6]# /usr/local/php/bin/phpize
[root@localhost php-clamav-0.15.6]# ./configure --with-clamav
[root@localhost php-clamav-0.15.6]# make
[root@localhost php-clamav-0.15.6]# make install
clamav.so 설치된 것 확인
[root@localhost ~]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613 | grep clamav.so
clamav.so
[root@localhost ~]#
clamav.so
[root@localhost ~]#
php.ini 아래와 같이 설정하고 아파치 리스타트
[PHP] extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613" [clamav] extension="clamav.so" clamav.dbpath="/var/clamav" clamav.keeptmp=0 clamav.load_db_on_startup=0 clamav.maxfiles=0 clamav.maxfilesize=0 clamav.maxreclevel=16 clamav.maxscansize=0 clamav.tmpdir="/var/tmp"※ clamav.maxreclevel 값은 16이 default 수치이므로 임의로 0으로 설정해서는 안 된다.
0은 제한을 하지 않는다는 의미인데 바이러스 스캐닝 프로세스가 시스템의 모든 리소스를 차지할 위험이 있기 때문에 하드웨어 성능에 맞게끔 적절하게 수치 조정할 것을 권장한다.
phpinfo에서 아래와 같이 확인되어야 연동이 된 것이다.

아래 소스코드로 된 php 파일을 만들고 웹에서 출력 테스트
(출처: http://www.howtoforge.com/scan_viruses_with_php_clamavlib)
\n"; foreach($functions as $func) { echo $func." \n"; } echo " \n"; $function = 'confirm_' . $module . '_compiled'; if (extension_loaded($module)) { $str = $function($module); } else { $str = "Module $module is not compiled into PHP"; } echo "$str\n"; ?>cl_info(), cl_scanfile(), cl_engine(), cl_pretcode(), cl_version(), cl_debug() 6가지 함수 기능 확인
(php-clamav-0.15.6 기준)

cl_setlimits() 함수는 2012년 1월 현재 최신 버전인 0.15.6에선 지원하지 않는다.
각 함수의 기능에 대해서는 아래 URL 참고
http://php-clamav.sourceforge.net/
php-clamav는 ClamAV를 호출할 수 있는 php 함수 몇 가지를 추가 지원하게 해 주는 extension이다. php 코드상에 cl_scanfile() 등의 함수를 사용자가 직접 넣어 원하는 기능을 구현해야 한다. 그러므로 웹호스팅 환경과 같이 여러 홈페이지를 운영하는 서버엔 현실적으로 적용하기 어렵다는 점과 php에 대해 어느 정도 지식이 있어야 사용할 수 있다는 점을 단점으로 꼽을 수 있겠다.
장점으론 최근 들어 상용백신 못지 않게 방대해진 바이러스 정의 DB로 발전을 거듭하고 있는 오픈소스 안티바이러스 백신인 ClamAV를 연동할 수 있다는 점일 것이다. clamscan 커맨드로 바이러스 스캐닝을 해 보니 2012년 1월 23일 ClamAV 0.97.3 기준으로 검출해 낼 수 있는 바이러스 패턴이 1119354가지에 달한다.
----------- SCAN SUMMARY -----------
Known viruses: 1119354
Engine version: 0.97.3
Scanned directories: 812
Scanned files: 5884
Infected files: 1
Data scanned: 433.91 MB
Data read: 499.26 MB (ratio 0.87:1)
Time: 62.578 sec (1 m 2 s)