File Filter の開発

Prev Next

Classic/VPC環境で利用できます。

File Filter REST APIを使用して File Filterコードを作成する方法を説明します。

参考

File Filter開発の先に、File Saferご利用の申し込み、API Gatewayご利用の申し込みと API Keyを作成する必要があります。詳細は、File Safer を開始するをご参照ください。

File Filter実現のシナリオ

File Filterを適用するシナリオは、次の通りです。

filesafer-programming-file_scenario_ko

1.ファイル検査リクエスト(inputFile)
1-1.マルウェアが疑われるファイルを区分
1-2.認証値作成
1-3.リクエスト Body作成
1-4.リクエストパラメータ追加
1-5.APIリクエスト

2.検査結果確認(getInputFileLog)
2-1.検査結果を確認する Hash値区分
2-2.認証値作成
2-3.リクエストパラメータ追加
2-4.APIリクエスト
2-5.レスポンス値確認とブロック有無を判断

参考

File Filterでマルウェアが確認される場合、Hash Filterの Hash値をアップデートするために検査結果を Hash Filterで照会しても同じ結果が得られます。

File Filterコード作成

File Filter の実装シナリオに従ってコードを作成します。

1.ファイル検査リクエスト(inputFile)

File Filter APIの中から inputFileを使用してファイル検査をリクエストします。

参考

inputFile APIの仕様は inputFile (File Filter)をご参照ください。

1-1.マルウェアが疑われるファイルを区分

Hash Filterで確認されないファイルや、マルウェア有無の確認が必要なファイルを区分します。ファイルの制限事項は次の通りです。

  • ファイル数の制限: inputFile API呼び出し時にリクエストごとに1つのファイルのみ処理。2つ以上のファイルが転送される場合、1つのファイルのみ任意に選択して処理。
  • ファイルサイズの制限: API呼び出しごとにファイル容量を10MBに制限

1-2.認証値作成

NAVERクラウドプラットフォーム API使用認証に必要な IAM認証値を作成します。認証に必要なヘッダは次の通りです。

  • x-ncp-iam-access-key: コンソールの My Account > アカウントとセキュリティ管理 > セキュリティ管理 > アクセス管理メニューから Access Keyを発行
  • x-ncp-apigw-signature-v2: Access Keyとマッピングされる Secret Keyを HmacSHA256暗号化し、signature値を作成(改行文字は \nを使用)
  • x-ncp-apigw-api-key: API Gatewayで API Keyを発行
  • x-ncp-apigw-timestamp: 認証値ではないがリクエストヘッダに含まれる。API明細を参照
参考

signature値を作成する方法とサンプルコードは、NAVERクラウドプラットフォーム APIガイド > API の概要 > 基本 API > Ncloud API > 2.ヘッダ作成をご参照ください。

1-3.リクエスト Body作成

Multipartで Bodyにファイルを含むリクエストを作成します。

  • Key: file
  • Value: binary

1-4.リクエストパラメータ追加

転送したいファイルがパスワードが設定された圧縮ファイルの場合、以下のパラメータをリクエストに追加します。

  • Key: archivePassword
  • Value: 圧縮ファイルのパスワード String

以下は、パラメータが追加された POSTリクエスト Bodyのフォーマットです。Boundary値は、エンティティ区切り文字として使用し、boundary設定値の前には「--」を入れる必要があります。各エンティティの後尾には、crlf(「\r\n」)を使用する必要があります。

Content-Type: multipart/form-data; boundary=----AAAAAAAAAAAAAAAAAAAAAAAAAAAAA

------AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Content-Disposition: form-data; name="file"; filename="suspicious-file.zip"
Content-Type: application/x-zip-compressed

... contents of 'suspicious-file.zip'
------AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Content-Disposition: form-data; name="archivePassword"

password
------AAAAAAAAAAAAAAAAAAAAAAAAAAAAA--

1-5.APIリクエスト

File Filter inputFile URIにリクエストを転送します。以下は inputFileリクエストのサンプルコードです。

public static void request(String fileName, String password) throws Exception 
{
	String boundary = "----AAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
	String crlf = "\r\n";
	
	String apiDomain = "https://filesafer.apigw.ntruss.com";
	String apiURL = "/filefilter/v1/inputFile";
	String method = "POST";
	long timestamp = System.currentTimeMillis();
		
	// step 2: Create Authentication Value
	String signature = makeSignature(method, apiURL, timestamp);

	// step 3: Create request with the identified file added
	var path = (Path) Paths.get(fileName);
	byte[] separator = ("--" + boundary + "\r\nContent-Disposition: form-data; name=").getBytes(StandardCharsets.UTF_8);
		
	var byteArrays = new ArrayList<byte[]>();
	byteArrays.add(separator);
	byteArrays.add(("\"file\"; filename=\"" + path.getFileName() + crlf).getBytes(StandardCharsets.UTF_8));
	byteArrays.add(("Content-Type: " + Files.probeContentType(path) + crlf + crlf).getBytes(StandardCharsets.UTF_8));
	byteArrays.add(Files.readAllBytes(path));
	byteArrays.add(crlf.getBytes(StandardCharsets.UTF_8));
		
	// step 4: If the file you want to transfer is a zip file with a password, add the following parameters to the request
	if (password != null && !password.isEmpty()) { 
		byteArrays.add(separator);
		byteArrays.add(("\"archivePassword\"\r\n\r\n" + password + "\r\n").getBytes(StandardCharsets.UTF_8));
	}
		
	byteArrays.add(("--" + boundary + "--").getBytes(StandardCharsets.UTF_8));

	// step5: Request API
	HttpRequest request = HttpRequest.newBuilder()
			.POST(BodyPublishers.ofByteArrays(byteArrays))
			.uri(URI.create(apiDomain + apiURL))
			.setHeader("x-ncp-apigw-timestamp", Long.toString(timestamp))
			.setHeader("x-ncp-iam-access-key", ACCESSKEY)
			.setHeader("x-ncp-apigw-signature-v2", signature)
			.setHeader("x-ncp-apigw-api-key", APIKEY)				
			.headers("Content-Type", "multipart/form-data; boundary=" + boundary)
			.build();

	HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());

	// Check the response value
	int responseCode = response.statusCode();
	String responseBody = response.body().toString();
	
	// do next step (ex, check to transfer succeeded)
	...		
}

2.検査結果確認(getInputFileLog)

File Filter APIの中から getInputFileLogを使用してマルウェアスキャン結果を確認します。

参考

getInputFileLog APIの仕様は getInputFileLog (File Filter)をご参照ください。

2-1.検査結果を確認する Hash値区分

ファイル検査リクエストのシナリオで File Filterに検査をリクエストしたファイルの Hash値を区分します。

2-2.認証値作成

NAVERクラウドプラットフォーム API使用認証に必要な IAM認証値を作成します。認証に必要なヘッダは次の通りです。

  • x-ncp-iam-access-key: コンソールの My Account > アカウントとセキュリティ管理 > セキュリティ管理 > アクセス管理メニューから Access Keyを発行
  • x-ncp-apigw-signature-v2: Access Keyとマッピングされる Secret Keyを HmacSHA256暗号化し、signature値を作成(改行文字は \nを使用)
  • x-ncp-apigw-api-key: API Gatewayで API Keyを発行
  • x-ncp-apigw-timestamp: 認証値ではないがリクエストヘッダに含まれる。API明細を参照
参考

signature値を作成する方法とサンプルコードは、NAVERクラウドプラットフォーム APIガイド > API の概要 > 基本 API > Ncloud API > 2.ヘッダ作成をご参照ください。

2-3.リクエストパラメータ追加

getInputFileLog APIリクエストパラメータ値を追加します。リクエストパラメータは次の通りです。

  • hashCode: Hash値を文字列に追加
  • hashType: Hash値のアルゴリズムを表記(MD5または SHA-1)

以下は、作成されたパラメータの例です。

hashCode=00010efc49b7174d18400710eed1642a7d4b12db&hashType=sha1

2-4.APIリクエスト

File Filter getInputFileLog URIにリクエストを転送します。以下は、getInputFileLogリクエストのサンプルコードです。

public static void main(String[] args)
{
	String apiDomain = "https://filesafer.apigw.ntruss.com";
	String method = "GET";
	String apiURL = "/filefilter/v1/getInputFileLog?hashCode=FILE_HASH&hashType=sha1"; // step 3: add required parameter 

	long timestamp = System.currentTimeMillis();

	// step 2: Create Authentication Value
	String signature = makeSignature(method, apiURL, timestamp);
	
	// step 4: Request API
	URL url = new URL(apiDomain + apiURL);
	HttpURLConnection con = (HttpURLConnection)url.openConnection();
	con.setRequestMethod(method);
	con.setRequestProperty("x-ncp-apigw-timestamp", Long.toString(timestamp));
	con.setRequestProperty("x-ncp-iam-access-key", ACCESSKEY); // access key (from portal or sub account)
	con.setRequestProperty("x-ncp-apigw-signature-v2", signature);

			
	// step5: Check the response value and determine whether to block
	int responseCode = con.getResponseCode();
	BufferedReader br = null;
	
	if(responseCode == 200) {
		br = new BufferedReader(new InputStreamReader(con.getInputStream()));

		String inputLine;
		StringBuffer response = new StringBuffer();
		while ((inputLine = br.readLine()) != null) {
			response.append(inputLine);
		}
	
		// do next step (ex, determine whether to block)
		...

		br.close();
	}
}

2-5.レスポンス値確認とブロック有無を判断

getInputFileLogレスポンスに応じてブロックまたは許可の有無を判断します。

inputFileLogListの数が0であればリクエスト結果がない場合であり、inputFileLogListが2つ以上であれば2回以上分析された場合を意味します。inputFileLogListanalysisStatusCodeフィールド値を読み取り、検査進行状況を確認します。

analysisStatusCodeコード 説明
IPRG Analyzing 分析中
CMPL Analysis completed 分析完了
RDY Ready 分析待ち
ERR Analysis error エラー
EXCN Exclude analysis 例外

inputFileLogListanalysisResultCodeフィールド値を読み取り、検査結果を確認します。

analysisResultCode 説明
M Malware detected マルウェアの検知
N Malware not detected 正常なファイル
E Detection error エラー

マルウェアが検出された場合はファイルをシステムから削除するか、安全に隔離します。
以下は検査分析完了ステータスでありながら、マルウェアが検出された場合のレスポンス例です。

{
  "returnCode": "0",
  "returnMessage": "success",
  "inputFileLogList": [
    {
      "fileType": "application/x-msdownload; format=pe32",
      "fileSize": 740544,
      "md5": "a69acb01b99959efec7c0a2a8caa7545",
      "sha1": "f093e7767bb63ac973b697d3fd1d40a78b87b8bf",
      "sha256": "470a75fe3da2ddf9d27fb3f9c96e6c665506ea7ba26ab89f0c89606f678ae4a2",
      "analysisStatusCode": "CMPL",
      "analysisResultCode": "M",
      "notifyYmdt": 1544005507000,
      "registrationYmdt": 1544005472000,
      "serviceCode": null,
      "applicationCode": null
    },
    {
      "fileType": "application/x-msdownload; format=pe32",
      "fileSize": 740544,
      "md5": "a69acb01b99959efec7c0a2a8caa7545",
      "sha1": "f093e7767bb63ac973b697d3fd1d40a78b87b8bf",
      "sha256": "470a75fe3da2ddf9d27fb3f9c96e6c665506ea7ba26ab89f0c89606f678ae4a2",
      "analysisStatusCode": "CMPL",
      "analysisResultCode": "M",
      "notifyYmdt": 1544006407000,
      "registrationYmdt": 1544006150000,
      "serviceCode": null,
      "applicationCode": null
    },
  ]
}