Rocky Linux - 메일서버(Postfix) SPF 정책 적용

    ◆ 메일서버등록제(SPF : Sender Policy Framework)란?

    참고 사이트 : KISA 불법스팸대응센터

    메일서버 정보를 사전에 DNS에 공개 등록함으로써 수신자로 하여금 이메일에 표시된 발송자 정보가 실제 메일서버의 정보와 일치하는지를 확인할 수 있도록 하는 인증기술, 대다수 스팸 발송자가 자신의 신원을 감추기 위하여 발송자 주소나 전송경로를 허위로 표기하거나 변경하는 경우가 많다는데 착안

     

    → SPF를 이용한 이메일 인증절차 (발신자, 수신자가 동시에 조건이 만족해야 합니다.)

    발신자 자신의 메일서버 정보와 정책을 나타내는 SPF 레코드를 해당 DNS에 등록
    수신자 이메일 수신시 발송자의 DNS에 등록된 SPF 레코드를 확인하여 해당 이메일에 표시된 발송 IP와 대조하고 그 결과값에 따라 수신 여부를 결정 (메일서버나 스팸차단 솔루션에 SPF 확인 기능이 설치되어 있어야 함)

    → SPF 값 예시 : "v=spf1 ip4:192.168.0.1 ~all"

    이용하고 있는 메일서버의 최종 발송 서버의 IP가 SPF값의 ip4:192.168.0.1와 일치해야 수신 측에서 인증하고 수신을 받는다는 뜻입니다.

    ■ 설치환경 및 준비물

    메일서버 구축 : https://foxydog.tistory.com/104

    이후 Postfix에 SPF 정책을 적용합니다.

    ■ 참고 문서

    ◇ 국제 인터넷 표준화 기구(Internet Engineering Task Force, IETF)

    https://datatracker.ietf.org/doc/html/rfc7208

     

    ◇ SPF 프로젝트 공식 소스 패키지

    https://web.archive.org/web/20190217174220/http://www.openspf.org/Software


    STEP01 → Python3 PIP 및 SPF 패키지 라이브러리 설치

    ① python3-pip 설치

    ※ Python언어에서 PIP명령어는 파이썬으로 작성된 패키지 라이브러리를 설치하고 관리는 용도로 사용됩니다.

    [root@localhost ]# dnf install python3-pip    [설치]

     

    ② pip3 명령어를 이용한 SPF 패키지 라이브러리 설치

    [root@localhost ]# pip3 install pyspf py3dns pypolicyd-spf    [설치]

    ※ WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead. (루트 권한으로 pip install을 실행하는 것은 일반적으로 좋은 생각이 아닙니다. 다음과 같이 시도하십시오.) 단순 경고 문자입니다. 해당 메시지를 보기 싫으시다면 sudo 명령어로 실행하시면 됩니다.

    [root@localhost ]# sudo -H pip3 install pyspf py3dns pypolicyd-spf    [예시]


    STEP02 → SPF정책을 사용하기 위한 사용자를 추가

    [root@localhost ]#  adduser policyd-spf --user-group --no-create-home -s /bin/false    [계정 생성]

    ※ --user-group 유저, 그룹에 생성하고 --no-create-home /home 경로에 폴더 이름 생성하지 말고 -s /bin/false 모든 시스템 접근 불가능 설정

     

    [root@localhost ]#  cat /etc/passwd | grep spf  [생성 확인]

    policyd-spf:x:6001:6001::/home/policyd-spf:/bin/false


    STEP03 → Postfix 구성 설정[master.cf]

    [root@localhost ]# vim /etc/postfix/master.cf   [구성 파일 편집]

     

    ※ 맨 하단에 다음 줄을 추가

    policyd-spf  unix  -       n       n       -       0       spawn    [추가]
        user=policyd-spf argv=/usr/local/bin/policyd-spf    [추가]

    Postfix가 SPF 정책 데몬이 시작될 때 시작하도록 지시합니다. 파이썬으로 작성된 /usr/local/bin/policyd-spf 파일을 policyd-spf 사용자로 실행됩니다.


    STEP04 → Postfix 구성 설정[main.cf]

    [root@localhost ]# vim /etc/postfix/main.cf    [구성 파일 편집]

     

    ※ 다음과 같이 추가

    policyd-spf_time_limit = 3600    [추가]

    smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination,

    check_policy_service unix:private/policyd-spf    [끝 부분 추가]

    policyd-spf_time_limit = DNS 쿼리용 시간 초과 설정

    smtpd_recipient_restrictions = 정책에 SPF를 추가 확인하여 수신 이메일을 제한


    STEP05 → Postfix 서비스 재시작

    [root@localhost ]# systemctl restart postfix


    STEP06 → Postfix Maillog에서 수신 이메일 헤더 SPF값 확인

    [root@localhost ]# tail -f /var/log/maillog    [실시간 로그 확인]

    ⓛ SPF값이 있는 포탈에서 수신[네이버 예시] : Pass [통과]

    Jun 19 11:49:17 mail policyd-spf[54803]: prepend Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=발송서버IP; helo=cvsmtppost013.nm.naver.com; envelope-from=발송ID@naver.com; receiver=<UNKNOWN>

    ② SPF값이 없는 일반 기업 메일 수신 : None [통과는 되었지만 의심 필요]

    Jun 19 11:52:23 mail policyd-spf[54822]: prepend Received-SPF: None (mailfrom) identity=mailfrom; client-ip=발송서버IP; helo=foxydog.sapce; envelope-from=발송메일주소; receiver=<UNKNOWN>

    ③ SPF값이 없으며, Mail From 헤더를 변조한 메일 수신 : SPF fail  [거부]

    Jun 19 11:56:35 mail policyd-spf[54836]: 550 5.7.23 Message rejected due to: SPF fail - not authorized. Please see http://www.openspf.net/Why?s=helo;id=foxydog.co.kr;ip=발송 IP;r=<UNKNOWN>


    STEP07 → 웹메일 수신 헤더에서 직접 확인


    순서가 조금 뒤바뀌었는데 이전에 포스팅한 https://foxydog.tistory.com/110 SPF 리턴 메시지 분석과 같이 읽어보시면 좀 더 도움이 되실 것으로 생각됩니다. 메일 보안정책으로 같이 사용하는 DKIM(DomainKeys Identified Mail)과 DMARC(Domain-based Message Authentication, Reporting and Conformance)도 공부하여 다음에 포스팅할 수 있도록 준비하도록 하겠습니다.

    Designed by JB FACTORY