콘텐츠로 이동






Procmailrc를 이용한 스팸메일 차단

back

소개

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와 파일 권한 정책에 따라 쓰기 권한 문제가 발생할 수 있다.

대소문자를 무시하고 조건을 검사하려면 formailegrep를 조합할 수 있다.

: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 폴더 자동 분류



작성일: 2026년 7월 15일 ,  마지막 업데이트: 2026년 8월 13일