Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MREチームの取り組み
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
molpako
September 18, 2023
1.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
MREチームの取り組み
molpako
September 18, 2023
Featured
See All Featured
ラッコキーワード サービス紹介資料
rakko
1
4.7M
How to train your dragon (web standard)
notwaldorf
97
6.8k
Abbi's Birthday
coloredviolet
3
9.8k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Building Applications with DynamoDB
mza
96
7.2k
Automating Front-end Workflow
addyosmani
1369
210k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
420
Google's AI Overviews - The New Search
badams
0
1.6k
Optimizing for Happiness
mojombo
378
71k
The Language of Interfaces
destraynor
162
27k
Transcript
1 MREチームの取り組み 坂尾 恭理 / GMO Pepabo Inc. Pepabo Tech
Conference #21 夏のSREまつり
2 ⾃⼰紹介 ホスティング事業部 MREチーム 2018年 中途⼊社 坂尾 恭理 Sakao Kyori
• MREチームでインフラエンジニアをしている • 趣味: ⼈に漫画を貸して読ませる • X : @molpako
3 アジェンダ 1. MREとは? 2. メールシステム概要 3. メールサービスにおけるMRE活動 4. まとめと次のステップ
1. MREとは? 4
1. MREとは? 5 • Messaging Reliability Engineering • ペパボの造語 •
メール/DNSを対象としたSRE MREとは?
• ホスティング事業部のメール/DNSサービスを担当 • 担当サービスの信頼性向上 ◦ セキュリティ対応(DKIM/DMARCなど) ◦ トイル削減などの運⽤効率化 ◦ 可視化(メトリクス収集)
◦ オンプレサーバのリプレイス 1. MREとは? 6 MREチームの主要な取り組み
1. MREとは? 7 本⽇はGoの活⽤事例を交えて メールシステムをご紹介 最後に今後やっていきたいことも話します 😁
2. メールシステム概要 8
2. メールシステム概要 9
3. メールサービスにおけるMRE活動 10
1. 認証バックエンドを Go で実装! 2. 通数制限機能を Go で実装! 3. クォータチェック機能を
Go で実装! 3. メールサービスにおけるMRE活動 11 メールサービスにおけるMRE活動
3.1. 認証バックエンドを Go で実装! 12
3.1 認証バックエンドを Go で実装! 13 ここ!
3.1 認証バックエンドを Go で実装! 14
3.1 認証バックエンドを Go で実装! 15 nginxをメールのリバースプロキシに • 以前はCourier-IMAPだったがプロセス増加/メモリ枯渇 • 障害を機に、使い慣れているnginxへ移⾏
• TLS終端も兼ねてる • ngx_mail_core_module を使⽤ • 認証バックエンドとは、HTTPヘッダーで通信
GoでHTTPサーバー、書きやすい 16
3.1 認証バックエンドを Go で実装! 17 認証バックエンドを Go で実装! • 認証メソッドの検証
• パスワードの検証 • アカウントの不正利⽤対策 ◦ DB管理のフラグを操作し、リアルタイムに対応
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 }
3.2 通数制限機能を Go で実装! 19
3.2 通数制限機能を Go で実装! 20 ここ!
3.2 通数制限機能を Go で実装! 21 メール送信には通数制限が必要 • めっちゃ送られる(⼤量配信、乗っ取りスパム • 不正利⽤防⽌対策も含め通数制限を設けている
• 以前は qpsmtpd (perl) で実現していた • リバースプロキシ刷新に伴い Go で再実装!
3.2 通数制限機能を Go で実装! 22 Policy Delegation • Postfix の
SMTP Access Policy Delegation ◦ 各SMTPコマンドの実⾏に対してフックできる機能 ◦ ポリシーを policy daemon に委譲 • Go で policy daemon を実装 ◦ Why: qpsmtpd パフォーマンス悪かった 💥
3.2 通数制限機能を Go で実装! 23
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]
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) }
3.3 クォータチェック機能を Go で実装! 26
3.3 クォータチェック機能を Go で実装! 27 ここ!
3.3 クォータチェック機能を Go で実装! 28 • over quota のメールボックスに配送してしまう •
メールサーバーのキューが滞留、アラート対応へ
Dovecotにドンピシャな機能ある 29
3.3 クォータチェック機能を Go で実装! 30
3.2 通数制限機能を Go で実装! 31 また Policy Delegation • smtpd_recipient_restrictions
を使う • しかし policy daemon はメールサーバーを知らない
3.3 クォータチェック機能を Go で実装! 32 Quota-Proxy を Go で実装
3.3 クォータチェック機能を Go で実装! 33
3.3 クォータチェック機能を Go で実装! 34 課題: SIZE=0 問題 • MAIL
FROM コマンドの SIZE= パラメータ(RFC 1870 • ほとんどのメールは SIZE= をつけていると思っていた • 実際に集計すると約40%ほど SIZE= をつけていない • SIZE=0 扱いになりクォータチェックが無視される
4. まとめと次のステップ 35
4. まとめと次のステップ 36 まとめ • 専⾨性を持ったチームで信頼性向上に取り組んでる • OSS利⽤しながら、コードを書いて解決
4. まとめと次のステップ 37 次のステップ • メール到達率向上 ◦ ユーザーメトリクスの収集‧可視化 ◦ メトリクス集計からユーザーのスコアリング
• セキュリティ強化 ◦ 不正利⽤や乗っ取られも多い • 分散ストレージ化