メールまわり
大前提
メールは複数のメールサーバーを経由する
形式
RFC 5322
ローカルパート@ドメインパート
Max 64文字@255文字
基本は大文字小文字は区別されない
SMTPサーバー
メールの送信や転送に使うサーバー
POPサーバー/IMAPサーバー
受信やがメールを受信する際に使用するサーバー
受信したメールを管理する場所が異なる
POP:利用者のパソコン
IMAP:サーバー上 → 現在の主流
メールソフトの機能
Outlook/Thunderbird...
メールの構成要素
宛先、差出人、件名、本文
SMTP
エンベロープを使用する(本文のFrom/Toとは異なる)
エンベロープFrom:メールを届ける相手が損じしない場合などにメールを配送する/Return-Path
エンベロープTo:メールを届ける相手(To/Cc/BccはエンベーロープToごとに分ける)
メールヘッダー:経由したメールサーバ等の情報(RFC5322に基づく)
SMTPコマンド
SMTP応答
Telnetで確認可能
デーモン:SMTPコマンドに対してメールサーバ側で応答しているプログラム
届いたメールを取り出す
他のメールサーバーに転送する
メールを保存する
宛先が存在しない等の何かしらの理由で目配信できなかった時に送られるメールをバウンスメール
ソフトバウンス:相手メールサーバーに障害が発生しているなど一時的な理由
ハードバウンス:メールアドレスに誤りがあるなど恒久的なエラー
SMTPサーバーの応答コード
利用者が入力したSMTPコマンドに対して3桁の応答コードを返す
2xx系: 正常
3xx: 処理中
4xx: 一時的なエラー
5xx: 永続的なエラー
POPの通信
SMTPとは別のサーバソフト、利用者の認証やメールのダウンロード、削除をする
IMAPの通信
メールサーバー側でメールを管理し、メールソフトではそのコピーを表示する
受信したメールの管理
1つのファイルに1つのメールを保存
Maildir
UNIX系のOSでメールボックスとして使われる形式
未読・既読などに分けれフォルダ管理されている
1つのファイルに複数のメールを保存
mbox(Mailbox): UNIX系のOSで古くからメールボックスとして使われていた形式
/var/spool/mail/user名 /home/ユーザー名/Mailbox
一つのファイルに保存するので新着メールヲッ着込んでいる間はロックされてしまうなど
メールソフト側のeml形式とpst形式
Maildirのような1通のメールを1つのファイルとして格納する方法→eml形式
インポートやエクスポートに便利
Outllookでメールを管理するために使われるpst形式
メールだけでなくカレンダーやアドレス帳などのさまざまなデータを扱える
メールヘッダー
フィールド名:フィールド値
From/Date/MIME/ReplyTo/Sender/Return-Path
ユーザーの認証
SMTPにおける認証の必要性
転送などもするのでログインすることなく使えるようにしていた→スパムメールが溢れた
送信元を認証する仕組み
POP before SMTP
メール送信より受信の作業が多いのでそこで認証をする
受信の後に送信が許可される
SMTP AUTH
POP before SMTPだとメールソフトでの変更は不要だが、同じIPアドレスの利用者は誰でもその認証を利用できたりしてしまう
SMTPを拡張し、メールを送信的にユーザー認証する(SMTP Service Extention For Authentication)
SASLを用いている
認証方式1)PLAINやLOGIN
パスワードをBase64でエンコードして送信する方式(盗聴リスクあり)
認証方式2) CRAM-MD5やDIGEST-MD5
ログインするときにランダムなチャレンジという文字列をサーバーから受けとり、そのチャレンジを使用してパスワードをハッシュ化して送信する認証方式(ハッシュ関数がMD5でセキュリティ標準的には微妙)
認証方式3) SCRAM-SHA-1やSCRAM-SHA-256
チャレンジレスポンス型の認証を改善(サーバ側ではパスワードそのものを保管しない、また、サーバからのチャレンジに対する応答だけを送信)
SHA-1やSHA-256というハッシュ関数が使われ現代でも安全(?)
OP25Bとサブミッションポート
メールを転送するSMTPサーバーでは認証が必要ない
プロバイダーによって25番ポートへの外向き(プロバイダ→インターネット)の通信をブロックする方法
一般の利用者が使用するメールサーバーのポート番号を587に変更しSMTP AUTHのポート番号として設定(サブミッションポート)
携帯電話のプッシュ型メール
新着メールが届いた時にサーバー側からメールソフトに通知する方法
ロングポーリング
IMAP IDLE
メールソフト側からIDLEを送り続け、接続を維持
携帯電話事業者
ここが付与するメールアドレスは独自のプロトコルを使用している?
SMSのような仕組みで端末に通知しているらしい
メールサーバーの種類
代表的なSMTPサーバー
SendGrid
Amazon SES
Postmark
Mailgun
Brevo
代表的なPOPサーバーとIMAPサーバー
Devecot
メールの文字コード
メールは7ビットのテキストしか送信できない
ASCII
日本語のような特殊な文字を使ったメールを送信するために、地域内のルールとして本文に独自の文字コードを使えるようにした
ISO-2022_JP
機種依存文字は使えない(きごう、半角カタカナ、絵文字)
Base64にすることで6bitで扱えるようにしてメールのタイトルでも使える
ファイルを添付
書式の拡張:MIME
日本語などの文字を扱えるようにするだけでなく、画像などのファイルを添付できるなど、さまざまなことをできるようにしている
パートで構造を分割:MIMEマルチパート→multipart/mixed
boundaryで境界を指定(画像とテキストなのかとかを判別する
セキュリティ
PPAPは意味ある?
メールを分けても結局同じメール
パスワードを設定するとウイルス対策ソフトで検出できない
スパムメール
送信者の認証による対策
SPF
メールの差出人として指定されたメールアドレスが、正規のメールサーバを経由して送信されたのかを受信者が確認できる仕組み
RFC7208
エンベロープFromのドメインと送信元メールサーバのIPアドレスが一致しているかを受信側のメールサーバーで確認
TXTレコードに登録(SPFレコード)
Q.送信もとメールサーバーのIPはどのタイミングで知る?
メールサーバーに接続する時に使うHELOやEHLOのコマンドのタイミングで送信もとのIPを調べるようにTFC7208で定められている
Fromを偽造しSPFを無効にする
エンベロープFromに対応するメールサーバーを偽のものにすり替える(DNSを新家に用意しSPFを登録しておくなど)
記述方法
-all: 指定されたもの以外は許可しない
ハードフェイル
~all:指定されたメールサーバー以外からのメールは配信できるか怪しいものとしてマーク
ソフトフェイル
確認サイトなどでチェック
DKIM
公開鍵暗号方式を使ってメールのヘッダーや本文から作成したデジタル署名をメールにふかし、メールサーバーがその署名を検証することで、メールの送信元を認証する技術
DNSサーバーに公開鍵を登録しておく
メール送信時にメールのハッシュ値を求めて送信側のメールサーバーに保存されている秘密鍵で暗号化したものを署名として作成→メールのヘッダー部分にメールのハッシュリと署名、ドメイン名などを記載
DKIMレコード
p=の部分に公開鍵をBase64で符号化したものが書かれている
RSA-SHA256
2048ビットのDKIMカギを使おうとするとTXTレコードの255文字制限に収まらない
一つのTXTレコードには255文字までの文字列を複数追加でき、最大長は4000文字
鍵の文字列を分割して引用符で囲み並べる
DKIMキーローテーション
OpenDKIMなどのソフトウェアがメール送信時の署名等は行ってくれる
DMARC
DNSサーバーに設定したSPFやDKIMの情報に加え、ヘッダーのFromの情報を組み合わせて送信ドメイン認証を実現する技術
認証の結果を報告してくれる仕組み
SPFやDKIMで検証できなかった場合におけるzX庾信側のサーバーでの処理方法を指示するとともに、送信もとのメールサーバに結果を報告できる
DMARC レコード
ruaにDMARCレポートを報告するメールの送信先
adkim=r;aspf=r
relaxed modeかstrict mode
例えばDNSサーバーに登録されているDKIM署名をexample.comで検証し送信もとアドレスがsample@hoge.example.comだった場合に、strict modeは判定は失敗する(完全一致)
ARCによる認証情報の保持
メーリングリストやメールの自動転送などを使用する場合、政党であっても認証に失敗する可能性がある
認証結果を維持するための規格
メーリングリストなどのサーバーが受信したときにSPFやDKIMの認証を満たしていれば連番をつけて再署名する
AAR
AMS
SAS
BIMIの設定
ドメインのブランドロゴを登録し、メールソフトでメールの差し出人を表示する欄に絵おごを表示する
DMARCを設定しpolicyをquarantineやrejectに設定していることに加え、VMCと呼ばれるデジタル証明書を使う(商標として登録されているロゴを認証局に申請して取得できる)
BIMIレコード
通信の暗号化
APOP(非推奨)
POPの通信におけるパスワードのやりとりにおいてパスワードをハッシュ化した値を送信することでメールサーバーとメールソフトの間の通信において、パスワードを平文で送信しないようにする
MD5
メールの経路の保護(暗号化)
STARTTLS
割り込みでダウングレードができてしまう
MTA-STS
受信側のメールサーバーが送信側のメールサーバーに対して、STARTTLSでTLS1.2以上を使うことを求める
mta-stsというサブドメインが必要
SMTP over SSL/TLS
POP over SSL/TLS
IMAP over SSL/TLS
本文の暗号化
S/MIME
認証曲で発行されたデジタル証明書を使い、公開鍵暗号方式によって暗号化や署名を行う
共通かぎでメールの本文を暗号化、メールの送信者が公開鍵を受信者の公開鍵で暗号化し添付ファイルとして送信
S/MIMEではメールアドレス単位に証明書を用意する必要がある
PGP(認証局に依存しない)
DNSSEC
DNSサーバーからの応答が改竄されていないこと、正しい相手からの応答であること