Procmailrc를 이용한 스팸메일 차단

소개
Procmail은 수신 메일에 대해 헤더와 본문 조건을 검사하고, 조건에 따라 특정 메일함으로 분류하거나 별도 프로그램으로 전달할 수 있는 메일 필터링 도구다.
이 문서는 과거 Sendmail 또는 Postfix의 로컬 메일 전달 환경에서 Procmail을 이용해 간단한 메일 필터링을 구성하던 방식을 기록한 것이다.
신규 운영 환경에서는 제목 키워드 기반의 Procmail 필터보다 Postfix + Rspamd + Dovecot Sieve 구성을 권장한다.
- Rspamd: 스팸·피싱·SPF·DKIM·DMARC·악성코드 검사
- Dovecot Sieve: Rspamd 판정 헤더에 따라 Spam 폴더로 자동 분류
- Procmail: 레거시 mbox 기반 환경 또는 단순한 개인 메일 규칙에 한정
주의 사항
제목 키워드만으로 스팸을 차단하면 안 되는 이유
제목 기반 키워드 차단은 다음과 같은 문제가 있다.
- 정상 메일이 특정 단어를 포함할 경우 오탐될 수 있다.
- 발신자는 문자 사이에 공백·특수문자·인코딩을 삽입해 쉽게 우회할 수 있다.
- MIME Base64 또는 Quoted-Printable로 인코딩된 제목은 단순 정규식으로 정확히 검사하기 어렵다.
- 한글·영문·이미지 기반 스팸을 모두 대응하기 어렵다.
- 스팸 판정 근거와 점수를 남기기 어렵다.
따라서 제목 키워드 차단은 보조 규칙으로만 사용하고, 실제 스팸 판정은 Rspamd 또는 SpamAssassin 같은 전용 필터를 사용한다.
Procmail 동작 조건
/etc/procmailrc 파일을 생성하는 것만으로는 Procmail이 자동 실행되지 않는다.
Postfix 또는 Sendmail이 로컬 메일을 전달할 때 Procmail을 호출하도록 별도 설정이 필요하다.
Postfix에서 Procmail을 로컬 전송 에이전트로 사용할 경우의 예시는 다음과 같다.
# postconf -e 'mailbox_command = /usr/bin/procmail -a "$EXTENSION"'
# postfix check
# systemctl reload postfix
Postfix와 Dovecot을 Maildir 또는 LMTP 방식으로 운영 중이라면, Procmail을 추가하기 전에 메일 전달 구조와 중복 전송 여부를 반드시 확인한다.
작업 절차
1. Procmail 패키지 설치
CentOS 등 기존 환경에서는 다음 명령으로 설치할 수 있다.
# yum install -y procmail
Rocky Linux 9에서는 기본 저장소에 패키지가 없을 수 있으므로, 패키지 제공 여부를 먼저 확인한다.
# dnf search procmail
# dnf info procmail
신규 Rocky Linux 9 환경에서는 Procmail 설치보다 Dovecot Pigeonhole Sieve와 Rspamd 사용을 우선 검토한다.
2. 스팸 격리 계정 생성
스팸으로 분류된 메일을 별도 보관할 경우 전용 계정을 생성한다.
# useradd -r -m -s /sbin/nologin spam-admin
계정이 생성되었는지 확인한다.
# id spam-admin
# getent passwd spam-admin
spam-admin계정은 시스템 관리용 계정이므로 일반적인 대화형 로그인을 허용하지 않는다.
3. Procmail 로그 파일 생성
# touch /var/log/procmail.log
# chown root:root /var/log/procmail.log
# chmod 0640 /var/log/procmail.log
시스템 전체
/etc/procmailrc는 여러 사용자 권한으로 실행될 수 있다. 따라서 일반 사용자 계정이/var/log/procmail.log에 직접 기록하지 못할 수 있다.운영 환경에서는 Procmail의 상세 로그를 상시 활성화하지 말고, 메일 본문·수신자 정보가 로그에 과도하게 남지 않도록 주의한다.
4. 시스템 전역 Procmail 설정
시스템 전체에 적용할 설정 파일을 생성한다.
# vi /etc/procmailrc
기본 환경 변수와 로그 설정을 추가한다.
SHELL=/bin/sh
PATH=/usr/bin:/usr/local/bin:/bin
LOGFILE=/var/log/procmail.log
VERBOSE=no
5. 제목 기반 스팸 격리 예시
다음 설정은 제목에 특정 키워드가 포함된 메일을 스팸 전용 mbox 파일로 전달하는 예시다.
:0:
* ^Subject:.*(viagra|porn|sex|drug|mortgage)
/var/spool/mail/spam-admin
:0:의 마지막:은 mbox 파일 기록 시 lock 파일을 사용한다.- lock을 사용하지 않으면 동시에 여러 메일이 전달될 때 메일함이 손상될 수 있다.
- 정규식은 대소문자를 구분할 수 있으므로 필요에 따라 별도 처리가 필요하다.
spam-admin의 mbox 파일은 Mail Transfer Agent와 파일 권한 정책에 따라 쓰기 권한 문제가 발생할 수 있다.
대소문자를 무시하고 조건을 검사하려면 formail과 egrep를 조합할 수 있다.
:0:
* ? formail -x"Subject:" | /usr/bin/grep -Eiq '(viagra|porn|sex|drug|mortgage)'
/var/spool/mail/spam-admin
위 규칙은 단순 예시다. 제목에
sex,drug같은 단어가 들어간 정상 메일도 격리될 수 있으므로 운영 환경에서 바로 적용하지 않는다.
6. 기존 설정의 오류 예시
다음 조건은 스팸을 판별하지 않는다.
:0
* ? formail -x"From" -x"From:" -x"Sender:" \
-x"Reply-To:" -x"Return-Path:" -x"To:"
/var/spool/mail/spam-admin
formail -x는 지정한 헤더를 출력할 뿐이며,
명령이 정상 종료되면 조건식의 반환 값은 성공(0)이 된다.
따라서 위 recipe는 거의 모든 메일에 대해 참으로 평가되어
수신 메일 전체를 spam-admin으로 전달할 수 있다.
발신자 차단 목록을 사용할 경우에는 명시적인 비교 명령이 필요하다.
:0:
* ? formail -x"From:" | /usr/bin/grep -Eiq '(bad-domain\.example|spammer@example\.com)'
/var/spool/mail/spam-admin
7. 한국어 제목 필터 예시
아래는 단순 키워드 필터 예시다.
:0:
* ^Subject:.*(성인|포르노|색골|야시시|몰카|대출|보험|무료|부업|경품)
/var/spool/mail/spam-admin
한글 제목은 MIME 인코딩 방식에 따라 실제 문자열이 헤더에 그대로 나타나지 않을 수 있다. 따라서 아래와 같은 Base64 문자열을 개별적으로 나열하는 방식은 유지보수가 어렵고, 인코딩 방식이 달라지면 쉽게 우회될 수 있다.
# 권장하지 않는 방식의 예시
* ^Subject:.*(=B1=A4=B0=ED|=BC=BA=C0=CE)
8. 설정 파일 권한
시스템 전체 설정 파일은 root만 수정할 수 있도록 권한을 제한한다.
# chown root:root /etc/procmailrc
# chmod 0644 /etc/procmailrc
사용자별 규칙은 각 사용자의 홈 디렉터리에 .procmailrc 파일로 생성할 수 있다.
$ vi ~/.procmailrc
$ chmod 0600 ~/.procmailrc
사용자별 설정 예시:
SHELL=/bin/sh
PATH=/usr/bin:/bin
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
:0:
* ^Subject:.*\[PROJECT\]
.Project/
최신 권장 방식: Rspamd + Dovecot Sieve
Rocky Linux 9 기반 신규 메일 서버에서는 Procmail 대신 Rspamd의 판정 결과를 Dovecot Sieve가 처리하도록 구성하는 방식을 권장한다.
1. Rspamd가 스팸 헤더 추가
Rspamd는 메일 검사 후 다음과 같은 헤더를 추가할 수 있다.
X-Spam: Yes
X-Spam-Score: 12.50
X-Spam-Action: rewrite subject
2. Dovecot Sieve로 Spam 폴더 이동
사용자별 Sieve 규칙 예시:
require ["fileinto", "imap4flags"];
if header :contains "X-Spam" "Yes" {
addflag "\\Seen";
fileinto "Junk";
stop;
}
또는 Rspamd의 점수 헤더를 기준으로 별도 폴더에 저장할 수 있다.
require ["fileinto"];
if header :contains "X-Spam-Score" "15" {
fileinto "Spam";
stop;
}
실제 Rspamd 헤더명, 점수 임계값, 메일함 이름은 운영 중인 Rspamd 및 Dovecot 설정에 맞게 조정한다.
운영 점검
Procmail 로그 확인
# tail -f /var/log/procmail.log
Postfix 로그 확인
# tail -f /var/log/maillog
메일 큐 확인
# postqueue -p
사용자 메일함 확인
# ls -al /var/spool/mail/
# ls -al /home/spam-admin/
결론
Procmail은 단순한 헤더 기반 분류에는 사용할 수 있지만, 현대적인 스팸·피싱·악성코드 대응 도구로는 적합하지 않다.
신규 Rocky Linux 9 메일 서버에서는 다음 구성을 권장한다.
Postfix
└── Rspamd
├── SPF / DKIM / DMARC
├── 스팸·피싱 검사
└── ClamAV 악성코드 검사
└── Dovecot
└── Sieve를 이용한 Spam 또는 Junk 폴더 자동 분류