Tag Archives: Spam

mod_spamhaus를 이용하여 스패머의 아파치 접근을 막아보자.

웹 서비스를 운영하는 차원에서 보면 스패머들은 매우 골치 아픈 문제입니다. 하지만 자세히 보면 이러한 공격이 특정한 패턴을 가지고 있지 않습니다.

그래서 더욱 필터링 하기가 어렵습니다. 대부분의 아이피를 조회해보면 특정 위치가 아닌 거의 전세계에서 동시에 들어오고, 그 방식도 매우 다채롭습니다.

이러한 공격에는 대부분 공격자의 명령에 따라 다른 시스템을 공격하는 좀비 PC들이 작업을 하게 됩니다.

하지만 이번에 소개해 드릴 mod_spamhaus를 Apache 웹서버에 설치하게 되면 SpamHaus에서 제공하는 스패머 블랙리스트와 대조하여 블랙리스트에 올라가 있는 시스템의 접근을 차단하게 됩니다.

보통은 sendmail과 같은 메일시스템(MTA)에 필터로 등록하여 사용하곤 하는데 이런식으로 사용하는것도 좋은 생각인것 같습니다.

스팸메일을 보내는데 이용되는 좀비PC나 스팸글을 등록하는 좀비PC나 같은 녀석들이 재활용 될테니깐요.

http://sourceforge.net/projects/mod-spamhaus/ 에서 관련 소스를 받아 설치합니다.

[code]tar -zxvf mod-spamhaus-0.7.tar.gz
cd mod-spamhaus
make
make install[/code]
apxs2를 찾을수 없다는 에러가 난다면 MakefileAPXS값을 적절한 값으로 변경해 줍니다. 저의 경우에는 apxs로 바꾸었습니다.

설치가 끝나게 되면 자동으로 httpd.conf 설정 파일에 다음의 내용이 추가 됩니다. 혹시 없다면 추가해 줍니다.

[code]LoadModule spamhaus_module   /usr/lib/apache2/modules/mod_spamhaus.so[/code]
다음으로 다음과 같은 설정을 하여 줍니다.

[code]<IfModule mod_spamhaus.c>
MS_METHODS POST,PUT,OPTIONS,CONNECT
MS_WhiteList /etc/spamhaus.wl
MS_CacheSize 256
</IfModule>[/code]
실제로 /etc/spamhaus.wl 파일을 생성해 두고 이 안에는 신뢰할수 있는 ip주소를 입력하시면 bypass 하게 됩니다.

이제 아파치를 재시작 하시면 됩니다. 이제부터 POST, PUT, OPTIONS, CONNECT 명령에 대해 spamhaus에 블랙리스트로 등록되어있는지를 확인하게 됩니다.

캐시 사이즈에 맞추어 캐시도 하게 됩니다. 적절히 설정하시면 됩니다.

참고 :
http://sourceforge.net/projects/mod-spamhaus/
http://www.howtoforge.com/how-to-block-spammers-with-apache2-mod_spamhaus-debian-etch
http://www.spamhaus.org/

Spam Assassin + ClamAV 바이러스 필터 연동하기

기존에 SpamAssassin과 ClamAV를 연동하는 방법은 많이 있어왔지만 사실상 연동이라기 보다는 Sendmail에서 둘다 따로 호출하거나 Procmail 스크립트를 사용하는 방법등이었습니다.

다음은 ClamAV를 아예 SpamAssassin으로 합쳐 바이러스 발견시 SpamAssassin의 점수계산에 포함되도록 하는 방법입니다.

무선 ClamAV를 설치하고 시작해 보도록 하겠습니다. [이곳]에서 ClamAV 소스를 다운받아 설치합니다. 패키지 모음은 [이곳]에 있습니다.

ClamAV를 설치하기 전에 우선 사용자 계정을 추가합니다.
[code]# groupadd clamav
# useradd -g clamav -s /bin/false -c “Clam AntiVirus” -d /var/lib/clamav clamav[/code]
다운받은 소스를 설치합니다.
[code]# ./configure –sysconfdir=/etc/clamav
# make
# make install[/code]
추가로 필요한 디렉토리를 생성합니다.
[code]# mkdir /var/lib/clamav
# mkdir /var/log/clamav
# mkdir /var/run/clamav
# chown clamav.clamav /var/lib/clamav
# chown clamav.clamav /var/log/clamav
# chown clamav.clamav /var/run/clamav[/code]
/etc/clamav/clamd.conf 파일에 다음의 내용을 수정합니다.
[code]LogFile /var/log/clamav/clamd.log
LogFileMaxSize 2M
LogTime yes
PidFile /var/run/clamav/clamd.pid
TemporaryDirectory /tmp
LocalSocket /var/lib/clamav/clamd.sock
FixStaleSocket yes
ScanMail yes[/code]
다음으로는 /etc/clamav/freshclam.conf 파일을 수정합니다.
[code]UpdateLogFile /var/log/clamav/freshclam.log
PidFile /var/run/clamav/freshclam.pid
DatabaseOwner clamav
DNSDatabaseInfo current.cvd.clamav.net
DatabaseMirror db.kr.clamav.net
DatabaseMirror database.clamav.net[/code]
다음의 스크립트 파일을 /etc/rc.d/init.d 안에 추가합니다.


1066105557.xxx이제 스크립트를 실행해 봅시다.
[code]# /etc/rc.d/init.d/freshclam start
# /etc/rc.d/init.d/clamd start[/code]
/etc/cron.daily/freshclam이 생성되었다면 freshclam은 따로 데몬으로 돌리실 필요는 없습니다.
SpamAssassin이 설치된 설정 디렉토리 /etc/mail/spamassassin 안에 다음의 파일을 추가합니다.

clamav.cf
[code]loadplugin ClamAV clamav.pm
full CLAMAV eval:check_clamav()
describe CLAMAV Clam AntiVirus detected a virus
score CLAMAV 10
add_header all Virus _CLAMAVRESULT_[/code]

clamav.pm
[code]package ClamAV;
use strict;


# version 2.0, 2010-01-07
#   – use SA public interface set_tag() and add_header, instead of
#     pushing a header field directly into $conf->{headers_spam}


# our $CLAMD_SOCK = 3310;               # for TCP-based usage
our $CLAMD_SOCK = “/var/run/clamd.basic/clamd.sock”;   # change me


use Mail::SpamAssassin;
use Mail::SpamAssassin::Plugin;
use Mail::SpamAssassin::Logger;
use File::Scan::ClamAV;
our @ISA = qw(Mail::SpamAssassin::Plugin);


sub new {
  my ($class, $mailsa) = @_;
  $class = ref($class) || $class;
  my $self = $class->SUPER::new($mailsa);
  bless($self, $class);
  $self->register_eval_rule(“check_clamav”);
  return $self;
}


sub check_clamav {
  my($self, $pms, $fulltext) = @_;
  dbg(“ClamAV: invoking File::Scan::ClamAV, port/socket: %s”, $CLAMD_SOCK);
  my $clamav = new File::Scan::ClamAV(port => $CLAMD_SOCK);
  my($code, $virus) = $clamav->streamscan(${$fulltext});
  my $isspam = 0;
  my $header = “”;
  if (!$code) {
    my $errstr = $clamav->errstr();
    $header = “Error ($errstr)”;
  } elsif ($code eq ‘OK’) {
    $header = “No”;
  } elsif ($code eq ‘FOUND’) {
    $header = “Yes ($virus)”;
    $isspam = 1;
    # include the virus name in SpamAssassin’s report
    $pms->test_log($virus);
  } else {
    $header = “Error (Unknown return code from ClamAV: $code)”;
  }
  dbg(“ClamAV: result – $header”);
  $pms->set_tag(‘CLAMAVRESULT’, $header);
  # add a metadatum so that rules can match against the result too
  $pms->{msg}->put_metadata(‘X-Spam-Virus’,$header);
  return $isspam;
}


1;[/code]
이후에 File::Scan::ClamAV 를 설치하여야 합니다.

[code]# cpan File::Scan::ClamAV[/code]
이제 SpamAssassin에서 메일을 처리할때 ClamAV를 호출하여 바이러스 검사까지 하게 되며 바이러스가 존재할시 스코어 10점을 부여하고 X-Spam-Virus: Yes 헤더를 붙이게 됩니다.

세세한 점수를 확인하고 싶다면 [이곳]에서 확인해 보시면 됩니다.

SpamAssassin을 데몬형태로 사용하고 계신다면 재시작 해주시면 됩니다. 그외의 경우에는 바로 적용됩니다.

참고 : http://wiki.apache.org/spamassassin/ClamAVPlugin