이메일 보안 - DKIM, SPF, DMARC

컴업·2024년 1월 24일
0
post-custom-banner

2024년 구글과 야후가 하루 5000건 이상의 발송을 하는 발신자에 대하여 이메일 인증 요건을 강화하겠다고 발표하였다.

참고. https://powerdmarc.com/ko/google-and-yahoo-email-authentication-requirements/#toggle-id-3

이에 중요하게 사용되는 DKIM, SPF, DMARC에 대해 알아보자.

📌from과 mailfrom

이메일을 수신하면 발신자 이메일 주소를 확인할 수 있다.
그런데 이메일 원문을 보면 from과 mailfrom으로 발신자 이메일 주소가 나뉘어 있는 것을 확인 할 수 있다.

중략
permitted sender) smtp.mailfrom=0100018d390cbba1-fee2fe89-3ed5-4130-
중략
permitted sender) smtp.mailfrom=0100018d390cbba1-fee2fe89-3ed5-4130-
중략
From: verify@velog.io
To: totw5701@naver.com
Subject: =?UTF-8?Q?Velog_=EB=A1=9C=EA=B7=B8=EC=9D=B8?=
MIME-Version: 1.0
이메일 컨텐츠... 중략

from 헤더는 이메일 메세지의 일부로, 이메일을 보낸사람을 나타낸다. 일반적으로 우리가 접할 수 있는 발신자 이메일 주소로 노출되는 값이다.
이와는 달리 mailfrom(Return-Path, Envelope From)은 SMTP 세션중에 사용되며, 주로 이메일 전송과 관련된 기술적인 목적으로 사용된다.
만약 이메일 발송이 실패하여 반송되는 경우 from이 아닌 이 mailfrom의 주소로 반송 메세지가 전달된다.

차이점 요약

From

  • 이메일 서버 인터페이스에 노출 (사용자가 직접 보는 곳)
  • 실제 발신자.

MailFrom

  • mailfrom: 이메일 시스템 내에서 사용되는 주소
  • 이메일 배달과 관련된 기술적인 주소

📌DKIM (DomainKeys Identified Mail)

DKIM 인증이란 이메일이 발송된 서버에서 실제 수신자가 메세지를 받아보는 과정에서 이메일에 대한 위변조가 발생하였는지를 검증한다.

DKIM인증을 위해서는 개인키, 공개키가 사용된다.
메일 발송 서버는 먼저 서버가 들고있는 개인키를 사용하여, 이메일에 대한 메타데이터를 암호화하여 이메일 원문에 추가한다(전자 서명을 한다라고 말함).
이후 수신 서버는 발신자의 도메인 DNS에서 공개키를 조회하여 전자서명을 해독 하고, 메타데이터와 이메일 원문을 비교하여 위변조가 있었는지를 확인한다.

예를 들어 메타데이터에 이메일 길이가 5000byte라는 데이터가 있다면 수신측에서는 이메일 원문길이와 메타데이터가 있는 데이터를 비교해 위변조 유무를 확인할 수 있다.

출처: https://www.crinity.net/Newsletter/2019/06/Coffee_Break.html

중요한 것은 이 공개키를 질의하는 도메인이 from도 mailfrom도 아닌 전자서명의 d태그에서 조회한 다는 것이다.
메일에는 아래와 같이 DKIM 전자서명이 추가되고 이에대한 공개키 질의는 노란색으로 형광펜 처리한 s태그(selector), d태그(domain)를 통한다.

따라서 메일 발송 서버에서는 전자서명시 실제 공개키가 등록되어있는 domain과 selector를 사용해 전자서명을 진행해야한다.

** d태그에 등록된 여러개의 dkim중에 selector를 사용해 필요한 공개키만 받아옴.

DKIM 개인키및 공개키 생성 및 DNS 등록 방법

openssl을 사용하면 간단하게 개인키와 공개키를 생성할 수 있다.

1. openssl 설치

sudo yum install openssl

2. 개인키 생성

openssl genrsa -out [개인키명] 1024	

개인키 파일에 아래와 같은 내용이 있어야한다.

-----BEGIN RSA PRIVATE KEY-----
ASsdfsdfsdfsdfadadfasfsdf3622d12we12edqwsdawdCFd5RNwQNVCcCGOo75wzuJV
uCt0PBX7jq2ea2dawdawdlyWsdsdsdlrVjEeyjle5qnJXlnMABAkEA/r0JKOWjD2Xz
DlQtGKmkKw/cMqAWyPdOudqgb2PqdGUAAe72gjEiULUK3HbWxYZakXAwvO3qSePe
nsUTZTkJoQJBAMmnsnUcOUyBlg3kSxKuRn335vkXwX/F32LPJTVLtpvGRet2+Tif
u2XjIjyM3iw/K7i8IZiXDF6f12e12e12easdadsdStN42GOnlG+SK0BuFbjsgu/X7hAkB0
uxeJxTdddddddddd2XX0ZGYVkGun/yI8nAdklPNLwyrY4OGQkoCRQUjFdpI
UNcdzmpBqAED5PkPvi4BAsdfA4itsoSJcyf3tvNSpivB7E6UFLZ0zsdivGwo3ay6s
pmdqP9SjqaN3SSBA/dlaAjHGM0y/kPZw+0KlxJCKQWiv5Q==
-----END RSA PRIVATE KEY-----

3. 공개키 생성

openssl rsa -in [개인키 위치] -pubout -out [공개키명] -outform PEM

공개키 파일에 아래와 같은 내용이 있어야한다.

-----BEGIN PUBLIC KEY-----
ASQfff3f23f23fawdwadawdDCBiQKBgQDIqUsafe3fd3e2323dAWCfCPo9dTsa6I
ela23f23f23fbfKWiY3kBf2f2f23f23ENr85pCVmrR17CFd5iaC4RNwQNV
CYoVOFEcCGOof2f23f23fBX7j063Ouf23f23f23x3f23f23fX25MX
WYK9KMNRSs6agVxXoQasdQAB
-----END PUBLIC KEY-----

4. DNS 공개키 등록
DNS 레코드 TXT에 추가한다.

1) 도메인: 셀렉터._domainkey.도메인
- ex) mail._domainkey.example.com

2) DNS 레코드 TXT: v=DKIM1;g=*;k=rsa;p=공개키

v=DKIM1;g=*;k=rsa;p=ASQfff3f23f23fawdwadawdDCBiQKBgQDIqUsafe3fd3e2323dAWCfCPo9dTsa6I
ela23f23f23fbfKWiY3kBf2f2f23f23ENr85pCVmrR17CFd5iaC4RNwQNV
CYoVOFEcCGOof2f23f23fBX7j063Ouf23f23f23x3f23f23fX25MX
WYK9KMNRSs6agVxXoQasdQAB

📌SPF(Sender Policy Framework)

SPF란 이메일이 실제 발신자 이메일주소 도메인에서 발송된 것이 맞는지를 검증한다.

정확하게는 도메인에 등록된 '허용된' 서버의 목록을 확인한다. 이 메일이 허용된 서버 중 하나에서 발송되었는지를 검사한다.

예를들어 example.com이란 도메인이 있다고 가정해보자.
이 도메인 소유자는 180.0.0.1, 180.0.0.2라는 두 서버에서만 이메일을 보낼 수 있다록 설정했다(SPF 등록).
이제 누군가 example.com을 사용해서 이메일을 보냈을 때, 이메일 서버는 이 메일이 180.0.0.1, 180.0.0.2 서버 중 하나에서 왔는지를 확인한다.

출처: https://www.crinity.net/Newsletter/2019/06/Coffee_Break.html

SPF는 mailfrom(Return-Path) 메일주소의 도메인 DNS에 spf를 질의한다. 따라서 mailfrom에 있는 메일 주소의 도메인 DNS에 SPF를 등록해야한다.

DNS SPF 설정 방법

  • v=spf1 ip4:[ip1] [ip2] [ip3] ~all

  • spf 등록예시

example.com. IN TXT "v=spf1 ip4:192.0.2.0/24 ip6:2001:db8::/32 include:_spf.google.com -all"

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

DMARC는 SPF와 DKIM 검증 결과를 바탕으로 주요한 두가지 측면에서 보안을 강화한다.

첫번째로, 검증에 실패한 이메일에 대해 어떻게 처리할지 정책을 정의할 수 있다.
두번재로, 검증 결과가 from 도메인과 얼마나 일치하는지를 평가한다. 다시말해 실제 수신자가 보게될 발신자 이메일에 대한 SPF, DKIM 검증이 이루어졌는지를 판단하는 것이다. 이를 각각 SPF 정렬(Alignment), DKIM정렬 라고 부른다.

출처: https://www.crinity.net/Newsletter/2019/06/Coffee_Break.html

DMARC 검증은 from 도메인을 기준으로 수행한다.
즉, 이메일이 john@example.com과 같은 주소에서 발송되었다면, example.com 도메인에 DMARC 정책이 설정되어 있어야한다.

SPF 검증이 완료된 도메인인 mailfrom 도메인과 DMARC 정책이 등록된 from 도메인간 일치하는지를 확인한다. (SPF alignment)
또 DKIM 검증이 완료된 도메인인 d태그 도메인과 from 도메인이 일치하는지 확인한다. (DKIM alignment)

DMARC 검증은 SPF와 DKIM 중 하나라도 From 주소의 도메인과 일치하면 통과된다.

정책 옵션

도메인에서 보낸 메일이 DKIM, SPF 인증을 통과하지 못할 경우 DMARC 정책에 따라 메일을 처리한다.

  • dmarc 설정 방법
    - v=DMARC1; p=[정책]

  • dmarc 정책

    • none: dmarc 검사를 통과하지 못한 메일에 아무런 조치를 취하지 않는다. 메일은 수신자에게 정살 전달된다.
    • quarantine: 검증 실패한 메일은 스팸함으로 전송된다.
    • reject: 검증 실패한 메일은 거부되고 수신자에게 전달되지 않는다.
  • dmarc 등록예시

example.com. IN TXT "v=DMARC1; p=quarantine"

참고: https://support.google.com/a/answer/10032169?hl=ko&ref_topic=2759254&sjid=2738262809634836792-AP

profile
좋은 사람, 좋은 개발자 (되는중.. :D)
post-custom-banner

0개의 댓글