createJob

Prev Next

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

新規の診断ジョブを登録するか、診断完了したジョブを再診断ジョブとして作成します。

注意

createJob API使用時は次の点にご注意ください。

  • 顧客所有のウェブサーバでない対象を診断する場合に発生し得る各種法的責任(業務妨害、情報通信網法の違反等に関する民事・刑事上の責任)はご本人にあることを予めご案内いたします。顧客が本 APIを使用した場合、これに同意したものとみなします。
  • createJob APIの呼び出し時に料金が発生します。呼び出す前に、Web Security Checkerの紹介ページで料金ポリシーを必ずご確認ください。
参考

createJob APIの使用時は次の内容をご確認ください。

  • createJob APIは NAVERクラウドプラットフォームによって作成されたサーバに対する診断のみサポートします。
    • NAVERクラウドプラットフォームによって作成されていない外部サーバは、NAVERクラウドプラットフォームコンソールの Web Security Checkerで診断を行ってください。
  • createJob APIは予約機能を提供していないため、APIを呼び出すと同時に診断を開始します。
    • 予約機能は NAVERクラウドプラットフォームコンソールの Web Security Checkerで使用できます。
    • 予約機能が必要な場合は、API実装の際、予約時間に createJob APIを呼び出すようにしてください。

リクエスト

リクエスト形式を説明します。リクエスト形式は次の通りです。

メソッド URI
PUT /job

リクエストヘッダ

Web Security Checkerで共通して使用されるヘッダの詳細は、Web Security Checkerのリクエストヘッダをご参照ください。

リクエストパスパラメータ

パラメータの説明は次の通りです。

フィールド タイプ 必須の有無 説明
StartUrl String Required 診断対象の URL
  • <例> "https://www.ncloud.com"
ExcludeUrl List Optional 診断除外 URLリスト
  • <例> ["https://www.ncloud.com/events", "https://www.ncloud.com/product/security/webSecurityChecker"]
Headers Object Optional 認証目的の HTTP Header情報
  • <例> { "Cookie": "JSESSIONID=AB123123123123ASAS", "Accept": "text/html.....", "Authorization": "Bearer ejs..."
VulnItems List Required 診断項目リスト
UserAgent String Required 診断ジョブに利用するブラウザ(User-Agent)情報を選択
Speed String Required 診断ジョブの速度を調整
  • "1" | "2" | "3"
    • "1": 普通
    • "2": やや早く
    • "3": 早く
Memo String Optional 診断ジョブに関するメモ
  • <例> "上半期セキュリティ診断"
MasterInstanceNo String Optional 再診断ジョブ作成対象の、完了した診断のインスタンス番号(InstanceNo)
  • 再診断のためのインスタンス番号はgetJobsを通じて確認
  • <例> "1234111231"

予約語リスト

予約語リストは次の通りです。

UserAgent予約語リスト

Web Securtiy Checkerは、ユーザーのウェブサイトに最適なブラウザを選択できるように診断オプションを提供します。
次の UserAgent予約語の説明を参考にして、診断の作成時に必要なUserAgent値を指定します。

予約語 説明
PC Chrome PC環境の Chromeブラウザ
PC IE PC環境の Internet Explorerブラウザ
iPhone モバイル環境の iPhoneブラウザ
Android モバイル環境の Androidブラウザ

診断項目の予約語リスト

診断作成 APIは、診断項目を明示して、希望する診断を選択して行える機能を提供します。

参考

診断項目の詳細は、Web Security Checkerの紹介ページ > 診断項目からもご確認できます。

次の診断項目予約語の説明を参考にして、診断の作成時に必要なVulnItems値を指定します。

  • すべてのチェック項目で診断する場合: ALLキーワードを選択
  • 一部のチェック項目だけで診断する場合: 希望するキーワードだけ選択
予約語 説明
ALL Web Security Checkerがサポートするすべての診断項目で診断を実行(推奨オプション)
LFI ウェブサーバの内部に存在する悪性ファイルを含め(Include)て、そのファイルを実行する脆弱性
SQL Injection ウェブアプリケーションで使用される SQL構文に攻撃者が任意の構文を注入(Injection)して、内部データベースのデータを流出・改ざんする脆弱性
XSS 攻撃者がウェブページに悪性スクリプトを挿入する脆弱性
RFI 遠隔地の攻撃者サーバに存在する悪性ファイルを含め(Include)て、そのファイルを実行する脆弱性
SSRF 外部からはアクセスできない内部の他のサーバにリクエストするように介入し、内部サーバに意図していない行為をさせる脆弱性
File Upload 悪性スクリプトファイルをウェブサーバにアップロードしてアクセスする場合、ウェブサーバのユーザー権限で実行されてしまう脆弱性
File Download サーバに存在するファイルが意図せずにクライアントにダウンロードされる脆弱性
XXE XML文書で動的に外部 URIのリソースを含める External Entity機能を悪用し、意図していない動作をさせる脆弱性
Command Injection 攻撃者がサーバに直接コマンドを伝えて実行させる脆弱性
Insufficient Authorization 通常、ユーザーに非表示にすべき特定のウェブアプリケーションに対してアクセス可能かどうかをチェックする項目
Specific Vulnerability 特定のアプリケーションに関連する影響力の大きい脆弱性をチェックする項目
File Management ウェブサーバの運用に不要なファイルはすべて削除するか、他のシステムで管理する必要がある
Directory Listing ディレクトリ内のファイルリストが表示される脆弱性
Source Code Disclosure ウェブサーバがスクリプトファイルを正常に処理できないため、ソースコードがそのまま晒される脆弱性
Information Disclosure Webサービスでサーバ情報、エラー情報などの攻撃に活用できる情報が晒される脆弱性
URL Redirection ユーザーが意図していないページに移動させる脆弱性
Insecure SSL/TLS 安全でない SSL/TLSバージョンの使用によって発生し得る脆弱性をチェックする項目
Mixed Content 保護されるべき重要なコンテンツが HTTPを介して転送されてしまう脆弱性
HTTP Request Smuggling 攻撃者が偽装された HTTPパケットをウェブサーバに転送し、遠隔地にいる不特定のユーザーがウェブサーバに転送する HTTPパケットを偽装する脆弱性
Personal Information Exposure 住民登録番号、クレジットカード番号などの個人情報が Webサービスに平文で晒される脆弱性
SSI Injection Server-Side Includes(SSI)設定によって悪意ある動的 HTMLコードが実行される脆弱性

リクエスト例(新規)

リクエストのサンプルコードは次の通りです。

curl --location --request GET 'https://wsc.apigw.ntruss.com/api/v1/job'
--header 'x-ncp-apigw-timestamp: {Timestamp}'
--header 'x-ncp-iam-access-key: {Access Key}'
--header 'x-ncp-apigw-signature-v2: {API Gateway Signature}'
--header 'Content-Type: application/json'
--data-raw '{
"StartUrl": "https://www.ncloud.com",
"ExcludeUrl": [
    "https://www.ncloud.com/event",
    "https://www.ncloud.com/robot.txt"
],
"Headers": {
    "Upgrade-Insecure-Requests": "1",
    "Accept": "text/html.....",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
    "Cookie": "XSRF-TOKEN=eyJ.....; PHPSESSIONID=e.....",
    "X-Custom-Header": "Bar"
},
"VulnItems": [
    "ALL"
],
"UserAgent": "Android",
"Speed": "1",
"Memo": "OPEN API TEST"
}'

リクエスト例(再診断)

リクエストのサンプルコードは次の通りです。

再診断可能な診断の検索(手動)

次の例のように、getJobs (Web Security Checker) APIを呼び出したレスポンスのresources > record_data属性の項目のうち、"rescan_button": "possible"と表記された項目のinstanceNoを確認します。

# リクエスト例
curl --location --request GET "https://wsc.apigw.ntruss.com/api/v1/jobs?limit=10&page=1"
--header 'Content-Type: application/json'
--header 'x-ncp-iam-access-key: {x-ncp-iam-access-key}'
--header 'x-ncp-apigw-timestamp: {x-ncp-apigw-timestamp}'
--header 'x-ncp-apigw-signature-v2: {x-ncp-apigw-signature-v2}'

# レスポンス例
{
    "returnCode": "0",
    "returnDesc": "Request Success",
    "returnMessage": "成功",
    "resources": {
        "total_cnt": 1,
        "total_page_cnt": "1",
        "current_start_page": "1",
        "current_end_page": "10",
        "record_data": [
            {
                "instanceNo": "12311231",
                "start_date": "2020-12-02 23:34:54",
                "end_date": "2020-12-02 23:36:43",
                "status": "Complete",
                "start_url": "http://ncloud.com",
                "crawl_cnt": "10",
                "scan_cnt": "1",
                "memo": "OPEN APIテスト(#1)",
                "result_button": "report",
                "result_desc": null,
                "rescan_button": "possible",
                "slave_data": null
            },
        ]
    }
}
  • rescan_buttonの値がnullまたはexpiredの場合は再診断できません。

再診断可能な診断の検索(jqユーティリティ使用)

次の例のように、getJobs (Web Security Checker) APIとjqユーティリティを利用すると再診断可能なinstanceNoリストを確認できます。

# リクエスト例
curl --location --request GET "https://wsc.apigw.ntruss.com/api/v1/jobs?limit=10&page=1"
--header 'Content-Type: application/json'
--header 'x-ncp-iam-access-key: {x-ncp-iam-access-key}'
--header 'x-ncp-apigw-timestamp: {x-ncp-apigw-timestamp}'
--header 'x-ncp-apigw-signature-v2: {x-ncp-apigw-signature-v2}' | jq '.resources.record_data[] | select( .rescan_button == "possible" ) | .instanceNo'

# レスポンス例
%"12311231"
  • instanceNoがない場合、再診断できる診断ジョブがないことを意味します。

再診断ジョブの作成

再診断ジョブを作成するサンプルコードは次の通りです。

curl --location --request GET 'https://wsc.apigw.ntruss.com/api/v1/job'
--header 'x-ncp-apigw-timestamp: {Timestamp}'
--header 'x-ncp-iam-access-key: {Access Key}'
--header 'x-ncp-apigw-signature-v2: {API Gateway Signature}'
--header 'Content-Type: application/json'
--data-raw '{
 "StartUrl": "https://www.ncloud.com",
    "ExcludeUrl": [
        "https://www.ncloud.com/event",
        "https://www.ncloud.com/robot.txt"
    ],
    "Headers": {
        "Upgrade-Insecure-Requests": "1",
        "Accept": "text/html.....",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
        "Cookie": "XSRF-TOKEN=eyJ.....; PHPSESSIONID=e.....",
        "X-Custom-Header": "Bar"
    },
    "VulnItems": [
        "ALL"
    ],
    "UserAgent": "Android",
    "Speed": "1",
    "Memo": "OPEN API TEST",
    "MasterInstanceNo": "12311231"
}'
  • masterInstanceNoは必ず文字列タイプで入力します。
    • <例> "MasterInstanceNo": "12311231"
  • VulnItemsは必ずリストタイプで入力します。
    • <例> "VulnItems": ["ALL"]

レスポンス

レスポンス形式を説明します。

レスポンスステータスコード

Web Security Checker APIで共通して使用されるエラーコードの詳細は、Web Security Checkerの共通エラーコードをご参照ください。

レスポンス例

レスポンスのサンプルコードは次の通りです。

  • 診断ジョブ作成完了

    {
        "returnCode": "0",
        "returnDesc": "Request Success",
        "returnMessage": "Success",
        "resources": null
    }
    
  • 診断ジョブ作成エラー: 無効な InstanceIdを入力した場合

    {
        "error": {
            "errorCode": 901,
            "message": "API Call Fail"
        }
    }
    
  • 診断ジョブ作成エラー: VulnItemsパラメータに診断項目予約語リストにないキーワードが存在するか、ALL予約語を他の予約語と一緒に使用する場合

    {
        "error": {
            "errorCode": 160433,
            "message": "Param Value Not Define - VulnItems"
        }
    }
    
  • 診断ジョブ作成エラー: 無効な形式のパラメータを入力した場合

    {
        "error": {
            "errorCode": 160433,
            "message": "Param Value Not Define - VulnItems"
        }
    }
    
  • 診断ジョブ作成エラー: 顧客本人の資産ではないサーバに対して診断をリクエストする場合(APIを利用するアカウントのサーバに対する権限の確認が必要)

    {
        "error": {
            "errorCode": 160451,
            "message": "Assets_Check_Fail"
        }
    }
    

サンプルコード

サンプルコードを紹介します。

新規診断の作成

make_signature関数でシグネチャーを作成してリクエストヘッドを作成し、入力したリクエストパラメータに応じて新規の診断ジョブを作成してレスポンスコードが200の場合、結果を出力するサンプルコードは次の通りです。

import sys
import os
import hashlib
import hmac
import base64
import requests
import time
import json

def make_signature(method, uri, timestamp):

    access_key = "{accessKey}"  # access key id (from portal or sub account)
    secret_key = "{secretKey}"  # secret key (from portal or sub account)
    secret_key = bytes(secret_key, 'UTF-8')

    method = method
    uri = uri

    message = method + " " + uri + "\n" + timestamp + "\n" + access_key
    message = bytes(message, 'UTF-8')
    signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
    return signingKey

timestamp = str(int(time.time() * 1000))

method = 'PUT'
uri = '/api/v1/job'
payload = {
"StartUrl": "https://www.ncloud.com",
"ExcludeUrl": [
    "https://www.ncloud.com/event",
    "https://www.ncloud.com/robot.txt"
],
"Headers": {
    "Upgrade-Insecure-Requests": "1",
    "Accept": "text/html.....",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
    "Cookie": "XSRF-TOKEN=eyJ.....; PHPSESSIONID=e.....",
    "X-Custom-Header": "Bar"
},
"VulnItems": [
    "ALL"
],
"UserAgent": "Android",
"Speed": "1",
"Memo": "OPEN API TEST"
}

timestamp = str(int(time.time() * 1000))

signature = make_signature(method, uri, timestamp)

headers = {
    'x-ncp-apigw-signature-v2': signature.decode('utf-8'),
    'x-ncp-apigw-timestamp': timestamp,
    'x-ncp-iam-access-key': '{accessKey}', # access key id (from portal or sub account)
    'Content-Type': 'application/json'
}

response = requests.request(
    method,
    f"https://wsc.apigw.ntruss.com{uri}",
    headers=headers,
    data=json.dumps(payload), # Json format required
)

if response.status_code == 200:
    print(response.text)

再診断の作成

再診断ジョブを作成するには、再診断作成が可能な診断のinstanceNo値を抽出し、この値を利用して再診断作成 APIを呼び出す必要があります。

  • getJobsまたはsearchJobs APIを呼び出したレスポンスのresources > record_data属性の項目のうち、"rescan_button": "possible"と表記された項目のinstanceNoを確認します。
  • jqユーティリティを使用して再診断可能な診断のinstanceNo値を抽出する方法は、再診断可能な診断の検索(jqユーティリティ使用)をご参照ください。もし、instanceNoがない場合、再診断できる診断ジョブがないことを意味します。

make_signature関数でシグネチャーを作成してリクエストヘッドを作成し、入力したリクエストパラメータに応じて再診断ジョブを作成してレスポンスコードが200の場合、結果を出力するサンプルコードは次の通りです。

import sys
import os
import hashlib
import hmac
import base64
import requests
import time
import json

def make_signature(method, uri, timestamp):

    access_key = "{accessKey}"  # access key id (from portal or sub account)
    secret_key = "{secretKey}"  # secret key (from portal or sub account)
    secret_key = bytes(secret_key, 'UTF-8')

    method = method
    uri = uri

    message = method + " " + uri + "\n" + timestamp + "\n" + access_key
    message = bytes(message, 'UTF-8')
    signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
    return signingKey

timestamp = str(int(time.time() * 1000))

method = 'PUT'
uri = '/api/v1/job'
payload = {
 "StartUrl": "https://www.ncloud.com",
    "ExcludeUrl": [
        "https://www.ncloud.com/event",
        "https://www.ncloud.com/robot.txt"
    ],
    "Headers": {
        "Upgrade-Insecure-Requests": "1",
        "Accept": "text/html.....",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
        "Cookie": "XSRF-TOKEN=eyJ.....; PHPSESSIONID=e.....",
        "X-Custom-Header": "Bar"
    },
    "VulnItems": [
        "ALL"
    ],
    "UserAgent": "Android",
    "Speed": "1",
    "Memo": "OPEN API TEST",
    "MasterInstanceNo": "12311231"
}

response = requests.request(
    method,
    f"https://wsc.apigw.ntruss.com{uri}",
    headers=headers,
    data=json.dumps(payload), # Json format required
)

if response.status_code == 200:
    print(response.text)
参考

サンプルコードは Python3を基に作成しました。Java、Node.jsなど他の言語で作成したサンプルコードは、API Gatewayご利用ガイドのAPIの呼び出しをご参照ください。