본문 바로가기
서버구축 (WEB,DB)

메일로 들어오는 바이러스 차단 AntiVir Milter 설치 및 운영

by 날으는물고기 2009. 5. 18.

메일로 들어오는 바이러스 차단 AntiVir Milter 설치 및 운영

작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
작성일 : 2003.02.10
수정일 : 2003.07.21
정리일 : 2003.08.19
  
H+BEDV AntiVir는 파일시스템, 메일(AntiVir Milter), 웹(AntiVir WebGate)을 통한
바이러스를 검사해주는 스캐너이다. 패턴이 업데이트되므로 최신 바이러스까지 검사할수
있다. Linux, OpenBSD, FreeBSD 등의 OS를 지원한다.
국내에서도 여러 곳에서 쓰고 있는 것으로 아는데, 설치 및 운영에 대한 글이 한글로
된 것을 찾기 힘들어(?) 기존에 써뒀던 글을 좀 다듬어 올린다.

AntiVir는 개인에 한하여 무료로 쓸 수 있는 key를 제공한다.
1개의 key 파일로
AntiVir for Linux and FreeBSD, AVMailGate for Linux,
AntiVir for Linux Workstation, AntiVir Command Line Scanner for Linux
를 사용할 수 있다.

1. AntiVir Milter 설치

http://www.hbedv.com/ -> Downloads (http://www.hbedv.com/download/download.htm)
에서 AntiVir Milter for Linux (avlxmlt.tgz) 를 받아온다.

------------------------------------------
[root@truefeel root]# tar xvfz avlxmlt.tgz
[root@truefeel root]# cd antivir-milter-x.y.z  (x.y.z 는 버전)
------------------------------------------

INSTALL 파일을 읽으면 설치 방법이 잘 나와 있으니 참고하기 바란다.

   1) 실행 파일 설치  
  
   ---------------------------------------
   mkdir /usr/lib/AntiVir
   cp bin/avmilter /usr/sbin
   cp script/avq   /usr/lib/AntiVir (AntiVir Milter용 메일큐 관리스크립트)
   ln -s /usr/lib/AntiVir/avq /usr/sbin/avq

   AntiVir for Linux를 설치한적이 없을 경우 다음과 같이 엔진까지 함께 복사
   cp bin/antivir  /usr/lib/AntiVir
   ln -s /usr/lib/AntiVir/antivir /usr/sbin/antivir
   ---------------------------------------

   ※ AntiVir for Linux(Scanner를 말함)는 installer가 제공되어 쉽게 설치할 수 있으며,
      운영중에 AntiVir Milter를 추가 설치가 가능하다.
      저는 하나의 시스템은 AntiVir 운영중에 AntiVir Milter를 추가 설치했고,
      다른 시스템은 AntiVir Milter부터 설치 운영하고 있다.

   2) 패턴 파일(antivir.vdf) 및 환경 파일 설치

   default로 avmilter는 uucp:uucp 권한으로 실행된다.

   ---------------------------------------
   cp vdf/antivir.vdf   /usr/lib/AntiVir
   cp etc/avmilter.conf /etc
   cp etc/antivir.conf  /etc (AntiVir를 설치한 적이 없는 경우)
   ---------------------------------------

   3) 부팅용 스크립트 복사

   ---------------------------------------
   cp init.d/rc.avmilter /etc/rc.d/init.d/avmilter
   chkconfig --add avmilter
   ---------------------------------------

2. License key 받기

AntiVir for Linux  Private User Registration ( http://www.hbedv.com/private/ )
에 각 항목을 입력하면 해당 메일로 라이센스 파일이 온다.
hbedv.key, lic_info.txt(이 txt파일은 없어도 운영에는 문제가 없지만)를
/usr/lib/AntiVir 로 복사하고 hbedv.key는 avmgate.key이름으로도 복사한다.

------------------------------------------
cp hbedv.key lic_info.txt /usr/lib/AntiVir (AntiVir를 설치한 적이 없는 경우)

cp hbedv.key /usr/lib/AntiVir/avmgate.key
chown uucp:uucp /usr/lib/AntiVir/avmgate.key
------------------------------------------

3. Milter용 메일 스풀 디렉토리 생성
  (/etc/avmilter.conf 에서 경로와 실행 user default값 변경 가능)

------------------------------------------
mkdir /var/spool/avmilter
cd    /var/spool/avmilter
mkdir incoming outgoing rejected

chown -R uucp:uucp /var/spool/avmilter
chmod -R 700       /var/spool/avmilter
------------------------------------------

4. sendmail.cf 설정

------------------------------------------
# Antivir Milter
Xavmilter, S=inet:3333@localhost, F=R, T=S:10m;R:10m;E:10m
O InputMailFilters=avmilter
------------------------------------------

메일을 송수신하게 되면 sendmail은 3333포트의 avmilter에게 전달하고, avmilter는
바이러스가 없으면 해당 사용자에게 전송하게 된다.  만약 바이러스가 존재하면
avmilter 큐에 저장을 해두며, 송수신자엑 메일에 바이러스가 있음을 알린다.
(환경 설정에 따라 알리지 않을 수 있다.)

5. 실행하기
  
------------------------------------------
/usr/sbin/avmilter -p inet:3333@localhost 또는 /etc/rc.d/init.d/avmilter start
  
/etc/rc.d/init.d/sendmail restart (sendmail.cf 설정 변경했으므로 재실행 필요)
------------------------------------------

netstat -atnp 로 동작중인지 확인해보자.
  
------------------------------------------
Proto Recv-Q Send-Q Local Address   Foreign Address  State  PID/Program name
...
tcp   0      0      127.0.0.1:3333  0.0.0.0:*        LISTEN 4259/avmilter
...
------------------------------------------

/etc/rc.d/init.d/avmilter start 할 때

can't initialize scan engine

오류가 발생했다면 /var/tmp 에 쓸 수 있는 권한이 있는지 확인해본다.
또는 /usr/lib/Antivir/antivir가 정상적으로 복사가 된 것인지도 확인해봐야한다.

※ Virus 메일일 때, 송수신자에게 모두 alert 메시지를 보내려면,
   /etc/avmilter.conf 에 다음 항목을 YES로 설정

   VirusAlertToRcpt                 YES
   VirusAlertToSender               YES

   설정 변경 후 반드시 avmilter 를 재실행해야함.

※ 패턴이 매일 자동 업데이트 되도록 cron 에 다음을 넣어둔다.

20 4 * * * /usr/lib/AntiVir/antivir --update -q

6. 바이러스를 정상적으로 체크하는지 확인하는 방법

   1) eicar 표준 안티바이러스 테스트 파일을 메일로 첨부해서 보내면 된다.
      아래에 옮겨둔 68bytes 를 eicar.com.txt 로 저장한 후 첨부하거나 메시지로 써서
      외부에서 root@호스트명 으로 보낸다.
   X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

   http://www.eicar.org/anti_virus_test_file.htm 에서 eicar.com.txt를 받을 수도 있다.

   2) 만약 postmaster 통해서 다음과 같은 메시지를 받았다면 바이러스를 정상적으로
      검사하고 있다는 의미이다.

------------------------------------
.. 생략 ..
Subject: AntiVir ALERT [mail from: truefeel <truefeel@???????.net>]
X-AntiVirus: checked by AntiVir Milter 1.0.4; AVE 6.20.0.1; VDF 6.20.0.43

* * * * * * * * * * * * * * * AntiVir ALERT * * * * * * * * * * * * * * *
This version of AntiVir is licensed for private and non-commercial use.

AntiVir has detected the following in a mail sent through your server:

        Eicar-Test-Signatur

The mail was not delivered.

.. 생략 ..
------------------------------------

7. AntiVir Milter용 메일큐 관리

AntiVir는 avq라는 스크립트를 제공한다.
------------------------------------
[root@truefeel root]# avq

S ---Queue ID--- --Size-- ---Sender/Recipients-------
v 06191-3F35903C    12425 <????@??????.?????.kr>
                          <truefeel@????????.net>
------------------------------------

바이러스가 있다고(State가 v) 판단되어 발송이 되지 않고 큐(/var/spool/avmilter)에
메일이 1개 남아있음을 나타낸다. 필요없는 메일이면 큐를 clear 시킨다.

------------------------------------
[root@truefeel root]# avq --remove=06911-3F35903C
ctor: /var/spool/avmilter/rejected/vf-06911-3F35903C
/var/spool/avmilter/rejected/df-06911-3F35903C
avq: message id '06911-3F35903C' removed.
AntiVir Milter mail queue is empty.
[root@truefeel root]#
[root@truefeel root]# avq
AntiVir Milter mail queue is empty.
[root@truefeel root]#
------------------------------------

8. syslog 통해서 남는 로그 (/var/log/maillog)

   1) 실행할 수 없는 예

   Mar 14 19:50:14 free avmilter[19330]: Scan engine is not available - exiting!
   Mar 14 19:50:14 free avmilter[19330]: can't initialize scan engine

   2) avmilter 실행할 때

   Jul 21 22:20:36 truefeel avmilter[5347]: engine version: 6.20.0.1
   Jul 21 22:20:36 truefeel avmilter[5347]: vdf version: 6.20.0.43
   Jul 21 22:20:36 truefeel avmilter[5347]: running in private mode

   3) 메일에 virus가 감지될 때 (/var/log/maillog)

   Jul 21 22:24:08 truefeel avmilter[5405]: Alert! the file "/var/tmp/av-05405-jfej1c/av-1" contains "W32/Nimda.eml" virus
   Jul 21 22:24:08 truefeel avmilter[5405]: Potential malicious code has been found - mail will be rejected.

   4) 메일에 virus 감지될 때 antivir (/var/log/messages)

   Jul 21 22:28:35 truefeel antivir[5535]: AntiVir ALERT: [W32/Nimda.eml virus] /var/tmp/av-05531-oMFI2L/av-1 <<< Contains code of the Windows virus W32/Nimda.eml

9. AntiVir 로 파일시스템의 바이러스 검사

/usr/sbin/antivir 로 링크도 해뒀으니 바이러스 검사도 쉽게 할 수 있을 것이다.

사용자 홈 디렉토리만 검사를 해보자.
--allfiles 옵션은 모든 파일을, -s는 서브 디렉토리까지 검사하라는 것이다.
만약 link를 따라 검사하기를 원하지 않으면 -nolnk 까지 추가해서 하면 된다.

------------------------------------
[root@truefeel root] antivir --allfiles -s /home

AntiVir / Linux Version 2.0.7-41
Copyright (C) 1994-2003 by H+BEDV Datentechnik GmbH.
All rights reserved.  

Loading /usr/lib/AntiVir/antivir.vdf ...                                                                                  

VDF version: 6.20.0.43 created 18 Jul 2003                                                                                

For private, non-commercial use only.
AntiVir license: ?????????? for Jinho ????????, ??????

\ /home/oracle/oui/bin/linux/libclntsh.so.9.0
------------------------------------

검사가 완료되면 다음과 같이 표시해준다.

----- scan results -----
directories:     1017
       files:     5193
      alerts:        0
   scan time: 00:00:46
------------------------
Thank you for using AntiVir.

삼바(samba)로 윈도 시스템과 공유를 할 때 antivir는 위력을 발휘할 것이다.
저는 파일서버로 운영중인 Network Drive(자체 OS, SMB 지원하는)장비를 검사하는데
antivir가 큰 도움이 되었다.

10. 맺음말

운영중에 문제가 생기면  
AntiVir MailGate Linux FAQ and Answers ( http://www.hbedv.com/support/mailgatefaq_e.htm )
가 도움이 될 것이다.

 

메일 바이러스 차단 AntiVir Milter FAQ (문제해결편)

Antivir Milter 설치는 간단합니다. 그러나
- 설치 환경이 다양하고
- 한글로 된 문서를 찾기가 쉽지않아서
순서대로 했는데 문제 발생할 때 해결책 찾기가 쉽지 않았을 겁니다.

저에게 직접 질문한 것과 KLTP를 통해 질문한 것을 정리한 것에 불과합니다.
Antivir툴의 전문가도 아닌데 여러 질문을 받다보니 여기까지(?) 오게 됐습니다.
문제 해결에 도움이 되기를...

Q1) 솔라리스에서도 사용할 수 있습니까?
-----------------------------------------------------------------------

A1) Antivir Milter는 Linux, FreeBSD, OpenBSD용만 있습니다.

Q2) Qmail에서는 Antivir Milter 사용은?
-----------------------------------------------------------------------

A2) Antivir Milter는 sendmail용입니다.

sendmail의 Milter API를 이용해서 동작합니다.
그러나 qmail에서 전혀 사용할 수 없는 것은 아닙니다.
AntiVir MailGate 라는게 있습니다.

AntiVir MailGate for linux, freebsd, openbsd
http://www.hbedv.com/download/download.htm

sendmail은 물론 qmail까지 지원합니다.
qmail이 메일을 받으면 mailgate에 넘겨서 검사 후에 다시 qmail이 받는 형태로
처리를 합니다.
linux에서 설치는 avinstall.pl라는 인스톨러가 있으니 쉽게 가능합니다.
설정은 INSTALL.qmail을 살펴보기 바랍니다.
qmail을 두개 띄우고 이리저리 넘겨 받는 과정이 필요합니다.


Q3) 설정후 sendmail 실행시에 unknown configuration line "Xavmilter...  에러
-----------------------------------------------------------------------

/etc/rc.d/init.d/sendmail restart 에서

unknown configuration line "Xavmilter, S=inet:3333@localhost, F=R,
T=S:10m;R:10m;E:10m"
554 /etc/sendmail.cf: line 1217: readcf: unknown option name InputMailFilters

와 같은 에러가 발생했습니다.

A3) Sendmail이 Milter 기능을 포함하지 않고 컴파일되어 있습니다.

Milter API는 sendmail 8.10.x 이상이면 가능하나 컴파일할 때 제외(default로
컴파일하면 제외됨)된 걸로 판단됩니다.

레드햇 7.2 이상에서는 Sendmail Milter API를 쓸 수 있도록 컴파일되어 있습니다.
이전 배포판 버전이더라도 최근 업데이트된 sendmail rpm을 설치하면 해결됩니다.
레드햇을 사용하시면 다음 주소에서 받아서 설치하세요.

https://rhn.redhat.com/errata/RHSA-2003-120.html
위 rpm패키지는 sendmail 8.11.6입니다.

설치는 어떻게 하는지 아시죠?
rpm -Fvh sendmail-8.11.6-??.??.????.rpm
rpm -Fvh sendmail-cf-8.11.6-??.??.????.rpm
rpm -Fvh sendmail-devel-8.11.6-??.??.????.rpm
rpm -Fvh sendmail-doc-8.11.6-??.??.????.rpm

이래도 잘 안되면 직접 컴파일해야 합니다.
컴파일하게 되면 Build 전에 devtools/Site/site.config.m4 작성하고
설치 후에 sendmail.cf 만드는 과정들이 필요합니다.

Q4) AntiVir Milter실행시 can't initialize scan engine 에러가 발생
-----------------------------------------------------------------------

A4) 여러가지의 경우가 있습니다.

  가장 먼저 /usr/lib/Antivir/antivir를 실행해보세요.

  Antivir Milter는 메일 바이러스 검사를 위해 antivir를 호출을 하므로
  antivir가 정상적으로 실행할 수 없는 환경이면 위의 에러를 발생하고 종료합니다.

  1) /var/tmp, /tmp의 퍼미션이 1777(rwxrwxrwt)가 아닌 경우

     chmod 1777 /var/tmp/ 와 같이 퍼미션을 변경할 수 있습니다.

  2) 라이센트 파일(hbedv.key, avmgate.key)이 설치안되어 있거나
     uucp 사용자가 읽을 수 없는 경우

     이럴 때 직접 쉘에서 antivir실행하면 DEMO mode라고 나옵니다.

     # antivir
     AntiVir / Linux Version 2.0.8-1
     Copyright (C) 1994-2003 by H+BEDV Datentechnik GmbH.
     All rights reserved.

     Loading /usr/lib/AntiVir/antivir.vdf ...

     AntiVir is running in DEMO mode.
     ... 생략 ...

     라이센스를 받지 않았다면 http://www.hbedv.com/private/ 에서
     받아 설치하세요. 퍼미션은 제 글을 읽어보면 됩니다.

  3) /usr/lib/Antivir/antivir가 임의로 변경된 경우

    antivir는 다른 백신프로그램처럼 자체 진단기능이 있습니다.
    자신이 임의로 변경됐다고 판단되면
    211 오류(Programm aborted, because the self check failed)를 발생하며
    종료합니다.
    이런경우는 드믈겠지만 Linux/OSF-8759 웜 바이러스 등에 걸린 경우
    실행 파일이 변경되므로 저런 현상이 생길 수 있습니다.

  4) 위의 3가지다 해당이 안되는 경우

    /usr, /usr/lib, /var 등의 디렉토리의 퍼미션을 확인하세요.
    Antivir Milter는 디폴트로 uucp:uucp 사용자:그룹으로 실행됩니다.
    따라서 /usr 디렉토리가 만약 711(rwx--x--x)라면 실행할 수 없습니다.
    755(rwxr-xr-x)로 변경해보세요.

Q5) AntiVir Milter실행시 chdir to "/var/spool/avmilter" failed - exiting!
    에러 발생
-----------------------------------------------------------------------

A5) Antivir Milter는 스풀디렉토리의 소유자와 퍼미션을 검사합니다.
    만약 700(rwx------)이 아니다면 위의 에러를 발생하며 종료합니다.

chown -R uucp:uucp /var/spool/avmilter
chmod -R 700       /var/spool/avmilter

로 변경하면 해결됩니다.

Q6) sendmail.cf 설정부분에서
    Xavmilter, S=inet:3333@localhost, F=R, T=S:10m;R:10m;E:10m
    O InputMailFilters=avmilter

    를 sendmail.cf 내 어디에 위치해야 하나요?
-----------------------------------------------------------------------

A6) 위치는 상관없으나, 옵션 설정하는 부분이 있습니다.
그 설정 부분에 두는게 좋을 것 같습니다.

이를 테면
O AliasFile=/etc/aliases
와 같이 들어 있는 부분 근처에.

Q7) /var/log/messages에 쌓이는 로그를 다른쪽으로 돌리고 싶은데 가능하나요?
-----------------------------------------------------------------------

A7) Antivir Milter를 통해 남겨진 로그를 다른 곳으로 옮기는 설정은 없습니다.
   (지금까지 확인한바로)

그러나 메일과는 무관하게 쉘상에서 antivir를 실행하여 남기는 로그는 가능합니다.
설정 파일인 /etc/antivir.conf 를 수정합니다.

LogTo /var/log/antivir.log
SyslogFacility local1
SyslogPriority debug

1번째줄 = /var/log/antvir.log에 로그가 남도록 합니다.
다음 2줄= messages에 로그가 남지 않도록 합니다. (임시적인 방법)

Antivir가 남기는 로그의 facility는 local1, priority는 debug로 변경했으므로
syslog.conf의 디폴트 설정이라면 messages에 남기지 않습니다.
syslog.conf 설정을 수정한 적이 있다면  
local1.debug, local1.*, *.debug, *.* 등의 줄이 있는지 확인해봐야 합니다.

Q8) /var/spool/avmilter/rejected에 있는 df, vf는 무슨 의미인가요?
-----------------------------------------------------------------------

A8) rejected에 있다는 것은 바이러스나 메일 mime 타입에 문제가 있다고 Antivir가
판단을 하고 메일 송수신을 거부한 것을 말합니다.

df = 메일 내용이 있는 data file
vf = 메일내에 바이러스가 발견됐을 나타내는 file
df-ID와 vf-ID 쌍으로 있죠? xxxxx-xxxxxxxx가 같은 것이 동일 메일에 대한 것입니다.

antivir는 이런 형태로 거부가 될 때 /etc/avmilter.conf 설정에 따라 송신자나
수신자에 메일내에 바이러스가 발견됐음을 알림니다.

/var/spool/avmilter/rejected 에 쌓인 메일을 보시고 필요없는 메일이라면
rm -f [dv]f*
로 모두 지우세요.

Q9) /var/spool/avmilter/rejected/ 에 너무 많은 메일이 걸러집니다.
-----------------------------------------------------------------------
    
A9) avq 명령어(제 글에서는 /usr/lib/Anivir/avq에 설치했음)을 이용해서
    큐를 확인할 수 있습니다.

필요없는 메일이라면 cron을 통해 특정시간마다 삭제하세요.

crontab -e
해서 다음과같이 넣으면 매일 새벽 0시 5 분에 rejected된 메일을 삭제합니다.

5 0 * * * rm -f /var/spool/avmilter/rejected/*

Q10) 바이러스 패턴 업데이트는 어떻게 하나요?
-----------------------------------------------------------------------

A10) 쉘상에서 직접한다면 다음과 같이 실행하면 됩니다.

# antivir --update
AntiVir / Linux Version 2.0.8-8
Copyright (C) 1994-2003 by H+BEDV Datentechnik GmbH.
All rights reserved.

checking for updates

06.21.00.35 <=> 06.21.00.35 [vdf, loaded]
06.21.00.01 <=> 06.21.00.01 [engine, running]
02.00.08.08 <=> 02.00.08.08 [program, running]

AntiVir is up-to-date

cron에 넣는 방법은 먼저 쓴 글에 있으니 찾아보세요.

Q11) 패턴 업데이트 중
sh: /tmp/antivir_20165_1640464374/download/antivir: 허가 거부됨 에러 발생
-----------------------------------------------------------------------

A11) /tmp 퍼미션이 정상이라면 저도 원인은 모르겠습니다.

임시로 수동 업데이트 하세요.

http://www.antivir.de/down/vdf/vdf.zip 를 받습니다.
파일을 풀면 (unzip vdf.zip) 파일 3개가 나올겁니다.
그중에 antivir.vdf 만 /usr/lib/Antivir 로 복사합니다. 퍼미션은 644로.

# chmod 644 antivir.vdf
# mv antivir /usr/lib/Antivir/


출처 : http://coffeenix.net/

728x90

댓글