DigiMoon 맘대로 닦고 조이고 기름치는 재미가 있는 DigiMoon만의 기억 저장소

Posted
Filed under 컴퓨터 탐구/리눅스
작성자: 주인장 디지문
(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

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 ~]#

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 ~]#



아래 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

clamav.so 설치된 것 확인
[root@localhost ~]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613 | grep clamav.so
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 기준)
사용자 삽입 이미지
※ 맨 아래행 Fatar error 메시지는 무시해도 된다.
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)


Creative Commons License
2012/01/21 23:45 2012/01/21 23:45

무료 Antivirus툴인 ClamAV( http://clamav.net/ )은 sendmail + ClamAV 조합으로 수신되는 메일의 바이러스를 검사할 수도 있고, 윈도에서는 ClamAV 바이러스 엔진을 사용한 ClamWin( http://www.clamwin.com/ )으로 바이러스 검사를 할 수 있다. 바로 이 clamav의 php용 라이브러리인 php-clamavlib으로 php에서 바이러스를 검사하는 방법을 'How To Automatic..