Slide 1

Slide 1 text

1 MREチームの取り組み 坂尾 恭理 / GMO Pepabo Inc. Pepabo Tech Conference #21 夏のSREまつり

Slide 2

Slide 2 text

2 ⾃⼰紹介 ホスティング事業部 MREチーム 2018年 中途⼊社 坂尾 恭理 Sakao Kyori ● MREチームでインフラエンジニアをしている ● 趣味: ⼈に漫画を貸して読ませる ● X : @molpako

Slide 3

Slide 3 text

3 アジェンダ 1. MREとは? 2. メールシステム概要 3. メールサービスにおけるMRE活動 4. まとめと次のステップ

Slide 4

Slide 4 text

1. MREとは? 4

Slide 5

Slide 5 text

1. MREとは? 5 ● Messaging Reliability Engineering ● ペパボの造語 ● メール/DNSを対象としたSRE MREとは?

Slide 6

Slide 6 text

● ホスティング事業部のメール/DNSサービスを担当 ● 担当サービスの信頼性向上 ○ セキュリティ対応(DKIM/DMARCなど) ○ トイル削減などの運⽤効率化 ○ 可視化(メトリクス収集) ○ オンプレサーバのリプレイス 1. MREとは? 6 MREチームの主要な取り組み

Slide 7

Slide 7 text

1. MREとは? 7 本⽇はGoの活⽤事例を交えて メールシステムをご紹介 最後に今後やっていきたいことも話します 😁

Slide 8

Slide 8 text

2. メールシステム概要 8

Slide 9

Slide 9 text

2. メールシステム概要 9

Slide 10

Slide 10 text

3. メールサービスにおけるMRE活動 10

Slide 11

Slide 11 text

1. 認証バックエンドを Go で実装! 2. 通数制限機能を Go で実装! 3. クォータチェック機能を Go で実装! 3. メールサービスにおけるMRE活動 11 メールサービスにおけるMRE活動

Slide 12

Slide 12 text

3.1. 認証バックエンドを Go で実装! 12

Slide 13

Slide 13 text

3.1 認証バックエンドを Go で実装! 13 ここ!

Slide 14

Slide 14 text

3.1 認証バックエンドを Go で実装! 14

Slide 15

Slide 15 text

3.1 認証バックエンドを Go で実装! 15 nginxをメールのリバースプロキシに ● 以前はCourier-IMAPだったがプロセス増加/メモリ枯渇 ● 障害を機に、使い慣れているnginxへ移⾏ ● TLS終端も兼ねてる ● ngx_mail_core_module を使⽤ ● 認証バックエンドとは、HTTPヘッダーで通信

Slide 16

Slide 16 text

GoでHTTPサーバー、書きやすい 16

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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 }

Slide 19

Slide 19 text

3.2 通数制限機能を Go で実装! 19

Slide 20

Slide 20 text

3.2 通数制限機能を Go で実装! 20 ここ!

Slide 21

Slide 21 text

3.2 通数制限機能を Go で実装! 21 メール送信には通数制限が必要 ● めっちゃ送られる(⼤量配信、乗っ取りスパム ● 不正利⽤防⽌対策も含め通数制限を設けている ● 以前は qpsmtpd (perl) で実現していた ● リバースプロキシ刷新に伴い Go で再実装!

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

3.2 通数制限機能を Go で実装! 23

Slide 24

Slide 24 text

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]

Slide 25

Slide 25 text

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) }

Slide 26

Slide 26 text

3.3 クォータチェック機能を Go で実装! 26

Slide 27

Slide 27 text

3.3 クォータチェック機能を Go で実装! 27 ここ!

Slide 28

Slide 28 text

3.3 クォータチェック機能を Go で実装! 28 ● over quota のメールボックスに配送してしまう ● メールサーバーのキューが滞留、アラート対応へ

Slide 29

Slide 29 text

Dovecotにドンピシャな機能ある 29

Slide 30

Slide 30 text

3.3 クォータチェック機能を Go で実装! 30

Slide 31

Slide 31 text

3.2 通数制限機能を Go で実装! 31 また Policy Delegation ● smtpd_recipient_restrictions を使う ● しかし policy daemon はメールサーバーを知らない

Slide 32

Slide 32 text

3.3 クォータチェック機能を Go で実装! 32 Quota-Proxy を Go で実装

Slide 33

Slide 33 text

3.3 クォータチェック機能を Go で実装! 33

Slide 34

Slide 34 text

3.3 クォータチェック機能を Go で実装! 34 課題: SIZE=0 問題 ● MAIL FROM コマンドの SIZE= パラメータ(RFC 1870 ● ほとんどのメールは SIZE= をつけていると思っていた ● 実際に集計すると約40%ほど SIZE= をつけていない ● SIZE=0 扱いになりクォータチェックが無視される

Slide 35

Slide 35 text

4. まとめと次のステップ 35

Slide 36

Slide 36 text

4. まとめと次のステップ 36 まとめ ● 専⾨性を持ったチームで信頼性向上に取り組んでる ● OSS利⽤しながら、コードを書いて解決

Slide 37

Slide 37 text

4. まとめと次のステップ 37 次のステップ ● メール到達率向上 ○ ユーザーメトリクスの収集‧可視化 ○ メトリクス集計からユーザーのスコアリング ● セキュリティ強化 ○ 不正利⽤や乗っ取られも多い ● 分散ストレージ化