sendgridで仕様変更が発生。
従来から使えた認証方式ではメールリレーが使えなくなるということで設定変更を実施したのでご報告です。
sendgrid仕様変更のお知らせがくる
簡単なアラートメールなんかをリレー先のSMTPサーバを指定して集約する用途でsendgridを活用させてもらっています。
去る10月にこんなメールが来ました。
前段は省略、「Why API keys?」から
--------------------------------------------------------------
なぜAPIキー?
これは、すべてのユーザーのセキュリティを強化するための取り組みです。アカウントのユーザー名とパスワードを認証に使用することは、APIキーを使用するよりも安全性が低くなります。ユーザー名やパスワードとは異なり、APIキーは一意に生成され、アクセスを制限し、特定のリクエストの権限を指定するように設定できます。
どのようなアクションが必要ですか?
次の手順に従って、認証方法を特定してAPIキーに置き換えてから、セキュリティを強化するために2要素認証(2FA)を実装します。
アクションが実行されない場合はどうなりますか?
2020年11月18日をもって、ユーザー名とパスワードによる基本認証を受け付けなくなり、アカウントへのログインに2FAが必要になります。その日以降にユーザーのユーザー名とパスワードを使用してAPIリクエストまたはSMTP構成を認証しようとすると、リクエストは拒否されます。
--------------------------------------------------------------
従来はSMTP認証にユーザ名とパスワードを利用することが出来ていたのですが、これが仕様変更によってAPIkeyしか使用できなくなるらしい。
その理由として、sendgridで使えるユーザIDの認証方式が2要素認証(2FA)を強制するようになるから。ユーザIDの認証は2要素認証を強制するので、メール送信にセットしている設定値としてユーザ名とパスワードを利用していると2要素認証できないから。
なので、メール送信に利用しているSMTP認証にユーザ名は使わずにAPIkeyを利用するよう変更して、sendgridへのログイン(ユーザ名/パスワード認証)は2要素認証を利用してね、ということのように読み取れます。
APIkeyを発行する
sendgridのページでAPIkeyを発行する必要があります。
元々テストや動作検証用にAPIkeyは発行してあったので、それを使うようにします。
とりあえず、hoge-smtp-apikeyを利用することにしました。
APIキーを編集するため「Edit API key」画面を開きます。
制限アクセス(Restricted Access)から、メールの送信だけを許可するようにします。
スクロールして、
この「Mail Send」のアクセス権のみFull Accessに設定(バーを右に)設定し、画面下までスクロール。
画面下の「Update」をクリックして設定を確定させます。
postfixの変更が必要
作成したAPIkeyを実際にpostfixに設定して、メール送信を試行してみます。
やり方は
https://sendgrid.kke.co.jp/docs/Integrate/Mail_Servers/postfix.html
これを参考にさせてもらいました。
設定ファイル/etc/postfix/main.cfの編集はそのまんま
--------------------------------------------------------------
# SendGrid APIkey Settings
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/smtp_apikey_sendgrid
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_tls_security_level = encrypt
header_size_limit = 4096000
relayhost = [smtp.sendgrid.net]:587
--------------------------------------------------------------
このような感じで設定。
「smtp_sasl_password_maps = hash:/etc/postfix/smtp_apikey_sendgrid」行で指定したファイル「/etc/postfix/smtp_apikey_sendgrid」で通常であればSMTP認証に利用するユーザ名とパスワードのセットを保管します。
しかしココはAPIkeyなので、
--------------------------------------------------------------
/etc/postfix/smtp_apikey_sendgrid の内容
--------------------------------------------------------------
[smtp.sendgrid.net]:587 apikey:%API KEYのランダム文字列%
--------------------------------------------------------------
という指定をします。こういうこと
使う%API KEYのランダム文字列%というのは
APIkeyを生成したときに一回だけ表示されるこの文字列の部分。
二回目は見られません。
もし記録が残っていない場合にはAPIkeyを生成しなおせばOKなはず。
このキーの部分を上記の書式に入れて、ファイルを生成します。
しかし、最初は勘違いしていて、
--------------------------------------------------------------
[smtp.sendgrid.net]:587 hoge-smtp-apikey:%API KEYのランダム文字列%
--------------------------------------------------------------
キーの名前を入力するものと勘違いして記載していました。
この指定だと、
--------------------------------------------------------------
postfix/smtp: : to=<hogeuser@hoge.com>, relay=smtp.sendgrid.net:587, delay=527, delays=514/0.09/13/0, dsn=4.0.0, status=deferred (SASL authentication failed; server smtp.sendgrid.net said: 535 Authentication failed: Bad username / password)
--------------------------------------------------------------
こういうエラーがログに記録され、「said: 535 Authentication failed: Bad username / password)」という認証エラーとなってしまうことが分ります。
通常ならユーザ名を記載する部分は「apikey」という文字列で固定する、というのがsendgridユーザのお約束。
そうすると、
--------------------------------------------------------------
postfix/smtp: : to=<hogeuser@hoge.com>, relay=smtp.sendgrid.net:587, delay=12, delays=0.22/0.04/11/0.24, dsn=2.0.0, status=sent (250 Ok: queued as AeaKFsX2QR)
--------------------------------------------------------------
メール送信ステータスは「status=sent (250 Ok)」で成功するようになりました。
ファイル生成後、postfixに適用
ファイルを正しく生成したのち、postfixに設定を適用しました。
--------------------------------------------------------------
# chmod 600 smtp_apikey_sendgrid
# postmap smtp_apikey_sendgrid
--------------------------------------------------------------
「postmap」コマンドを実行すると、同じディレクトリにsmtp_apikey_sendgrid.dbが生成されます。この.dbファイルが実際に使われるファイル。
完了後、postfixをリスタート
--------------------------------------------------------------
# systemctl restart postfix
--------------------------------------------------------------
これで設定の反映が完了しました。