docs: Tools-Tabelle komplett (9 Tools) + Suppression-Write + VULNERABILITY_ANALYSIS
CI / test (push) Failing after 5m23s
CI / test (push) Failing after 5m23s
This commit is contained in:
@@ -1,7 +1,8 @@
|
|||||||
# dependencyTrack-MCP
|
# dependencyTrack-MCP
|
||||||
|
|
||||||
MCP-Server fuer [OWASP Dependency-Track](https://dependencytrack.org/), in Rust.
|
MCP-Server fuer [OWASP Dependency-Track](https://dependencytrack.org/), in Rust.
|
||||||
Read-only Zugriff auf Projekte, Findings und Metriken.
|
Ueberwiegend lesender Zugriff (Projekte, Findings, Metriken, VEX/SBOM u.a.) plus
|
||||||
|
eine geschuetzte Schreib-Operation: Finding-Suppression/Analyse.
|
||||||
|
|
||||||
Zwei Frontends, eine gemeinsame Tool-Logik:
|
Zwei Frontends, eine gemeinsame Tool-Logik:
|
||||||
|
|
||||||
@@ -19,7 +20,7 @@ Zwei Frontends, eine gemeinsame Tool-Logik:
|
|||||||
```
|
```
|
||||||
crates/dtrack-config Config (TOML laden/speichern, Secret-Masking, Persistenz)
|
crates/dtrack-config Config (TOML laden/speichern, Secret-Masking, Persistenz)
|
||||||
crates/dtrack-perms RBAC-Policy (Rollen/Clients, Deny-overrides-Allow)
|
crates/dtrack-perms RBAC-Policy (Rollen/Clients, Deny-overrides-Allow)
|
||||||
crates/dtrack-core DT-REST-Client (reqwest+rustls, read-only)
|
crates/dtrack-core DT-REST-Client (reqwest+rustls)
|
||||||
crates/dtrack-tools rmcp-Server (die Tools) -- transport-unabhaengig, geteilt
|
crates/dtrack-tools rmcp-Server (die Tools) -- transport-unabhaengig, geteilt
|
||||||
crates/dtrack-stdio Bin: stdio-Frontend
|
crates/dtrack-stdio Bin: stdio-Frontend
|
||||||
crates/dtrack-http Bin: HTTP-Frontend (axum + StreamableHTTP + Admin-UI)
|
crates/dtrack-http Bin: HTTP-Frontend (axum + StreamableHTTP + Admin-UI)
|
||||||
@@ -27,18 +28,38 @@ crates/dtrack-http Bin: HTTP-Frontend (axum + StreamableHTTP + Admin-UI)
|
|||||||
|
|
||||||
## Tools
|
## Tools
|
||||||
|
|
||||||
|
Lesend:
|
||||||
|
|
||||||
| Tool | Argument | DT-Endpoint |
|
| Tool | Argument | DT-Endpoint |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `list_projects` | -- | `GET /project` |
|
| `list_projects` | -- | `GET /project` |
|
||||||
|
| `lookup_project` | `name`, `version?` | `GET /project/lookup` |
|
||||||
|
| `project_components` | `uuid` | `GET /component/project/{uuid}` |
|
||||||
| `project_findings` | `uuid` | `GET /finding/project/{uuid}` |
|
| `project_findings` | `uuid` | `GET /finding/project/{uuid}` |
|
||||||
| `project_metrics` | `uuid` | `GET /metrics/project/{uuid}/current` |
|
| `project_metrics` | `uuid` | `GET /metrics/project/{uuid}/current` |
|
||||||
|
| `project_violations` | `uuid` | `GET /violation/project/{uuid}` (braucht `VIEW_POLICY_VIOLATION`) |
|
||||||
|
| `project_vex` | `uuid` | `GET /vex/cyclonedx/project/{uuid}` |
|
||||||
|
| `project_bom` | `uuid` | `GET /bom/cyclonedx/project/{uuid}` |
|
||||||
|
|
||||||
|
Schreibend (braucht das DT-Recht `VULNERABILITY_ANALYSIS`):
|
||||||
|
|
||||||
|
| Tool | Argument | DT-Endpoint |
|
||||||
|
|---|---|---|
|
||||||
|
| `suppress_finding` | `project`, `component`, `vulnerability`, `suppressed?`, `state?`, `justification?`, `comment?` | `PUT /analysis` |
|
||||||
|
|
||||||
|
> `suppress_finding` ist die einzige schreibende Operation. Die drei UUIDs
|
||||||
|
> (project/component/vulnerability) stammen aus der `project_findings`-Antwort.
|
||||||
|
> `suppressed` ist standardmaessig `true` (`false` hebt die Unterdrueckung auf).
|
||||||
|
> Wer nur lesen soll, bekommt einen Key **ohne** `VULNERABILITY_ANALYSIS` --
|
||||||
|
> dann scheitert der Write serverseitig mit HTTP 403. Im HTTP-Modus zusaetzlich
|
||||||
|
> per RBAC eingrenzbar (eigene Rolle / `deny`).
|
||||||
|
|
||||||
## Konfiguration (Umgebungsvariablen)
|
## Konfiguration (Umgebungsvariablen)
|
||||||
|
|
||||||
| Var | Pflicht | Bedeutung |
|
| Var | Pflicht | Bedeutung |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `DTRACK_URL` | ja* | Basis-URL der DT-Instanz (ohne `/api/v1`, wird angehaengt) |
|
| `DTRACK_URL` | ja* | Basis-URL der DT-Instanz (ohne `/api/v1`, wird angehaengt) |
|
||||||
| `DTRACK_API_KEY` | ja* | API-Key eines **read-only** Teams (`VIEW_PORTFOLIO`, `VIEW_VULNERABILITY`) |
|
| `DTRACK_API_KEY` | ja* | API-Key eines Teams. Lesen: `VIEW_PORTFOLIO` + `VIEW_VULNERABILITY` (Policy-Verstoesse: `VIEW_POLICY_VIOLATION`); fuer `suppress_finding`: `VULNERABILITY_ANALYSIS` |
|
||||||
| `DTRACK_INSECURE` | nein | `1`/`true` -> TLS-Pruefung aus (Notbehelf bei internem CA-Cert) |
|
| `DTRACK_INSECURE` | nein | `1`/`true` -> TLS-Pruefung aus (Notbehelf bei internem CA-Cert) |
|
||||||
| `DTRACK_CONFIG` | nein | Pfad zu einer TOML-Config; einmal aus env gebootstrappt, danach massgeblich |
|
| `DTRACK_CONFIG` | nein | Pfad zu einer TOML-Config; einmal aus env gebootstrappt, danach massgeblich |
|
||||||
| `DTRACK_PERMISSIONS` | nein | (nur HTTP) Pfad zur RBAC-Policy; gesetzt -> RBAC statt flacher Token-Liste |
|
| `DTRACK_PERMISSIONS` | nein | (nur HTTP) Pfad zur RBAC-Policy; gesetzt -> RBAC statt flacher Token-Liste |
|
||||||
@@ -114,7 +135,8 @@ volumes:
|
|||||||
`docker compose up -d` (apiserver braucht ~4 GB RAM + ein paar Minuten beim
|
`docker compose up -d` (apiserver braucht ~4 GB RAM + ein paar Minuten beim
|
||||||
Erststart). Dann `http://localhost:8082` (Login `admin`/`admin`), unter
|
Erststart). Dann `http://localhost:8082` (Login `admin`/`admin`), unter
|
||||||
**Administration -> Access Management -> Teams** einen API-Key mit
|
**Administration -> Access Management -> Teams** einen API-Key mit
|
||||||
`VIEW_PORTFOLIO` + `VIEW_VULNERABILITY` erzeugen und ein Projekt anlegen.
|
`VIEW_PORTFOLIO` + `VIEW_VULNERABILITY` erzeugen (fuer den Suppression-Test
|
||||||
|
zusaetzlich `VULNERABILITY_ANALYSIS`) und ein Projekt anlegen.
|
||||||
Aus dem MCP-Container ist die DT unter `http://host.docker.internal:8081`
|
Aus dem MCP-Container ist die DT unter `http://host.docker.internal:8081`
|
||||||
erreichbar (nicht `localhost`).
|
erreichbar (nicht `localhost`).
|
||||||
|
|
||||||
@@ -241,17 +263,23 @@ leer = offen). Fuer feinere Rechte `permissions.toml.example` nach
|
|||||||
|
|
||||||
Modell: benannte Rollen mit `allow`/`deny` (`"*"` = alle Tools, **deny schlaegt
|
Modell: benannte Rollen mit `allow`/`deny` (`"*"` = alle Tools, **deny schlaegt
|
||||||
allow**), Clients ordnen einen Bearer-Token einer Rolle zu. Ein nicht erlaubter
|
allow**), Clients ordnen einen Bearer-Token einer Rolle zu. Ein nicht erlaubter
|
||||||
`tools/call` wird mit **403** abgewiesen.
|
`tools/call` wird mit **403** abgewiesen. Tipp: das schreibende `suppress_finding`
|
||||||
|
gezielt nur Auditor-Rollen erlauben (oder breit per `deny` ausschliessen).
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[[roles]]
|
[[roles]]
|
||||||
name = "metrics-only"
|
name = "read-only"
|
||||||
allow = ["list_projects", "project_metrics"]
|
allow = ["*"]
|
||||||
|
deny = ["suppress_finding"]
|
||||||
|
|
||||||
|
[[roles]]
|
||||||
|
name = "auditor"
|
||||||
|
allow = ["*"]
|
||||||
|
|
||||||
[[clients]]
|
[[clients]]
|
||||||
name = "dashboard-bot"
|
name = "dashboard-bot"
|
||||||
token = "GEHEIM"
|
token = "GEHEIM"
|
||||||
role = "metrics-only"
|
role = "read-only"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Admin-UI
|
## Admin-UI
|
||||||
|
|||||||
Reference in New Issue
Block a user