安全なURLかチェックするLambdaをF-SecureのAPIを使って書いてみた

2017.05.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

先日行ってきたF-Secureパートナーカンファレンスにて紹介されていた、「F-Secure Security Cloud API for URLs」を利用すると、APIに投げたURLが安全なURLか判断したり、URLがどのようなカテゴリのサイトか判断してくれる(ギャンブルやアダルト等)ということだったので、早速AWS Lambdaで試してみました。

F-Secure Security Cloud API for URLsの登録

まずは、F-Secure Security Cloud API for URLsを利用するために登録します。

AWSマネジメントコンソールへログイン後、F-Secure Security Cloud API for URLsのマーケットプレイスへアクセスします。

「Continue」を選択して次へ進みます。

01_marketplace_

ちなみに、右下にかかれているとおり1リクエストあたり$0.003なので、非常に安価で利用しやすいですね。

確認が出るので「Subscribe」を選択します。

02_market_subscribe_

完了したので、「Set Up Your Account」を選択します。

03_market_subscribed

続いてF-Secureのポータルに移動するので、「Register」を選択してF-Secureのアカウントを作成します。既にF-Secureのアカウントを持っている場合はそのままログインで問題ないと思います。

04_f-secure_portal_register_

登録画面で必要情報を入力して「アカウントの作成」を選択します。

05_f-secure_create_account

アカウント作成後、すぐにF-SecureのAPIのポータルへリダイレクトします。また、登録したメールアドレス宛にアクティベーションのメールが届きますので、URLをクリックしてアクティベートします。

06_f-secure_activate_

F-Secure APIポータル

ログイン後の画面はこちらです。APIのkeyとエンドポイントのURLが払い出されました。

07_f-secure_portal_

API keyの右下の「Actions」では、keyのRefreshやUnsubscribeなどが可能で、ライフサイクルの管理が簡単に行えるようでした。

09_action_

「Document」ページにはAPIの使用やコードのサンプルなどがあり、すぐに利用できるような情報が整っていました。

08_f-secure-document

その他にも、Support情報やContact Us、AboutにはAPIの更新履歴が掲載されていました。

APIをLambdaで利用してみる

さて、それではLambdaでこのAPIを利用してみます。

「Documentation」のPythonのサンプルコードを利用してPython 3.6で書きました。

import urllib.request
import json

def lambda_handler(event, context):
	api_end_point = event['api_end_point']
	api_key = event['api_key']
	urlsToCheck = "\n".join(event['urlsToCheck'])
	
	headers = {"x-api-key": api_key}
	data = urlsToCheck.encode('ascii')
	req = urllib.request.Request(api_end_point, data, headers)
	with urllib.request.urlopen(req) as response:
		r = response.read().decode('utf-8')
	
	return r

サンプルコードではrequestsを利用していたのですが、今回はAWSマネジメントコンソールから直接記述するため、外部ライブラリに依存しないように記述してみました。本当はrequests使いたい

APIの仕様は主に以下のような形です。

  • 指定されたエンドポイントURLにリクエストを投げる
  • ヘッダーに「x-api-key」として発行されたkeyを入れる
  • POSTのdataとしてURLを入れる
    • 複数URLを一度にリクエストする場合は改行("\n")区切りにする

エンドポイントやkeyはコールするときに一緒に送るように作成しましたが、環境変数等のパラメータを参照する形でもいいかと思います。

それでは実際にテストしてみます。

10_test_

テストに利用するコードはこちらです。

{
	"api_end_point": "https://xxxxxxxxxxxxxxxxxxxxxx",
	"api_key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
	"urlsToCheck": ["http://malicious.fstestdomain.com", "https://www.f-secure.com/"]
}

チェックするURLについては、サンプルにあるものを利用しています。

名前からわかるように、1つ目が問題があるサイトで、二つ目は正常なサイトになります。

実行結果は下記のとおりです。

{
	"u1": {
		"ttl": 300,
		"c": {
			"weapons": 0,
			"entertainment": 0,
			"chat": 0,
			"games": 0,
			"safe": -100,
			"banking": 0,
			"anonymizers": 0,
			"adult": 0,
			"shopping": 0,
			"blogs": 0,
			"spam": 0,
			"dating": 0,
			"warez": 0,
			"hate": 0,
			"adserving": 0,
			"drugs": 0,
			"auctions": 0,
			"gambling": 0
		}
	},
	"u2": {
		"ttl": 86400,
		"c": {
			"adult": 0,
			"safe": 80,
			"shopping": 0,
			"adserving": 0
		}
	}
}

まず、URL毎に「u1,u2」と結果が分かれて返ってきています。

重要なのは、"safe"のパラメータになります。この値の仕様は以下のようになっています。

  • A value of 100 means that the URL is considered Trusted
  • A value of 80 - 99 means that the URL is considered Safe
  • A value of 1 - 79 means that the URL is generally considered Safe
  • A value less than 0 means that the URL is considered Unsafe
  • A value of -100 means that the URL is Malicious

つまり、80以上であれば安全で、1以上でも通常のサイトであると考えられます。逆に、-100は100%アウトです。

レスポンスの結果としては、1つ目のhttp://malicious.fstestdomain.comは-100で完全にアウトなサイトであり、2つ目のhttps://www.f-secure.com/は80で十分に安全なサイトであると判断できます。

また、"c"に含まれるその他の値は、各カテゴリにどれだけマッチしているかを表しています。ちなみに"c"はcategoryです。

カテゴリは下記のようなものがあります。

  • Alcohol and Tobacco
  • Anonymizers
  • Auctions
  • Banking
  • Blogs
  • Chat
  • Dating
  • Drugs
  • Entertainment
  • Gambling
  • Games
  • Hate
  • Job Search
  • Payment Service
  • Shopping
  • Social Networking
  • Software Download
  • Spam
  • Streaming Media
  • Warez
  • Weapons

上記の結果では、あまりマッチするカテゴリが無いようですので、別のサイトを検証してみます。

日本でも有名な某ムフフな動画サイト達をリクエストすると、下記のようになりました。

{
	"u1": {
		"ttl": 86400,
		"c": {
			"blogs": 0,
			"games": 0,
			"adult": 100,
			"dating": 0,
			"adserving": 0,
			"shopping": 100,
			"safe": 80
		}
	},
	"u2": {
		"ttl": 86400,
		"c": {
			"blogs": 0,
			"adult": 100,
			"gambling": 0,
			"safe": 80,
			"shopping": 100
		}
	}
}

アダルトだけど安全という結果になりました。安全であるという所が流石ですね。他にも、ショッピングの様子が見られるようで、正しいと考えられます。

複数のカテゴリについてレスポンスがあるため、多角的にURLを見ることが出来ます。

まとめ

F-Secure Security Cloud API for URLsを利用してURLの安全性をチェックしてみました。

用途としては、ユーザが任意のURL(や文字列)を投稿できるシステムにて、受け取ったURLが安全かどうか確認する、などが考えられると思います。

1リクエスト$0.003と考えると非常に使いやすいと思いますので、ぜひ試してみてはいかがでしょうか?