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

Email hosting service with golang.

rhykw
July 13, 2019

Email hosting service with golang.

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 を採用