SMTP AUTH(SMTP 認証)
概要
SMTP AUTH(SMTP Authentication) は、SMTP でメールを送信する前にユーザー名とパスワードで認証を行う拡張仕様です。RFC 4954(2007年)で定義されており、SMTP の AUTH コマンドとして実装されています。
SMTP は元々認証の仕組みを持たないプロトコルでした。ポート 25 で接続してくる送信者が誰であるかを確認する手段がなく、これがオープンリレー(第三者中継)の脆弱性の原因になっていました。SMTP AUTH は、正規のユーザーだけがメールサーバーを経由して送信できるようにする仕組みです。
SMTP AUTH はポート 587(Submission)とポート 465(Submissions)で使われます。RFC 6409 は Submission ポートでの認証を必須としており、ポート 25 でのメール中継とは明確に区別されています。現在では主要メールプロバイダーがポート 587/465 での SMTP AUTH を前提としており、未認証のメール送信は受け付けません。
仕組み
SMTP AUTH は EHLO の機能交渉で AUTH を宣言し、クライアントが選択した認証メカニズムで認証を行います。
sequenceDiagram
participant C as メールクライアント
participant S as メールサーバー(587)
C->>S: TCP 接続
S-->>C: 220 Ready
C->>S: EHLO
S-->>C: 250-AUTH PLAIN LOGIN XOAUTH2
C->>S: STARTTLS
Note over C,S: TLS ハンドシェイク
C->>S: EHLO(TLS 内で再送)
S-->>C: 250-AUTH PLAIN LOGIN XOAUTH2
C->>S: AUTH PLAIN(Base64 認証データ)
S-->>C: 235 Authentication successful
Note over C: 認証済み — メール送信可能
認証の流れ
SMTP AUTH を使ったメール送信の流れを示します。
- クライアントがサーバーのポート 587 または 465 に TCP 接続する
- サーバーが
220レスポンスで接続を受け付ける - クライアントが
EHLOコマンドを送信する - サーバーが対応する機能一覧を返す。
AUTH行にサポートする認証メカニズムを列挙する - クライアントが
STARTTLSで TLS 暗号化を開始する(ポート 587 の場合) - TLS が確立した後、再度
EHLOを送信する - クライアントが
AUTH LOGINまたはAUTH PLAINで認証を行う - サーバーが
235 Authentication successfulを返す - 認証済みの状態で
MAIL FROM、RCPT TO、DATAでメールを送信する
手順 4 で返る AUTH 行の例を示します。
250-AUTH PLAIN LOGIN XOAUTH2 OAUTHBEARER
250-STARTTLS
250-SIZE 35882577
250 ENHANCEDSTATUSCODES
手順 7 の認証は、TLS で暗号化された接続内で行われます。ポート 465(暗黙的 TLS)では接続開始時から暗号化されているため、TLS ネゴシエーションは不要です。
認証メカニズム
SMTP AUTH で使われる主な認証メカニズムを示します。
| メカニズム | 定義 | 説明 |
|---|---|---|
| PLAIN | RFC 4616 | ユーザー名とパスワードを Base64 エンコードで送信。TLS なしでは使用不可 |
| LOGIN | 非標準 | PLAIN と同様だが、ユーザー名とパスワードを別々に送信。古いクライアント用 |
| XOAUTH2 | Google 独自 | OAuth 2.0 のアクセストークンを使って認証。パスワードの代わりにトークンを使用 |
| OAUTHBEARER | RFC 7628 | OAuth 2.0 の Bearer トークンを使う標準仕様 |
PLAIN 認証の送信データは AuthorizationID\0AuthenticationID\0Password を Base64 エンコードしたものです。認証データ自体は暗号化されていませんが、TLS 接続内で送信されるためネットワーク上での漏洩リスクはありません。
LOGIN 認証は PLAIN 認証と同等のセキュリティレベルですが、チャレンジ・レスポンス方式でユーザー名とパスワードを別々に送信します。Microsoft Outlook の古いバージョンとの互換性のために残されています。
Submission ポートと中継ポートの違い
SMTP AUTH は Submission ポート(587/465)でのみ使われます。中継ポート(25)と Submission ポートの違いを次に示します。
| 項目 | ポート 25(中継) | ポート 587/465(Submission) |
|---|---|---|
| 用途 | サーバー間のメール転送 | クライアントからのメール送信 |
| 認証 | 任意(通常は認証なし) | 必須 |
| 暗号化 | STARTTLS(任意) | STARTTLS または暗黙的 TLS |
| OP25B | 多くの ISP がブロック | ブロックされない |
ISP やクラウドプロバイダーはスパム対策としてポート 25 のアウトバウンド接続をブロックしています(OP25B)。メールクライアントからの送信にはポート 587 または 465 を使います。
PLAIN 認証の例
SMTP AUTH PLAIN の認証フローを示します。
C: EHLO mail.example.com
S: 250-AUTH PLAIN LOGIN
S: 250 OK
C: AUTH PLAIN AGFsaQBwYXNzd29yZA==
S: 235 Authentication successful
C: MAIL FROM:<sender@example.com>
S: 250 OK
C: RCPT TO:<recipient@example.net>
S: 250 OK
C: DATA
S: 354 Start mail input; end with <CRLF>.<CRLF>
C: From: sender@example.com
C: Subject: Test message
C:
C: Hello, ...
C: .
S: 250 OK
C: QUIT
S: 221 Bye
AUTH PLAIN の後の Base64 文字列は、認証データ(AuthorizationID\0AuthenticationID\0Password)をエンコードしたものです。ネットワーク上は TLS で暗号化されているため、Base64 デコードされても平文で送信されているわけではありません。
設定例
Postfix と Dovecot による SMTP AUTH の設定例を示します。
Postfix での Submission ポート有効化
Postfix でポート 587 の Submission を有効にする設定です。
# /etc/postfix/master.cf
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
smtpd_tls_security_level=encrypt は TLS 暗号化を必須にします。smtpd_sasl_auth_enable=yes で SMTP AUTH を有効にし、認証済みのユーザーのみが送信できるようにしています。
Postfix でのポート 465(Submissions)有効化
ポート 465 の暗黙的 TLS を有効にする設定です。
# /etc/postfix/master.cf
submissions inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
smtpd_tls_wrappermode=yes で接続開始時から TLS を使用します。
Gmail の SMTP AUTH 設定
Gmail 経由でメールを送信する場合の SMTP 設定です。
サーバー: smtp.gmail.com
ポート: 587(STARTTLS)または 465(暗黙的 TLS)
認証: PLAIN または XOAUTH2
ユーザー名: example@gmail.com
パスワード: アプリパスワード(2段階認証有効時)または OAuth トークン
Google は 2024 年 9 月 30 日に Less Secure Apps(低セキュリティのアプリアクセス)を廃止しました。現在は、2 段階認証を有効にしたうえでのアプリパスワード、または OAuth 2.0 ベースの認証(XOAUTH2・OAUTHBEARER)が必要です。
確認方法
SMTP AUTH が有効になっているかを確認するには、サーバーの EHLO 応答を確認します。
openssl s_client -connect smtp.example.com:587 -starttls smtp -quiet
接続後に EHLO test を入力します。
250-smtp.example.com
250-AUTH PLAIN LOGIN
250-SIZE 35882577
250-STARTTLS
250 ENHANCEDSTATUSCODES
250-AUTH 行が含まれていれば、SMTP AUTH が有効です。サポートする認証メカニズム(PLAIN、LOGIN 等)が列挙されます。
ポート 465(暗黙的 TLS)の場合は -starttls オプションを外します。
openssl s_client -connect smtp.example.com:465 -quiet
送信ドメインの SPF・DKIM・DMARC 設定を確認するには、Labee Dev Toolbox の Mail Auth API を使います。
curl "https://labee.dev/api/mail-auth?domain=example.com"
{
"success": true,
"data": {
"spf": {
"record": "v=spf1 include:_spf.google.com ~all",
"exists": true
},
"dkim": {
"mode": "auto",
"record": null,
"exists": false,
"selector": "",
"matches": [],
"checkedSelectors": ["google", "selector1", "selector2", "s1", "s2", "k1"],
"exhaustive": false
},
"dmarc": { "record": "v=DMARC1; p=none; rua=mailto:dmarc@example.com", "exists": true, "source": "exact", "domain": "example.com" },
"bimi": { "record": null, "exists": false }
},
"error": null,
"meta": { "responseTime": 98 }
}
SMTP AUTH で認証して送信したメールが SPF・DKIM・DMARC を通過するかは、ここで確認した認証設定と送信パスの構成に依存します。
よくある問題
SMTP AUTH の運用では、平文認証のリスク、ポートの誤設定、OP25B による送信不能が頻出します。
TLS なしで PLAIN 認証を許可している
SMTP AUTH PLAIN または LOGIN は認証データを Base64 エンコードで送信します。Base64 は暗号化ではなくエンコードであるため、TLS なしの接続ではユーザー名とパスワードが平文でネットワークを流れます。Postfix では smtpd_tls_security_level=encrypt を設定し、Submission ポートで TLS を必須にします。TLS なしで認証を許可する設定は、認証情報の漏洩に直結します。
ポート 25 で SMTP AUTH を期待している
メールクライアントの設定でポート 25 を指定している場合、多くのプロバイダーが OP25B でブロックしているため接続できません。ポート 587(STARTTLS)または 465(暗黙的 TLS)に変更します。ポート 25 はサーバー間の中継用であり、クライアントからの送信には使われません。
アプリパスワードの期限切れまたは無効化
Google や Microsoft のメールサービスは、2段階認証を有効にしたアカウントでアプリパスワードの発行を求めます。アプリパスワードが期限切れになるか無効化されると、SMTP AUTH が 535 Authentication failed を返します。パスワードの再発行または OAuth 2.0 ベースの認証への移行が必要です。
Submission ポートがファイアウォールでブロックされている
企業ネットワークのファイアウォールがポート 587 や 465 のアウトバウンド接続をブロックしている場合、メールクライアントからサーバーに接続できません。ポート 587 と 465 の両方を許可するか、VPN 経由で接続します。近年はポート 465 のみを許可するネットワークも増えており、両方を試すことが推奨されます。