Skip to content

Commit a75f26a

Browse files
✨ implement krakend audit parser (#10924)
* ✨ implement krakend audit parser * advance unittests
1 parent 2d422a0 commit a75f26a

8 files changed

Lines changed: 105 additions & 1 deletion

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
title: "KrakenD Audit Scan"
3+
toc_hide: true
4+
---
5+
Import KrakenD Audit Scan results in JSON format. You can use the following command to audit the KrakenD configuration which then can be uploaded to DefectDojo:
6+
```
7+
krakend audit -c krakend.json -f "{{ marshal . }}" >> recommendations.json
8+
```
9+
10+
### Sample Scan Data
11+
Sample KrakenD Audit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/krakend_audit).
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
702d74c8bc703d11c03cf5b3f7c4319ad0cdeaef68db6426d1112c59e59365a6
1+
b330f7dbd92c2df5a2a0632befc9775bef4a1c62b90375aa511957ebcd0ea82a

dojo/settings/settings.dist.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,6 +1280,7 @@ def saml2_attrib_map_format(dict):
12801280
"Legitify Scan": ["title", "endpoints", "severity"],
12811281
"ThreatComposer Scan": ["title", "description"],
12821282
"Invicti Scan": ["title", "description", "severity"],
1283+
"KrakenD Audit Scan": ["description", "mitigation", "severity"],
12831284
}
12841285

12851286
# Override the hardcoded settings here via the env var
@@ -1505,6 +1506,7 @@ def saml2_attrib_map_format(dict):
15051506
"Legitify Scan": DEDUPE_ALGO_HASH_CODE,
15061507
"ThreatComposer Scan": DEDUPE_ALGO_UNIQUE_ID_FROM_TOOL_OR_HASH_CODE,
15071508
"Invicti Scan": DEDUPE_ALGO_HASH_CODE,
1509+
"KrakenD Audit Scan": DEDUPE_ALGO_HASH_CODE,
15081510
}
15091511

15101512
# Override the hardcoded settings here via the env var
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__author__ = "manuel-sommer"

dojo/tools/krakend_audit/parser.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import json
2+
3+
from dojo.models import Finding
4+
5+
6+
class KrakenDAuditParser:
7+
def get_scan_types(self):
8+
return ["KrakenD Audit Scan"]
9+
10+
def get_label_for_scan_types(self, scan_type):
11+
return scan_type # no custom label for now
12+
13+
def get_description_for_scan_types(self, scan_type):
14+
return "Import JSON reports of KrakenD Audit Scans."
15+
16+
def get_findings(self, file, test):
17+
data = json.load(file)
18+
findings = []
19+
for recommendation in data.get("recommendations", []):
20+
rule = recommendation.get("rule", None)
21+
severity = recommendation.get("severity")
22+
message = recommendation.get("message", None)
23+
if rule is not None:
24+
finding = Finding(
25+
title="KrakenD" + "_" + rule,
26+
test=test,
27+
description="**Rule:** " + rule,
28+
severity=severity.lower().capitalize(),
29+
mitigation=message,
30+
static_finding=True,
31+
dynamic_finding=False,
32+
)
33+
findings.append(finding)
34+
return findings
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{
2+
"recommendations": [
3+
{
4+
"rule": "2.1.2",
5+
"severity": "HIGH",
6+
"message": "Enable TLS or use a terminator in front of KrakenD."
7+
},
8+
{
9+
"rule": "2.1.7",
10+
"severity": "HIGH",
11+
"message": "Enable HTTP security header checks (security/http)."
12+
},
13+
{
14+
"rule": "2.2.1",
15+
"severity": "MEDIUM",
16+
"message": "Hide the version banner in runtime."
17+
},
18+
{
19+
"rule": "3.1.1",
20+
"severity": "LOW",
21+
"message": "Enable a bot detector."
22+
},
23+
{
24+
"rule": "4.2.1",
25+
"severity": "MEDIUM",
26+
"message": "Implement a telemetry system for tracing for monitoring and troubleshooting."
27+
}
28+
],
29+
"stats": {}
30+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"recommendations": [],
3+
"stats": {}
4+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from dojo.models import Test
2+
from dojo.tools.krakend_audit.parser import KrakenDAuditParser
3+
from unittests.dojo_test_case import DojoTestCase
4+
5+
6+
class TestKrakenDAuditParser(DojoTestCase):
7+
8+
def test_parse_no_findings(self):
9+
with open("unittests/scans/krakend_audit/no_findings.json", encoding="utf-8") as testfile:
10+
parser = KrakenDAuditParser()
11+
findings = parser.get_findings(testfile, Test())
12+
self.assertEqual(0, len(findings))
13+
14+
def test_parse_many_findings(self):
15+
with open("unittests/scans/krakend_audit/many_findings.json", encoding="utf-8") as testfile:
16+
parser = KrakenDAuditParser()
17+
findings = parser.get_findings(testfile, Test())
18+
self.assertEqual(5, len(findings))
19+
with self.subTest(i=0):
20+
finding = findings[0]
21+
self.assertEqual("High", finding.severity)
22+
self.assertEqual("Enable TLS or use a terminator in front of KrakenD.", finding.mitigation)

0 commit comments

Comments
 (0)