treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

sendgridの設定変更(11月18日までが期限)

sendgridで仕様変更が発生。
従来から使えた認証方式ではメールリレーが使えなくなるということで設定変更を実施したのでご報告です。

sendgrid仕様変更のお知らせがくる

簡単なアラートメールなんかをリレー先のSMTPサーバを指定して集約する用途でsendgridを活用させてもらっています。

去る10月にこんなメールが来ました。

f:id:treedown:20201026183751p:plain

前段は省略、「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は発行してあったので、それを使うようにします。

f:id:treedown:20201026183836p:plain
とりあえず、hoge-smtp-apikeyを利用することにしました。
APIキーを編集するため「Edit API key」画面を開きます。

f:id:treedown:20201026183853p:plain
制限アクセス(Restricted Access)から、メールの送信だけを許可するようにします。
スクロールして、

f:id:treedown:20201026183916p:plain

この「Mail Send」のアクセス権のみFull Accessに設定(バーを右に)設定し、画面下までスクロール。

f:id:treedown:20201026183931p:plain
画面下の「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のランダム文字列%
--------------------------------------------------------------
という指定をします。こういうこと

f:id:treedown:20201026184248p:plain

使う%API KEYのランダム文字列%というのは

f:id:treedown:20201026184305p:plain
APIkeyを生成したときに一回だけ表示されるこの文字列の部分。

f:id:treedown:20201026184524p:plain
二回目は見られません。
もし記録が残っていない場合には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
--------------------------------------------------------------

これで設定の反映が完了しました。