Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
 @shin1x1
2016/02/27 TwilioJP-UG大阪&AWScean合同勉強会
Twilio と Web アプリ

連携におけるセキュリティ
https://github.com/shin1x1/twilio-api-security-demo
TwilioとWebアプリの連携
サンプルアプリケーション
(c) 2016 Masashi Shinbara @shin1x1
• 会員向けポイント管理システム
• 電話をかけると現在のポイントが聞ける
• 電話番号で認証
(c) 2016 Masashi Shinbara @shin1x1
電話をかける
図図 - twilio
図図 - twilio
Twilio Webサーバ会員
090-xxxx-xxxx
(c) 2016 Masashi Shinbara @shin1x1
電話番号が送られる
図図 - twilio
図図 - twilio
HTTPリクエスト

From: 090-xxxx-xxxx
(発信元電話番号)
(c) 2016 Masashi Shinbara @shin1x1
会員認証
図図 - twilio
図図 - twilio
090-xxx-xxx で DB を参照して
会員を特定する
(c) 2016 Masashi Shinbara @shin1x1
情報をXMLで返す
図図 - twilio
図図 - twilio
TwiML(XML)を返す
(c) 2016 Masashi Shinbara @shin1x1
情報をTwiMLで返す
図図 - twilio
図図 - twilio
TwiML(XML)を返す
<?xml version="1.0" encoding="UTF-8"?...
(c) 2016 Masashi Shinbara @shin1x1
音声を流す
図図 - twilio
図図 - twilio
音声再生
(c) 2016 Masashi Shinbara @shin1x1
デモ
(c) 2016 Masashi Shinbara @shin1x1
起こりうる問題
(c) 2016 Masashi Shinbara @shin1x1
HTTPの世界
図図 - twilio
図図 - twilio
Twilio Webサーバ会員
(c) 2016 Masashi Shinbara @shin1x1
偽装リクエスト
図図 - twilio
図図 - twilio
電話番号を
POST
(c) 2016 Masashi Shinbara @shin1x1
偽装リクエスト
図図 - twilio
図図 - twilio
TwiMLを
取得
(c) 2016 Masashi Shinbara @shin1x1
偽装リクエスト
図図 - twilio
図図 - twilio
Twilio Webサーバ会員
$ curl -d "From=%2B819012345678"

https...
(c) 2016 Masashi Shinbara @shin1x1
Twilio を偽ったリクエスト
•偽装したリクエストをWebアプリに送信
•情報取得、操作などの不正利用の可能性
(c) 2016 Masashi Shinbara @shin1x1
対策
偽装リクエスト対策
(c) 2016 Masashi Shinbara @shin1x1
1. 通信経路の暗号化
2. 通信元を制限
3. リクエストを検証
(c) 2016 Masashi Shinbara @shin1x1
1. 通信経路の暗号化
• HTTPS を利用する
• 自己署名の証明書は NG
• TLS を利用(SSLv3 は、廃止予定)
(c) 2016 Masashi Shinbara @shin1x1
Webアプリケーションのエンドポイント
https:// にする
(c) 2016 Masashi Shinbara @shin1x1
2. 通信元を制限
• HTTP Basic認証 / Digest認証
• ユーザ、パスワードを URL に含める
• https://user:pass@example.c...
(c) 2016 Masashi Shinbara @shin1x1
IPアドレスによる制限は?
https://www.twilio.com/help/faq/twilio-basics/which-ip-addresses-will-twi...
(c) 2016 Masashi Shinbara @shin1x1
3. リクエストの検証
・Twilio からのリクエストであることを確認
• 妥当であれば処理を実行
• そうでなければ処理を中断(エラー)
(c) 2016 Masashi Shinbara @shin1x1
HMAC-SHA1署名による検証
・ X-Twilio-Signatureヘッダ
• 所定のアルゴリズムで署名を算出
• 上記、2つを比較して合致すれば ok
X-Twilio-Signatureヘッダ
X-Twilio-Signature: +sndfa0paQ+m2P0PZ4U/2lnLkHw=
署名算出
・URL - https://example.com/calling
・POSTパラメータ(キーでソート)

Key2=value2
Key1=value1
From=+819012345678
https://example.com...
署名算出
・AuthTokenをキーにして、HMAC-SHA1署名
・base64でエンコード
+sndfa0paQ+m2P0PZ4U/2lnLkHw=
https://example.com/calling

Key1value1Key2va...
署名が一致するか
生成した署名 +sndfa0paQ+m2P0PZ4U/2lnLkHw=
X-Twilio-Signature: +sndfa0paQ+m2P0PZ4U/2lnLkHw=
合致するので、Twilioからのリクエストとみなす
twilio/sdk による検証
$validator = new Services_Twilio_RequestValidator($authToken);



// ヘッダから署名取得
$signature = $request->hea...
まとめ
(c) 2016 Masashi Shinbara @shin1x1
•Twilio と Web アプリケーションは

HTTP(S) で連携
•偽装リクエストが送信されることを意識
•Twilio 公式ドキュメントを参考に
https...
Upcoming SlideShare
Loading in …5
×

日本語消えたスライド

1,168 views

Published on

Osaka フォントは ok。
ヒラギノフォントが ng っぽい。

Published in: Technology
  • Be the first to comment

日本語消えたスライド

  1. 1.  @shin1x1 2016/02/27 TwilioJP-UG大阪&AWScean合同勉強会 Twilio と Web アプリ
 連携におけるセキュリティ
  2. 2. https://github.com/shin1x1/twilio-api-security-demo
  3. 3. TwilioとWebアプリの連携
  4. 4. サンプルアプリケーション (c) 2016 Masashi Shinbara @shin1x1 • 会員向けポイント管理システム • 電話をかけると現在のポイントが聞ける • 電話番号で認証
  5. 5. (c) 2016 Masashi Shinbara @shin1x1 電話をかける 図図 - twilio 図図 - twilio Twilio Webサーバ会員 090-xxxx-xxxx
  6. 6. (c) 2016 Masashi Shinbara @shin1x1 電話番号が送られる 図図 - twilio 図図 - twilio HTTPリクエスト
 From: 090-xxxx-xxxx (発信元電話番号)
  7. 7. (c) 2016 Masashi Shinbara @shin1x1 会員認証 図図 - twilio 図図 - twilio 090-xxx-xxx で DB を参照して 会員を特定する
  8. 8. (c) 2016 Masashi Shinbara @shin1x1 情報をXMLで返す 図図 - twilio 図図 - twilio TwiML(XML)を返す
  9. 9. (c) 2016 Masashi Shinbara @shin1x1 情報をTwiMLで返す 図図 - twilio 図図 - twilio TwiML(XML)を返す <?xml version="1.0" encoding="UTF-8"?> <Response> <Say voice="woman" language="ja-JP">
 鈴木さんのポイントは 50 ポイントです。 </Say> </Response>
  10. 10. (c) 2016 Masashi Shinbara @shin1x1 音声を流す 図図 - twilio 図図 - twilio 音声再生
  11. 11. (c) 2016 Masashi Shinbara @shin1x1 デモ
  12. 12. (c) 2016 Masashi Shinbara @shin1x1 起こりうる問題
  13. 13. (c) 2016 Masashi Shinbara @shin1x1 HTTPの世界 図図 - twilio 図図 - twilio Twilio Webサーバ会員
  14. 14. (c) 2016 Masashi Shinbara @shin1x1 偽装リクエスト 図図 - twilio 図図 - twilio 電話番号を POST
  15. 15. (c) 2016 Masashi Shinbara @shin1x1 偽装リクエスト 図図 - twilio 図図 - twilio TwiMLを 取得
  16. 16. (c) 2016 Masashi Shinbara @shin1x1 偽装リクエスト 図図 - twilio 図図 - twilio Twilio Webサーバ会員 $ curl -d "From=%2B819012345678"
 https://example.com/api/calling <?xml version="1.0" encoding="UTF-8"?> <Response> <Say voice="woman" language="ja-JP">
 田中さんのポイントは 100 ポイントです。 </Say> </Response>
  17. 17. (c) 2016 Masashi Shinbara @shin1x1 Twilio を偽ったリクエスト •偽装したリクエストをWebアプリに送信 •情報取得、操作などの不正利用の可能性
  18. 18. (c) 2016 Masashi Shinbara @shin1x1 対策
  19. 19. 偽装リクエスト対策 (c) 2016 Masashi Shinbara @shin1x1 1. 通信経路の暗号化 2. 通信元を制限 3. リクエストを検証
  20. 20. (c) 2016 Masashi Shinbara @shin1x1 1. 通信経路の暗号化 • HTTPS を利用する • 自己署名の証明書は NG • TLS を利用(SSLv3 は、廃止予定)
  21. 21. (c) 2016 Masashi Shinbara @shin1x1 Webアプリケーションのエンドポイント https:// にする
  22. 22. (c) 2016 Masashi Shinbara @shin1x1 2. 通信元を制限 • HTTP Basic認証 / Digest認証 • ユーザ、パスワードを URL に含める • https://user:pass@example.com/
  23. 23. (c) 2016 Masashi Shinbara @shin1x1 IPアドレスによる制限は? https://www.twilio.com/help/faq/twilio-basics/which-ip-addresses-will-twilios-requests-come- from • Twilio の送信元 IP アドレスは非公開 • 代わりにリクエストの検証を行う • どうしても必要なら相談
  24. 24. (c) 2016 Masashi Shinbara @shin1x1 3. リクエストの検証 ・Twilio からのリクエストであることを確認 • 妥当であれば処理を実行 • そうでなければ処理を中断(エラー)
  25. 25. (c) 2016 Masashi Shinbara @shin1x1 HMAC-SHA1署名による検証 ・ X-Twilio-Signatureヘッダ • 所定のアルゴリズムで署名を算出 • 上記、2つを比較して合致すれば ok
  26. 26. X-Twilio-Signatureヘッダ X-Twilio-Signature: +sndfa0paQ+m2P0PZ4U/2lnLkHw=
  27. 27. 署名算出 ・URL - https://example.com/calling ・POSTパラメータ(キーでソート)
 Key2=value2 Key1=value1 From=+819012345678 https://example.com/calling
 From+819012345678Key1value1Key2value2
  28. 28. 署名算出 ・AuthTokenをキーにして、HMAC-SHA1署名 ・base64でエンコード +sndfa0paQ+m2P0PZ4U/2lnLkHw= https://example.com/calling
 Key1value1Key2value2From+819012345678
  29. 29. 署名が一致するか 生成した署名 +sndfa0paQ+m2P0PZ4U/2lnLkHw= X-Twilio-Signature: +sndfa0paQ+m2P0PZ4U/2lnLkHw= 合致するので、Twilioからのリクエストとみなす
  30. 30. twilio/sdk による検証 $validator = new Services_Twilio_RequestValidator($authToken);
 
 // ヘッダから署名取得 $signature = $request->header('X-Twilio-Signature');
 
 // URL 取得 Request::setTrustedProxies([$request->getClientIp()]);
 $url = $request->getUri();
 
 // POST パラメータ取得 $postParameters = $request->input();
 
 // 署名検証 if (!$validator->validate($signature, $url, $postParameters)) {
 // OK
 } else {
 // NG
 }
  31. 31. まとめ (c) 2016 Masashi Shinbara @shin1x1 •Twilio と Web アプリケーションは
 HTTP(S) で連携 •偽装リクエストが送信されることを意識 •Twilio 公式ドキュメントを参考に https://jp.twilio.com/docs/api/security

×