メール周りの技術について
SMTP,POP,IMAPについて
- SMTPとは
- SMTP(Simple Mail Transfer Protocol)の略で名前の通りメールを転送・送信するためのプロトコルです.
- SMTPサーバに接続することでメールの転送・送信が可能になります.
- その際にクライアントからSMTPサーバへの接続は25番ポートに対してTelnetを使って行われます.
- 後程紹介する
OP25B
により25番ポートは使われない場合が多いです.
- 後程紹介する
- イメージとしてはTCP/IPの3way hand shakeみたいな感じで互いにやり取りしてる感じです.
- その際にクライアントからSMTPサーバへの接続は25番ポートに対してTelnetを使って行われます.
- POPとは
- POP(Post Office Protocol)とはメールの受信に用いられるプロトコルでありSMTPは送信を担っているのに対してこちらは受信を担っています.
- 受信したメールをローカルにダウンロードしたのちにメールサーバからは該当のメールが削除されるため一度ダウンロードするとその端末以外からは見れなくなります.
- IMAPとは
- IMAP(Internet Message Access Protocol)はPOPと同様にメールを受信するためのプロトコルです.
- POPとは異なりメールサーバー上でメールの管理を行っているため複数の端末で同一のメールを閲覧することができ,ある端末で閲覧してもサーバー上から削除はされません.
- あくまでもローカルにコピーをとっているようなイメージです.
- なのでPOPとIMAPはメールを管理する場所が違うという感じです.
- POP:ローカルの端末
- IMAP:メールサーバ上
メールの構造について
- SMTPでメールを送信する際,メール本文の宛先をもとに送信するわけではない
- 封筒の役割を果たすエンベロープを参照している.
- エンベロープに書かれている送信者をエンベロープFrom,宛先をエンベロープToという.
- エンベロープFromと本文のFromや,エンベロープToと本文のToが異なる場合がある.
- 企業のメールマガジンの配信などで,送信に使うメールサーバに外部のメールサーバを使いたいとき
- エンベロープFromは外部のメールサーバ,本文のFromは企業名などにしておくなど
- エンベロープFromを偽装することでエラーメールを用いて特定のメールアドレスに大量のメールを送り付ける方法がある
メールヘッダーについて
- メールヘッダーには送信先[To]や送信元[From],件名[Subject]のほかに送信日時を表す[Date]やメールを一意に識別するための[Message-ID]などの様々な情報が付加されています.
- また,MIME(Multipurpose Internet Mail Extension)と呼ばれるようなメールに文字列以外の画像やPDFなどのファイルを添付するための拡張機能などでは,添付ファイルごとにヘッダーと本文を繰り返すような構造をとっています.
- ヘッダーには[MIME-Version:1.0]などが付加されます.
- Content-type
- メール本文の形式を指定するもので,メールにテキストや画像,音声,動画などを添付する際にその種類が指定されています.
- テキスト形式の場合
Content-Type: text/plain;charset=UTF-8
- 画像の場合
Content-Type: image/png
- 動画の場合
Content-Type: video/mp4
- PDFの場合
Content-Type: application/pdf
- メールを複数の構造に分割して作成する場合(テキストと画像などの複数の要素を含んでいる場合)
Content-Type: multipart/mixed
- Return-Path
- 宛先が存在しなかったなどの理由でメールサーバ間でメールが送信できなかったときにエラーメールを返す先を表す.
- Received
- メールを中継するサーバが別のサーバに向けて転送処理を行うたびにヘッダーに付加される情報になります.
- これによりメールが送信される際に通過したサーバの経路を特定することができます.
メールを送信する際の認証
- メールの送信の際の認証が必要な理由
- POPやIMAPでは受診の際にユーザID・パスワードなどでログインを行っていた
- SMTPでは送信の際に認証などを行わずに誰でも送信・転送可能
- スパムメールであふれてしまう可能性がある
- SMTP AUTH(AMTP Authentication)
- SMTPによってメールを送信する際にIDとパスワードを用いてそのユーザを認証する
- SASL(Simple Authentication and Security Layer)と呼ばれるフレームワークにより様々な方法による認証が可能に
- 認証方式
- PLAIN
- IDとパスワードを合わせて符号化してSMTPサーバーに送信する
- LOGIN
- 最初にIDを送信して何度かSMTPサーバーとやり取りする中でパスワードを送信
- PLAINやLOGINでは認証情報は暗号化はされていないため,盗み見られるの可能性がある
- CRAM-MD5
- Challenge Response Authentication Mechanismの略
- 処理の流れ
- サーバ側に認証要求を送る
- SMTPサーバ側(認証する側)からクライアント側に「チャレンジ」と呼ばれる乱数文字列を送信
- クライアント側は送られてきた乱数文字列と自身のユーザ名・パスワードを用いてハッシュ化する
- この時にハッシュ関数としてMD5を使用
- クライアントから届いたハッシュ化された文字列(パスワード+乱数文字列)
- サーバ側で保存されているパスワードと乱数文字列をハッシュ化したもの
- この2つを比較することで認証する
- 乱数文字列は毎回変わり,ハッシュ化されるため盗み見られるリスクがない
- SCRAM-SHA-1・SCRAM-SHA-256
- Solted Challenge Response Authentication Mechanismの略
- サーバー側でパスワード自体を保存せずに認証が可能
- 「ソルト」と呼ばれる,ユーザごとに異なる乱数文字列のこと
- ユーザごとに異なる文字列なので,異なるユーザが同じパスワードを使用していた場合でも生成されるハッシュ値は異なるものになる
- ここはもう少し勉強が必要そうです.
- PLAIN
OP25B
- OP25B(Outbound Port 25 Blocking)の略
- 自分のネットワークから外部ネットワークへのTCP/25番ポートの通信を遮断すること
- スパムメールなどは自分のネットワーク(プロバイダ)のSMTPサーバを使わずに標的のSMTPサーバのTCP/25番ポートに接続
- このときSMTPでは認証機能がないため誰でも送信できてしまう
- プロバイダの管理外のSMTPサーバに対して接続しようとする(TCP/25)通信を遮断することで防ぐ
- プロバイダ管理内のSMTPサーバの25番ポートには接続できると思います
- プロバイダ管理内で有れば認証しなくても誰が送信しているかわかるので
- SMTP AUTH
- メールの送信に使うポートをTCP/587に変更してSMTP AUTHによるユーザ認証を行うことでスパムメールを防ぐ
- TCP/587をサブミッションポートと呼ぶ
DNSサーバーについて
- DNS(Domain Name System)はドメイン名とIPアドレスを紐づけることができる仕組み
- あるサイトに接続する際にドメイン名から紐づいたIPアドレスを特定し,該当IPアドレスを持つホストと通信する.
- DNSに記録されるレコードにはいくつかの種類がある
- Aレコード
- そのドメイン名に紐づいたIPv4アドレスを記録
- AAAAレコード
- そのドメイン名に紐づいたIPv6アドレスを記録
- NSレコード
- そのドメインの権威DNSサーバのホスト名
- 権威DNSサーバ:ドメインを管理しているDNSサーバのこと
- MXレコード
- メールサーバのホスト名
- TXTレコード
- その他のメモやSPFやDKIMの情報など
- Aレコード
- 実際にあるメールアドレスに対してメールを送る際はDNSを使ってそのドメイン名とIPアドレスを紐づけ,そのIPアドレス(メールサーバなど)に対して問い合わせる
メールにおける日本語の扱い方について
- メールではASCIIコードという文字コードに基づいて文字が表現されている
- ASCIIコードは文字を7bitで表現しアルファベットの小文字・大文字や制御文字などを表現する
- 日本語などを扱うためにはShift JISやEUC-JPなどが使われている
- これらの文字は2byte文字であるがASCIIコードは7bitであるため表現できない
- 日本語独自の文字コードとしてISO-2022-JPが定められた
- 制御文字を用いて全角,半角の切り替わりやアルファベットと日本語の切り替わりなどを判断
- 本文だけでなくメールのタイトルなどにも日本語が使えるように
- 「=?文字コード?符号方式?符号化後の文字列?=」と表現することでどの文字コードで符号化されているかがわかるように
- 「=?ISO-2022-JP?B?xxxxxx?=」はISO-2020-JPという文字コードの文字列をBase64で符号化した結果がxxxxxxということ
送信ドメイン認証
- 送信元を偽装したメールを送信できる理由
- 自分のアドレス以外を指定しても送信できてします
- OP25BやSMTP AUTHはアカウントの認証をしているだけで,メールアドレス自体の認証はしていない
- 差出人に設定されたアドレスが正規のメールサーバを経由して送信されたものかを確認する必要がある
- SPF(Sender Policy Framework)
- DKIM(Domain Keys Identified Mail)
- DMARC(Domain-based Message Authentication Reporting and Conformance)
SPF
- SPF(Sender Policy Framework)とはエンベロープFromドメインと送信元メールサーバのIPアドレスが一致しているかどうかを受信側で確認する技術です.
- ドメインとIPアドレスの関連を調べるのでDNSサーバを使用
- DNSレコードに対して「SPFレコード」と呼ばれる,そのドメインから送信されるメールに関する正当なメールサーバの情報をまとめたレコードを記述しておく
- *メールの配送経路にリレーメールサーバがある場合は送信元のIPアドレスとエンベロープFromのドメインが使用するメールサーバのIPが一致しない
- SPFだけではエンベロープFromのドメインと送信元のIPが一致しているかを見ているだけ
- 攻撃者が用意したドメインに対するDNSサーバにSPFレコードを設定していた場合,IPアドレス自体は一致するのでSPFは成功してしまう
DKIM
- DKIM(Domain Keys Identified Mail)
- 公開鍵暗号方式を用いた送信元ドメイン認証の仕組み
- 本文などをもとに作成したデジタル署名をメールに付加して受信側のメールサーバでデジタル署名を検証する技術
- 処理の流れ
- 送信側は前もって,公開鍵と秘密鍵を用意し,公開鍵をDNSサーバに登録する(DKIMレコードという形で)
- メールの送信時にメールの本文・ヘッダーなどからハッシュ値を計算して秘密鍵で暗号化したものを署名とする
- 受信側は付加されたデジタル署名をDNSに登録された公開鍵を用いて復号し,ハッシュ値を得る
- 受信したメールからハッシュ値を取得し,復号して得られたハッシュ値を比較する
- これらが一致した場合,正規のユーザから送信されたことがわかる
- DKIMでは送信元を認証するだけでなく,メールが改ざんされていないことの確認もできる
- メールの内容が変わるとハッシュ値が異なるものになるため
- SPFと同様に,攻撃者が用意したドメインに対するDNSサーバにDKIMレコードを設定していた場合,ハッシュ値自体は一致してしまうので認証は成功してしまう.
- 送信者側の秘密鍵が漏洩することも考えられるため定期的に鍵を変更・DNSサーバへの再登録が必要
DMARC
- DMARC(Domain-based Message Authentication Reporting and Conformance)
- SPFやDKIMの認証結果をどのように処理するかを指定することができる
- 受信側のメールサーバはエンベロープFROMに記述されたドメインのDNSサーバよりDMARCレコードを取得する
- SPFやDKIMの認証結果について確認する
- 認証が成功していた場合はそのメールを受信する
- 失敗した場合の対応について記述することができる
- そのまま許可する・隔離する・拒否するのいづれか
- 認証の結果についてのレポートを受信メールサーバのドメインの持ち主へ通知することもできる
- SPFやDKIMの認証結果をどのように処理するかを指定することができる
DNSSEC
- DNSキャッシュポイズニングを防ぐための技術
- DNSキャッシュポイズニングとは
- フルサービスリゾルバー(キャッシュDNSサーバ)が権威DNSサーバに問い合わせを行う際に,攻撃者が用意した偽のDNSサーバが正規のDNSサーバよりも先に応答を返すことで,誤った内容をキャッシュさせ偽のサイトに誘導する攻撃
- DNSSECとは
- 権威DNSサーバからの応答が改ざんされておらず,かつ正しい相手からの通信であることを保証する技術
- 問い合わせを受けた権威DNSサーバは応答時にDNSデータだけでなく,デジタル署名を付加して応答する
- この署名を検証することで応答してきたDNSサーバが正規のDNSサーバであることを確認できる
- 検証に使う公開鍵の管理方法について
- DNSは階層構造をとっている
- 自身の公開鍵をハッシュ化して親DNSサーバに送付する
- 親DNSサーバは送られてきたハッシュ値を自身の秘密鍵で暗号化し,さらに上の親DNSサーバに送付する
- DNSキャッシュポイズニングとは
参考
- 実務で使えるメール技術の教科書
- 構造計画研究所[日本語メールの仕組み]
- https://atmarkit.itmedia.co.jp/fnetwork/rensai/netpro03/mail-header-mime.html
- https://www.kitasato-u.ac.jp/knc/mail/download/info_mail_header_v2.pdf
- https://www.tohoho-web.com/ex/draft/smtp-auth.htm
最後に
今回はメール周りについて勉強したことをまとめてみました. 先日VPSも契約したので時間があればメールサーバとか立ててみたいですね. メールヘッダーのこととかあんまりちゃんと考えたことなかったのでとても興味深かったです.