통합 가이드
서비스를 보호하세요
악성 파일 업로드로부터
Nightwatch는 업로드된 파일이 저장소에 도달하기 전에 웹쉘, 위장 실행파일, 악성 문서를 스캔합니다. API 호출 한 줄로 보호를 추가하세요.
WAF가 잡지 못하는 것
WAF는 HTTP 요청 패턴(SQL 인젝션, XSS)을 검사합니다. 하지만 사용자가 정상적인 POST 요청으로 JPEG로 위장한 PHP 웹쉘을 업로드하면, WAF는 문제를 감지하지 못합니다. Nightwatch는 파일의 실제 내용을 검사합니다.
웹쉘 업로드
이미지로 위장한 PHP/JSP 쉘 — 서버 침해의 1순위 벡터
위장 실행파일
.jpg/.pdf 확장자의 ELF/PE 바이너리
악성 문서
Office 매크로, PDF exploit, polyglot 파일
암호화폐 채굴기
취약한 엔드포인트를 통해 업로드된 채굴 바이너리
통합 방식
에이전트 설치
5분서버에 설치하면 업로드 디렉토리를 자동 감시합니다. 코드 수정 없음.
API 통합
30분파일 저장 전에 스캔 API를 호출합니다. 모든 언어에서 사용 가능.
AWS EB / Docker
다음 배포 시배포 패키지에 설정 파일을 추가합니다. 배포 시 자동 설치.
방식 1: 에이전트 설치
명령어 한 줄. 코드 수정 없음. 모든 Linux 서버에서 동작합니다.
curl -sL https://install.aientrophy.com/agent | sudo bash -s -- --key YOUR_API_KEY
방식 2: API 통합
업로드 로직 앞에 스캔 호출을 추가합니다. 악성이면 거부합니다.
Endpoint
POST https://nightwatch.aientrophy.com/api/v1/scan응답
{
"status": "clean", // "clean" | "suspicious" | "malicious"
"malware_name": null, // malware name if detected
"severity": null, // "critical" | "high" | "medium" | "low"
"ai_analysis": "..." // AI explanation
}코드 예제
PHP
$ch = curl_init('https://nightwatch.aientrophy.com/api/v1/scan');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['x-api-key: YOUR_API_KEY'],
CURLOPT_POSTFIELDS => ['file' => new CURLFile($tmp_path)],
]);
$result = json_decode(curl_exec($ch), true);
if ($result['status'] === 'malicious') {
die('Upload blocked: malware detected');
}Node.js
const form = new FormData();
form.append('file', fileBuffer, filename);
const res = await fetch('https://nightwatch.aientrophy.com/api/v1/scan', {
method: 'POST',
headers: { 'x-api-key': 'YOUR_API_KEY' },
body: form,
});
const { status } = await res.json();
if (status === 'malicious') {
throw new Error('Upload blocked: malware detected');
}Python
import httpx
resp = httpx.post(
'https://nightwatch.aientrophy.com/api/v1/scan',
headers={'x-api-key': 'YOUR_API_KEY'},
files={'file': (filename, file_bytes)},
timeout=30,
)
if resp.json()['status'] == 'malicious':
raise Exception('Upload blocked: malware detected')Java
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("file", new ByteArrayResource(file.getBytes()) {
@Override public String getFilename() { return file.getOriginalFilename(); }
});
HttpHeaders headers = new HttpHeaders();
headers.set("x-api-key", "YOUR_API_KEY");
ResponseEntity<Map> resp = restTemplate.exchange(
"https://nightwatch.aientrophy.com/api/v1/scan",
HttpMethod.POST, new HttpEntity<>(body, headers), Map.class);
if ("malicious".equals(resp.getBody().get("status")))
return ResponseEntity.badRequest().body("Malware detected");Go
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, _ := writer.CreateFormFile("file", filename)
part.Write(fileBytes)
writer.Close()
req, _ := http.NewRequest("POST",
"https://nightwatch.aientrophy.com/api/v1/scan", body)
req.Header.Set("x-api-key", "YOUR_API_KEY")
req.Header.Set("Content-Type", writer.FormDataContentType())
resp, _ := http.DefaultClient.Do(req)
// Check resp for "malicious" status에러 처리: Fail-Open 원칙
Nightwatch API에 연결할 수 없으면 업로드를 허용합니다. 보안 도구 때문에 서비스 가용성이 깨져서는 안 됩니다. 모든 코드 예제에 이 원칙이 반영되어 있습니다.
성능 영향
| 파일 크기 | 로컬 스캔 | Cloud AI 포함 |
|---|---|---|
| < 1 MB | ~50ms | ~8초 |
| 1–10 MB | ~200ms | ~12초 |
| 10–50 MB | ~1초 | ~20초 |
Cloud AI는 의심 파일에만 호출됩니다. 정상 파일은 로컬 스캔만으로 수 밀리초 내에 통과합니다.