Postfix는 여러 기능을 제공하는 오픈 소스 메일 서버로 내장된 기능 중 여러 가지 기능을 제공한다 특이 메일 필터링을 하는 기능이 뛰어난데 그중 header_checks 기능은 메일 서버운영의 최대 난제인 스팸, 바이러스 메일로부터 시스템을 보호하는 기능 중 하나다. header_checks는 이메일 헤더를 검사해 특정 패턴을 가진 메일발송을 수락, 거부, 보류할 수 있다. 검사하는 메일은 postfix queue에서 검사 되어 처리된다. Postfix에서 제공되는 필터 기능 중 header_checks 외에 mime_header_checks, body_checks 등 다양한 필터 기능이 있는데 그중 실무에서 가장 활용도 높게 사용하는 header_checks 기능에 대해서 소개한다.
[목차]
1. header_checks의 기본 구조
header_checks 설정은 메일 헤더(본문이 아닌 부분)에 적용된다. 이는 메일의 주제, 보낸 사람, 받는 사람 등의 정보를 검사하는 데 사용되는데 주로 이용한다. 작동 방식은 발송될 메일이 postfix 시스템에 도착하면, header_checks 설정에 따라 각 헤더 라인이 검사한다. 각 라인은 설정 파일에 정의된 패턴 목록과 비교 후. 일치하는 패턴이 발견되면, 해당 패턴 옆에 정의된 액션이 실행된다.
이 작업은 메시지를 거부하거나, 헤더를 수정하거나, 메시지를 특정 주소로 리디렉션 하는 등 다양할 수 있다. 모든 헤더 라인에 대해 반복되며, 메시지 본문은 body_checks 설정에 따라 별도로 처리할 수도 있다. 이렇게 Postfix는 각 메시지를 세밀하게 제어하고, 원치 않는 메일을 효과적으로 필터링할 수 있다.
2. header_checks 필터 구조
/정규표현식/ 액션
3. 액션의 종류
액션 | 설명 |
REJECT | 메일을 거부 하고 송신자의 MTA에게 거부/반송메시지를 전달한다 |
IGNORE | 헤더를 삭제하고 정상적인 메일로 처리하게 된다. |
WARN | REJECT 할 때 액션의 뒤에 메시지를 기록해 놓으면, 로그와 헤더에 그 메시지가 추가로 남는다. |
HOLD | 해당 메일을 보류 홀드 큐(Queue)에 보관됨, 다시 발송할 수 있도록 처리하기 전까지 메일이 발송되지 않는다. |
DISCARD | 메일을 정상적으로 처리한 것처럼 나타내고, 내부적으로는 그 메일을 버리게 된다. |
FILTER | Postfix 말고 다른 프로그램으로 메일을 전달 한다. |
BCC | 메시지의 복사본을 지정된 주소로 보낸다. |
DUNNO | 무런 작업도 수행하지 않는다. 이는 다음 규칙을 검사하도록 지시하는 것이다. |
FILTER | 이 액션은 메시지를 지정된 메일 필터로 전달한다. |
4. header_checks 필터 적용 예
설정 파일 : /etc/postfix/header_checks
- mail header에서 Important Notification: Your Account Has Been Compromised 문자열이 들어가면 차단한다.
/^Subject:\ Important\ Notification\:\ Your\ Account\ Has\ Been\ Compromised$/ DISCARD
- "Subject" 헤더가 "Viagra"라는 단어를 포함하는 모든 메시지를 버린다.
/^Subject:.*[Vv][Ii][Aa][Gg][Rr][Aa]/ DISCARD
- mail header에서 문자열이 "Viagra"라는 단어를 포함하면 메일을 리턴 시키고 "We suspect mail password hacking. Please change your password immediately." 메시지를 보냄.
/^Subject:.*[Vv][Ii][Aa][Gg][Rr][Aa]/ REJECT WARN "We suspect mail password hacking. Please change your password immediately."
- "From" 헤더가 "example.com"에서 오는 모든 메시지를 거부
/^From:.*[@.]example.com/ REJECT We do not accept mail from example.com
- To" 헤더가 "example.net"으로 가는 모든 메시지를 지정된 메일 필터로 전달
/^To:.*[@.]example.net/ FILTER smtp:192.0.2.1:25
5. header_checks 적용 방법
main.cf 설정 파일에 header_checks 지시자로 파일을 설정하여 사용하고, 설정 방법은 아래와 같으며 /etc/postfix/header_checks 파일 내부에 필터구조를 넣는 방식이다.
# vi main.cf
header_checks = regexp:/etc/postfix/header_checks
# postmap /etc/postfix/header_checks // postfix header_checks Lookup 테이블을 생성한다.
# /etc/init.d/postfix reload // postfix reload
6. maillog 처리 상태
REJECT
Jun 24 17:36:05 gbminnote postfix/cleanup[31914]: 143912EF480: reject: header Subject: Important Notification: Your Account Has Been Compromised from tech.gbminnote.com[211.37.179.216];
from=<test@gbminnote.com> to=<gbminnote@gmail.com> proto=ESMTP helo=<tech.gbminnote.com>: 5.7.1 message content rejected
IGNORE
로그는 정상 메일과 같고, 해더가 삭제되어 제목 없음으로 메일이 수신됨
Jun 24 17:39:01 gbminnote postfix/smtp[31961]: D5C3B181D7F: to=<gbminnote@gmail.com>, relay=gmail-smtp-in.l.google.com[108.177.125.27]:25, delay=2, delays=0.01/0.01/1.3/0.66, dsn=2.0.0, status=sent (250 2.0.0 OK 1682253458 p11-20020a170902e74b00b001a1956e542dsi9489535plf.340 - gsmtp)
REJECT WARN
리턴 메일에 WARN "We suspect mail password hacking. Please change your password immediately." 문구가 들어감.
Jun 24 17:53:38 gbminnote postfix/cleanup[32155]: 992312EF480: reject: header Subject: Subject: Important Notification: Your Account Has Been Compromised tech.gbminnote.com[211.37.179.216];
from=<test@gbminnote.com> to=<gbminnote@gmail.com> proto=ESMTP helo=<tech.gbminnote.com>: 5.7.1 WARN "We suspect mail password hacking. Please change your password immediately."
HOLD
차단 큐 저장 경로 - /var/spool/postfix/hold
차단 해제는 메일 큐를 /var/spool/postfix/active 로 이동후 HOLD 설정 주석처리 후 postfix reload 해주면 발송이 된다.
Jun 24 18:01:06 gbminnote postfix/cleanup[32318]: 1FCF12EF480: hold: header Subject: Important Notification: Your Account Has Been Compromised tech.gbminnote.com[211.37.179.216];
from=<test@gbminnote.com> to=<gbminnote@gmail.com> proto=ESMTP helo=<tech.gbminnote.com>
postfix에서 제공하는 header_checks는 강력한 필터링 툴임에도 불구하고 몆 가지 단점이 있다. 한글의 경우 인코딩 형식으로 해더에 들어가기 때문에 정규식표현을 하기 까다롭다. 두 번째는 메일 해더만 체크하기 때문에 본문은 body_checks를 활용해야 한다. 하지만 body_checks의 경우 사용을 잘하지 못하는 이유가 필터를 걸기가 너무 까다롭다. 잘못 설정되면 오 탐지로 정상적인 서비스가 어렵기 때문이다. 실무에서는 종종 header_checks만을 사용하여 스팸을 차단하고 있는데 룰 설정만 잘된다면 오 탐지율도 낮고 필터링도 잘된다. header_checks 설정 만으로도 비싼 메일 보안 프로그램 이상의 기능을 수행할 수 있다.
참고사이트 : https://www.postfix.org/header_checks.5.html