Files
kubescape/httphandler/README.md
2025-11-30 11:47:00 +01:00

340 lines
7.6 KiB
Markdown

# Kubescape HTTP Handler
The HTTP Handler provides a REST API for running Kubescape scans programmatically. This enables integration with CI/CD pipelines, custom dashboards, and automation workflows.
## Table of Contents
- [Overview](#overview)
- [API Reference](#api-reference)
- [Trigger Scan](#trigger-scan)
- [Get Results](#get-results)
- [Check Status](#check-status)
- [Delete Results](#delete-results)
- [Request/Response Objects](#requestresponse-objects)
- [API Examples](#api-examples)
- [Environment Variables](#environment-variables)
- [Deployment Examples](#deployment-examples)
- [Debugging](#debugging)
---
## Overview
When running Kubescape as a service, it starts a web server on port `8080` that exposes REST APIs for:
- Triggering security scans (async or sync)
- Retrieving scan results
- Checking scan status
- Managing cached results
---
## API Reference
### Trigger Scan
**Endpoint:** `POST /v1/scan`
Triggers a Kubescape scan. By default, scans run asynchronously and return a scan ID immediately.
**Query Parameters:**
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `wait` | bool | `false` | Wait for scan to complete (synchronous mode) |
| `keep` | bool | `false` | Keep results in cache after returning |
**Request Body:** See [Trigger Scan Object](#trigger-scan-object)
**Response (async):**
```json
{
"id": "scan-12345",
"type": "busy",
"response": "scanning in progress"
}
```
**Response (sync with `wait=true`):** Same as [Get Results](#get-results) response.
---
### Get Results
**Endpoint:** `GET /v1/results`
Retrieve scan results.
**Query Parameters:**
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `id` | string | - | Scan ID. If empty, returns latest results |
| `keep` | bool | `false` | Keep results in cache after returning |
**Response (success):**
```json
{
"id": "scan-12345",
"type": "v1results",
"response": { /* scan results object */ }
}
```
**Response (error):**
```json
{
"id": "scan-12345",
"type": "error",
"response": "error message"
}
```
**Response (in progress):**
```json
{
"id": "scan-12345",
"type": "busy",
"response": "scanning in progress"
}
```
---
### Check Status
**Endpoint:** `GET /v1/status`
Check if a scan is still in progress. Useful for polling without retrieving full results.
**Query Parameters:**
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `id` | string | - | Scan ID. If empty, checks if any scan is in progress |
**Response (in progress):**
```json
{
"id": "scan-12345",
"type": "busy",
"response": "scanning in progress"
}
```
**Response (complete):**
```json
{
"id": "scan-12345",
"type": "notBusy",
"response": "scanning completed"
}
```
---
### Delete Results
**Endpoint:** `DELETE /v1/results`
Delete cached scan results.
**Query Parameters:**
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `id` | string | - | Scan ID to delete. If empty, deletes latest |
| `all` | bool | `false` | Delete all cached results |
---
## Request/Response Objects
### Trigger Scan Object
```json
{
"format": "json",
"excludedNamespaces": ["kube-system", "kube-public"],
"includeNamespaces": ["production", "staging"],
"useCachedArtifacts": false,
"keepLocal": true,
"account": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"accessKey": "your-access-key",
"targetType": "framework",
"targetNames": ["nsa", "mitre"]
}
```
| Field | Type | Description |
|-------|------|-------------|
| `format` | string | Output format (default: `json`) |
| `excludedNamespaces` | []string | Namespaces to exclude from scan |
| `includeNamespaces` | []string | Namespaces to include in scan |
| `useCachedArtifacts` | bool | Use cached artifacts (offline mode) |
| `keepLocal` | bool | Don't submit results to backend |
| `account` | string | Kubescape SaaS account ID |
| `accessKey` | string | Kubescape SaaS access key |
| `targetType` | string | `"framework"` or `"control"` |
| `targetNames` | []string | Frameworks/controls to scan |
### Response Object
```json
{
"id": "scan-12345",
"type": "v1results",
"response": { /* payload */ }
}
```
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Scan identifier |
| `type` | string | Response type (see below) |
| `response` | any | Response payload |
**Response Types:**
| Type | Description |
|------|-------------|
| `v1results` | Scan results object |
| `busy` | Scan in progress |
| `notBusy` | No scan in progress |
| `ready` | Scan complete, results ready |
| `error` | Error occurred |
---
## API Examples
### Basic Scan (Async)
```bash
# 1. Trigger scan
curl -X POST http://127.0.0.1:8080/v1/scan \
-H "Content-Type: application/json" \
-d '{"targetType": "framework", "targetNames": ["nsa"]}'
# 2. Check status
curl http://127.0.0.1:8080/v1/status
# 3. Get results
curl http://127.0.0.1:8080/v1/results -o results.json
```
### Synchronous Scan
```bash
curl -X POST "http://127.0.0.1:8080/v1/scan?wait=true" \
-H "Content-Type: application/json" \
-d '{"targetType": "framework", "targetNames": ["nsa"]}' \
-o results.json
```
### Scan Specific Namespaces
```bash
curl -X POST http://127.0.0.1:8080/v1/scan \
-H "Content-Type: application/json" \
-d '{
"includeNamespaces": ["production"],
"targetType": "framework",
"targetNames": ["nsa", "mitre"]
}'
```
### Scan with Account Integration
```bash
curl -X POST http://127.0.0.1:8080/v1/scan \
-H "Content-Type: application/json" \
-d '{
"account": "YOUR-ACCOUNT-ID",
"accessKey": "YOUR-ACCESS-KEY",
"targetType": "framework",
"targetNames": ["nsa"]
}'
```
### Delete All Cached Results
```bash
curl -X DELETE "http://127.0.0.1:8080/v1/results?all=true"
```
---
## Environment Variables
Configure the HTTP handler using environment variables:
| Variable | Description | Example |
|----------|-------------|---------|
| `KS_ACCOUNT` | Default account ID | `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` |
| `KS_EXCLUDE_NAMESPACES` | Default namespaces to exclude | `kube-system,kube-public` |
| `KS_INCLUDE_NAMESPACES` | Default namespaces to include | `production,staging` |
| `KS_FORMAT` | Default output format | `json` |
| `KS_LOGGER_NAME` | Logger name | `kubescape` |
| `KS_LOGGER_LEVEL` | Log level | `info`, `debug`, `warning`, `error` |
| `KS_DOWNLOAD_ARTIFACTS` | Download artifacts on each scan | `true`, `false` |
---
## Deployment Examples
### Microservice Deployment
Deploy Kubescape as a microservice in your cluster for API-driven scanning.
📖 **[Microservice Deployment Guide →](examples/microservice/README.md)**
### Prometheus Integration
Expose Kubescape metrics for Prometheus scraping.
📖 **[Prometheus Integration Guide →](examples/prometheus/README.md)**
---
## Debugging
### Enable Debug Logging
Set the log level to debug for more verbose output:
```bash
export KS_LOGGER_LEVEL=debug
```
### Performance Profiling
The HTTP handler exposes pprof endpoints for performance analysis:
```bash
# Heap profile
go tool pprof http://localhost:6060/debug/pprof/heap
# CPU profile
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
# Goroutine profile
go tool pprof http://localhost:6060/debug/pprof/goroutine
```
For more information on pprof, see the [pprof documentation](https://pkg.go.dev/net/http/pprof).
---
## Related Documentation
- [CLI Reference](../docs/cli-reference.md)
- [Architecture](../docs/architecture.md)
- [Getting Started Guide](../docs/getting-started.md)
- [Troubleshooting](../docs/troubleshooting.md)