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

Email hosting service with golang.

Avatar for rhykw rhykw
July 13, 2019

Email hosting service with golang.

Avatar for rhykw

rhykw

July 13, 2019
Tweet

More Decks by rhykw

Other Decks in Technology

Transcript

  1. 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
  2. 5 メールサービスの裏側 POP/IMAP Proxy SMTP Server Anti Virus Anti Spam

    Mail Server Database SMTP(MX) Server Anti Virus Anti Spam ೝূ৘ใɾ઀ଓઌ ೝূ৘ใ ഑ૹઌ
  3. 17 nginxをmail proxy serverとして使う POP/IMAP Proxy SMTP Server Anti Virus

    Anti Spam メールソフトが接続する部分に nginx を採用した
  4. 18 nginxをmail proxy serverとして使う nginx • nginx自体は直接DBと通信するような認証の 仕組みを持たない • nginxのmail

    proxyで認証を橋渡しするのが 「ngx_mail_auth_http_module」 Auth Server MySQL Postfix ユーザー(メールソフト)
  5. 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 { // Τϥʔॲཧ } 普通はこんな感じで書く?
  6. 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で済むところが 面倒くさい感じに... 何か良い方法ないですかねー?
  7. 29 PostfixとSMTP Access Policy Delegation • PostfixとPolicy Serverのやり取りはいたっ てシンプル。 •

    一連のやり取りは、`name=value` 属性が改 行で区切られ、空行で終端される。 http://www.postfix.org/SMTPD_POLICY_README.html
  8. 32 まとめ • ユーザーがメールソフトで接続する smtp/ pop/imap のフロントサーバにnginxを採用 • nginxのmail proxyで認証を橋渡しするのが

    「ngx_mail_auth_http_module」 • 自前で認証の仕組みを作らないといけないが 大きな自由度が得られる • 大量のリクエストを捌く力とデプロイの容易 さから認証サーバの開発にGoを採用
  9. 33 まとめ • MTAには使い慣れたPostfixを採用 • PostfixはSMTP Access Policy Delegationと いう機構がある

    • SMTPの各命令段階でフックし、配送を拒否 したり配送ルートを変えたりすることが可能 • ここでもリクエストを捌く力とデプロイの容 易さからPolicy Delegationサーバの開発にGo を採用