Mailfiltering Gateway/ko

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Mailfiltering Gateway and the translation is 100% complete.

Other languages:
English • ‎日本語 • ‎한국어 • ‎русский

This guide provides step-by-step instructions for installing spam fighting technologies for Postfix. Among them Amavisd-new using Spamassassin and ClamAV, greylisting and SPF.

도입부

이 안내서에서는 스팸 및 바이러스를 걸러내는 메일 게이트웨이를 설치하는 방법을 과정별로 설명합니다. 단일 서버 솔루션에 적용할 때 꽤 단순합니다.

대략적인 그림

이 문서는 다중 도메인에 대한 스팸 차단 메일 게이트웨이 설정 방법을 설명합니다. 이 서버는 메일 계정을 실제로 보유하고 있는 메일 서버(마이크로소프트 익스체인지 또는 로터스 노츠 등)의 앞단에서 실행합니다.

이 설치 과정에서 적절한 보안 레코드와 알아보기 쉬운 설정 파일을 갖춘 프로그램을 선택합니다. 전자메일 MTA로는 적절한 보안레코드를 보유하고 있으며 설정을 올바르게 처리하는데 상당히 쉬운 postfix를 활용합니다. Postfix는 메일 수신에 보통 25번 포트로 감청합니다. 이 과정에서 Amavisd-new에 10024번 포트를 통해 전달합니다. Amavisd-new 는 다음 메일 서버로 메일을 전달할 10025번 포트를 통해 Postfix로 메일을 다시 되돌리기 전에 다양한 필터를 거칩니다.

Amavisd-new는 내용 기반 차단 프레임워크이며 바이러스 및 스팸을 차단하는 도우미 프로그램을 제대로 동작하게 합니다. 이 설치 과정에서 바이러스를 차단하는 ClamAV 그리고 스팸을 차단하는 스팸 어쌔신을 두가지 도우미 프로그램으로 활용하겠습니다. 스팸 어쌔신 자체는 내용 기반 차단 프레임워크 계층 기능을 잇따라 수행하며, Vipul's Razor2와 DCC 도우미 프로그램을 동작합니다.

RBL 및 기타 스팸 처리 기능 프로그램과는 달리 스팸 어쌔신은 단순히 일회 시험만을 기반으로 하는 전자메일 수용, 거절 기능만을 수행하지 않습니다. 내부 시험과 외부 도우미 프로그램을 통해 거쳐간 모든 전자메일을 기반으로 스팸 가중치를 계산합니다. 이 가중치는 다음 시험 과정을 기반으로 합니다:

  • 베이지안 필터링
  • 정규 표현식에 기반한 정적 규칙
  • 분산 협업 네트워크
    • RBLs
    • Razor2
    • Pyzor
    • DCC

안내서의 첫부분(1~4장)에서는 메일 차단 게이트웨이의 기본 설정을 설명합니다. 다음 장에서는 이전 장과 관계없이 제각각 구현할 수 있습니다. 아래 언급 한 장에서는 다음 방법에 대해 설명합니다:

  • 베이지언 필터 숙지 동작과 거짓 양성 메일 배달을 처리할 특수 IMAP 폴더 설정
  • Postfix로 그레이리스팅 설정
  • Amavisd-new에서 사용자 설정을 담을 MySQL 백엔드 사용 설정
  • Spamassassin에서 AWL과 Bayes 데이터를 담을 MySQL 백엔드 사용 설정
참고
IMAP 폴더는 maildir 형식을 사용합니다. 여러개의 파일로 나눈 각각의 메일은 처리를 더욱 단순하게 합니다. mbox를 사용한다면 maildir을 시도해볼만한 대상으로 추천합니다. 아직 maildir을 사용하지 않는다면 emerge courier-imap 명령으로 필요한 도구를 이머지하십시오.

계획한 다섯번째 부분에서는 성능과 관련있는 내용 그리고 알고 싶은 부분(루트를 전환한 환경에서 실행, postfix 제한, 등)에 대한 다양한 실마리를 제공합니다.

참고
서드파티의 기능을 가져오는 작업은 위험을 동반하지 않습니다. 이 서드파티의 기능을 알고 믿을 수 있어야합니다. 이 설정 과정에서 바이러스 메일의 격리 결정은 단일 서드 파티 기능을 기반으로 합니다. 스팸 어쌔신의 가중치 처리 시스템을 활용하면, 아마도 스팸 어쌔신 자체 정적 규칙을 제외하고 단일 권한으로는 스팸 메일을 차단할 규칙을 결정하지 않을 것입니다.
경고
MTA 수준에서 스팸 메일을 거절할 때 여러분이 사용하려는 RBL을 선택하는 경우 신중을 기해야 합니다. 예를 들면, SpamCop은 MTA 수준에서 활용하기엔 썩 좋지 않은 RBL인데 때로는 목록을 통한 처리가 너무 적극적이어서 잘못된 양성 반응이 나올 수 있기 떄문입니다. 실시간 블랙홀 리스트는 별로다The Spam Problem: Moving Beyond RBLs에서 나오는 내용을 살펴보십시오.

준비

설치한 Postfix가 잘 동작하는지 확인하기 전에 메일을 주고 받을 수 있는 네트워크에 백엔드 메일 서버가 필요합니다. Postfix를 설정해본 경험이 없다면 한번에 모든 부분을 설정해야 한다고 할 경우 상당히 복잡한 느낌이 바로 찾아올 것입니다. 도움이 필요하다면 젠투 위키에 있는 가상 메일 서버 완벽 안내서 를 참고하십시오

필요한 프로그램 설치

가장 중요한 Amavisd-new, Spamassassin, ClamAV 프로그램 설치로 시작하겠습니다.

root #echo "mail-filter/amavisd-new spamassassin clamav" >> /etc/portage/package.use
root #emerge amavisd-new
root #freshclam
참고
앞서 언급한대로 여러분은 postfix 인스턴스를 머신에서 실행해야하합니다. 기본적으로 이 부분에서는 emerge postfix postfix 동작 방식의 기본적인 이해 내용의 선 이상을 넘지 않습니다.

DNS 설정

참고
게이트웨이 서버를 설정하지 않았지만 동일한 서버에 메일함을 구축했다면, MX 레코드만 만들면 됩니다.

프로그램을 이머지하는 동안 다른 쉘을 띄우시고 필요한 DNS 레코드를 만드십시오.

메일 게이트웨이에 MX 레코드를 우선 생성하고, 다음 목적지의 A 레코드를 생성하십시오.

코드 DNS 설정
(Create a MX record for the gateway server)
                MX      10      mailgateway.mydomain.tld.
(Create an A record for the gateway server)
mailgateway     A       mgw.ip.add.here
(Create an A record for the next hop mail server)
mail            A       ms.ip.add.here


참고
일부 ADSL 서비스 제공자는 25번 포트를 차단하고, 서비스에서 제공하는 서버로 메일을 전달하라고 합니다. 보통 여러분은 MX 20 backup-mx.some-isp.tld와 같이 두번째 MX 레코드를 만들어야합니다.


방화벽 개방

일반 메일 흐름을 허용하려면 서버 통신을 확인하는 네트워크에서 몇가지 서비스를 방화벽을 뚫어 허용해야합니다.

프로그램 프로토콜 포트번호
DCC UDP 6277
Razor(나가는 ping) TCP 7
Razor TCP 2703

Razor 은 어떤 서버가 가장 가까운 곳에 있는지 찾을 때 ping을 활용합니다.

Postfix 설정

우선 postfix에게 포트 10025번에서의 감청을 지시하고, 포트 25번에서 감청중인 postfix 인스턴스에 적용한 상당부분의 제약을 제거해야합니다. 또한 10025 포트는 로컬 연결만 기다립니다. 이 조건을 충족하기 위해 /etc/postfix/master.cf의 마지막 부분에 다음 내용을 추가해야합니다.

코드 master.cf 파일 수정
smtp-amavis     unix -        -       n     -       2  smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
#Equivalently when using lmtp:
#lmtp-amavis    unix -        -       n     -       2  lmtp
#   -o lmtp_data_done_timeout=1200
#   -o lmtp_send_xforward_command=yes
  
127.0.0.1:10025 inet n        -       n     -       -  smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks=127.0.0.0/8
  -o strict_rfc821_envelopes=yes
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
  
#If you want to use proxy filtering instead
#smtp            inet n         -       n      -       8 smtpd
# -o smtpd_proxy_filter=127.0.0.1:10024
# -o smtpd_client_connection_count_limit=4
#If you don't want to scan outgoing mail use this
#10.0.0.2:smtp   inet n         -       n       -      - smtpd
#-o content_filter=
참고
smtp-amavis 줄에서는 언제든 실행할 이들 두 프로세스의 최대 갯수를 정의합나다. 더 큰 동시성 설정값이 필요하다면 이 숫자값이 요구조건에 맞습니다. amavisd.conf 에 있는 $max_servers의 숫자값과 일치시켜야 함을 기억하십시오. Keep in mind that amavisd-new 는 메모리를 중점적으로 활용하며 amavisd-new 프로세스를 상당히 많이 띄우면 메모리가 쉽게 고갈되고 스왑영역을 많이 소모하며, 눈에 띄게 성능이 줄어드는 결과를 초래합니다.
참고
프로세스에 도달하기 전에 스팸을 차단하려 한다면 차단 기법 중 Before-Queue(프록시) 기법을 활용할 수 있습니다. 언급한 세 줄의 주석 표시를 없애면 main.cfcontent_filter=변수를 설정해야합니다. amavisd 인스턴스의 수 만큼 동시 연결 수를 제한하므로 상당량의 트래픽을 보유하는 서버에서의 설정은 추천하지 않습니다.
경고
Before-Queue(프록시) 방식은 아직 제대로 시험해보지 않았습니다.
참고
어떤 이유에서든 이 머신에서 메일을 보내고 검사처리를 하지 않으려면, 마지막 두 줄의 주석 표시를 제거하여 다른 postfix 인스턴스를 추가하고 적당한 IP로 바꾸십시오.

master.cf 파일은 postfix master 프로그램에 개별 postfix 프로세스를 실행하는 방식을 지시합니다. 더 많은 내용은 man 8 master 명령을 참고하십시오.

다음 10024 포트에서 대기중인 amavisd-new로 오는 메일을 걸러내기 위해 postfix 인스턴스를 25번 포트에서 대기하도록 해야합니다.

또한 메일의 다음 홉 대상을 설정해야합니다. postfix에게 모든 메일이 외부 컨텐트 필터를 거치도록하고, postfix가 메일을 어디로 전달할 지 알도록 명시한 경로 지정을 활성화하십시오.

파일 /etc/postfix/main.cf
biff = no
empty_address_recipient = MAILER-DAEMON
queue_minfree = 120000000
  
content_filter = smtp-amavis:[127.0.0.1]:10024
#Equivalently when using lmtp:
#content_filter = lmtp-amavis:[127.0.0.1]:10024
  
# TRANSPORT MAP
#
# Insert text from sample-transport.cf if you need explicit routing.
transport_maps = hash:/etc/postfix/transport
  
relay_domains = $transport_maps

postfix는 main.cf에 설정할 많은 옵션이 있습니다. 파일에 대한 더 많은 정보는 man 5 postconf 명령 또는 동일한 내용을 지닌 Postfix 설정 매개변수 온라인 문서를 참고하십시오.

transport 파일의 형식은 일반 postfix 해시 파일입니다. 왼편에 있는 도메인에 보내는 메일은 오른편에 있는 목적 대상으로 전달합니다.

파일 /etc/postfix/transport
mydomain.tld                          smtp:mail.mydomain.tld

파일을 편집하고 나면 postmap 명령을 실행해야합니다. postfix는 이 파일을 실제로 읽지 않기 때문에 postmap /etc/postfix/transport 명령을 통해 적당한 형식으로 편집한 파일을 변환해야합니다. 이 명령은 /etc/postfix/transport.db 파일을 만듭니다. postfix에서 바뀐 설정을 자동으로 가져오므로 postfix를 통해 설정을 다시 불러올 필요가 없습니다.

참고
다음 홉에 위치한 메일 서버가 표준 SMTP 포트 25번에서 대기중이 아니라면, postfix에게 smtp:mail.mydomain.tld:25000처럼 지정 포트 번호를 사용하도록 지시할 수 있습니다.

처음 메일을 보냈을때 메시지 결과가 되돌아온다면, 어딘가에 설정 오류를 안고 있을지도 모릅니다. 설정 문제를 해결하는 동안 soft_bounce를 임시로 활성화 하십시오. 이 옵션을 설정하면 postfix 가 전송 오류 때문에 되돌아오는 메일을 일시적 오류에 의한 반송으로 간주합니다. soft_bounce 옵션을 비활성화했거나 제거할 때까지는 메일 큐에서 대기중인 메일을 그대로 둡니다.

root #postconf -e "soft_bounce = yes"
root #/etc/init.d/postfix reload

동작하는 설정을 만들어 마무리했다면 soft_bounce 옵션을 비활성화하거나 제거하시고 postfix를 재가동하십시오.

Amavisd-new 설정

Amavisd-new는 모든 필터링을 관리하고 여러가지 제각각의 기술을 쉽게 연계할 수 있도록 하는데 사용하빈다. 메일 메시지를 받을 때 메일을 추출하고, 몇가지 개별 필터로 걸러내며, 화이트/블랙 리스팅 처리한 후 여러가지 바이러스 검색기로 메일을 걸러낸 다음 스팸 어쌔신을 활용하여 메일을 최종적으로 걸러냅니다.

Amavisd-new 자체에는 몇가지 추가 기능이 있습니다:

  • 위험한 첨부 파일을 식별하고 이 파일을 처리할 정책을 보유합니다
  • 사용자별, 도메인 별 시스템 범위 정책:
    • 화이트리스트
    • 블랙리스트
    • 스팸 가중치 한계치 설정
    • 바이러스 및 스팸 처리 정책

postfixfreshclam 와는 별개로 amavis 사용자로 모든 프로그램을 실행하겠습니다.

/etc/amavisd.conf에서 다음 부분을 편집하십시오

파일 /etc/amavisd.conf
# (Insert the domains to be scanned)
$mydomain = 'example.com';
# (Bind only to loopback interface)
$inet_socket_bind = '127.0.0.1';
# (Forward to Postfix on port 10025)
$forward_method = 'smtp:127.0.0.1:10025';
$notify_method = $forward_method;
# (Define the account to send virus alert emails)
$virus_admin = "virusalert\@$mydomain";
# (Always add spam headers)
$sa_tag_level_deflt  = -100;
# (Add spam detected header aka X-Spam-Status: Yes)
$sa_tag2_level_deflt = 5;
# (Trigger evasive action at this spam level)
$sa_kill_level_deflt = $sa_tag2_level_deflt;
# (Do not send delivery status notification to sender.  It does not affect
# delivery of spam to recipient. To do that, use the kill_level)
$sa_dsn_cutoff_level = 10;
# Don't bounce messages left and right, quarantine
# instead
$final_virus_destiny      = D_DISCARD;  # (defaults to D_DISCARD)
$final_banned_destiny     = D_DISCARD;  # (defaults to D_BOUNCE)
$final_spam_destiny       = D_DISCARD;  # (defaults to D_BOUNCE)
참고
$sa_tag2_level_deflt = 5; 줄에서 스팸 어쌔신 스팸 가중치를 5로 설정했습니다. 가중치 값이 좀 낮은 것 같습니다. 보셨을지도 모르겠지만 Amavisd-new의 기본값은 6.3입니다. 메일 폴더에서 단일 스팸 메일을 보고 싶지 않다면 5 값으로 설정하지만, 거짓 양성 처리 결과를 다루기 싫다면 6.3로 설정하십시오.

사용자에게 배달을 원치 않는 바이러스 메일를 보관할 격리 디렉터리를 만드십시오.

root #mkdir /var/amavis/virusmails
root #chown amavis:amavis /var/amavis/virusmails
root #chmod 750 /var/amavis/virusmails
참고
Amavisd-new 에서는 정책 뱅크를 활용한 잘 다듬어놓은 정책 설정을 제공합니다.

ClamAV 설정

바이러스 검사기로 상업용 프로그램과 거의 비슷하게 양호한 감지율을 보이는 ClamAV를 활용하겠습니다. 상당히 빠르고 게다가 오픈소스 소프트웨어입니다. 기록 파일을 좋아하니 syslog 에게 clamd 로그를 만들게 하고 로그 내용을 자세하게 뽑도록 하겠습니다. clamdroot 계정으로 실행하지 마십시오. 이제 /etc/clamd.conf 파일을 편집하겠습니다.

파일 /etc/clamd.conf
# (Verbose logging with syslog)
LogSyslog
LogVerbose
LogFacility LOG_MAIL
# (Change pid file location)
PidFile /var/run/amavis/clamd.pid
# (Set the clamav socket)
LocalSocket /var/amavis/clamd
# (Close the connection when this limit is exceeded)
StreamMaxLength 10M
# (Don't run clamd as root)
User amavis
# (Newer versions require you to uncomment this)
ScanMail
ScanArchive
참고
ClamAV를 동작하게 하는 예제의 지시 구문 제거를 기억하십시오.

ClamAV는 바이러스 서명 업데이트를 주기적으로 확인하는 freshclam 데몬이 들어있습니다. freshclam가 바이러스 서명을 하루에 두번 업데이트 하게 하는 대신 매 두시간마다 업데이트하게 하겠습니다.

파일 /etc/freshclam.conf
# (Syslog logging)
LogSyslog
# (Verbose logging)
LogVerbose
# (Explicitly drop root privileges)
DatabaseOwner clamav
# (Check for updates every two hours. That is the official recommendation)
Checks 12
# (Use the mirror closest to you. Replace XY with your country code)
DatabaseMirror db.XY.clamav.net

/etc/conf.d/clamd를 수정하여 초기화 스크립트로 clamdfreshclam를 시작하십시오.

파일 /etc/conf.d/clamd
START_CLAMD=yes
START_FRESHCLAM=yes
CLAMD_NICELEVEL=3
FRESHCLAM_NICELEVEL=19
IONICE_LEVEL=2

마지막으로 amavisd.conf 파일에서 새 소켓 위치 값으로 바꾸십시오.

파일 /etc/amavisd.conf
# (Uncomment the clamav scanner and modify socket location)
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/amavis/clamd"],
  qr/\bOK$/, qr/\bFOUND$/,
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
경고
무얼 하고 있는지 알기 전까지는 $unix_socketname 값을 수정하지 마십시오.

Vipul's Razor 설정

Razor2는 협업 분산 스팸 검사합 네트워크입니다. emerge razor 명령으로 설치하고 필요한 설정 파일을 만드십시오. amavis 사용자로 su - amavis 다음 razor-admin -create를 입력하여 실행하십시오.

root #emerge razor
root #su - amavis -s /bin/bash
user $razor-admin -create
user $exit

분산 검사합 정리 저장소(Distributed Checksum Clearinghouse : dcc) 설정

Razor2와 같이 dcc는 협업 분산 스팸 검사합 네트워크입니다. 이 프로그램의 동작 개념은 제각각의 메일을 식별하도록 주어진 메일의 여러 수신자를 퍼지 체크섬을 통해 계수하는 것입니다.

root #emerge dcc

Spamassassin 설정

Amavis는 스팸 어쌔신 펄 라이브러리를 바로 활용하므로 서비스를 시작할 필요가 없습니다. 또한 /etc/mail/spamassassin/local.cf에 일부 스팸 어쌔신 설정을 넣고 /etc/amavisd.conf 의 옵션을 덮어쓰므로 설정상 혼동을 유발합니다.

파일 /etc/mail/spamassassin/local.cf
# Enable the Bayes system
use_bayes               1
  
# Enable all network checks
skip_rbl_checks         0
  
# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
# - danish english norwegian swedish
ok_languages            da en no sv
  
# Mail using locales used in these country codes will not be marked
# as being possibly spam in a foreign language.
ok_locales              en
  
# Use a sensible bayes path
bayes_path              /var/amavis/.spamassassin/bayes


참고
스팸 어쌔신 3.1에서는 v310.pre의 다음 줄 주석을 해제하여 DCC, Razor2를 활성화해야합니다.
참고
스팸 어쌔씬 설정 파일 생성프로그램을 활용하면 local.cf 파일의 작성 요령을 알아볼 수 있습니다.
참고
ok_languagesok_locales 값을 바꾸셔도 좋습니다 .

모든 바람직한 규칙에는 마찬가지로 바람직한 예외가 있습니다

메일 전달을 시작하고 나면 이 메일 게이트웨이에서 설정이 완벽하지 않음을 깨닫게 됩니다. 아마도 어떤 고객은 다른사람이 못받은 메일을 받고 싶어하겠죠. 송신자를 화이트 리스트에 넣거나 블랙리스트에 쉽게 넣을 수 있습니다. amavisd.conf에서 다음 줄의 주석을 해제하십시오.

파일 amavisd.conf사이트 범위 가중치 부여 처리
read_hash("/var/amavis/sender_scores_sitewide"),

sender_scores_sitewide 파일에는 완전한 전자메일 주소를 넣거나 도메인 부분만 넣고 양/음 가중치를 표기하여 스팸 가중치를 추가할 수 있습니다.

파일 whitelist_sender예제
# (Whitelist all emails from the specific email address)
postmaster@example.net                -3.0
# (Whitelist all emails from the example.net excluding subdomains)
.example.net                          1.0


참고
더 많은 예제를 보려면 /etc/amavisd.conf 파일을 살펴보십시오.
참고
amavisd.conf 밖에 이 주소를 넣으면 깔끔하고 안전한 해결책이 될 수있습니다.
참고
대신 스팸 어쌔신의 /etc/mail/spamassassin/local.cf 설정 파일로 해결할 수는 있는데 /etc/amavisd.conf 에서 설정하는게 더 깔끔할 것 같습니다.
참고
다음에 MySQL을 활용하여 사용자별 정책을 설정하는 방법을 보여드리겠습니다.

더 나은 방법을 기다리는 동안 다음 설정을 amavisd.conf에 넣어 postmasterabuse의 메일함에 들어가는 메일에 대해서는 스팸 검사를 통과하도록 할 수 있습니다.

코드 postmaster 및 abuse 메일에 대한 스팸 필터 통과 처리
map { $bypass_spam_checks{lc($_)}=1 } (qw(
        postmaster@
        abuse@
));
중요
우리가 지금 이상태에서 스팸을 처리할 때 postmaster 또는 abuse 계정의 메일을 절대 자동으로 무시해선 안됩니다. RFC 2142 MAILBOX NAMES FOR COMMON SERVICES, ROLES AND FUNCTIONS 문서를 살펴보십시오. 자동으로 무시하게 하면 rfc-ignorant.org에 있는 저주스런 목록에 들어가버립니다.

더 많은 규칙 추가

SpamAssassin Rules Emporium 의 SARE Ninjas에서 제공하는 더 많은 규칙을 활용하려면 스팸 어쌔신에 들어있는 sa-update 매커니즘을 활용하여 쉽게 추가하고 업데이트할 수 있습니다.

sa-update 명령으로 SARE 규칙 세트를 활용하는 안내 요약서는 여기에서 찾을 수 있습니다.

시험 및 마무리

설정 시험

이제 freshclam을 시작하기 전에 동작하는지 직접 확인할 수 있습니다.

root #freshclam
ClamAV update process started at Sun May  2 09:13:41 2004
Reading CVD header (main.cvd): OK
Downloading main.cvd [*]
main.cvd updated (version: 22, sigs: 20229, f-level: 1, builder: tkojm)
Reading CVD header (daily.cvd): OK
Downloading daily.cvd [*]
daily.cvd updated (version: 298, sigs: 1141, f-level: 2, builder: diego)
Database updated (21370 signatures) from database.clamav.net (193.1.219.100).

이제 최신 바이러스 정의를 받았고 freshclam.conf가 제대로 동작함을 알았습니다.

freshclam과 amavisd를 명령행 인터페이스와 amavisd 시험 메일로 시험해보십시오. 다음 명령으로 clamdamavis 를 시작하십시오:

root #/etc/init.d/clamd start
root #/etc/init.d/amavisd start
root #/etc/init.d/postfix reload

모든게 잘 처리됐다면 postfix는 25번 포트를 통해 메일을 기다리며 10024번을 통해 메일을 다시 넣습니다. 동작을 확인하려면 로그 파일을 확인하십시오.

root #tail -f /var/log/mail.log
참고
로그 설정에 따라 /var/log/messages가 올바른 경로일 수 있습니다.

이제 로그 파일에 이상한 메시지가 안나타난다면 새로 테스트 해볼 시간입니다.

netcat으로 amavisd에 접속할 때 10024 포트를, postfix에 접속할 때 10025 포트를 활용하십시오.

참고
Netcat은 telnet의 고급진 대체 프로그램으로 활용할 수 있습니다. emerge netcat 명령으로 설치하십시오.
참고
어떤 알 수 없는 이유 때문에 netcat에서 amavisd로의 직접 메일 전송을 처리할 수 없으면, telnet을 대신 사용하십시오.
root #nc localhost 10024
220 [127.0.0.1] ESMTP amavisd-new service ready
root #nc localhost 10025
220 example.com ESMTP Postfix


참고
amavisd-new의 완전한 출력을 보려면 amavis사용자로 amavisd debug-sa 명령을 실행한 후 메일을 보내십시오. 이 과정이 동작하려면 /etc/passwd에서 기본 쉘을 바꿔야할지도 모릅니다.

amavisdclamddefault 런레벨에 추가하십시오.

root #rc-update add clamd default
root #rc-update add amavisd default
참고
amavisd가 스팸 어쌔신 펄 라이브러리를 바로 사용하므로 spamd를 기본 런레벨에 바로 추가하면 안됩니다.
참고
로그에서 Net::Server: Couldn't POSIX::setuid to ... [] 줄을 볼 수 있습니다. amavis chroot README에 따르면, 프로세스 UID가 0으로 남으면 ( root ), 프로그램은 멈추고 그렇지 않으면 참고할만한 메시지로 간주할 수 있습니다. 왜냐면 POSIX::setuid() 함수에서 0 but true 문자열을 반환하기 때문입니다.
중요
amavis로의 로그인을 활성화했다면 /etc/passwd 의 로그인 쉘을 /bin/false로 바꾸는 일을 잊지 마십시오.

전자메일 자동 숙지 및 열외처리

spamtrap 사용자 만들기

spamtrap 계정과 디렉터리를 민드십시오.

root #useradd -m spamtrap
root #maildirmake /home/spamtrap/.maildir
root #chown -R spamtrap:spamtrap /home/spamtrap/.maildir

spamtrap 사용자에게 제대로 된 암호를 부여하십시오.

root #passwd spamtrap

메일 검사 결과중 일부가 거짓 양성 반응을 보이는지 직접 확인하려면 다음의 procmail을 활용하여 다른 메일 폴더에서 스팸이 나오지 않게 할 수 있습니다.

.procmailrc 만들기

파일 /home/spamtrap/.procmailrc
#Set some default variables
MAILDIR=$HOME/.maildir
  
SPAM_FOLDER=$MAILDIR/.spam-found/
  
LIKELY_SPAM_FOLDER=$MAILDIR/.likely-spam-found/
  
#Sort mails with a spamscore of 7+ to the spamfolder
:0:
* ^X-Spam-Status: Yes
* ^X-Spam-Level: \*\*\*\*\*\*\*
$SPAM_FOLDER
  
#Sort mail with a spamscore between 5-7 to the likely spam folder
:0:
* ^X-Spam-Status: Yes
$LIKELY_SPAM_FOLDER
  
#Sort all other mails to the inbox
:0
*
./
경고
메일 서버에서 많은 메일을 받고 있는 중이면 유사스팸 처리 정책을 사용하면 안됩니다. 대신 거짓 양성 판단을 피사기 위해 $sa_tag2_level_deflt 값을 큰 값으로 설정하시고 $SPAM_FOLDER로 바로 걸러내십시오.
참고
아직 procmail를 설치하지 않았다면 emerge procmail로 설치하십시오.

이제 Postfix 에서 메일을 전달할 때 procmail을 사용하는지 확인하십시오.

파일 /etc/postfix/main.cf
mailbox_command = /usr/bin/procmail -a "DOMAIN"

메일 폴더 만들기

이제 햄과 스팸을 처리할 공유 폴더를 만들겠습니다.

root #maildirmake /var/amavis/.maildir
root #maildirmake -S /var/amavis/.maildir/Bayes
root #maildirmake -s write -f spam /var/amavis/.maildir/Bayes
root #maildirmake -s write -f ham /var/amavis/.maildir/Bayes
root #maildirmake -s write -f redeliver /var/amavis/.maildir/Bayes

Amavisd-new에서는 모든 메일 사용자와 마찬가지로 이 파일을 읽을 수 있어야합니다. 따라서 amavis와 연관된 mailuser 그룹에 모든 관련 사용자를 추가하겠습니다.

root #groupadd mailusers
root #usermod -G mailusers spamtrap
root #chown -R amavis:mailusers /var/amavis/.maildir/
root #chown amavis:mailusers /var/amavis/
root #chmod -R 1733 /var/amavis/.maildir/Bayes/
root #chmod g+rx /var/amavis/.maildir/
root #chmod g+rx /var/amavis/.maildir/Bayes/
경고
이 명령 실행 절차를 통해 mailusers 그룹의 사용자가 amavis 메일의 접근 권한을 얻도록합니다.

이 명령 처리를 통해 스팸과 햄 폴더를 읽지는 못하고 쓰기만 가능하게 합니다. 이 방식으로 사용자들이 햄 메일을 읽지 못하게 하면서 안전하게 메일함에 넣을 수 있습니다.

spamtrap 사용자로 다음 명령을 실행하십시오:

user $maildirmake --add Bayes=/var/amavis/.maildir/Bayes $HOME/.maildir
참고
IMAP에서 사용하는 하위 디렉터리를 메일 클라이언트에서 읽을 수 있게 하려면 Bayes 폴더의 그룹 읽기 폴더를 부여해야합니다.

크론 작업 추가

이제 crontab -u amavis -e를 실행하여 amavis 사용자의 크론탭을 편집하고, 베이지언 필터에서 자동 학습 하는 동작을 매 시간마다 수행하도록 활성화하십시오.

파일 crontabamavis 사용자용 설정
#Auto learn
0 * * * *          /usr/bin/sa-learn --spam /var/amavis/.maildir/Bayes/.spam/{cur,new} \
                    > /dev/null 2>&1
0 * * * *          /usr/bin/sa-learn --ham /var/amavis/.maildir/Bayes/.ham/{cur,new} > \
                   /dev/null 2>&1
참고
크론을 실행하려면 amavis 사용자를 cron 그룹의 구성원으로 넣어야 합니다.
참고
공유 maildir 폴더가 sa-learn에서 모든 메시지를 두번씩 검사하도록 하게 하는 것 같습니다. 문제가 되는건 아닙니다. 출력 내용은 메시지를 검사한 절반 또는 그보다 적은 메시지로부터 학습한 메시지의 최대 갯수를 나타냅니다.

amavisd.conf 수정

이제 amavis가 spamtrap 계정으로 스팸 메일을 돌려보내게 하고 스팸 헤더를 유지하도록 하겠습니다.

파일 /etc/amavisd.conf
# (Define the account to send virus spam emails)
$spam_quarantine_to = "spamtrap\@$myhostname";

정리

메일을 계속 두고 싶지 않기 때문에 주기적으로 지우기 위해 tmpwatch 프로그램을 사용하겠습니다. emerge tmpwatch 명령으로 이머지하십시오. root 계정만 tmpwatch를 실행할 수 있으니 root 크론탭을 편집해야합니다.

파일 crontab루트 사용자
# Clean up
# Keep virusmails for a week (24*7 hours)
15 0 * * *      /usr/sbin/tmpwatch -c -f -d --quiet 168 /var/amavis/virusmails/
# Delete spam and ham learned after a week
15 0 * * *      /usr/sbin/tmpwatch -c -f -d --quiet 168 /var/amavis/.maildir/Bayes/

그레이 리스팅

도입부

그레이리스팅은 스팸 전쟁 무기고에 있는 새 무기중 하나입니다. 이름이 의미하는 바와 같이 화이트리스팅과 블랙리스팅을 함께 처리하는 것 같습니다. 매 때마다 알 수 없는 메일 서버에서 메일을 배달하는데 해당 메일을 try again later 메시지로 거절합니다. 이는 해당 메일을 지연시켰을 뿐만 아니라 머저리 스팸 봇에서 스팸 배달 시도를 차단하고 다시는 시도하지 않게끔 하는 RFC 프로토콜을 구현하지 않았다는 이야기가 되기도 합니다. 이 때 스팸봇에서 설정을 조절하겠지만, 앞으로 스팸을 식별할 때 다른 기술을 적용합니다.

참고
ISP에서 25번 포트를 막고 여러분에게 오는 모든 메일을 ISP의 메일 서버를 통해 릴레이한다면 그레이리스팅은 동작하지 않습니다.

Postfix 2.1은 일련의 스킴을 구현한 단일 Perl 그레이리스팅 정책 서버를 보유하고 있습니다. 하지만, 분할 공간에서 그레이리스팅 데이터베이스를 계속 유지하는 도중에 여분의 공간이 없어지는 예상치 못한 결과에 기능상 장애가 발생합니다. 이 문제에 시달리지 않는 개선 버전이 있습니다. 우선 Postfix에 들어있는 내장 그레이리스팅 지원 기능을 설치하는 방법을 보여드리고, 그 다음 더욱 견고한 대안책을 설정하는 방법을 보여드리겠습니다.

참고
Postfix와 함께 쓸 다른 그레이리스팅 정책 서버(포티지에 있는 GldSQLgrey)가 있습니다. 일부는 데이터베이스 백엔드, 자동 화이트리스팅, 그리고 다른 근사한 기능을 지원합니다.

간단한 그레이 리스팅

참고
postgrey로 개선된 그레이 리스팅 기능을 활용하는게 좋다면 이 부분을 안전하게 건너뛰어도 됩니다.

greylist.pl 파일이 필요하지만 불행하게도 이빌드에서 기본으로 설치해주지 않습니다.

root #cp /usr/portage/distfiles/postfix-your-version-here.tar.gz /root/
root #tar xzf postfix-your-version-here.tar.gz
root #cp postfix-2.1.0/examples/smtpd-policy/greylist.pl /usr/bin/

이제 파일을 제 자리에 두었으니 그레이리스팅 데이터베이스를 유지하도록 디렉터리를 만들어야합니다:

root #mkdir /var/mta
root #chown nobody /var/mta
경고
공간이 부족한 분할 공간에 그레이리스팅 데이터베이스 디렉터리를 만들지 마십시오. postfix는 공간이 부족한 상황에서 메일 큐와 메일 박스 상태를 복원할 수 있지만, 그레이리스팅 데이터베이스를 호라용하는 경우는 해당이 안됩니다. 파일이 깨졌다면 파일을 직접 삭제하기 전까지는 메일을 받을 수 없습니다.

그레이 리스팅 설정

이제 모든 것이 준비되었고 남은건 postfix 설정에 추가하는 부분입니다. 우선 필요한 정보를 master.cf 에 추가하겠습니다:

코드 그레이 리스팅을 활용할 목적으로 master.cf 수정
policy-greylist  unix  -       n       n       -       -       spawn
   user=nobody argv=/usr/bin/perl /usr/bin/greylist.pl

증식한 postfix 데몬 프로세스는 보통 1000초가 지나면 하위 프로세스를 강제 종료하지만 그레이리스팅 프로세스에는 상당히 짧은 시간이기에 main.cf에서 제한 시간을 늘려보겠습니다:

파일 main.cf그레이 리스팅 활용
policy-greylist_time_limit = 3600
# (Under smtpd_recipient_restrictions add:)
check_sender_access hash:/etc/postfix/sender_access
# (Later on add:)
restriction_classes = greylist
greylist = check_policy_service unix:private/policy-greylist
경고
reject_unauth_destination 다음check_sender_access를 지정했는지 확인하십시오. 이렇게 하지 않으면 여러분이 구축한 시스템은 공개 메일 릴레이가 됩니다.
참고
그레이리스트 데이터베이스는 짜가 주소로 금방 난장판이 됩니다. 그레이리스트에서 알 수 없는 송수신자를 거절하는 다른 제한을 찾는 동작을 막으면 도움이 됩니다.

모든 도메인을 그레이리스팅 처리하지 않겠지만 스패머가 주로 남용하는 도메인에 대해서는 그레이리스팅을 처리합니다. 이후 메일 배달을 지연합니다. 주로 위조하는 MAIL FROM 도메인 목록은 온라인en에 있습니다. 상당한 양의 스팸을 보내는 도메인을 /etc/postfix/sender_access에 추가하십시오:

코드 Format of sender_access
aol.com     greylist
hotmail.com greylist
bigfoot.com greylist

더 많은 목록을 살펴보시려면:

root #cat sender-domain-validate.in | sort | awk {'print $1 "\t\t greylist"'} > /etc/postfix/sender_access

이제 sender_access 데이터베이스만을 초기화했습니다:

root #postmap /etc/postfix/sender_access

이제 간단한 그레이 리스팅 설정은 끝났습니다.

경고
매일 수천개 메일을 처리하는 머신에서 시도했고, 거의 재앙에 가까운 결과가 나타났습니다. 4일쯤 지나다보니 메일함은 수천개의 greylist.pl 프로세스 덕분에 난장판이 됐습니다.

postgrey로 그레이 리스팅 설정 개선하기

간단한 emerge 명령으로 개선된 그레이 리스팅 정책 서버를 설치할 수 있습니다:

root #emerge postgrey

postgrey를 설치한 후 main.cf를 편집해야 합니다. 바꿀 내용은 이미 그레이리스팅한 내용과 거의 정확하게 비슷합니다.

파일 main.cf그레이 리스팅 활용
# (Under smtpd_recipient_restrictions add:)
check_sender_access hash:/etc/postfix/sender_access
# (Later on add:)
smtpd_restriction_classes = greylist
greylist = check_policy_service inet:127.0.0.1:10030
참고
Postfix의 SMTPD_POLICY_READMErestriction_classes 값만 활용하지만 동작하지 않는 것 같습니다.
참고
몽땅 그레이리스트 처리하고 싶다면 대신 check_policy_service inet:127.0.0.1:10030를 추가하십시오.

마지막으로, 서버를 시작하고 적당한 런레벨에 추가하십시오.

root #/etc/init.d/postgrey start
root #rc-update add postgrey default
참고
어떤 사람은 메일을 빨리 받는걸 좋아하기 때문에 그레이리스팅이 별로 가치가 없을 수 있습니다. 허나, 백업 메일 서버를 도입하면 서버에서 안전하게 그레이리스팅을 설정할 수 있습니다. 제 좁은 식견에 따르면 세번만에 스팸 수신을 차단할 수 있습니다.

SPF (전송 정책 프레임워크)

도입부

SPF는 도메인 소유자가 어떤 IP 주소를 해당 도메인에서 메일을 보내도록 허용할지 DNS 레코드에 상태를 언급하도록 합니다. 이 설정은 Return-Path 를 스푸핑한 스패머를 막아줍니다.

참고
ISP에서 25번 포트를 막고 여러분에게 오는 모든 메일을 ISP의 메일 서버를 통해 릴레이한다면 SPF는 동작하지 않습니다.

우선 도메인 소유자가 특수 TXT DNS 레코드를 만들어야합니다. 이렇게 하면 SPF 활성 MTA에서 이 부분을 확인할 수 있고, SPF에 명시하지 않은 서버에서 온 메일을 거절할 수 있습니다. 예제 항목은 다음과 같습니다:

코드 SPF 레코드 예제
example.com.  IN TXT  "v=spf1 a mx ptr -all"

-all은 기본적으로 모든 메일을 거절하지만 A( a ), MX( mx ), PTR( ptr ) DNS 레코드의 조건에 일치하는 도메인에서 온 메일은 허용한다는 의미입니다. 더 많은 내용을 찾아보려면 페이지 하단의 자료를 참고하십시오.

참고
ISP를 통해 내보내는 메일을 릴레이처리할 경우 include:yourisp.com 을 추가해야 합니다.

스팸 어쌔신 3.0에서는 SPF를 지원합니다만, 기본적으로 활성화 상태가 아니며 Postfix의 새 정책 데몬에서 SPF를 지원합니다. 따라서, Postfix의 SPF 지원을 설치하겠습니다.

참고
스팸 어쌔신의 SPF를 대신 사용한다면, 간단하게 emerge dev-perl/Mail-SPF-Query를 실행하고 Amavisd-new를 다시 시작하십시오

준비

우선 postfix 2.1을 위에서 설명한대로 설치하십시오. 소스코드를 가져왔으면 spf.pl을 찾아 다음 명령을 수행하십시오:

root #cp postfix-<version>/examples/smtpd-policy/spf.pl /usr/local/bin/
참고
postfix에 딸려오는 spf.pl 파일은 약간 문제가 있으므로 다음 부분을 찾아 주석 표시를 없애십시오: push @HANDLERS, "sender_permitted_from"; use Mail::SPF::Query;. 게다가 199번째 줄 쯤의 comemntcomment로 바꾸십시오. 바꾸기가 귀찮으면, 대신 개발 버전을 내려받을 수 있습니다.

펄 스크립트는 현재 포티지에 없는 펄 라이브러리를 필요로하지만, 설치는 여전히 단순합니다:

root #emerge Mail-SPF-Query Net-CIDR-Lite Sys-Hostname-Long

이제 적재적소에 갖춰야할 모든 것을 갖췄으니 이제 필요한 모든건 postfix를 새 정책을 기반으로 동작하도록 설정하는 일입니다.

파일 master.cfSPF 활용
policy-spf  unix  -       n       n       -       -       spawn
   user=nobody argv=/usr/bin/perl /usr/local/bin/spf.pl

SPF 검사항목을 main.cf에 추가하십시오. 제대로 설정한 SPF에는 문제가 없어야 하며 모든 도메인에 대해 SPF를 점검할 수 있어야합니다:

파일 main.cfSPF 활용
# (Under smtpd_recipient_restrictions add:)
check_policy_service unix:private/policy-spf
참고
fetchmail을 쓸 때 SPF에 문제가 있다면, 일부 지정 도메인에 대해서만 SPF를 활성화하는게 좋을지도 모릅니다.

MySQL을 활용하여 amavisd-new 설정

MySQL 설정

참고
2.2버전 위로는 시험해보지 않았습니다. 시험 경험에 대해 언제든지 보내주세요 :)

거대 도메인에 대해 amavisd.conf에서 설정할 수 있는 기본 값은 모든 사용자에게 적절한 값이 아닐 수도 있습니다. amavisd-new와 MySQL 지원기능을 함께 쓰도록 설정한다면 사용자 또는 사용자의 그룹별로 각각 설정할 수 있습니다.

user $mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 78 to server version: 4.0.18-log
  
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>create database maildb;
mysql>GRANT INSERT,UPDATE,DELETE,SELECT ON maildb.* TO 'mail'@'localhost' IDENTIFIED BY 'very_secret_password';
mysql>use maildb;

이제 데이터베이스를 만들었으니 필요한 테이블을 만들겠습니다. mysql 프롬프트에 다음 구문을 잘라다가 붙여넣을 수 있습니다:

코드 MySQL 테이블 구성
CREATE TABLE users (
    id         int unsigned NOT NULL auto_increment,
    priority   int          NOT NULL DEFAULT '7',  -- 0 is low priority
    policy_id  int unsigned NOT NULL DEFAULT '1',
    email      varchar(255) NOT NULL,
    fullname   varchar(255) DEFAULT NULL,    -- not used by amavisd-new
    local      char(1),     -- Y/N  (optional field, see note further down)
    PRIMARY KEY (id),
    KEY email (email)
    );
CREATE UNIQUE INDEX users_idx_email ON users(email);
  
# (any e-mail address, external or local, used as senders in wblist)
CREATE TABLE mailaddr (
   id         int unsigned NOT NULL auto_increment,
   priority   int          NOT NULL DEFAULT '7',  -- 0 is low priority
   email      varchar(255) NOT NULL,
   PRIMARY KEY (id),
   KEY email (email)
   );
CREATE UNIQUE INDEX mailaddr_idx_email ON mailaddr(email);
  
# (-- per-recipient whitelist and/or blacklist,
# -- puts sender and recipient in relation wb)
# (white or blacklisted sender)
CREATE TABLE wblist (
   rid        int unsigned NOT NULL,     -- recipient: users.id
   sid        int unsigned NOT NULL,     -- sender:    mailaddr.id
   wb         char(1) NOT NULL, -- W or Y / B or N / space=neutral
   PRIMARY KEY (rid,sid)
   );
  
CREATE TABLE policy (
   id               int unsigned NOT NULL auto_increment,
   policy_name      varchar(32),     -- not used by amavisd-new
   virus_lover          char(1),     -- Y/N
   spam_lover           char(1),     -- Y/N  (optional field)
   banned_files_lover   char(1),     -- Y/N  (optional field)
   bad_header_lover     char(1),     -- Y/N  (optional field)
   bypass_virus_checks  char(1),     -- Y/N
   bypass_spam_checks   char(1),     -- Y/N
   bypass_banned_checks char(1),     -- Y/N  (optional field)
   bypass_header_checks char(1),     -- Y/N (optional field)
   spam_modifies_subj   char(1),     -- Y/N (optional field)
   spam_quarantine_to   varchar(64) DEFAULT NULL, -- (optional field)
   spam_tag_level  float,  -- higher score inserts spam info headers
   spam_tag2_level float DEFAULT NULL,  -- higher score inserts
               -- 'declared spam' info header fields
   spam_kill_level float,  -- higher score activates evasive actions, e.g.
               -- reject/drop, quarantine, ...
               -- (subject to final_spam_destiny setting)
   PRIMARY KEY (id)
  );
참고
복사/붙여넣기에 문제가 있다면 구문을 어딘가에 복사하고 필요없는 문자를 지워나가십시오.
참고
John "Funny" Smith@example.com와 같은 RAW(rfc2821-unquoted and unbracketed) 주소를 키로 간주하여 일치하는 전자메일 주소 찾기 사도를 진행합니다
참고
검색은 SQL , LDAP , hash , ACL , regexp , constant 순서대로 진행합니다. 분명한 응답(undef/NULL 아님)이 나오기 시작하면, 검색을 중단합니다.

화이트리스팅 및 블랙리스팅을 활용하려면 wblist에 송신자와 수신자의 전자메일 주소간 관계를 만들고 난 후 mailadr 에 송신자 및 수신자 메일 주소를 추가하고, 화이트리스트 처리할 지( W ), 블랙리스트 처리할 지( B )를 명시해야합니다.

이제 테이블을 만들었으니 test 사용자와 test 정책을 넣어보겠습니다:

코드 test 사용자 및 test 정책 만들기
INSERT INTO users
   SET
      id         =1,
      priority   =9,
      policy_id  =1,
      email      ="johndoe@example.com",
      fullname   ="John Doe",
      local      ="Y";
  
INSERT INTO policy
   SET
      id                     =1,
      policy_name            ="Test policy 1",
      virus_lover            ="N",
      spam_lover             ="N",
      banned_files_lover     ="N",
      bad_header_lover       ="N",
      bypass_virus_checks    ="N",
      bypass_spam_checks     ="N",
      bypass_banned_checks   ="N",
      bypass_header_checks   ="N",
      spam_modifies_subj     ="N",
      spam_quarantine_to     =NULL,
      spam_tag_level         =-50.0,
      spam_tag2_level        =7.0,
      spam_kill_level        =10.0;
참고
이 구문을 어딘가에 복사해두고 여러분의 환경에 맞게 값을 조정하십시오.
참고
localY값으로 설정하지 않으면 스팸 메일을 검색하지 않습니다.

이 구문은 test 사용자와 Test 정책을 넣습니다. 이 예제를 요구에 맞춰 약간 조절해나가십시오. 설정 이름에 대한 더 많은 설명은 amavisd.conf 에서 찾을 수 있습니다.

MySQL을 활용하여 amavisd 설정

이제 amavis에 MySQL을 사용하라고 할 준비가 되었습니다:

파일 amavisd.confMySQL을 사용하도록 업데이트
@lookup_sql_dsn =
   ( ['DBI:mysql:maildb:host1', 'mail', 'very_secret_password']  );
  
# (For clarity uncomment the default)
$sql_select_policy = 'SELECT *,users.id FROM users,policy'.
   ' WHERE (users.policy_id=policy.id) AND (users.email IN (%k))'.
   ' ORDER BY users.priority DESC';
  
# (If you want sender white/blacklisting)
   $sql_select_white_black_list = 'SELECT wb FROM wblist,mailaddr'.
     ' WHERE (wblist.rid=?) AND (wblist.sid=mailaddr.id)'.
     '   AND (mailaddr.email IN (%k))'.
     ' ORDER BY mailaddr.priority DESC';
</pre>

MySQL을 활용하도록 스팸 어쌔신 설정

스팸 어쌔신 3.0에서 Bayes와 AWL 데이터를 MySQL에 저장할 수 있습니다. MySQL이 다른 데이터베이스에 비하면 무난한 동작을 수행할 수 있으므로 MySQL을 백엔드로 활용하겠습니다. 두가지 데이터 모음을 처리하는데 MySQL을 활용하면 시스템 관리가 더 쉬워집니다. 쉽게 처리하는 방법을 보여드리겠습니다.

우선 새 MySQL 사용자를 만들고 필요한 테이블을 만드십시오.

root #mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 78 to server version: 4.0.18-log
  
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>create database dbname;
mysql>GRANT INSERT,UPDATE,DELETE,SELECT ON dbname.* TO 'dbuser'@'localhost' IDENTIFIED BY 'another_very_secret_password';
mysql>use dbname;

이제 데이터베이스를 만들었으니 필요한 테이블을 만들겠습니다. mysql 프롬프트에 다음 구문을 잘라다가 붙여넣을 수 있습니다:

코드 MySQL 테이블 구성
CREATE TABLE bayes_expire (
          id                    int(11)         NOT NULL default '0',
          runtime               int(11)         NOT NULL default '0',
          KEY bayes_expire_idx1 (id)
          ) TYPE=MyISAM;
  
      CREATE TABLE bayes_global_vars (
          variable              varchar(30)     NOT NULL default '',
          value                 varchar(200)    NOT NULL default '',
          PRIMARY KEY           (variable)
          ) TYPE=MyISAM;
  
      INSERT INTO bayes_global_vars VALUES ('VERSION','3');
  
      CREATE TABLE bayes_seen (
          id                    int(11)         NOT NULL default '0',
          msgid                 varchar(200) binary NOT NULL default '',
          flag                  char(1)         NOT NULL default '',
          PRIMARY KEY           (id,msgid)
          ) TYPE=MyISAM;
  
      CREATE TABLE bayes_token (
          id                    int(11)         NOT NULL default '0',
          token                 char(5)         NOT NULL default '',
          spam_count            int(11)         NOT NULL default '0',
          ham_count             int(11)         NOT NULL default '0',
          atime                 int(11)         NOT NULL default '0',
          PRIMARY KEY           (id, token),
          INDEX (id, atime)
          ) TYPE=MyISAM;
  
      CREATE TABLE bayes_vars (
          id                    int(11)         NOT NULL AUTO_INCREMENT,
          username              varchar(200)    NOT NULL default '',
          spam_count            int(11)         NOT NULL default '0',
          ham_count             int(11)         NOT NULL default '0',
          token_count           int(11)         NOT NULL default '0',
          last_expire           int(11)         NOT NULL default '0',
          last_atime_delta      int(11)         NOT NULL default '0',
          last_expire_reduce    int(11)         NOT NULL default '0',
          oldest_token_age      int(11)         NOT NULL default '2147483647',
          newest_token_age      int(11)         NOT NULL default '0',
          PRIMARY KEY           (id),
          UNIQUE bayes_vars_idx1 (username)
          ) TYPE=MyISAM;
  
      CREATE TABLE awl (
          username              varchar(100)    NOT NULL default '',
          email                 varchar(200)    NOT NULL default '',
          ip                    varchar(10)     NOT NULL default '',
          count                 int(11)         default '0',
          totscore              float           default '0',
          PRIMARY KEY           (username,email,ip)
          ) TYPE=MyISAM;
중요
INSERT줄은 반드시 실행해야 하며 그렇지 않으면 스팸 어쌔신이 동작하지 않습니다.
참고
소스 타르볼에 있는 awl_mysql.sql 파일 및 bayes_mysql.sql 파일에도 있습니다.

MySQL 백엔드를 사용하도록 스팸 어쌔신 설정

DBM 데이터베이스에서 오래된 Bayes 데이터베이스를 보유하고 있고 다음 절차를 통해 유지하려면:

root #su - amavis
user $sa-learn --sync
user $sa-learn --backup > backup.txt
user $sa-learn --restore backup.txt
참고
MySQL 데이터베이스와 secrets.cf 설정 파일을 업데이트 한 후 마지막 과정을 수행해야 함을 참고하십시오.

이제 필요한 정보를 스팸 어쌔신에 제공하십시오:

파일 /etc/mail/spamassassin/secrets.cf
# (Tell Spamassassin to use MySQL for bayes data)
bayes_store_module              Mail::SpamAssassin::BayesStore::SQL
bayes_sql_dsn                   DBI:mysql:sa_bayes:localhost:3306
bayes_sql_username              db_name
bayes_sql_password              another_very_secret_password
  
# (Tell Spamassassin to use MySQL for AWL data)
auto_whitelist_factory          Mail::SpamAssassin::SQLBasedAddrList
user_awl_dsn                    DBI:mysql:sa_bayes:localhost:3306
user_awl_sql_username           db_name
user_awl_sql_password           another_very_secret_password

다음 보안 수준을 만족스러운 수준으로 끌어올리기 위해 권한을 바꾸십시오:

root #chmod 400 /etc/mail/spamassassin/secrets.cf
참고
상당히 안전한 암호를 만들려면 emerge app-admin/makepasswd 명령을 실행한 후, makepasswd -chars=8 명령을 활용하십시오

이제 해야 할 일은 /etc/init.d/amavisd restart 명령의 실행입니다.

문제 해결

Amavisd-new

Amavisd-new 문제를 해결하려면 /etc/init.d/amavisd stop 명령으로 서비스를 멈추고 amavisd debug 명령으로 전면 실행하여 출력 내용에 이상한 점이 없는지 관찰하십시오.

스팸 어쌔신

스팸 어쌔신의 문제를 찾을 때 spamassassin -D < mail 명령으로 전자메일을 걸러볼 수 있습니다. 헤더에 문제가 없는지 확인하려면 다른 머신에서 IMAP으로 메일을 가져올 수 있습니다.

참고
문제를 찾아야 한다면 amavis 사용자의 로그인 쉘을 /etc/passwd에서 /bin/bash 로 바꿔서 로그인할 수 있게 해야 합니다.

동일한 정보와 Amavisd-new 동작에 대한 더 많은 정보를 가져오고 싶게 하려면 amavisd debug-sa 명령을 사용하십시오.

설치 후 작업 반복 처리

이 안내서에서 언급한 일부 처리 과정은 업그레이드를 하고 나서도 반복해야합니다. 예를 들면, 전자메일 자동 숙지 및 열외처리 의 섹션에서 언급한 chown -R amavis:mailusers 명령은 amavisd-new를 업데이트한 후 매번 반복해야합니다.

다행스럽게도 젠투에서는 이 과정을 자동으로 처리하는 수단을 제공합니다. 이머지 프로세스 후킹 편에서 젠투 핸드북은 각 꾸러미 설치 후 작업을 실행하는 방법을 다음과 같이 설명하고 있습니다:

코드 언급한 chown을 실행하는 bashrc 코드 일부 예제
if [ "${PN}" == "amavisd-new" ] &&
   [ "${EBUILD_PHASE}" == "postinst" ]; 
then
  chown -R amavis:mailusers /var/amavis/.maildir
fi

도움 받기

도움이 필요하다면 amavis-user 메일링 리스트가 바람직한 곳이 되겠습니다. 질문을 올리기 전에 Amavis 사용자 메일링 리스트 보관소에서 검색해보십시오. 만약 답변을 못찾았다면 Amavis 사용자 메일링 리스트에 가입할 수 있습니다.

질문이 스팸 어쌔신, DCC, Razor, Postfix에 관련된 질문이라면 하단에 언급한 각각의 홈페이지를 참고하십시오.

자료

더 많은 정보

일반 자료

다른 설명서