Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はてなにおける メール基盤とDMARC対応(JPAAWG 7th General Meeting版)

Mitsuru Takigahira
November 11, 2024
74

はてなにおける メール基盤とDMARC対応(JPAAWG 7th General Meeting版)

JPAAWG 7th General Meetingで発表した内容です。

内容は基本 https://speakerdeck.com/mysticdoll/hatenaniokerumeruji-pan-todmarcdui-ying の物と同一で会社紹介と一部追加部分を含みます。

Mitsuru Takigahira

November 11, 2024
Tweet

Transcript

  1. 自己紹介 • id: MysticDoll / 瀧ヶ平 充 • 株式会社はてな (2023/4~)

    ◦ システムプラットフォームチーム所属 Platform SRE • 社内基盤の運用とかやり続けて7年目 ◦ 前職ではGHE運用やCI/CDツールの開発・運用とか ◦ Screwdriver.cd Most Valuable Contributer (2021 CD Foundation Project Awards) 2
  2. DKIM(RFC 6376) DKIMでは以下の方法でメールの送信者を認証する 送信者はメール本文・ヘッダの内容を元に • 電子署名を作成 • DKIM-Signatureヘッダに記録 ◦ 署名に使用した秘密鍵に対応するセレクタ、署名に利用したヘッダなどを記録

    受信者はメールのDKIM-Signatureヘッダの内容から • 対応する公開鍵をDNSレコードから取得 ◦ <selector>._domainkey.<domain> のTXTレコードを参照する • 署名を検証 13
  3. DMARCの対応でやるべきこと SPF: • 把握した送信元IPをSPFレコードに全て追加する ◦ SaaSの場合は各社のサポートページ等に設定内容がある ◦ 独自システムの場合はシステムの利用しているIGWを追加する DKIM: •

    把握した送信元でに対応するDKIMレコードを追加する ◦ SaaSの場合、設定ページなどから設定項目を取得する ◦ 独自システムの場合はMTA毎に設定方法が異なる 16
  4. はてなのメール送信システム • ECS Anywhereで管理・運用 ◦ さくらのクラウド上のコンテナ実行基盤を利用 • サービスからはNLBを経由してSMTPでアクセス ◦ さくらのクラウドとAWS

    VPCはTGWで疎通可能となっている ◦ コンテナからNLBのtarget groupへの登録の話は今回は割愛 • ECS TaskとしてPostfixが稼動 20
  5. OpenDKIM PostfixでのDKIM対応にはOpenDKIMを利用する • Postfixとはmilter APIを利用して連携する • milter APIでの通信は以下どちらかで行う ◦ Unix

    Domain Socket ◦ TCP Socket • 今回はsidecarとしてOpenDKIMコンテナを起動した ◦ 以下の点を考慮しsidecarとして起動することにした ▪ Postfixと同居させる場合コンテナ起動スクリプトが煩雑化する ▪ 個別のタスクとLBを立てる場合アクセス制御を考える必要がある 24
  6. OpenDKIM sidecar ECS Anywhereでは以下の点に注意が必要 • プロセス間でTCP通信する際はlinksの設定が必要 ◦ Fargateならこの問題はない ◦ 厳密にはポートマッピングをすれば通信可能ではある

    ▪ 外部のMTAから署名されたくないため今回はlinks設定を使用 ◦ linksを使う場合ネットワークモードがbridgeである必要がある 26
  7. OpenDKIMの設定 • 送信ドメインのDNSにDKIMのレコードを追加しておく • opendkim.confに以下を設定する ◦ 署名すべきドメイン (Domain) ◦ 使う鍵ファイルのパス

    (KeyFile) ◦ ListenするSocketの設定 (Socket) ◦ Postfixへの送信元IPレンジ (InternalHosts) • Postfixの main.cf で non_smtpd_milters にopendkimのSocketを指定 これらの設定はdocker-compose等でメール送受信環境を作って検証できる • 仮にDNSを設定していなくてもDKIM署名ができていることは確認できる ◦ その場合意味の無い署名ではあるが、DKIM署名の設定の確認には便利 27
  8. バウンスメールのDKIM署名 バウンスメールはデフォルトではmilterが適用されない → main.cf で internal_mail_filter_classes を設定 • bounceを指定する •

    迷惑メール率を下げるために考慮する必要がある ◦ 不特定多数に送るシステムではバウンスメールが大量発生しうる ▪ 受信側からレポートが送信されないことが保証できれば必要ない ◦ はてなではバウンスメールをAmazon SESに送っている ▪ Amazon SESからのDMARCレポートで発覚した 28
  9. ログからのエラー判別 Postfixのログには以下が含まれている、これらでエラーが判別可能 • SMTP Reply Code ◦ 3桁の数値 210とか ◦

    RFC5321で定義 • Delivery Status Notification(以下DSN) ◦ RFC3464で定義 ◦ 判別に使うのは status field で 「.」 区切りの3つの数値の組 ▪ 5.7.26 みたいなやつ ▪ RFC3463で定義 ▪ RFC3463で書かれているコード以外は IANA.org に一覧がある (RFC 5248) • https://www.iana.org/assignments/smtp-enhanced-status-codes/smtp-enhanced-status-codes.xhtml 詳しくは: Postfixのログ監視で注意すべきSMTPのステータス仕様について - Hatena Developer Blog 33
  10. Postfixのログ形式 CloudWatch Logs Insightsで調べてみると • SMTP Reply Codeは接続先MTAからのメッセージ中 ◦ said:

    550 ….のような形 • DSNは以下2パターン、どちらかしかないこともある ◦ dsn=2.0.0 のような形式のパラメータ ◦ 接続先MTAが返すメッセージ中の 「said: 550-4.7.1 …」など 34
  11. 実際のログ形式 Feb 05 04:54:08 mailoutbound-fb postfix/smtp[1285887]: 38E2AC2616: to=<****@gmail.com>, relay=alt1.gmail-smtp-in.l.google.com[142.250.141.26]:25, delay=974719,

    delays=974661/55/2.3/0.22, dsn=4.2.2, status=deferred (host alt1.gmail-smtp-in.l.google.com[142.250.141.26] said: 452-4.2.2 …(省略)) 赤字の部分がエラー判別に必要 35
  12. cloudwatch-logs-aggregatorの設定 ログ集計用のクエリを作成 注意点としては以下 • DSNはパラメータ・メッセージのどちらかにしかないことがある ◦ →coalesce でどちらかを取る • メッセージ中のDSNの区切りは「-」「

    」(空白)のいずれか ◦ →正規表現で頑張る… • SMTP Reply Codeとの組で監視する ◦ Reply CodeとDSNをconcatしてハイフンで繋ぐ • メトリクス名の「.」は別の字に置換したほうが良い ◦ → replace関数で「.」を「_」に置換 ◦ そのままだとメトリクスが同じグラフに入ってくれなくて見辛い 38
  13. ログメトリクス活用例 40 • 社内から送信されるbatchの通知メールの不備の検知 ◦ メール基盤のTCP resetがある時期から増えていることに気付く ◦ グラフを確認しその時期増えているものを確認 ▪

    550-5.7.1 エラーが増えている ◦ CloudWatch Logs Insight で当該Status/DSNのものを確認 ▪ 社内向けのメールがgmailから拒否されていることが分かる • メールフォーマットのRFC違反によるもの ▪ batch通知メールだったので当該チームに連絡 • メールクライアントの設定等を見直してもらった
  14. アラート設定 ひとまず今回のGmailのポリシー対応では • 550-5.7.26 の数をアラート対象とした ◦ 現状ではとりあえず1件でも起きたら発火させている ▪ →今後の状況を見て調整していく ▪

    設定後半年以上経ったものの今のところ無風 • アラートが発生したらとりあえずログを見に行く ◦ DMARC/DKIM/SPFのいずれのエラーなのかを把握するため 44
  15. まとめ • DMARC対応には以下が必要 ◦ メール送信元の把握 ◦ SPF/DKIM 認証の設定など ▪ 独自システムでDKIMを設定するためにはOpenDKIMを使う

    ◦ DMARCのレコード設定・レポート送信先の作成 • レポートから設定漏れを潰していく必要がある ◦ 可視化はparsedmarc + OpenSearch + grafana での構築が簡単 ◦ DMARCを可視化してくれるSaaSに頼るのも良い 47
  16. まとめ • メールのログ監視は難しい ◦ 独自基盤でやる場合は避けられない ◦ 完璧にやるなら各メールサービス毎にエラーの対応の把握が必要 • DMARC対応はちゃんとやろう! ◦

    Gmailを使っている顧客に重要なメールが届かないと大変 ◦ 今後ガイドライン適用範囲が変更される可能性もあるため… 48