gbmin's Tech Notes

서버 구축 및 유지보수, 클라우드 컴퓨팅, 네트워크 보안, IT 분야 기술 노트. :)

Tech Notes/Mail Server

메일 서버 보안 강화: Postfix header_checks를 이용한 메일 필터링 방법

gbmin 2023. 6. 26. 21:45

Postfix는 여러 기능을 제공하는 오픈 소스 메일 서버로 내장된 기능 중 여러 가지 기능을 제공한다 특이 메일 필터링을 하는 기능이 뛰어난데 그중 header_checks 기능은 메일 서버운영의 최대 난제인 스팸, 바이러스 메일로 부터 시스템을 보호하는 기능 중 하나다. header_checks는 이메일 헤더를 검사해 특정 패턴을 가진 메일발송을 수락, 거부, 보류할 수 있다. 검사하는 메일은 postfix queue에서 검사되어 처리된다. Postfix에서 제공되는 필터 기능 중 header_checks 외에 mime_header_checks, body_checks 등 다양한 필터 기능이 있는데 그중 실무에서 가장 활용도 높게 사용하는 header_checks 기능에 대해서 소개한다.

 


[목차]

1. header_checks의 기본 구조

2. header_checks 필터 구조

3. 액션의 종류

4. header_checks 필터 적용 예

5. header_checks 적용 방법

6. maillog 처리 상태


 

 


※ 설치 OS에 따라 설치 경로는 다를 수 있는데 이 글은 데비안 계열의 리눅스에서 테스트 한 경로를 기준으로 작성하였다.

 

 

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

/^Subject:\ Important\ Notification\:\ Your\ Account\ Has\ Been\ Compromised$/ DISCARD

→ mail header에서 Important Notification: Your Account Has Been Compromised 문자열이 들어가면 차단한다.

 

/^Subject:.*[Vv][Ii][Aa][Gg][Rr][Aa]/ DISCARD

→ "Subject" 헤더가 "Viagra"라는 단어를 포함하는 모든 메시지를 버린다.

/^Subject:.*[Vv][Ii][Aa][Gg][Rr][Aa]/ REJECT WARN "We suspect mail password hacking. Please change your password immediately."

→ mail header 에서 문자열이 "Viagra"라는 단어를 포함하면 메일을 리턴 시키고 "We suspect mail password hacking. Please change your password immediately." 메시지를 보냄.

/^From:.*[@.]example.com/ REJECT We do not accept mail from example.com

→ "From" 헤더가 "example.com"에서 오는 모든 메시지를 거부

/^To:.*[@.]example.net/ FILTER smtp:192.0.2.1:25

→ To" 헤더가 "example.net"으로 가는 모든 메시지를 지정된 메일 필터로 전달

 

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

 

Postfix manual - header_checks(5)

 

www.postfix.org