Google は2016年5月20日に Google Safe Browsing API version 4 を発表しました。
Google Online Security Blog: Evolving the Safe Browsing API
https://security.googleblog.com/2016/05/evolving-safe-browsing-api.html
従来使われていた Google Safe Browsing API version 3 は、2017年の初め頃(early 2017)に廃止予定となり、Google は version 4 への移行を推奨しています。そこで早速、Safe Browsing を使用しているサービスで、新しい API への移行を行いました。Google が Go 言語製クライアントを公開しているため、非常に簡単にセットアップできました。今回は、APIキーの取得から、Gehirn RS2 Plus 上で Go 実装のクライアントをビルドして実際に使いはじめるまでのセットアップ手順をご紹介します。
APIキーの取得
まずはAPIキーを取得します。
Google API Console にアクセスします。
必要に応じて新しいプロジェクトを作成します。
プロジェクトを作成すると、自動的にそのプロジェクトに入って操作を行えるようになります。まだどのAPIも有効になっていないので、検索ボックスに「safe」と入力して Safe Browsing を探します。表示された「Safe Browsing API」をクリックすると、APIを有効にする画面に移ります。
「有効にする」ボタンを押すと数秒でAPIが有効になります。
続いて、APIキーを取得するための認証情報の取得をします。これも「認証情報に進む」ボタンを押すだけの簡単な作業です。
「API を呼び出す場所」を必要に応じて変更します。今回はWebアプリケーションから呼び出すことを想定しているため、「ウェブサーバ」を選択します。
APIキーの名前を設定します。識別しやすい名前をつけてください。
「APIキーを作成する」ボタンでAPIキーが発行されます。表示された認証情報を控えておいてください。控え忘れてもあとから参照することができますのでご安心ください。
ここまで、APIキーの取得の手順をお伝えしました。
サーバのセットアップ
つぎに、クライアントとサンプルアプリを動かすサーバのセットアップです。Google 謹製のクライアントは Go 言語で書かれているプロキシのため、Golang 環境とデーモンプロセスを常駐させられる環境が必要です。VPS を借りるなど root をもった環境を入手することが一般的ですが、小さいデーモンとWebアプリのためにわざわざrootを持ってサーバのセットアップをする必要はありません。今回はマネージドホスティングサービスの Gehirn RS2 Plus を使った手順を紹介します。
ここからの手順は、あらかじめ Gehirn ID を取得しておく必要があります。面倒な場合や既存の VPS がある場合には、Golang環境をセットアップして次の章に進んでください。
Gehirn Infrastructure Services のコントロールパネルを開き、右上のアイコンを選択してプロジェクト管理を開きます。
プロジェクト管理画面の左上から「プロジェクトの作成」を選択して、新しくテスト用のプロジェクトを作成します。
「支払い設定」タブを開いて、「支払いウォレットを変更」を押して支払情報の登録を行います。
右上のアイコンから「すべてのプロジェクトから選択」を開き、いま作ったプロジェクトを選択してください。その際、左側のスターボタンをクリックすると、一覧に表示されるようになります。
「RS2 Plus」タブを開いて、左上にある「RS2 Plus新規契約」ボタンを押すとウィザードが開きます。
「デフォルトイメージ」を選択して次に進み、テストなので一番小さいプランの「ショート」を選択します。名前を「セーフブラウジングのテスト」とつけて確認画面に表示されている内容に問題がなければ、チェックマークで使用を開始します。
通知センターに「コンテナを作成中です」という表示からおよそ90秒でサービスが使えるようになります。
作成されたコンテナを開いて、「UNIXユーザ」タブを選択して、「UNIXユーザを追加」ボタンを押します。
ユーザ名に「sbserver」など好きな名前を入力してください。
いま作成したユーザを開いて、「公開鍵の管理」を選択します。普段SSHで公開鍵認証を使っていない方はパスワード認証を設定しても構いません。
「公開鍵を追加」ボタンを押して、開いたモーダルに使用したい公開鍵を貼り付けて保存します。
「sbserver」ユーザのページに戻り、SSHコマンド例をコピーしてターミナルに貼り付けます。
ターミナルでSSHにログインします。
vi ~/.zshenv
を実行して、次の行を追加して保存します。
#golang export GOPATH="$HOME/.go" export PATH="$PATH:$GOPATH/bin"
シェルから
source ~/.zshenv
を実行して環境変数をセットします。
ここまででサーバ環境の準備は完了です。
Go言語製クライアントのセットアップ
Google の GitHub リポジトリで公開されているクライアントをサーバでビルドします。
go get github.com/google/safebrowsing
と入力して実行します。
上記の処理が終わったらつぎに
go get github.com/google/safebrowsing/cmd/sbserver
と入力して実行します。
この手順で sbserver コマンドが使えるようになりました。
このコマンドは、Google Safe Browsing のプロキシとして動作します。脅威データベースをダウンロードして30分毎に自動更新するほか、脅威情報をキャッシュする処理などを行います。Google Safe Browsing API には1日1万リクエストの制限があるため、頻繁に参照する場合には上限に達するおそれがありますが、このクライアントをプロキシさせることで、Google の API へのリクエストを1日あたり数百程度に抑えることができます。また、脅威データベースはローカルにあるためレスポンス速度も向上します。Safe Browsing では、URLの検査リクエストすべてを Google の API に直接リクエストしないように実装するのが望ましく、特にモバイル環境ではローカルのデータベースを使わずにすべてインターネット越しの API を参照しているとユーザ体験に大きく影響することが容易に想像できます。Google 謹製のプロキシないしこの実装は、従来まで実装が面倒だったURLのハッシュを計算したり、データベースの更新処理を自動でやってくれて実装の手間を省けるため、携帯アプリに使うにしろWebアプリに使うにしろ、実質的に公開されている実装を使うことが必須になっているように思います。ほかにもローカルで処理を行うことで、Google に検査した生のURLを渡さずに済むこともメリットの一つです。
つぎに、この sbserver を常駐させる設定をします。
Gehirn RS2 Plus のコントロールパネルから「プロセス」を開きます。
「新しいプロセス管理を追加」で名前に「sbserver」、実行ユーザに「sbserver」、実行コマンドを次のように設定します。
/home/sbserver/.go/bin/sbserver -apikey Googleのコンソールで取得したAPIキー -db="/home/sbserver/db" -srvaddr="localhost:8080"
これで確定するボタンを押すと、 sbserver が自動的に立ち上がります。
Gehirn RS2 Plus のプロセス管理は、ログのローテーションをしたり、サーバー再起動時にプログラムを自動起動したり、プロセスが何らかの異常で落ちた時に自動的に起動し直すように管理してくれます。
プログラムの標準出力および標準エラー出力のログは、
/var/log/process/sbserver.std{out,err}.log
に保存されています。
サンプルリクエスト
curl でのリクエスト例
curl --include --request POST \ --url http://localhost:8080/v4/threatMatches:find \ --header 'Content-Type: application/json' \ --data '{"threatInfo":{"threatEntries":[{"url":"http://testsafebrowsing.appspot.com/apiv4/ANY_PLATFORM/UNWANTED_SOFTWARE/URL/"}]}}'
レスポンス例
HTTP/1.1 200 OK Content-Type: application/json Date: Thu, 02 Jun 2016 20:34:39 GMT Content-Length: 199 {"matches":[{"threatType":"UNWANTED_SOFTWARE","platformType":"ANY_PLATFORM","threatEntryType":"URL","threat":{"url":"http://testsafebrowsing.appspot.com/apiv4/ANY_PLATFORM/UNWANTED_SOFTWARE/URL/"}}]}
おわりに
ステップは多いですが、Google API Console と Gehirn RS2 Plus の環境に慣れてしまえばあっという間に Google Safe Browsing API を試すことができます。最後に番外編をお楽しみください。
番外編:sbserver を外部に公開する
あまり必要性を思いつきませんが、 外部から sbserver にアクセスする手順です。
プロセス管理で設定したコマンド設定で「-srvaddr」の値を「0.0.0.0:8080」にします。
/home/sbserver/.go/bin/sbserver -apikey Googleのコンソールで取得したAPIキー -db="/home/sbserver/db" -srvaddr="0.0.0.0:8080"
次に、「サイト設定」でサイトを追加します。
歯車のボタンでサイト設定を開き、「バックエンドの選択」ボタンで「TCP」を選択します。
プロキシ先ポート番号は「8080」になっています。プロセス管理の設定とあわせてください。
この設定を完了すると外部から sbserver にリクエストが転送されます。