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
Email hosting service with golang.
Search
rhykw
July 13, 2019
Technology
430
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Email hosting service with golang.
rhykw
July 13, 2019
More Decks by rhykw
See All by rhykw
Identifying and Analyzing Fake OSS with Malware - fukuoka.go#21
rhykw
0
1.1k
Messaging Reliability Engineering with Go
rhykw
0
82
Other Decks in Technology
See All in Technology
20260912_スクフェス三河
kgnkhkr
0
250
「重なり」は迎える側がつくる ― 人もAIエージェントも歓迎するプロダクトエンジニアリング ―
go0517go
PRO
0
280
GuardDuty 検知対応を DevOps Agent で効率化しようとしている話 / GuardDuty Investigations with DevOps Agent
masahirokawahara
1
350
Reactの設計論
uhyo
14
7.3k
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
3
440
OpenTelemetryのメトリクスをCloudWatchに送ってPromQLで見てみた
ota1022
0
120
omasushiというライブラリを作った
polidog
PRO
0
190
20260912_スクラムにジェネラリストは必要か
ryugen04
0
290
AIに丸投げしないトイル削減 / Eliminating Toil Without Leaving It All to AI
kohbis
4
1.1k
幾何アルゴリズムで なめらかなピン操作を / iOSDC Japan 2026 / smoothpin
kazumanagano
0
240
Claude Code本って、 読む必要あるの?
oikon48
2
370
#jawssonic2026 あの時代が悪かった ~動かなかったSageMakerと共に迎えたイベント当日~
ktkn1129
0
140
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
400
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
The Limits of Empathy - UXLibs8
cassininazir
1
650
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
710
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
320
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
500
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
The untapped power of vector embeddings
frankvandijk
2
1.9k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Transcript
1 ホスティングにおける メールサービスの運用と Go Go Conference'19 Summer in Fukuoka GMOペパボ
株式会社 ホスティング事業部インフラチーム rhykw
2 本日の内容 • メールサービスの裏側 • メールサービスの敵 • nginxをmail proxy serverとして使う
• PostfixとSMTP Access Policy Delegation
3 ホスティングとは? ホスティングサーバ(レンタルサーバー、共用サー バーとも)とは、複数のユーザーが利用するサーバー のことで、WebサイトやWebアプリケーションをイ ンターネットで一般公開するために使われる。ホスティ ングサービスとはサーバの利用者自身でサーバの運営・ 管理をしなくてもいいように、有料または無料でサー バ機のHDDの記憶スペースや情報処理機能などを利 用させるサービスを言う。(Wikipediaより引用)
4 メールサービスの裏側 SMTP(MX) Server Anti Virus Anti Spam Mail Server
Load balancer POP/IMAP Proxy SMTP Server Anti Virus Anti Spam POP/IMAP Proxy SMTP Server Anti Virus Anti Spam SMTP(MX) Server Anti Virus Anti Spam Mail Server Mail Server
5 メールサービスの裏側 POP/IMAP Proxy SMTP Server Anti Virus Anti Spam
Mail Server Database SMTP(MX) Server Anti Virus Anti Spam ೝূใɾଓઌ ೝূใ ૹઌ
6 メールサービスの敵 • ひとことで言うとSPAM
7 メールサービスの敵 • ひとことで言うとSPAM • 契約者がメールの大量配信を行うケースもあ るが圧倒的に多いのは「乗っ取り」
8 メールサービスの敵 • ひとことで言うとSPAM • 契約者がメールの大量配信を行うケースもあ るが圧倒的に多いのは「乗っ取り」 • 脆弱なパスワードのアカウントが狙われる
9 メールサービスの敵 • ひとことで言うとSPAM • 契約者がメールの大量配信を行うケースもあ るが圧倒的に多いのは「乗っ取り」 • 脆弱なパスワードのアカウントが狙われる •
[email protected]
のパスワードがinfoとか • qwerty1234 みたいなパスワードとか
10 メールサービスの敵 • ひとことで言うとSPAM • 契約者がメールの大量配信を行うケースもあ るが圧倒的に多いのは「乗っ取り」 • 脆弱なパスワードのアカウントが狙われる •
[email protected]
のパスワードがinfoとか • qwerty1234 みたいなパスワードとか • 攻撃の多くは日本国外から
11 メールサービスの敵 SPAMメールの送信を許して しまうとBlockList(BlackList とも)に登録され、メールの 到達率の低下(=サービス品質 の低下)を招く
12 メールの 治安を 回復したい!!
13 ホスティングにおける メールサービスの治安と Go Go Conference'19 Summer in Fukuoka
14 いかにして治安を取り戻すか • 脆弱なパスワードをなくす。
15 いかにして治安を取り戻すか • 脆弱なパスワードをなくす。啓蒙大事。 → ユーザーの行動に依存
16 いかにして治安を取り戻すか • 脆弱なパスワードをなくす。啓蒙大事。 → ユーザーの行動に依存 • 不審なログイン試行を適切にブロックする • 国内からの利用がメインのアカウントにおい
ては国外からの接続を拒否すると効果がある のでは?
17 nginxをmail proxy serverとして使う POP/IMAP Proxy SMTP Server Anti Virus
Anti Spam メールソフトが接続する部分に nginx を採用した
18 nginxをmail proxy serverとして使う nginx • nginx自体は直接DBと通信するような認証の 仕組みを持たない • nginxのmail
proxyで認証を橋渡しするのが 「ngx_mail_auth_http_module」 Auth Server MySQL Postfix ユーザー(メールソフト)
19 nginxをmail proxy serverとして使う • nginxとAuth Server間はHTTPで通信 • 認証はリクエストもレスポンスもHTTPヘッ ダで
• 単一のURLに対するGETリクエスト なんだ、簡単じゃん!!
20 Auth Serverの設計 HTTP Server: RESTfulなAPIの開発ではechoとかGinとか使 うけど正直今回はそこまで大袈裟なものは要ら ない。標準パッケージでも事足りそう。 →近くの席の人が gorilla/mux
使っていたので 自分も gorilla/mux を選択。 https://github.com/gorilla/mux (★9,475)
21 Auth Serverの設計 DB周り: (開発当初)発行するクエリが1クエリしかなかっ た。のでORM使うほどでもないかなぁと思い 標準パッケージ database/sql を選択。
22 Auth Serverの設計 なんだ、簡単じゃん!! ??
23 Auth Serverの設計 > 認証はリクエストも レスポンスも HTTP ヘッダで これが曲者
24 Auth Serverの設計 type AuthRequest struct { Method string `json:"method"`
Protocol string `json:"protocol"` User string `json:"user"` Pass string `json:"password"` Salt string `json:"salt"` LoginAttempt int `json:"login_attempt"` ClientIP net.IP `json:"clinet_ip"` ClientHost string `json:"client_host"` } ... var authReq AuthRequest if err := json.Unmarshal(jsonBytes, &authReq); err != nil { // Τϥʔॲཧ } 普通はこんな感じで書く?
25 Auth Serverの設計 func (a *AuthRequest) New(r *http.Request) *AuthRequest {
a.Method = r.Header.Get("Auth-Method") a.Protocol = r.Header.Get("Auth-Protocol") a.User = r.Header.Get("Auth-User") a.Pass = r.Header.Get("Auth-Pass") a.Salt = r.Header.Get("Auth-Salt") a.LoginAttempt, _ = strconv.Atoi(r.Header.Get("Auth-Login-Attempt")) a.Client.IP = net.ParseIP(r.Header.Get("Client-Ip")) a.Client.Host = r.Header.Get("Client-Host") return a } json形式のAPIならjson.Unmarshalで済むところが 面倒くさい感じに... 何か良い方法ないですかねー?
26 Auth Serverの設計 Goでは周辺ライブラリも充実しており、前述の「国 外からの接続を拒否」なども容易。 この手の処理でお馴染みのMaxMind DBも oschwald/maxminddb-golang でサクッと使え る。
https://dev.maxmind.com/geoip/geoip2/downloadable/ https://github.com/oschwald/maxminddb-golang
27 PostfixとSMTP Access Policy Delegation • SMTPの特定の命令について拒否・許可を行う ための機構がPostfixに組み込まれている。 • Postfixはこの判断を外部サーバに移譲出来る
ように作られている。
28 Policy Delegationがあると何が嬉しいか? • SMTPの命令毎にフック出来る • 例えば End of DATAのタイミングで、一定期
間内の累積送信通数をチェックして大量送信 を抑制する、など
29 PostfixとSMTP Access Policy Delegation • PostfixとPolicy Serverのやり取りはいたっ てシンプル。 •
一連のやり取りは、`name=value` 属性が改 行で区切られ、空行で終端される。 http://www.postfix.org/SMTPD_POLICY_README.html
30 Policy Serverの設計 なんだ簡単じゃん!! と言いたいところですが... まだ完成しておりません。
31 おまけ(監視周りの話) Prometheus+Grafanaでパフォーマンスをモニ タリングするなどGoが大活躍
32 まとめ • ユーザーがメールソフトで接続する smtp/ pop/imap のフロントサーバにnginxを採用 • nginxのmail proxyで認証を橋渡しするのが
「ngx_mail_auth_http_module」 • 自前で認証の仕組みを作らないといけないが 大きな自由度が得られる • 大量のリクエストを捌く力とデプロイの容易 さから認証サーバの開発にGoを採用
33 まとめ • MTAには使い慣れたPostfixを採用 • PostfixはSMTP Access Policy Delegationと いう機構がある
• SMTPの各命令段階でフックし、配送を拒否 したり配送ルートを変えたりすることが可能 • ここでもリクエストを捌く力とデプロイの容 易さからPolicy Delegationサーバの開発にGo を採用
34 ご静聴ありがとうございました