createJob
    • PDF

    createJob

    • PDF

    記事の要約

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

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

    注意

    顧客所有のウェブサーバでない対象を診断する場合に発生し得る各種法的責任(業務妨害、情報通信網法の違反等に関する民事・刑事上の責任)はご本人にあることを予めご案内いたします。顧客が本 APIを使用した場合、これに同意したものとみなします。

    参考

    サポート範囲および注意事項

    リクエスト

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

    メソッドURI
    PUT/job

    リクエストヘッダ

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

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

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

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

    予約語リスト

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

    UserAgent予約語リスト

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

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

    診断項目の予約語リスト

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

    参考

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

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

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

    • rescan_buttonの値がnullまたはexpiredの場合は再診断できません。
    # リクエスト例
    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
                },
            ]
        }
    }
    

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

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

    • もし、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"
    

    再診断ジョブの作成

    • masterInstanceNoは必ず文字列タイプで入力します。
      • <例> "MasterInstanceNo": "12311231"
    • VulnItemsは必ずリストタイプで入力します。
      • <例> "VulnItems": ["ALL"]
    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"
    }'
    

    レスポンス

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

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

    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の呼び出しをご参照ください。


    この記事は役に立ちましたか?

    What's Next
    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.