継続的セキュリティテストVAddyの説明資料

説明資料をアップロードしました。
サイトよりも少し詳しく書いてます。

VAddyはCIツールと連携し、継続的なセキュリティテストを実現することで、セキュリティを意識した開発を助けます。
無料プランでも、何回でも検査できますので、是非お試しください。
http://vaddy.net/ja/

開発者向けサービスのビジネスが成功する時代に

CircleCIのブログに、「Developers Matter: New Relic IPOs」という記事がありました。
2011年当時、投資家から開発者向けのサービスで稼ぐのは難しいと言われたが、最近はNewRelicのIPOもあって、開発者向けのツールやサービスが注目されるようになった。これはまだ始まりであって、CircleCIのようなサービスがどんどん出てきてビジネスとして成功していくだろう、とのこと。


必要なものは自分たちで買って構築して運用してというスタイルから、良いツールをうまく運用してくれるサービスを使って組み合わせる時代になってきました。やはり、メインビジネス以外のところを自前主義でがんばったとしても効果は限定的ですし、運用コストもかかるし、時代の流れについて行くのが難しくなってきているからでしょう。

私が関わっている継続的セキュリティテストサービスVAddyも同じ開発者向けサービスです。
自前でセキュリティテストツールを使って継続的セキュリティテスト環境を構築するのは難しく大変なため、それに特化したサービスをVAddyは提供しています。既にJenkins連携、CircleCIのようなCIサービス連携が可能です。
CI連携できるセキュリティテストツールはほとんど無いため、我々はフルスクラッチでスキャンエンジンを開発して運用しています。セキュリティエキスパートで開発も得意なエンジニアが、その力を最大限発揮してVAddyを作っています。

脆弱性検査で使う検査ツールは、基本的には人が使って検査することを前提に作られており、CI連携のように完全に無人でうまく回せる検査ツールを作るというのはとてもハードルが高く、チャレンジングな課題です。
VAddyはそのハードルを既に越えていますが、まだまだ進化の途中であり、これからも突き進んでいきます。


http://vaddy.net/ja/

mod_rewriteを使って画像のみCloudFront経由で配信する設定

CloudFrontを導入する際にCNAMEを付けて、該当FQDN全てCloudFront経由の配信にする方法が一般的かと思いますが、今回は画像やjsなど特定ファイルのみCDN対象としたかったので、その設定方法をメモ。

Apachemod_rewriteを使い、下記のように設定

RewriteCond %{HTTP_HOST} ^example\.com$
RewriteCond %{HTTP_USER_AGENT} !^Amazon\ CloudFront$
RewriteRule ^(.*)\.(png|js|jpg|gif|ico)$ http://xxxx.cloudfront.net/$1.$2 [NE,R=302,L]

これで、example.comにアクセスすると、画像やjsのみxxxx.cloudfront.netにリダイレクトされてCloudFrontから配信されます。
重要なのは2行目のユーザエージェントで、これが無いとCloudFrontから画像を取得しにきた時にリダイレクトループが起こります。
1行目にホスト名を指定して限定しているのは、ステージングサイトなどで動作しないようにするためです。

この方法だと、最初にオリジンサーバにHTTPリクエストが来てリダイレクトのレスポンスを返すため通常のCDNよりは非効率ですが、そこはデータ量が少ないので無視できるとしました。
この方法だと、いざというときにmod_rewriteコメントアウトしてCloudFrontを簡単に切り離せますし。

CakePHP2にTwilio SMSを使った2要素認証機能を追加

CakePHPアドベントカレンダー2014の2日目の記事です。12/1に @K1LoWさんが突然アドベントを始めたので乗り遅れないように2日目を担当します。まだアドベントカレンダーは空いているので皆様も是非。

そうそう、12/10にCakePHP2実践入門が電子書籍として発売されます。紙の本を出してから2年ぐらい経ちますが、これからCakePHP2を始める方には良いかなと思います。
http://gihyo.jp/news/nr/2014/12/0101


CakePHPのAuthコンポーネントを使うと簡単に認証機能が追加できます。詳細は日本語チュートリアルをご覧ください。

一般的なIDとパスワードを使った認証ですと、emailなどの共通したIDのシステムでパスワード使い回しのユーザがいる場合に標的になる可能性があります。これを防ぐために最近では2要素認証を導入しているところが多くなりました。GoogleDropboxZohoなど。
これらの多くはID/PW認証が完了した後に、SMSを送信してトークンを入力させて認証を行います。SMSが届く携帯電話などが必要です。

SMSの送信はTwilioを使うと簡単に実現できます。TwilioはPHP SDKを提供しているのでPHPに組み込むのも簡単です。具体的には下記のコードになります。

<?php
$client = new Services_Twilio($account_sid, $auth_token);
$message = $client->account->messages->sendMessage(
  $from_number, //Twilioで取得した電話番号(SMSはUS電話番号を使う必要があります)
  '+819011112222', //SMSの送信先携帯番号
  "sms_token: " . $token //SMSのメッセージ
);

あとはこのコードをAuthコンポーネントを使ったログイン用のコントローラアクションに挟むだけです。Authコンポーネント自体を変更したり継承してオーバライドする必要もありません。
CakePHPの2要素認証のサンプルをGithubに上げました。詳細はそちらをご覧ください。
https://github.com/ichikaway/cakephp-2FactorAuth-SMS


メインの処理は下記のコミットになります。
https://github.com/ichikaway/cakephp-2FactorAuth-SMS/commit/33f0ce45bbb47c95eafc5211cb0eb33cf6ba09e8

注意点としては、$this->Auth->login()でID/PW認証をしてしまうと、自動的に認証が通ったセッションが生成されてしまうため、いくらSMSトークン入力画面を挟んでも、ログイン後URLに直接遷移されてしまうと無意味になります。
ですので、このサンプルでは、

 $this->Auth->identify($this->request, $this->response);

を使って最初にID/PWのマッチングのみをしています。

ID/PWがマッチした場合にのみ、SMSを送信してトークン入力画面を表示します。トークンが送信されてユーザが入力し、トークンが一致すると、hiddenで引き継いだID/PWを使って$this->Auth->login()を実行してログイン成功のセッションを作成しています。
別にhiddenで引き継がなくてもSessionに入れて引き継いでも良いと思います。hiddenにしておくと$this->Auth->login()でそのまま利用できるため今回はそうしました。

名前を付けること、生命を吹き込むこと

最近リリースした継続的セキュリティスキャンサービスVAddy(バディ)の話です。
http://vaddy.net
VAddyのプロモーション動画はこちら。

1年前ぐらいにVAddyのざっくりしたコンセプトはあって、
どの方向で行くべきか、どのような世界を目指すべきかという議論を散々やってました。


まだその頃には名前がなくて、security, scan, test, Continuousなどの文字から何かサービス名を考えていました。
でも全然しっくりくる名前が出なくて2ヶ月ぐらいしたころには、とりあえず住んでる地名(Chihaya)でも良いんじゃない?とか冗談がでる始末。


2ヶ月ずっと考えていた末に出たのが、VAddyでした。
Vulnerability Assessment is your Buddy(脆弱性診断はあなたの相棒)の省略形です。
VAddyの言葉が浮かんだ時はすごく興奮して、とりあえずGoogleで検索にヒットしやすそうか見て、これに決めました。
(vaddy.comは転売業者に取られていて交渉したら90万円と言われたのでvaddy.netにしましたが、今ではvaddy.netのほうが気に入っています)


名前が決まると不思議なもので、今までふわっとしてたコンセプトやイメージがどんどん具体的になっていきました。
VAddyというサービスが開発者の相棒となってセキュリティ面をサポートするというイメージです。
低コストで管理不要のSaaS型のサービスを作り、CIにセキュリティテストを超簡単に追加できるようにして、
「テストは当たり前にやるよね」という一般的になってきた文化に加えて、
セキュリティテストもデプロイ前には当たり前にやるよね、という文化を創ることです。


この名前が決まって、具体的な機能やビジネスモデルの話などもどんどん進んでいき、2014年10月にリリースとなりました。


名前が決まった後からリリースまでのことを振り返ると、サービスに生命を吹き込むことをずっとしてた気がします(今でもそんな感じですが)。
これを具体化させるために、コードに落とし込み、サーバを立ち上げ、宣伝して、使ってもらって、反応をみる、そして次はこうなるぞと新しい世界にワクワクする。
VAddyを通して今、そのような体験をしている真っ最中です。
いやぁ、製品作りは楽しいですね。

来週にはVAddyのJenkinsプラグインとWebAPIを公開予定です。これでようやくVAddyの目指す世界に必要な機能が揃います。

SaaS型 継続的WEBセキュリティ診断VAddyの紹介

PHPカンファレンス関西2014に参加し、LTで5分の発表を行いました。
現在、VAddy(http://vaddy.net)というSaaS型の継続的Webセキュリティ診断サービスを開発していて、そのコンセプトを発表しました。VAddyという名前を初めて外部に公開したことになります。

このサービスの目標は、開発初期からリリース後まで継続的にセキュリティテストを自動で行い、開発者が安心してリリースできる世界を作ることです。CIに組み込んで使うエンジニアのためのサービスです。

リリース直前にセキュリティ検査をして大量に脆弱性が見つかった場合、リリースできなかったり、根本の対応策ができずリリース後に不具合が発生してしまったり、教育するタイミングを失って何度も脆弱性を出してしまったり、という問題を解決できたら良いなと思っています。


共同開発者の金床さんが仕組みを少し解説しているページがあるので、興味ある方はご覧ください。
継続的WEBセキュリティ診断サービス VAddy

まだ詳細情報も出しておらず、ベータリリースもしていませんが、近いうちに出します。 http://vaddy.net のページからメールアドレスを登録してもらえると、クローズドベータの段階から順次招待しますので、興味のある方は是非登録をお願いします。




発表後に良い反応を頂き、何名かから使ってみたいというありがたいお言葉を頂きました。

今年のPHPカンファレンスは3トラックあって発表内容も多種多様で良かったです。特に郡山さんの基調講演は素晴らしく、会場全体がどんどん引き込まれて行くのが分かりました。途中からツイートも少なくなって皆聞く事に集中しているようでした。

また来年も参加したいと思います。スタッフの皆様ありがとうございました。来年も期待しています!

Twilioで電話転送した時のステータスパターン

Twilioで、受けた電話を他の電話に繋ぐとき、Call命令を使います。
https://jp.twilio.com/docs/api/twiml/dial

このとき、通話者同士の動作によってステータスが変わり、Dialで指定しているactionのurlにステータスの状態が通知されます。電話を切った時とタイムアウトの時に通知のリクエストがサーバに飛んできます。
Dialのアクション指定はこのようにします。

どの動作の場合に、どのような通知になるか不明だったので実際に実験しました。これだけあれば、次の動作やログに何を記録した方が良いかなど判断できると思います。

これだけ見れば、電話が通じなかったのか、通話した時間、通話上限時間に達したのかが判断できると思います。

発信者が転送コール音中に電話を切った場合

DialCallStatus : no-answer
CallStatus : completed

転送コールを続けてTimeoutで終わり、通話せずに終わった場合

DialCallStatus : no-answer
CallStatus : in-progress

転送先が通話中で出れない場合

 キャッチを入れてる電話しかなかったのでテストできず。。。

通話して、時間内に発信者から切った場合

DialCallStatus : completed
CallStatus : completed
DialCallDuration : 13 (TimeLimitは15に設定)

通話して、時間内に受信者から切った場合

DialCallStatus : completed
CallStatus : in-progress
DialCallDuration : 13 (TimeLimitは15に設定)

通話して、時間切れの場合

DialCallStatus : completed
CallStatus : in-progress
DialCallDuration : 15 (TimeLimitは15に設定)