APIキーによるTwilio認証の向上

March 01, 2021
執筆者
レビュー担当者
Diane Phan
Twilion

Twilioアカウントを作成すると、アカウント文字列ID(SID)と認証トークンが生成されます。これらの認証情報を使用すると、Twilio APIで使用可能なすべての関数を実行できます。

アカウントSIDと認証トークンをデバイスや同僚に渡すと、これらの認証情報が侵害されるリスクが高まります。幸い、Twilioはこのリスクを最低限に抑える機能を提供しています。この記事では、以下の内容を取り上げます。

  • 認証トークン
  • サブアカウント
  • APIキー

認証トークン

新しいアカウントまたはサブアカウントを作成すると、TwilioはそのアカウントのアカウントSIDと認証トークンを生成します。これらの認証情報は、アカウントのダッシュボードページで確認できます。

アカウントSIDと認証トークンを矢印で示したTwilioアカウントダッシュボード。

これらの認証情報は、CLI、SDK、またはAPIを直接使用してTwilioと通信するために、頻繁に使用されます。デフォルトでは1つの認証トークンしか存在しないため、この認証トークンの共有を回避し、侵害されるリスクを最低限に抑える必要があります。何らかの理由で認証トークンが侵害された場合は、セカンダリ認証トークンを作成してローテーションし、リークされたトークンが役に立たなくなるようにします。

セカンダリ認証トークンを作成するには、次の手順に従います。

  • 右上のナビゲーションにある[Account](アカウント)リンクをクリックします
  • サブメニューで[API keys & tokens](APIキーとトークン)をクリックします。
  • ページの最後までスクロールして[Request a Secondary Token](セカンダリトークンをリクエストする)をクリックします。

セカンダリトークンの取得後、このトークンをプライマリトークンに昇格できます。これにより、以下に示すように、古いプライマリトークンが削除され、使用できなくなります。

残念ながら、これらのトークンのローテーションにはTwilio Consoleを使用する必要があります。APIを使用してAPI認証情報トークンをローテーションすることはできません。ただし、APIキーをローテーションすることはできます。これについては、この投稿で後述します。

サブアカウント

サブアカウントはアカウントと同じですが、親アカウントにより所有されており、親アカウントで管理できます。親アカウントの認証トークンを使用する代わりに、サブアカウントの認証トークンを使用できます。サブアカウントの認証トークンが侵害された場合、そのトークンを使用して親アカウントまたは他のサブアカウントのリソースにアクセスすることはできません。

Twilio Consoleを使用してサブアカウントを作成するには、次の手順に従います。

  • 右上のナビゲーションにある[Account](アカウント)リンクをクリックします
  • サブメニューで[Subaccounts](サブアカウント)をクリックします
  • 他のサブアカウントがある場合はプラス(+)アイコンをクリックします。ない場合は[Create new Subaccount](新規サブアカウントの作成)ボタンをクリックします
  • サブアカウントに分かりやすい名前をつけます
  • Create](作成)ボタンをクリックします

TwilioのCLI、SDK、APIを使用してサブアカウントを作成することもできます。詳細はTwilioのドキュメントをご覧ください。

APIキー

APIキーはTwilioのサービス認証に推奨される方法です。APIキーには、標準メインの2つのタイプがあります。

標準APIキーを使用すると、TwilioのAPIのすべての機能にアクセスできます。ただし、APIキー、アカウント構成、サブアカウントの管理は除きます。

メインAPIキーのアクセス権は標準キーと同じですが、APIキー、アカウント構成、サブアカウントも管理できます。メインAPIキーは、認証トークンを使用している場合と同じレベルのアクセスを提供します。

Twilio Consoleを使用してAPIキーを作成するには、次の手順に従います。

  • 右上のナビゲーションにある[Account](アカウント)リンクをクリックします
  • サブメニューで[API keys & tokens](APIキーとトークン)をクリックします。
  • Create API key](APIキーを作成)ボタンをクリックします
  • APIキーに分かりやすい名前をつけます
  • 最も近い地域を選択します
  • キータイプを標準またはメインのどちらにするか選択します

CLI、SDK、APIを使用して標準APIキーを作成することもできます。詳細はTwilioのドキュメントをご覧ください。APIキーを管理するには、認証トークンまたはメインAPIキーで認証される必要があります。

APIキーのローテーション

API認証情報の代わりにAPIキーを使用するメリットの1つは、APIを使用してAPIキーの作成と削除が可能であることです。この場合、予防措置としてプログラムによりAPIキーをローテーションできます。
Twilio CLIとPowerShellを使用してAPIキーをローテーションする方法は次のとおりです。

# Step 0: Install the Twilio CLI and authenticated with account API Credentials or with a Master API Key
# Twilio CLI installation instructions: https://www.twilio.com/docs/twilio-cli/quickstart

# Step 1: Create a new API Key
$NewApiKey = twilio api:core:keys:create -o json | ConvertFrom-Json;
$NewApiKeySid = $NewApiKey.sid;
$NewApiKeySecret = $NewApiKey.secret;

# Step 2: Update your applications to use the new API Key SID and API Key Secret
# --- TO IMPLEMENT BY YOU --- 

# Step 3: Fetch the existing API Key SID (hardcoded for sample)
$OriginalApiKeySid = "[YOUR_API_KEY_SID]";

# Step 4: Delete the old API Key
twilio api:core:keys:remove --sid=$OriginalApiKeySid;

注記: このコードを実行する前に、Twilio CLIがインストール済みであることを確認してください。

警告: APIキーのローテーションが適切に処理されるように、アプリケーションの開発とテストを実施してください。

APIキーは必要な数だけ作成できますが、API認証情報の場合、アカウントごとに2つ(プライマリとセカンダリ)のトークンしかありません。そのため、チームメイトやアプリケーションに渡すのは、API認証情報ではなくAPIキーにする必要があります。そうすることにより、使用されていないAPIキーを安全に取り消すことができます。

認証トークンからAPIキーへの移動

すでにコードで認証トークンを使用している場合は、数行を変更するだけでAPIキーの使用に切り替えることができます。Twilio Consoleから認証トークンの一部を取得し、環境変数にローカルに保存して、コードを実行する必要があります。その方法の詳細については、Twilio認証情報を安全に保存する手順を実行します。  

C#を使用し、API認証情報によりSMSを認証、送信する方法は次のとおりです。

// Find your Account Sid and Token at twilio.com/console
// and set the environment variables. See http://twil.io/secure
string accountSid = Environment.GetEnvironmentVariable("TwilioAccountSid");
string authToken = Environment.GetEnvironmentVariable("TwilioAccountAuthToken");

TwilioClient.Init(
    username: accountSid,
    password: authToken
);

string twilioPhoneNumber = Environment.GetEnvironmentVariable("TwilioPhoneNumber");
string targetPhoneNumber = "[TARGET_PHONE_NUMBER]";

var message = MessageResource.Create(
    body: "Hello World",
    from: new PhoneNumber(twilioPhoneNumber),
    to: new PhoneNumber(targetPhoneNumber)
);
Console.WriteLine(message.Sid);

まず、usernameパラメータとしてアカウントSIDを、passwordパラメータとして認証トークンをTwilioClient.Initに渡します。次に、MessageResource.Createを使用してテキストメッセージを送信します。

TwilioClient.Initに渡したパラメータを更新し、(API認証情報ではなく)APIキーで認証します。

// Find your Account Sid and Token at twilio.com/console
// and set the environment variables. See http://twil.io/secure
string accountSid = Environment.GetEnvironmentVariable("TwilioAccountSid");
string apiKey = Environment.GetEnvironmentVariable("TwilioApiKeySid");
string apiSecret = Environment.GetEnvironmentVariable("TwilioApiKeySecret");

TwilioClient.Init(
    username: apiKey, 
    password: apiSecret, 
    accountSid: accountSid
);

まず、(アカウントSIDではなく)APIキーSIDusernameパラメータに渡します。次に、(認証トークンではなく)API Key Secretpasswordパラメータに渡します。最後に、Account SIDをaccountSidパラメータに渡します。

まとめ

TwilioのAPIでは、ユーザー名としてのアカウントIDと、プライマリまたはセカンダリトークンを使用して認証を行えます。プライマリトークンが侵害された場合、セカンダリトークンをプライマリトークンに昇格させると、古いプライマリトークンは使用できなくなります。

アカウントをサブアカウントでセグメント化することにより、認証情報を保護できます。サブアカウントの認証トークンまたはAPIキーが侵害された場合、トークンはサブアカウントのリソースへのアクセスにのみ使用できます。

現在、TwilioのAPIで認証を行う際には、APIキーを使用することが推奨されています。必要な数のAPIキーを作成し、侵害された場合やすでに使用されていない場合には削除できます。

Niels Swimberghe氏はベルギー人のフルスタック開発者であり、テクニカルコンテンツクリエイターとして米国で活動しています。Swimberghe氏へのご連絡は、Twitter @RealSwimburgerにお願いします。.NET、Azure、Web開発などについては、swimburger.netでブログをフォローいただけます