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

MREチームの取り組み

molpako
September 18, 2023
550

 MREチームの取り組み

molpako

September 18, 2023
Tweet

Transcript

  1. 2 ⾃⼰紹介 ホスティング事業部 MREチーム 2018年 中途⼊社 坂尾 恭理 Sakao Kyori

    • MREチームでインフラエンジニアをしている • 趣味: ⼈に漫画を貸して読ませる • X : @molpako
  2. 1. 認証バックエンドを Go で実装! 2. 通数制限機能を Go で実装! 3. クォータチェック機能を

    Go で実装! 3. メールサービスにおけるMRE活動 11 メールサービスにおけるMRE活動
  3. 3.1 認証バックエンドを Go で実装! 17 認証バックエンドを Go で実装! • 認証メソッドの検証

    • パスワードの検証 • アカウントの不正利⽤対策 ◦ DB管理のフラグを操作し、リアルタイムに対応
  4. 3.1 認証バックエンドを Go で実装! 18 • 認証メソッドやパスワード認証 var ok bool

    switch req.Method { case "login", "plain": ok = (account.Secret == req.Pass) case "cram-md5": expected := CramGetExpected(crypto.MD5, []byte(account.Secret), []byte(req.Salt)) ok = (expected == req.Pass) default: return ErrNotPermittedMethod } if !ok { return ErrPasswordIncorrect }
  5. 3.2 通数制限機能を Go で実装! 22 Policy Delegation • Postfix の

    SMTP Access Policy Delegation ◦ 各SMTPコマンドの実⾏に対してフックできる機能 ◦ ポリシーを policy daemon に委譲 • Go で policy daemon を実装 ◦ Why: qpsmtpd パフォーマンス悪かった 💥
  6. 3.2 通数制限機能を Go で実装! 24 • Policy Delegation のリクエストデータ •

    sasl_username からキーを⽣成 • recipient_count から送信数を取得 • KVSに対して取得/更新 request=smtpd_access_policy protocol_state=END-OF-MESSAGE protocol_name=SMTP sasl_username=you recipient_count=1 size=12345 policy_context=submission server_address=10.3.2.1 server_port=54321 [empty line]
  7. 3.2 通数制限機能を Go で実装! 25 • レスポンスは `action=$action` • OK:

    action=DUNNO • NG: action=DEFER_IF_REJECT ... for { conn, err := ln.Accept() if err != nil { logger.Fatal(err) } go func(conn net.Conn) { defer conn.Close() action := SmtpdAccessPolicy(conn) conn.Write([]byte(fmt.Sprintf("action=%s\n\n", action))) }(conn) }
  8. 3.2 通数制限機能を Go で実装! 31 また Policy Delegation • smtpd_recipient_restrictions

    を使う • しかし policy daemon はメールサーバーを知らない
  9. 3.3 クォータチェック機能を Go で実装! 34 課題: SIZE=0 問題 • MAIL

    FROM コマンドの SIZE= パラメータ(RFC 1870 • ほとんどのメールは SIZE= をつけていると思っていた • 実際に集計すると約40%ほど SIZE= をつけていない • SIZE=0 扱いになりクォータチェックが無視される