APIキー認証でセキュリティを強化しよう

成功タグの付いた鍵

はじめに

2015年7月7日の七夕に、SendGridの新ポータルがリリースされました。これに伴いセキュリティ機能が強化され、APIキーが使えるようになりました。

APIキーの嬉しいところ

これまでのSendGridでは、SMTPやWeb APIの認証に、ポータルへログインするためのユーザ名とパスワードをそのまま使うようになっていました。この認証方法は引きつづき使うことができますが、あらたにログイン情報を含まないAPIキーによる認証もできるようになりました。
APIキーは、すぐに追加でき、すぐに破棄でき、複数同時に使うことができます。そのため、アプリケーションやオペレータやサーバごとに異なるAPIキーを配布し、万が一APIキーが漏洩するなどのセキュリティ問題が起きてしまったならば個別に無効にする、といった柔軟な運用ができるようになります。

APIキーの追加

APIキーの追加は、とても簡単です。はじめに、新ポータルのメニューから「SETTINGS > API Keys」を選択したのち、右上の「Create API Key」ボタンを選択します。
APIキーのリスト

表示された「KEY NAME」フォームに、管理用のラベル名を入力したのち、右上の「Save」ボタンを選択します。ラベル名は、用途を示す分かりやすいものが良いでしょう。
APIキーの削除

作成されたAPIキーが表示されます。このAPIキーは一度しか表示されず、再確認することはできないため、適切な場所に保存する必要があります。表示されたAPIキーを選択すると、クリップボードにコピーされます。
APIキーの生成

なお、短時間に連続して追加作業を行った場合、「too many requests」というエラーメッセージがポップアップ表示されることがあります。その際は、数十秒ほど待ってから追加しなおしてください。

APIキーの破棄

特定のAPIキーを破棄するためには、右の歯車ボタンから「Delete」ボタンを選択します。
APIキーの破棄

確認画面が表示されるので、本当に破棄して良ければ「Confirm」ボタンを選択します。
APIキーの破棄確認

APIキーの使用

APIキーによる認証ができるのは、SMTP、Web APIのメール送信用エンドポイントWeb API v3です。これらの認証については、ログイン情報を使った認証から移行することを推奨しています。
APIキーごとに権限を設定する機能も、鋭意開発中です。

以降、下記のような設定であるとして、具体的な使用方法を説明します。

ユーザ名 [USER_NAME]
パスワード [PASSWORD]
APIキー [API_KEY]

SMTP

SMTP認証でAPIキーを使う場合は、ユーザ名をapikeyという固定文字列、パスワードを[API_KEY]、と設定します。
たとえばThunderbirdでは、下記のように設定すればOKです。
ThunderbirdのSMTP設定

メール送信用のWeb API、全てのWeb API v3

AuthorizationヘッダのBearerトークンに、APIキーを設定します。
たとえばcurlコマンドでメールを送信する場合は、これまで

curl -X POST https://api.sendgrid.com/api/mail.send.json 
     -d "to=test@sendgrid.com" 
     -d "from=you@youraddress.com" 
     -d "subject=Sending with SendGrid is Fun" 
     -d "html=and easy to do anywhere, even with CURL" 
     -d "api_user=[USER_NAME]" 
     -d "api_key=[PASSWORD]"

のように書いていたところを、

curl -X POST https://api.sendgrid.com/api/mail.send.json 
     -d "to=test@sendgrid.com" 
     -d "from=you@youraddress.com" 
     -d "subject=Sending with SendGrid is Fun" 
     -d "html=and easy to do anywhere, even with CURL" 
     -H "Authorization: Bearer [API_KEY]"

と変更すればOKです。

公式ライブラリ

SendGridの公式ライブラリは、ほぼ対応済みです。
たとえばNode.jsライブラリを使う場合は、これまで

var sendgrid  = require('sendgrid')([USER_NAME], [PASSWORD]);

のように書いていたところを、

var sendgrid  = require('sendgrid')([API_KEY]);

と変更すればOKです。
なお、実際のコードにはログイン情報やAPIキーの文字列は埋めこまず、環境変数や設定ファイルから読みこむことを推奨しています。

おわりに

新ポータルでは、APIキー以外にも様々な機能が追加されています。順次紹介していきますので、お楽しみに。