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

MREチームの取り組み

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for molpako molpako
September 18, 2023
1.2k

 MREチームの取り組み

Avatar for molpako

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 扱いになりクォータチェックが無視される