Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
MREチームの取り組み
Search
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
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
590
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
520
Statistics for Hackers
jakevdp
799
230k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Abbi's Birthday
coloredviolet
4
10k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
960
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
440
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
710
Building Flexible Design Systems
yeseniaperezcruz
330
41k
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 次のステップ • メール到達率向上 ◦ ユーザーメトリクスの収集‧可視化 ◦ メトリクス集計からユーザーのスコアリング
• セキュリティ強化 ◦ 不正利⽤や乗っ取られも多い • 分散ストレージ化