DKIM에 대하여 알아보기

DKIM(DomainKeys Identified Mail:도메인키 식별 메일)이란 이메일 인증 기술의 한 종류로 이메일이 발송된 출처를 인증함과 동시에 공개키 암호화 방식을 통한 디지털 서명을 이용하여 악의적인 제 3자에 의하여 메시지 본문의 위조 여부를 판별할 수 있는 기술입니다.

작동방식

이메일 발송자는 RSA기반의 공개키/개인키 쌍을 생성합니다.
공개키는 이메일 수신 에이전트가 DNS질의를 통하여 확인할 수 있도록 DNS서버에 등록합니다.
이메일 발송시 DKIM-Signature 라는 헤더 정보를 생성하여 메일 헤더에 삽입하며 이메일 수신 서버 또는 에이전트는 DNS질의를 통하여 획득한 발신자의 공개키 정보와 DKIM-Signature 헤더 정보를 이용하여 발신자 인증 및 메시지의 위변조 여부를 확인합니다.

구체적인 프로세스는 다음과 같이 진행됩니다.

  1. 발신자는 공개키/개인키 쌍을 생성하여 개인키는 외부에 노출되지 않도록 관리하며 공개키는 DNS 서버에 등록합니다. DNS등록시 해당 도메인의 TXT 레코드 타입의 정보로 등록하여야 하며 입력하는 정보의 양식은 다음과 같습니다. 적용하는 도메인의 이름은 example.net이라고 가정합니다.

    이름(호스트) : selector._domainkey 또는 selector._domainkey.example.net
    여기서 selector 부분은 변수명으로 임의의 영문 단어를 대입시켜 사용하시면 됩니다. 예를 들어 s1, mail, dkim 등등의 사용자가 식별 가능한 고유 단어를 selector로 표기된 부분에 사용하시면 됩니다.
    _domainkey는 고정값이므로 그대로 사용하여야 합니다.

    유형(Record Type): TXT

    값(value) : “v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDmzRmJRQxLEuyYiyMg4suA2SyMwR5MGHpP9diNT1hRiwUd/mZp1ro7kIDTKS8ttkI6z6eTRW9e9dDOxzSxNuXmume60Cjbu08gOyhPG3GfWdg7QkdN6kR4V75MFlw624VY35DaXBvnlTJTgRg/EW72O1DiYVThkyCgpSYS8nmEQIDAQAB”.

    여기서 v=DKIM1; k=rsa; 는 버전과 암호화 알고리즘을 표시하는 내용이며 거의 대부분 고정 값이고, p= 태그 값은 이메일 발신자의 공개키 정보입니다. 위에 있는 값은 예시이므로 그대로 사용하면 안되고 반드시 사용자가 직접 생성한 공개키 정보를 입력하여야 합니다.

  2. 발신자는 원본 이메일 헤더와 본문(body) 콘텐트를 이용하여 DKIM-Signature 헤더를 작성한 후 이를 원본 헤더 정보에 추가합니다. 일반적인 DKIM-Signature 헤더 정보는 다음과 같은 모습입니다. DKIM-Signature헤더 정보는 기본적으로 노출되는 정보가 아니며 포털사이트 등에서 제공하는 “메일 원문 보기”등의 추가 기능을 통하여 확인할 수 있습니다.

    DKIM-Signature: v=1; a=rsa-sha256; d=example.net; s=news;
    c=simple/relaxed; t=1126524832; x=1149015927;
    h=from:to:subject:date:reply-to:message-id;
    bh=MHIzKDU2Nzf3MDEyNzR1Njc5OTAyMjM0MUY3ODlqBLP=;
    b=hyjCnOfAKDdLZdKIc9G1q7LoDWlEniSbzc+yuU2zGrtruF00ldcFVoG4WTHNiYw

    v: 버전 정보이며 항상 1의 고정 값을 가집니다.
    a: 서명 생성에 사용된 알고리즘이며 대부분 rsa-sha25입니다.
    d: 도메인 정보입니다.
    s: 셀렉터 정보입니다. 도메인 정보와 함께 사용하여 DNS질의를 통해 발신자의 공개키 정보를 획득합니다. 예를 들어 위 DKIM-Signature에서 d=example.net, s=news 이므로 news._domainkey.example.net 에 대한 DNS TXT질의를 하여 공개키 정보를 얻습니다.
    h: b태그(서명) 작성시 사용된 헤더 정보들에 대한 목록입니다. 서명 당시 헤더 정보의 순서가 나열된 것으로 수신측에서 검증 작업을 할 때에 역시 동일한 순서의 헤더 정보를 이용하여 검증해야 합니다.
    bh: body hash의 약자로 본문에 대한 해시 값을 Base64인코딩 방식으로 인코딩한 값입니다. 해시 알고리즘이란 임의의 길이의 문자열(여기서는 메일 본문)을 고정 길이의 바이트로 변환하는 알고리즘으로 동일한 내용은 항상 동일한 해시 결과값을 갖게 되며 단 한 글자라도 차이가 날 경우 해시 값은 달라집니다. 해시 알고리즘으로는 SHA-256을 사용하며 메일 수신측에서 본문의 해시 값을 구하여 bh= 태그 값과 일치하는지의 여부를 판단하여 메시지 본문이 중간 과정에서 변조되지 않았음을 확인할 수 있습니다.
    b: 발신자가 개인키를 이용하여 서명한 내용으로 h= 태그에서 열거된 헤더 정보를 개인키로 암호화한 해시 데이터입니다. bh= 태그에 사용된 해시 메시지와는 달리 수신측에서는 발신자의 공개키를 이용하여 서명 정보를 복호화 한 후 이 값이 b= 태그 작성에 대한 헤더 해시와 일치하는지를 확인하여 발신자를 인증합니다.

    위에 열거된 태그들은 필수적으로 입력해야 할 정보들이며 그 밖에 위의 예문에서 사용된 c=(canonicalization algorithm), t=(timestamp), x=(expire date)등의 정보는 선택 사항입니다.

  3. 수신 측 서버 또는 에이전트는 2번의 b=, bh= 태그에서 설명한 것처럼 이 두 가지 정보를 이용하여 본문이나 발신자 정보의 위변조 여부를 확인합니다. DKIM 인증에 실패했다고 해서 해당 메시지가 항상 수신자에게 전달되지 않는 것은 아니며, 그에 대한 처리 여부는 철저히 수신 측의 정책에 달려 있습니다. DKIM-Signature는 메일의 인증 방식일 뿐 이메일 송수신에 있어서 필수적인 항목은 아니기 때문입니다.

메일링크는 메일링크 소유의 도메인 정보를 이용하여 DKIM-Signature 헤더를 작성합니다. 따라서 DKIM-Signature의 정보 중 d=, s= 태그는 메일링크와 관련된 정보가 들어갑니다. 예를 들어 d=dk.maillink.co.kr 과 같을 수 있습니다(이것은 예일 뿐 실제 dk.maillink.co.kr이라는 도메인은 사용되지 않습니다).
이러한 경우 예를 들어 메일링크 사용자가 보내는이 정보로 reply@example.net이라는 주소를 사용한다면 이 값은 From 헤더에 들어가며 DKIM-Signature 헤더의 d= 태그의 값과 차이가 발생하게 됩니다.
일반적으로 DKIM인증시에는 DKIM-Signature 헤더에 포함된 정보 만을 사용하므로 문제가 발생하지 않지만 From 주소에 사용되는 도메인과 DKIM-Signature에 사용되는 도메인의 일치를 요구하는 엄격한 정책을 실행하는 환경에서는 메일이 전달되지 않거나 스팸편지함으로 이동되는 등의 문제가 발생할 수 있습니다.

이러한 문제를 해결하기 위해서는 사용자 소유 도메인의 DNS 레코드 정보에 메일링크의 DKIM 서버를 링크하는 CNAME 타입의 정보를 추가해 주어야 합니다.
위 1번의 DNS레코드 등록 방법은 사용자가 직접 공개키/개인키 쌍을 생성하여 TXT 레코드로 등록하는 방법이었던 반면 메일링크에서 제공하는 DKIM 서비스를 이용하고자 한다면 다음과 같은 방법으로 등록하여야 합니다. 위의 예와 마찬가지로 사용자 소유의 도메인은 example.net이라 가정합니다.

이름(호스트) : mlk._domainkey 또는 mlk._domainkey.example.net.

유형(Record Type): CNAME

값(value) : dkim.maillink.co.kr

이와 같은 정보를 모두 정상적으로 등록한 경우 메일링크는 이메일 발송시 DKIM-Signature 헤더 정보의 도메인 정보를 From 주소에 사용된 도메인 정보와 일치시켜 작성할 수 있으며 엄격한 발신자 인증 룰을 적용하는 메일 서비스 기업의 요구를 충족시킬 수 있습니다. 추가적인 문의 사항은 메일링크 고객센터 (1544-9231 혹은 help@maillink.co.kr)로 연락주시기 바랍니다.

Leave a Comment