본문 바로가기

클라우드

SMTP 프로토콜과 Relay 설정

728x90
반응형

SMTP 란

이메일을 송신하기 위한 표준 프로토콜이다.

메일 클라이언트가 메일 서버로 송신할 때, 그리고 메일 서버가 다른 메일 서버로 송신 요청을 보낼 때 SMTP 프로토콜을 사용하게 된다.

 

포트는 통상적으로 아래 3가지가 사용된다.

  용도 암호화 방식 인증 권장 여부 특징
25 서버 ↔ 서버 전송 없음
(STARTTLS 가능)
거의안씀 비권장 옛날의 SMTP 기본 포트
스팸 때문에 ISP에서 차단 많음
587 클라이언트 → 서버 전송 STARTTLS 필수 권장 표준 메일 제출 포트 (Mail Submission)
465 클라이언트 → 서버 전송 SSL/TLS 즉시 필수 조건부 권장 SMTPS, 예전엔 비표준 → 요즘은 다시 사용됨

 

 

위의 표에서 언급되는 단어에 대한 설명은 아래와 같다.

인증

SMTP 서버에 내가 메일을 송신하기 위한 권한을 가지고 있음을 인증하는 방식이다.

보통 SMTP 서버에 권한이 있는 계정을 만들어 id/pwd 를 이용하여 인증을 시도한다.

다만 25번 포트의 경우에는 인증을 사용하지 않고도 메일 송신이 가능하기에 취약한 포트라고 볼 수 있다.

따라서 보통 서로 신뢰하는 서버 간의 SMTP 통신이나, IP 기반으로 화이트리스트를 관리하는 사내 메일 등을 제외하면 서비스단에서 인증 없이 통신하는 경우는 보통 없다.

 

STARTTLS vs SSL/TLS

STARTTLS 는 일단 평문으로 연결한 후, 중간에 암호화로 업그레이드하는 방식이고
SSL/TLS 는 처음부터 끝까지 암호화 연결을 하는 방식이다.

아래는 쉽게 풀어쓴 예시이다.

 

STARTTLS

1. TCP 연결 (평문)
2. EHLO
3. STARTTLS 명령
4. TLS 핸드쉐이크
5. 이후부터 암호화
6. AUTH (ID / PW)
7. 메일 전송

 

SSL/TLS

1. TCP 연결
2. TLS 핸드쉐이크 (바로 암호화 시작)
3. 암호화된 상태
4. EHLO
5. AUTH
6. 메일 전송

 

차이를 보면 STARTTLS 는 먼저 클라이언트가 EHLO 로 인사 후 응답에 STARTTLS 가 포함되어있으면 TLS 핸드쉐이크를 시작하는 반면,

SSL/TLS 는 바로 TCP 연결이 되자마자 TLS 핸드쉐이크를 시도한다.

 

(펼치기) EHLO 에 대해 더 알고싶다면

더보기
더보기

EHLO (Extended HELO)

클라이언트가 서버에게 확장 SMTP를 쓰기 위해 서버로부터 지원하는 기능 리스트를 받기 위해 사용하는 명령어이다.

옛날에 사용하는 SMTP 는 기능이 단순했으나 현대로 넘어오면서 STARTTLS, 인증 등의 기능이 추가되어, 서버가 어떤 기능을 지원할 수 있는지 확인이 필요해지게 되었다.

아래는 EHLO 의 예시다.

C: EHLO myapp.company.com
S: 250-mail.company.com
S: 250-STARTTLS
S: 250-AUTH LOGIN PLAIN
S: 250-SIZE 52428800

 

Relay 란

Mail Relay (SMTP Relay) 는 메일을 대신 전달해주는 중계 서버를 의미한다.

따라서 SMTP 서버로 클라이언트가 메일을 바로 보내지 않고, 중간에 Relay 서버를 거쳐서 메일을 송신할 수 있다.

Relay 를 사용하는 이유는 클라이언트가 직접 Gmail 이나 Naver SMTP 같은 곳으로 메일을 송신하게 되면
클라이언트의 ip 를 신뢰할 수 없고 SPF, DKIM 서명 등의 보안 없이 SMTP 서버로 바로 가기에 SMTP 서버가 해당 메일을 스팸으로 분류할 수 있다.

 

즉, 이러한 메일 수신자에 대한 신뢰 및 안정성을 보장해주는 것이 Relay 서버다.

메일 클라이언트는 Relay 서버까지만 메일을 정상적으로 전달하면, 그 뒤는 Relay 서버가 다른 SMTP 서버와 통신하며 안정성 있는 메일 전달을 보장해준다

 

아래는 쉽게 들은 Relay 서버 유무에 대한 시나리오의 차이다.

 

Relay 서버가 없을 때

[Java 서비스]
   ↓
[Gmail / Naver SMTP]

Relay 서버가 있을 때

[Java 서비스]
   ↓ 587 (AUTH + TLS)
[SMTP Relay]
   ↓ 25
[외부 메일 서버]

 

다만 Relay 라고 해서 SMTP 서버와 별개의 개념은 아니고, SMTP 서버에 Relay 의 기능이 포함되어 있다고 볼 수 있다.

따라서 클라이언트 쪽에 붙어있는 SMTP 서버가 다른 곳으로부터 메일을 수신 받음과 동시에 내가 송신하려는 메일의 Relay 기능도 동시에 할 수 있다.

 

Relay의 핵심 기능

1. 릴레이 제어

Relay 는 아래와 같이 모든 클라이언트에 대해 수신을 받지 않고 문제가 있는 송신은 걸러주는 역할을 한다.

  • 인증된 사용자만 발송
  • 허용된 IP만 발송
  • 특정 도메인만 발송

아무 인증도 없이, 아무나, 아무 메일이나 보낼 수 있는 것을 Open Relay 라고 하는데, 이것을 방지하는 기능을 한다.

만약 릴레이 제어 없이 Open Relay 를 하게 되면 악의적인 해커가 해당 SMTP 서버를 통해 다른 곳으로 스팸 메일을 대량으로 발송해도 막을 수 없다.

 

2. 큐잉 (Queue)

아래와 같은 상황에서 메일 임시 저장 후 재시도 등의 처리를 해준다.

 

  • 상대 서버 다운
  • 네트워크 문제

3. 스팸 대응

아래와 같은 보안 확인을 통해 스팸 메일 여부를 체크 한다.

 

  • DKIM 서명
  • SPF alignment
  • DMARC 정책 준수

이 외에 송/수신처 및 내용, 성공 여부에 대한 로깅 등도 함께 기록해준다.

 

 

SPF / DKIM / DMARC 에 대한 개념

SPF / DKIM / DMARC 는 이 메일이 정말 신뢰가 가능한지를 검증하기 위한 보안 장치다.

 

SPF 는

xxx.com 이라는 주소로 어떤 서버가 메일을 보내도 되는지 확인하는 절차이다.

SMTP 서버가 gmail 일 때, aaa@company.com -> bbb@gmail.com  송신해주려는데 메일을 보낸 클라이언트 서버 정보가 등록이 되어있지 않으면 SPF 단계에서 fail 이 발생한다.

이 때 SPF 는 송신자(회사 등) 도메인의 SPF 레코드에 SMTP Relay 서버 IP를 추가해야 한다.

 

아래는 SPF 가 성공하는 예시다.

김대리: kim@company.com
회사 메일 서버: 203.0.113.10
수신자: user@gmail.com

1. 김대리가 수신자에게 보낸 메일이 회사 SMTP Relay (203.0.113.10) 를 거쳐 Gmail SMTP 서버로 나간다.
2. Gmail이 DNS 를 통해 company.com 의 SPF 를 조회한다.
DNS 결과: v=spf1 ip4:203.0.113.10 -all
3. spf 에 회사 메일 서버인 203.0.113.10 가 등록되어 있음을 확인하고 SPF 검증을 패스하여 메일을 송신한다.

 

DKIM 는

송신한 메일의 도메인을 신뢰할 수 있으며, 중간에 내용이 변경되지 않았음을 증명하기 위한 전자 서명이다.

IP 가 아닌 메일 내용 자체를 증명하기 위한 수단으로, 위조 및 변조 방지에 목적이 있다.

 

아래는 DKIM 에 대한 시나리오다.

김대리: kim@company.com
회사 메일 서버: 203.0.113.10
수신자: user@gmail.com

1. 김대리가 수신자에게 보낸 메일이 회사 SMTP Relay (203.0.113.10) 를 거친다.
2. SMTP Relay 는 메일 내용 일부를 해시한 뒤 비밀키로 서명 후 서명 결과를 메일 헤더에 붙인다. 그 후 Gmail SMTP 로 송신한다.
3. Gmail SMTP 는 DKIM 서명이 있는 것을 확인하고 공개키로 서명 검증을 한다. 공개 키로 서명 검증에 성공하고 메일 내용 해시가 일치하면 DKIM 검증이 패스되어 메일을 송신한다.

 

DMARC 는

SPF / DKIM 검사 결과를 보고 이 메일을 어떻게 처리할지 도메인 주인이 수신자에게 지시하는 규칙이다.

From 도메인의 DNS 에 DMARC 를 설정할 수 있으며, 아래의 p= 부분에 설정된다.

p= 의 값이 어떤 것인지에 따라 차단하지 않고 보고만 해줄지(none), 스팸함으로 넣을지(quarantine), 아예 거절할지(reject) SMTP 서버에서 결정할 수 있다.

v=DMARC1;
p=quarantine;
rua=mailto:dmarc@company.com;
ruf=mailto:dmarc@company.com;

 

 

728x90
반응형