本日も乙

ただの自己満足な備忘録。

Web Risk API で危険な URL から守る

個人で Web サービスを開発するときに、Web 上にある情報を取得するためにクローラを実装された方もいるかもしれません。昨今、本や Web サイトでクローラやスクレイピングに関する情報が多く出回っているので、実装は難しくないと思います。

しかし、クローリングのセキュリティリスクに関する指摘はほぼ目にしたことがありません*1。クローリング対象の URL すべてが安全である保証はなく(特に Google 検索で取得したもの) 、悪意のある URL にアクセスすることでクローラを実行しているサーバもしくはローカルマシンが被害に遭うかもしれません。事前に URL が安全であるかどうかを知ることができればセキュリティリスクは軽減されます。

2019年3月に Google が Web Risk API のベータ版を発表しました。Google が保有するデータベースを元に、URL が安全でないかを検知できる API です。

本記事では Web Risk API を使ってみたので紹介します。要は「やってみた」系記事です。

目次

リクエストフォームに申請

Web Risk API は2020年1月時点ではベータ版で利用するにはリクエストフォームにて申請が必要です。フォーム内容は英語ですが回答内容はとても簡単です。

Please provide an email address with access to your Google Cloud account (organizational address preferable)

Web Risk API を利用する Google(G Suite)メールアドレスを入力します。GCP で組織を使っている場合は組織のメールアドレスを、個人利用なら gmail.com で構いません。
Please provide your website for verification purposes (websites that do not load will not be whitelisted) 

組織もしくは個人で保有しているサイト URL を記入します。私の場合はこのブログ URL(https://blog.jicoman.info)にしました。
Where did you hear about this service?

どこで Web Risk API を知ったのかを記入します。当ブログでもいいですし Google 検索でも良いです。
I accept Google's Terms and Conditions and acknowledge that my information will be used in accordance with Google's Privacy Policy.

利用規約、プライバシーポリシーに同意する場合はチェックを入れてください。

申請後、1日程度 Welcome to Web Risk API [Beta] という件名のメールが来ました。

API の有効化、API キーの発行

Web Risk API を有効化します。マネジメントコンソールにアクセスして検索窓から「web risk api」と入力します。申請が通っていれば下図のように出てきます。

web-risk-api

「ENABLE」をクリックすると有効になります。

web-risk-api

API キーが必要なので発行します。「認証情報」→「認証情報を作成」→「API キー」を選択します。API キーがポップアップで表示されますので、控えておいてください。

web-risk-api

このままで使えるのですが、API キーが漏洩すると危険なので少しでもリスクを下げるために利用できる API を下図のように制限します。

web-risk-api

Web Risk API を使用する

Web Risk API には大きく分けて Lookup API と Update API の2種類があります。Lookup API は URL を API に投げることで安全でないかがレスポンスされます。とても簡単に使える反面、1回の HTTP リクエストにつき1つの URL なので大量の時間と料金がかかります。Update API は安全でない URL リストのハッシュをダウンロードできる API です。URL のハッシュ値のプレフィックスを求めて、取得した URL リストに含まれているかをチェックします。含まれていれば安全ではない URL ということです。Lookup API のように何度も API を叩かなくても良い反面、取得したリストの保管や URL のハッシュプレフィックスを求めたりと手間がかかります。

Lookup API

uris:search メソッド を使用します。以下がドキュメントに書かれているサンプルコマンドです。YOUR_API_KEY を各自の API キーに置き換えてください。

$ curl -H "Content-Type: application/json" \
  "https://webrisk.googleapis.com/v1beta1/uris:search?key=YOUR_API_KEY&threatTypes=MALWARE&uri=http%3A%2F%2Ftestsafebrowsing.appspot.com%2Fs%2Fmalware.html"
{
  "threat": {
    "threatTypes": [
      "MALWARE"
    ],
    "expireTime": "2020-01-11T06:10:57.877290715Z"
  }
}

uri パラメータで指定した URL が脅威リストに含まれている場合は上のようなレスポンスが返されます。安全な URL の場合は {} が返されます。

$ curl -H "Content-Type: application/json" \
  "https://webrisk.googleapis.com/v1beta1/uris:search?key=YOUR_API_KEY&threatTypes=MALWARE&uri=http%3A%2F%2Fgoogle.com"
{}

Update API

threatLists.computeDiff メソッドを使用します。以下がドキュメントに書かれているサンプルコマンドです。YOUR_API_KEY を各自の API キーに置き換えてください。

$ curl -H "Content-Type: application/json" \
  "https://webrisk.googleapis.com/v1beta1/threatLists:computeDiff?key=YOUR_API_KEY&threatType=MALWARE&versionToken=&constraints.maxDiffEntries=2048&constraints.maxDatabaseEntries=4096&constraints.supportedCompressions=RAW"
{
  "recommendedNextDiff": "2020-01-12T18:04:22.443708441Z",
  "responseType": "RESET",
  "additions": {
    "rawHashes": [
      {
        "prefixSize": 4,
        "rawHashes": "AEwS..."
      }
    ]
  },
  "newVersionToken": "ChAIARAGGAEiAzAwMSiAEDABEMn0BhoCGAmFNOpt",
  "checksum": {
    "sha256": "ggRGSn/eOIxEmbNo8VyLgi5YypNRfYvXWo8wDP7hZlc="
  }
}

rawHashes が安全ではない URL リストのハッシュです。

サンプルアプリ

Web Risk API を使いやすくするためのサンプルアプリが Google 公式から出ています。

go get コマンドでインストールできます。

$ go get github.com/google/webrisk
$ go get github.com/google/webrisk/cmd/wrlookup
$ go get github.com/google/webrisk/cmd/wrserver
$ export PATH=$PATH:$GOPATH/bin
$ export APIKEY=YOUR_API_KEY

wrlookup は Lookup API コマンドと同様に URL が安全ではないかをチェックするコマンドです。

$ wrlookup -apikey $APIKEY
webrisk: 2020/01/11 15:35:48 database.go:111: no database file specified
webrisk: 2020/01/11 15:35:58 database.go:385: database is now healthy
webrisk: 2020/01/11 15:35:58 webrisk_client.go:496: Next update in 30m11s
https://google.com  # 入力
Safe URL: https://google.com
http://testsafebrowsing.appspot.com/s/malware.html # 入力
Unsafe URL: [MALWARE]

wrserver は安全ではない URL をリダイレクトするプロキシサーバです。次のコマンドを実行すると Web サーバが起動し、http://localhost:8080/ にアクセスできます。

$ wrserver -apikey $APIKEY
webrisk: 2020/01/11 15:37:47 database.go:111: no database file specified
webrisk: 2020/01/11 15:37:50 database.go:235: Server requested next update in 30m28.13591573s
webrisk: 2020/01/11 15:37:56 database.go:385: database is now healthy
webrisk: 2020/01/11 15:37:56 webrisk_client.go:496: Next update in 30m28.13591573s
Starting server at localhost:8080

ブラウザを開き、次の URL にアクセスします。url パラメータにつけた URL が安全であればその URL にリダイレクトされます。

http://localhost:8080/r?url=http://google.com

安全ではない URL の場合は警告ページにリダイレクトされます。

http://localhost:8080/r?url=http://testsafebrowsing.appspot.com/s/malware.html

web-risk-api

料金

ドキュメントをご参照ください。

まとめ

安全ではない URL を教えてくれる Web Risk API を紹介しました。Google のナレッジデータベースを API 一つで使えるのはとても便利です。しかし、URL 単位なので例えば ドメインや IP アドレスの場合は使えません。URLページは問題なくともドメイン全体で問題がある場合は(おそらく)検知はできないかもしれないので注意が必要です。ベータ版なので今後改善されることを期待しています。

*1:見落としているかもしれませんのでもしありましたらご連絡ください