- 인쇄
- PDF
createJob
- 인쇄
- PDF
Classic/VPC 환경에서 이용 가능합니다.
신규 진단 작업을 등록하거나 진단 완료한 작업을 재진단 작업으로 생성합니다.
고객 소유의 웹 서버가 아닌 대상을 진단할 경우 발생할 수 있는 각종 법적 책임(업무방해, 정보통신망법 위반 등 관련 민형사상 책임)은 본인에게 있음을 알려드립니다. API를 사용하는 것은 고객이 이를 동의한 것으로 간주합니다.
지원 범위 및 주의 사항
- createJob API는 네이버 클라우드 플랫폼 콘솔에서 Web Security Checker 이용 신청 후 사용할 수 있습니다.
- createJob API 호출 시 과금이 발생합니다. 반드시 요금 정책을 Web Security Checker 소개 페이지에서 확인해 주십시오.
- createJob API는 네이버 클라우드 플랫폼에서 생성한 서버에 대한 진단만 지원합니다.
- 네이버 클라우드 플랫폼에서 생성하지 않은 외부 서버는 네이버 클라우드 플랫폼 콘솔(Web Security Checker)을 통해 이용해 주십시오.
- createJob API는 예약 기능을 제공하지 않으므로 API 호출 즉시 진단을 시작합니다.
- 예약 기능은 네이버 클라우드 플랫폼 콘솔(Web Security Checker)을 통해 이용해 주십시오.
- 예약 기능이 필요한 경우, API 구현 과정에서 예약 시간에 createJob API를 호출해 주십시오.
요청
요청 형식을 설명합니다. 요청 형식은 다음과 같습니다.
메서드 | URI |
---|---|
PUT | /job |
요청 헤더
Web Security Checker에서 공통으로 사용하는 헤더에 대한 자세한 내용은 Web Security Checker 요청 헤더를 참조해 주십시오.
요청 경로 파라미터
파라미터에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
StartUrl | String | Required | 진단 대상 URL
|
ExcludeUrl | List | Required | 진단 제외 URL 목록
|
Headers | Object | Optional | 인증을 위한 HTTP Header 정보
|
VulnItems | List | Required | 진단 항목 목록
|
UserAgent | String | Required | 진단 작업에 이용할 브라우저(User-Agent) 정보를 선택
|
Speed | String | Required | 진단 작업의 속도를 조절
|
Memo | String | Optional | 진단 작업에 대한 메모
|
MasterInstanceNo | String | Optiona | 재진단 작업을 생성할 완료된 진단의 인스턴스 번호(InstanceNo)
|
예약어 목록
예약어 목록은 다음과 같습니다.
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 | 웹 서비스에서 서버 정보, 오류 정보 등 공격에 활용될 수 있는 정보가 노출되는 취약점 |
URL Redirection | 사용자가 의도하지 않은 페이지로 이동시킬 수 있는 취약점 |
Insecure SSL/TLS | 안전하지 않은 SSL/TLS 버전 사용으로 인해, 발생 가능한 취약점을 점검하는 항목 |
Mixed Content | 보호되어야 하는 중요한 콘텐츠가 HTTP를 사용해 전송되는 취약점 |
HTTP Request Smuggling | 공격자가 조작된 HTTP 패킷을 웹 서버로 전송하여, 원격에 있는 임의의 사용자가 웹 서버로 전송하는 HTTP 패킷을 조작할 수 있는 취약점 |
Personal Information Exposure | 웹 서비스에서 주민등록번호, 신용카드번호 등 개인정보가 평문으로 노출되는 취약점 |
SSI Injection | SSI(Server-Side Includes) 설정에 의해 악의적인 동적 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 호출을 참조해 주십시오.