도메인 및 SMTP 서버에 DKIM 적용하기

출처 : https://kr.minibrary.com/278/

1. 실행 환경

  • 하드웨어: 라즈베리파이 3
  • OS: 라즈비안 8 제시

2. DKIM 이란?

SPF 설정의 경우, 설명이 길어지다 보니 이론편 및 실전편으로 나누어져 버렸습니다.

해당 기술들에 대해 깊은 지식이 있는게 아니다 보니, 여기서 길게 쓰는 것 보다 해당 기술을 만들고 관리하는 곳에서 내용을 보시는게 훨씬 정확하다고 생각됩니다.

DKIM은 Domain Keys Identified Mail, 도메인 키 인증 메일이라고 합니다.

DKIM을 메일 헤더에 추가하여 사인이 맞을 경우 메일의 컨텐츠가 수정/변형/손상이 없음을 신뢰할수 있게 해주는 기술입니다.

동작 원리는, 도메인키 라고 하는 공개키 서명 방식을 이용하며, 메일에 사용하는 도메인에 공개키를 텍스트로 저장하고, 메일을 발송하는 서버에는 비밀키를 저장합니다.

메일을 발송 할 때, SMTP 클라이언트(sendmail, postfix 등)이 dkim 클라이언트를 로드하여, dkim 클라이언트의 설정에 따라 발송하려는 메일 도메인의 비밀키와, 도메인에 공개된 공개키를 대조하여 맞는 값일 경우 메일 헤더에 DKIM 서명을 넣습니다.

3. Opendkim 설치

아래 명령어로 필요한 패키지들을 설치합니다.

$ sudo apt install opendkim opendkim-tools

4. Opendkim 키 생성

가장 먼저 실제로 사용할 Opendkim Key를 만들도록 하겠습니다.

Opendkim의 키는 도메인키 라고도 불립니다.

앞서 간략하게 설명했지만, DKIM은 공개키와 비밀키 한쌍이 필요합니다.

RSA 1024 bit를 많이 사용합니다.

DKIM은 공식적으로 2048 bit도 지원 하지만, 많은 도메인 업체에서 TXT 레코드의 길이 제한으로 2048 Bit로 생성된 공개키가 입력이 되지 않는다고 합니다.

Openssl 로 비밀키, 공개키 한쌍을 직접 만들 수도 있지만, 더욱 쉽게 Opendkim의 키 생성 도구를 이용하겠습니다.

아래 명령어에도 나오지만, 키를 생성하기 전에 한가지 정해야 할 것이 있습니다.

바로 "포인터" 라는 것인데요, DKIM은 도메인 소유자만이 알고 있는 포인터 의 이름을 정해서 사용해야 합니다.

  • 실습에서는 mail.hestia.tk 도메인의 DKIM 포인터는 pointer1 로 결정하였습니다.

본인의 포인터 이름을 결정하였으면, 아래 명령어로 /etc/opendkim/keys/mail.hestia.tk 디렉토리에 공개키/비밀키 한쌍을 만듭니다.

(/etc/opendkim 디렉토리 아래에 keys  mail.hetia.tk 디렉토리가 없는 경우에는 생성 하시기 바랍니다.)

$ sudo opendkim-genkey -D /etc/opendkim/keys/mail.hestia.tk -d mail.hestia.tk -s pointer1

위의 명령어로 키 생성 시, 기본 값 RSA 1024 bit로 생성합니다.

생성이 잘 되었는지, 아래 명령어로 확인해 봅니다.

ls -al /etc/opendkim/keys/mail.hestia.tk

img-2016-0522-006.png

  보이는 것과 같이, pointer1.private (비밀키) 및 pointer1.txt (공개키)가 생성 되었습니다.

pointer1.txt (공개키)는, 파일의 내용을 도메인에 TXT 레코드로 입력 후에는 삭제해도 괜찮습니다.

pointer1.private (비밀키)의 소유자가 root의 경우 아래 명령어로 opendkim이 소유하도록 합니다.

$ sudo chown opendkim /etc/opendkim/keys/mail.hestia.tk/pointer1.private

생성된 키들은, 아래 설정들에서 쓰입니다.

5. Opendkim 기본 설정

Opendkim의 기본 설정 파일은 /etc/opendkim.conf 입니다.

해당 파일의 기본값에서, Socket을 inet이 아닌 Unix Socket을 만들어서 사용하겠습니다.

$ sudo nano /etc/opendkim.conf

파일이 열리면 가장 아래의 Socket을 수정합니다.

...
AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  Yes

Canonicalization        relaxed/simple

ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable

Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256

UserID                  opendkim:opendkim

Socket                  local:/var/run/opendkim/dkim-filter.sock

img-2016-0522-007.png

이제, 다음 파일들을 자신의 환경에 맞게 차례대로 수정하겠습니다.

  • InternalHosts refile:/etc/opendkim/TrustedHosts
  • KeyTable refile:/etc/opendkim/KeyTable
  • SigningTable refile:/etc/opendkim/SigningTable

1) TrustedHosts 수정

파일을 열어줍니다.

$ sudo nano /etc/opendkim/TrustedHosts

아래와 같이, 메일에 사용하는 자신의 도메인을 추가하고 저장합니다.

127.0.0.1
localhost
mail.hestia.tk

img-2016-0522-008.png

2) KeyTable 수정

DKIM을 위해 도메인에서 불러올 공개키의 전체 주소는 다음과 같습니다.

포인터명._domainkey.메일도메인

pointer1을 사용하는 mail.hestia.tk의 경우에는 pointer1._domainkey.mail.hestia.tk 가 됩니다.

KeyTable 파일을 열어 아래와 같이 내용을 수정합니다.

$ sudo nano /etc/opendkim/KeyTable
pointer1._domainkey.mail.hestia.tk mail.hestia.tk:pointer1:/etc/opendkim/keys/mail.hestia.tk/pointer1.private

조금 복잡해 보이지만, 자신의 포인터명, 자신의 도메인, 그리고 앞서 생성한 비밀키의 경로만 잘 입력 하시면 됩니다.

저장 후 종료합니다.

img-2016-0522-009.png

3) SigningTable 수정

DKIM 사인용 키와 메일 도메인 매칭에 대한 설정입니다.

$ sudo nano /etc/opendkim/SigningTable

파일을 열어, 아래와 같이 내용을 수정합니다.

*@mail.hestia.tk pointer1._domainkey.mail.hestia.tk

img-2016-0522-010.png

저장 후 종료합니다.

설정이 끝났으면, 아래 명령어로 opendkim을 다시 시작해줍니다.

$ sudo systemctl restart opendkim

6. 도메인에 공개키 등록

이제 앞서 생성한 공개키를 자신의 도메인에 등록하도록 하겠습니다.

도메인 관리 사이트에 로그인 하시고, 아래 명령어로 자신의 공개키를 확인합니다.

$ sudo cat /etc/opendkim/keys/mail.hestia.tk/pointer1.txt

img-2016-0522-001.png

호스트명

위의 공개키는 실제 도메인에 입력되는 포맷으로 보여줍니다.

다만 저의 경우 가장 앞의 pointer1._domainkey는, mail.hestia.tk에 대한 호스트명으로, 본래 hestia.tk 도메인을 zone으로 하고 있기 때문에, 도메인에 입력할 때에는 pointer1.domainkey.mail. 으로 입력해야 합니다.

레코드

괄호 안의 내용 전체가 TXT 레코드로 입력할 부분입니다. 보통, 해당 내용 그대로 복사 후 입력해도 됩니다만, ""의 경우 도메인 관리 업체에 따라 다를 수 있으니, 입력이 되는지 잘 확인 하시기 바랍니다. 등록 후 다른 DNS 서버로의 전파에 시간이 걸리는 경우가 있습니다. 아래 명령어로 본인의 DKIM 도메인키가 등록 되었는지 확인해 봅시다.

dig pointer1._domainkey.mail.hestia.tk TXT

img-2016-0522-011.png

등록이 되었으면, Sendmail에 지금까지 설정한 Opendkim을 적용하겠습니다.

7. Sendmail 설정

먼저, Sendmail의 설정파일을 엽니다.

$ sudo nano /etc/mail/sendmail.mc

가장 아래에 다음 내용을 추가합니다.

INPUT_MAIL_FILTER(`opendkim',`S=local:/var/run/opendkim/opendkim.sock') 

img-2016-0522-012.png

저장, 종료 후 다음 명령어로 sendmail의 설정을 다시 만들어 줍니다.

$ sudo make -C /etc/mail/
$ sudo /etc/init.d/sendmail reload

img-2016-0522-013.png

8. DKIM 테스트

설정은 모두 끝났습니다. 이제 테스트를 해 볼 차례입니다.

SPF 설정 때 만든 ~/mail/mail.txt를 이용하겠습니다.

내용은 조금 수정하겠습니다.

img-2016-0522-002.png

메일을 발송해 봅니다.

sendmail -t < mail.txt

도착한 메일의 헤더를 분석해 봅니다.

img-2016-0522-003.png

SPF 및 DKIM 설정이 제대로 되었습니다.

9. Third-Party 업체

SPF의 경우, 자신의 도메인으로 메일 발송을 허용하기 위해 SPF 레코드에 해당 회사의 도메인, 혹은 IP주소 등을 추가하면 되었습니다.

DKIM의 경우에는 어떻게 할까요?

해당 업체에서 DKIM을 도입하고 있다면, 업체에서 자신의 도메인을 위한 공개키/비밀키를 만들고, 공개키를 전달 받아 업체가 지정하는 (혹은 사전에 본인이 지정해주는) pointer를 이용하여 도메인에 등록하고, 업체의 SMTP 클라이언트에 적용 하면 됩니다.

minibrary.com 이라는 업체에서 mail.hestia.tk 를 발신 도메인으로 하는 테스트를 해보겠습니다.

1) DKIM 적용 전

img-2016-0522-004.png

2) DKIM 적용 후

img-2016-0522-005.png

적용이 제대로 되었습니다.

이번 포스트에서 자신의 도메인에 대해 본인 소유의 SMTP 메일 발신 서버, 혹은 제 3자의 서버에서 발송한 메일에 DKIM 사인을 넣는 방법을 알아 보았습니다.

위로 스크롤