SPF, DKIM, DMARC 동작 원리

민정·2025년 9월 4일

SMTP 보안 레코드(SPF, DKIM, DMARC)

요약

  • SMTP 보안 레코드(SPF, DKIM)는 수신 MTA가 메일을 받았을 때, 해당 메일이 스팸 서버로부터 사칭되거나 위조되지 않았는지 검증함
  • DMARC는 SPF, DKIM 레코드를 확인한 후 수행할 작업을 수신 MTA에게 알려줌

SPF(Sender Policy Framework)

  • 특정 도메인을 SMTP 명령 MAIL FROM에서 사용해 이메일을 전송할 수 있는 모든 MTA의 IP를 작성한 TXT 레코드

SPF 레코드 구조

v=spf1 ip4:1.1.1.1 ip4:2.2.2.2 include:test.com -all
  • TXT 레코드의 이름으로 지정된 도메인 example.com에 대해 SPF 적용
  • 레코드 값 구성 요소
    • v=spf1: SPF 레코드라고 정의
    • ip4:1.1.1.1: 허용되는 MTA의 IPv4 값
    • include:test.com: test.com 도메인의 SPF 레코드도 함께 참고
      • 즉, example.com에 명시된 조건(1.1.1.1example.comMAIL FROM에 사용 가능)과 test.com에 명시된 조건을 모두 확인
    • -all: SPF 레코드에 열거되지 않은 IP는 모두 차단
      • ~all: SPF 레코드에 열거되지 않은 IP는 일단 허용하지만 스팸 분류
      • +all: SPF 레코드에 열거되지 않은 IP도 모두 허용(사실상 SPF 검사 안함이라는 의미)
  • 자세한 내용은 RFC 7208 참고

사용 이유

  • 공격 방지
    • SPF 레코드가 적용되지 않은 도메인은 MAIL FROM에 사용해서 메일을 보내는 것이 가능
    • 이는 MX 레코드, A 레코드 등의 리소스 레코드 적용 여부와 무관하게 MAIL FROM에서 사용 할 수 있음
    • 공격자는 MAIL FROM에 도메인을 사용해서 스팸을 발송할 수 있으며 이로 인해 사용자가 해당 도메인에 아무런 설정을 하지 않아도 도메인의 평판이 낮아질 수 있음
  • 이메일 신뢰성 보장
    • SPF 레코드가 적용되지 않은 도메인은 스팸으로 분류되거나 메일이 반송당할 수 있음

DKIM(DomainKeys Indentified Mail)

  • 메일 수신 서버가 메일이 변조되지 않았는지 검증
  • 발신 MTA는 공개키와 비밀키를 생성
    • 공개키는 TXT 레코드에 저장(DKIM 레코드)
    • 비밀키는 발신 MTA가 개인적으로 소유
  • 발신 MTA는 메일 전송 시 SMTP 컨텐츠를 개인키로 서명 후 서명 내용을 이메일의 헤더에 포함해 전송
  • 수신 MTA는 DKIM 레코드의 공개키를 바탕으로 서명 및 이메일 변조 확인
    • 이메일 헤더나 본문이 변경된 경우, 디지털 서명이 제대로 확인되지 않음

DKIM 레코드 구조

[selector]._domainkey.[domain]
  • DKIM 레코드는 특수 이름으로 저장
    • [selector]: dkim 레코드를 식별하는 값, 사용자 지정 값이 됨
    • ._domainkey.는 모든 DKIM 레코드 이름에 포함됨
    • [domain]: DKIM 레코드를 적용할 도메인
v=DKIM1; p=[공개키 값]
  • 레코드 값 구성 요소
    • v=DKIM1: DKIM 레코드라고 정의
    • p=: DKIM 공개 키 값을 기록

DKIM 헤더

v=1; a=rsa-sha256; 
d=example.com; s=big-email;
h=from:to:subject;
bh=uMixy0BsCqhbru4fqPZQdeZY5Pq865sNAnOAxNgUS0s=;
b=LiIvJeRyqMo0gngiCygwpiKphJjYezb5kXBKCNj8DqRVcCk7obK6OUg4o+EufEbB
tRYQfQhgIkx5m70IqA6dP+DBZUcsJyS9C+vm2xRK7qyHi2hUFpYS5pkeiNVoQk/Wk4w
ZG4tu/g+OA49mS7VX+64FXr79MPwOMRRmJ3lNwJU=
  • v=: 사용되는 DKIM 표시
  • a=: 디지털 서명과 해시에 사용된 알고리즘
  • d=: 발신 도메인
  • s=: 수신 MTA가 선택해야 할 selector 지정
  • h=: 디지털 서명을 만드는데 사용된 헤더 필드
  • bh=: 이메일 본문의 해시
  • b=: 디지털 서명

메일 발송 시나리오

  • 발신 MTA가 존재, 해당 MTA는 example.com 도메인을 사용하며 1.1.1.1 IP 값을 가짐
  • 발신 MTA는 메일을 보내는 시스템이 여러 개 존재
    • 같은 도메인 example.com을 사용하지만, 마케팅팀이 발송하는 광고 메일 시스템과 고객사에게 발송하는 안내 메일 시스템이 별개로 존재
    • 각각의 시스템마다 다른 DKIM 키를 사용하도록 함
      • 광고 시스템은 ad_dkim이라는 selector를 사용
      • 안내 시스템은 info_dkim이라는 selector를 사용
    • 시스템마다 사용하는 DKIM 키가 달라 서로의 서비스에 영향을 미치지 않으며, 키가 유출되더라도 입는 피해가 최소화됨
  • 발신 MTA는 고객사에게 메일을 전송
  • 수신 MTA는 해당 메일을 받아 메일 헤더의 DKIM 헤더에서 s=info_dkim을 확인
    • 발신 도메인의 DKIM 조회 시 2개의 DKIM 레코드가 나타남
    • 이중 selectorinfo_dkim인 것을 선택
  • 수신 MTA는 DKIM 레코드의 공개키를 통해 디지털 서명을 검증

DMARC(Domain-based Message Authentication, Reporting, and Conformance)

  • 수신 MTA에서 이메일을 SPF, DKIM 레코드로 검증한 후 수행할 작업을 결정
    • 수신 MTA가 받은 이메일이 SPF, DKIM 검사를 실패하는 경우 해당 이메일을 스팸 표시, 차단, 수신자에게 전달 중 어떤 작업을 수행할지 설정

DMARC 레코드 구조

v=DMARC1; p=quarantine; adkim=s; aspf=s;
  • v=DMARC1: DMARC 레코드라고 정의
  • p=: SPF, DKIM 검사를 실패하는 경우 수행할 작업을 결정
    • none: 통과 허용
    • quarantine: 스팸함으로 전송(격리)
    • reject: 차단
  • adkim=, aspf=: SPF, DKIM을 얼마나 엄격하게 검사할지 결정
    • r: relaxed, 완화
    • s: strict, 엄격

설정

  • 보안 레코드 설정
    • MTA가 메일을 발신하는 경우, 신뢰성 보장 및 스팸 메일 분류를 막기 위해 설정해야 함
  • 보안 레코드 관련 프로그램 설치
    • SPF: 메일 수신을 위해 필요
      • 메일 수신 시 발신 서버의 SPF 레코드를 검증하기 위해 필요
    • DKIM: 메일 발신, 수신을 위해 필요
      • 메일 발신 시 해당 메일에 DKIM 헤더를 추가해야 하기 때문에 필요
      • 메일 수신 시 DKIM 헤더를 바탕으로 DKIM 레코드를 조회한 후 서명을 검증하는 과정을 거쳐야 하기 때문에 필요
    • DMARC: 메일 수신을 위해 필요
      • 메일 수신 시 SPF, DKIM 검사를 거친 후 DMARC 레코드 조회를 통해 수행할 작업을 결정하기 위해 필요

사용할 프로그램

  • SPF: postfix-policyd-spf-python
  • DKIM: openDKIM
  • DMARC: openDMARC

참고 자료

https://www.cloudflare.com/ko-kr/learning/email-security/dmarc-dkim-spf/
https://www.cloudflare.com/ko-kr/learning/dns/dns-records/dns-spf-record/
https://www.cloudflare.com/learning/dns/dns-records/dns-dkim-record/
https://www.cloudflare.com/learning/dns/dns-records/dns-dmarc-record/

profile
시스템 + 리눅스 + 클라우드

0개의 댓글