diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..4e53a13e4 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,34 @@ +name: generate-docs +on: + workflow_dispatch: {} # allow manually triggering the workflow + push: + branches: + - main + paths: + - "docs/**" + - mkdocs.yml + +permissions: + contents: read + +jobs: + deploy: + permissions: + contents: write # for mkdocs gh-deploy to publish docs + runs-on: ubuntu-latest + steps: + - name: Harden Runner + uses: step-security/harden-runner@cba0d00b1fc9a034e1e642ea0f1103c282990604 + with: + egress-policy: block + allowed-endpoints: > + files.pythonhosted.org:443 + github.com:443 + pypi.org:443 + + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 + with: + python-version: 3.x + - run: pip install mkdocs-material mkdocs-awesome-pages-plugin + - run: mkdocs gh-deploy --force \ No newline at end of file diff --git a/docs/application/DEVELOPER.md b/DEVELOPER.md similarity index 100% rename from docs/application/DEVELOPER.md rename to DEVELOPER.md diff --git a/docs/application/Architecture.excalidraw b/docs/Architecture.excalidraw similarity index 100% rename from docs/application/Architecture.excalidraw rename to docs/Architecture.excalidraw diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 000000000..a9e9c7dde --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,23 @@ +# Architecture + +KubeHound works in 3 steps: + +1. Connect to your Kubernetes cluster and read API resources (pods, nodes, permissions...) +2. Compute attack paths +3. Write the results to a local graph database (JanusGraph) + +After the initial ingestion is done, you use a compatible client (such as [gdotv](https://gdotv.com/)) to visualize and query attack paths in your cluster. + + +
+[![KubeHound architecture](./images/kubehound-high-level.png)](./images/kubehound-high-level.png) +

KubeHound architecture (click to enlarge)

+
+ +Under the hood, KubeHound leverages a caching and persistence layer (Redis and MongoDB) while computing attack paths. As an end user, this is mostly transparent to you. + + +
+[![KubeHound architecture](./images/kubehound-detailed.png)](./images/kubehound-detailed.png) +

KubeHound detailed architecture (click to enlarge)

+
diff --git a/docs/comparison.md b/docs/comparison.md new file mode 100644 index 000000000..a5be0926a --- /dev/null +++ b/docs/comparison.md @@ -0,0 +1,34 @@ +# Comparison with other tools + +## Lyft's [Cartography](https://github.com/lyft/cartography) + +Cartography has a [Kubernetes module](https://lyft.github.io/cartography/modules/kubernetes/index.html). While useful to vizualize a cluster, it only has a few types of resources and relationships. Consequently, it cannot be used for mapping attack paths in a Kubernetes cluster. + +## [BloodHound](https://github.com/SpecterOps/BloodHound) + +BloodHound is one of the first projects (and certainly the most popular) that introduced attack graphs mapping. It is currently focused on Active Directory and [Azure](https://bloodhound.readthedocs.io/en/latest/data-collection/azurehound.html) environments, and does not support Kubernetes. + +## [BOtB](https://github.com/brompwnie/botb) + +BOtB is a pentesting tool that attempts to exploit common weaknesses. It runs from inside a compromised container. While very useful when performing a blackbox assessment, it doesn't have a full view of the cluster and does not attempt to find cluster-wide attack paths. + + +## [BOtB](https://github.com/brompwnie/botb) + +BOtB is a pentesting tool that attempts to exploit common weaknesses. It runs from inside a compromised container. While very useful when performing a blackbox assessment, it doesn't have a full view of the cluster and does not attempt to find cluster-wide attack paths. + +## [peirates](https://github.com/inguardians/peirates) + +Similarly to BOtB, peirates is an offensive tool running from inside a pod. It doesn't have a full view of the cluster and does not attempt to find cluster-wide attack paths. + +## [rbac-police](https://github.com/PaloAltoNetworks/rbac-police) + +rbac-police allows you to retrieve the permissions associated to a specific identity in the cluster, which makes it easier to understand who has access to what. However, it does not look for attack paths in the cluster - it's focused on showing effective permissions of an identity. + +## [KubiScan](https://github.com/cyberark/KubiScan) + +KubeScan scans a Kubernetes cluster for risky permissions that allow an identity to escalate its privileges inside the cluster. It does not look for other types of attacks in the cluster, nor does it attempt to build an attack graph. + +## [kdigger](https://github.com/quarkslab/kdigger) + +Similarly to BOtB and peirates, kdigger runs from a compromised pod and attempts to retrieve information about the cluster and potential weaknesses. It does not have a full cluster view, nor does it attempt to build attack paths on a graph. \ No newline at end of file diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 000000000..82a41e3ad --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,3 @@ +# Contributing + +Contributions are welcome! Refer to the [CONTRIBUTING](https://github.com/DataDog/KubeHound/blob/main/CONTRIBUTING.md) guide on how you can contribute to KubeHound, and what to expect. \ No newline at end of file diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 000000000..0f106984c --- /dev/null +++ b/docs/faq.md @@ -0,0 +1,3 @@ +# Frequently Asked Questions + +TODO \ No newline at end of file diff --git a/docs/images/kubehound-detailed.excalidraw b/docs/images/kubehound-detailed.excalidraw new file mode 100644 index 000000000..3b9e343f1 --- /dev/null +++ b/docs/images/kubehound-detailed.excalidraw @@ -0,0 +1,1038 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "type": "rectangle", + "version": 162, + "versionNonce": 212841042, + "isDeleted": false, + "id": "YijJ7E4UNzzVIJhvenmCh", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 333.2221984863281, + "y": 238.3791046142578, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 660.0268249511719, + "height": 386.2890319824219, + "seed": 17202382, + "groupIds": [], + "roundness": { + "type": 3 + }, + "boundElements": [], + "updated": 1691671685184, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1039, + "versionNonce": 488166350, + "isDeleted": false, + "id": "zUmguPGAP2vTB_V4EW4_A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 602.6229421293422, + "y": 344.19214153940055, + "strokeColor": "#c92a2a", + "backgroundColor": "#fd8888", + "width": 112.64736525303451, + "height": 36.77344700318558, + "seed": 112715238, + "groupIds": [ + "WKktN-osppvFakfT9AgQB" + ], + "roundness": null, + "boundElements": [ + { + "id": "52v-YF8sx9XcALQAikpWa", + "type": "arrow" + } + ], + "updated": 1691671685184, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1078, + "versionNonce": 2087294994, + "isDeleted": false, + "id": "8P6cE1eP8oyX8iy3tm43d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 602.6229421293422, + "y": 335.320361611142, + "strokeColor": "#c92a2a", + "backgroundColor": "#fd8888", + "width": 112.64736525303451, + "height": 36.77344700318558, + "seed": 1301173114, + "groupIds": [ + "WKktN-osppvFakfT9AgQB" + ], + "roundness": null, + "boundElements": [ + { + "id": "52v-YF8sx9XcALQAikpWa", + "type": "arrow" + } + ], + "updated": 1691671685184, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1156, + "versionNonce": 178858510, + "isDeleted": false, + "id": "sS3kPIsIpHNM52XDjW3FY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 602.6229421293422, + "y": 322.68980201642995, + "strokeColor": "#c92a2a", + "backgroundColor": "#fd8888", + "width": 112.64736525303451, + "height": 36.77344700318558, + "seed": 1473132838, + "groupIds": [ + "WKktN-osppvFakfT9AgQB" + ], + "roundness": null, + "boundElements": [], + "updated": 1691671685184, + "link": null, + "locked": false + }, + { + "type": "diamond", + "version": 1198, + "versionNonce": 794871250, + "isDeleted": false, + "id": "Y0KS8wt1zivKG_AL7nMwL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 602.6229421293422, + "y": 310.1581297191326, + "strokeColor": "#c92a2a", + "backgroundColor": "#fd8888", + "width": 112.64736525303451, + "height": 36.77344700318558, + "seed": 2116670522, + "groupIds": [ + "WKktN-osppvFakfT9AgQB" + ], + "roundness": null, + "boundElements": [], + "updated": 1691671685184, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4593, + "versionNonce": 139769934, + "isDeleted": false, + "id": "z7cEO4y046S-TNzT7BOKA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 819.762044259025, + "y": 308.72438456621495, + "strokeColor": "#0a11d3", + "backgroundColor": "#228be6", + "width": 60.7382680010908, + "height": 78.39237751899326, + "seed": 1884246331, + "groupIds": [ + "Q9SaOana8lZmAZmlfmiyh" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691671685184, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.20028361605803496, + 59.24853403628056 + ], + [ + 0.009372803058215485, + 65.99372235184508 + ], + [ + 3.1281551336420153, + 68.90823481425232 + ], + [ + 13.989158982750121, + 71.37485607708486 + ], + [ + 32.347332056685445, + 72.1429250910517 + ], + [ + 49.88735243619048, + 70.91659040084292 + ], + [ + 59.20649440816879, + 67.98383316912404 + ], + [ + 60.52083327976382, + 65.51148805709545 + ], + [ + 60.7054274163297, + 60.08098613254131 + ], + [ + 60.56054248355994, + 4.970621305146061 + ], + [ + 60.23392533882228, + -0.23629276019543785 + ], + [ + 56.33391578766731, + -3.1464712835087236 + ], + [ + 48.12132796908886, + -4.831892693901661 + ], + [ + 29.405949953842192, + -6.249452427941555 + ], + [ + 14.400963346206083, + -5.404158366627446 + ], + [ + 2.599643283560067, + -2.537024049408259 + ], + [ + -0.03284058476110599, + -0.03560029776626749 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 2327, + "versionNonce": 1588345746, + "isDeleted": false, + "id": "ohw8PGTCNgicQYX0jkIyS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 820.2353016855415, + "y": 353.67748994903775, + "strokeColor": "#0a11d3", + "backgroundColor": "transparent", + "width": 60.80127009119773, + "height": 6.745993515778707, + "seed": 2079699957, + "groupIds": [ + "Q9SaOana8lZmAZmlfmiyh" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691671685184, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.6018523995224774, + 2.6890657551102657 + ], + [ + 8.509979555390247, + 4.945167211490023 + ], + [ + 17.702324706273377, + 6.31144861163304 + ], + [ + 32.10328143659777, + 6.435951684337329 + ], + [ + 48.908703758524034, + 5.566101969596352 + ], + [ + 58.72326031034886, + 2.401608343351324 + ], + [ + 60.80127009119773, + -0.31004183144137804 + ] + ] + }, + { + "type": "line", + "version": 2414, + "versionNonce": 1576304270, + "isDeleted": false, + "id": "YnYxUPbYLZw85Zllj-aD0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 819.4822463778527, + "y": 330.9055028153093, + "strokeColor": "#0a11d3", + "backgroundColor": "transparent", + "width": 60.80127009119773, + "height": 6.745993515778707, + "seed": 778531291, + "groupIds": [ + "Q9SaOana8lZmAZmlfmiyh" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691671685184, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.6018523995224774, + 2.6890657551102657 + ], + [ + 8.509979555390247, + 4.945167211490023 + ], + [ + 17.702324706273377, + 6.31144861163304 + ], + [ + 32.10328143659777, + 6.435951684337329 + ], + [ + 48.908703758524034, + 5.566101969596352 + ], + [ + 58.72326031034886, + 2.401608343351324 + ], + [ + 60.80127009119773, + -0.31004183144137804 + ] + ] + }, + { + "type": "ellipse", + "version": 5434, + "versionNonce": 142801234, + "isDeleted": false, + "id": "McNYp6GMfDJE24wy776X_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 818.7105453283045, + "y": 303.19927646730434, + "strokeColor": "#0a11d3", + "backgroundColor": "#fff", + "width": 60.34868280304699, + "height": 12.205067075133375, + "seed": 1667591509, + "groupIds": [ + "Q9SaOana8lZmAZmlfmiyh" + ], + "roundness": null, + "boundElements": [], + "updated": 1691671685184, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 801, + "versionNonce": 1883339982, + "isDeleted": false, + "id": "yLzkifW9o_pPJq3RR6d43", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 867.9459294355252, + "y": 320.12003753676214, + "strokeColor": "#0a11d3", + "backgroundColor": "#fff", + "width": 8.844677956739957, + "height": 9.599183137539441, + "seed": 32669307, + "groupIds": [ + "Q9SaOana8lZmAZmlfmiyh" + ], + "roundness": null, + "boundElements": [], + "updated": 1691671685184, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 850, + "versionNonce": 1279000338, + "isDeleted": false, + "id": "BQysi4ABUsDr_OF23i4hb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 867.9459294355252, + "y": 341.1902264732981, + "strokeColor": "#0a11d3", + "backgroundColor": "#fff", + "width": 8.844677956739957, + "height": 9.599183137539441, + "seed": 727120565, + "groupIds": [ + "Q9SaOana8lZmAZmlfmiyh" + ], + "roundness": null, + "boundElements": [], + "updated": 1691671685184, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 904, + "versionNonce": 617919246, + "isDeleted": false, + "id": "wbHzA5bMb9HwU5QOowF_I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 867.9459294355252, + "y": 364.090722235984, + "strokeColor": "#0a11d3", + "backgroundColor": "#fff", + "width": 8.844677956739957, + "height": 9.599183137539441, + "seed": 364050203, + "groupIds": [ + "Q9SaOana8lZmAZmlfmiyh" + ], + "roundness": null, + "boundElements": [], + "updated": 1691671685184, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 313, + "versionNonce": 479410177, + "isDeleted": false, + "id": "dMMKC3N4WzJFN4q0zOtiG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 588.3804321289062, + "y": 269.3304443359375, + "strokeColor": "#000000", + "backgroundColor": "#fd8888", + "width": 154.4921875, + "height": 23, + "seed": 844306638, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691756929216, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "In-memory cache", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "In-memory cache", + "lineHeight": 1.15, + "baseline": 18 + }, + { + "type": "text", + "version": 501, + "versionNonce": 1817240210, + "isDeleted": false, + "id": "cn-MGnUL6NODmYNkVRwLM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 765.6129150390625, + "y": 269.3623046875, + "strokeColor": "#000000", + "backgroundColor": "#fd8888", + "width": 177.861328125, + "height": 23, + "seed": 844306638, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691671685184, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Storage (MongoDB)", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Storage (MongoDB)", + "lineHeight": 1.15, + "baseline": 18 + }, + { + "type": "diamond", + "version": 335, + "versionNonce": 357790414, + "isDeleted": false, + "id": "YNXvVaNMg8wGXD55ABs1d", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 347.86181640625, + "y": 445.6231689453125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.18695068359375, + "height": 95.24267578125, + "seed": 592178962, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "iGnUCaKa6Dsd1W7mC7RJV" + } + ], + "updated": 1691671830024, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 222, + "versionNonce": 837576978, + "isDeleted": false, + "id": "iGnUCaKa6Dsd1W7mC7RJV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 402.33238220214844, + "y": 481.933837890625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 81.15234375, + "height": 23, + "seed": 1215986062, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691671830025, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "ingestors", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "YNXvVaNMg8wGXD55ABs1d", + "originalText": "ingestors", + "lineHeight": 1.15, + "baseline": 18 + }, + { + "type": "text", + "version": 219, + "versionNonce": 1201300498, + "isDeleted": false, + "id": "C6RcEjDEBsRgNoPbKwfHe", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 580.0796508789062, + "y": 186.6113494873047, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 147.90234375, + "height": 32.199999999999996, + "seed": 1997638162, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691671784536, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 2, + "text": "KubeHound", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "KubeHound", + "lineHeight": 1.15, + "baseline": 26 + }, + { + "type": "rectangle", + "version": 253, + "versionNonce": 2052968658, + "isDeleted": false, + "id": "CHmgrq0ai57DieZpBpP-A", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 618.920166015625, + "y": 454.7411804199219, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 284, + "height": 68, + "seed": 725437710, + "groupIds": [], + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "71oRt_ozcb2XVp01OA-KJ" + }, + { + "id": "UOYege4suyYxnHAQhNyIS", + "type": "arrow" + }, + { + "id": "e7fIu70Co648e4-_nHO-q", + "type": "arrow" + }, + { + "id": "00j74CecUimyC8XrJnRus", + "type": "arrow" + } + ], + "updated": 1691671791332, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 315, + "versionNonce": 2011318798, + "isDeleted": false, + "id": "71oRt_ozcb2XVp01OA-KJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 648.635009765625, + "y": 477.2411804199219, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 224.5703125, + "height": 23, + "seed": 1333424398, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691671736178, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Attack paths computation", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "CHmgrq0ai57DieZpBpP-A", + "originalText": "Attack paths computation", + "lineHeight": 1.15, + "baseline": 18 + }, + { + "type": "arrow", + "version": 223, + "versionNonce": 1690435086, + "isDeleted": false, + "id": "UOYege4suyYxnHAQhNyIS", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 531.4299926757812, + "y": 493.5558776855469, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 86.34759521484375, + "height": 0.16207023815331922, + "seed": 1938194002, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691671746602, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "CHmgrq0ai57DieZpBpP-A", + "focus": -0.12793696178654337, + "gap": 1.142578125 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 86.34759521484375, + -0.16207023815331922 + ] + ] + }, + { + "type": "arrow", + "version": 370, + "versionNonce": 1054260878, + "isDeleted": false, + "id": "52v-YF8sx9XcALQAikpWa", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 660.0524135839318, + "y": 385.87452519338433, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "width": 0, + "height": 68.95414912302192, + "seed": 267686354, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691671764823, + "link": null, + "locked": false, + "startBinding": { + "elementId": "8P6cE1eP8oyX8iy3tm43d", + "focus": -0.019632750851979457, + "gap": 13.4435055785132 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": "triangle", + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 0, + 68.95414912302192 + ] + ] + }, + { + "type": "arrow", + "version": 433, + "versionNonce": 523329870, + "isDeleted": false, + "id": "e7fIu70Co648e4-_nHO-q", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 852.5105590820314, + "y": 384.1728582998172, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "width": 0, + "height": 68.95414912302192, + "seed": 267686354, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691671775504, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "CHmgrq0ai57DieZpBpP-A", + "focus": 0.6450027680732842, + "gap": 1.6141729970827328 + }, + "lastCommittedPoint": null, + "startArrowhead": "triangle", + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 0, + 68.95414912302192 + ] + ] + }, + { + "type": "diamond", + "version": 2, + "versionNonce": 2137374482, + "isDeleted": false, + "id": "FC5dvllDxDBtclEx-cTZT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 854.1347045898438, + "y": 394.9568176269531, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "width": 0.08404541015625, + "height": 0.231964111328125, + "seed": 2061221070, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691671769490, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 380, + "versionNonce": 1249618706, + "isDeleted": false, + "id": "00j74CecUimyC8XrJnRus", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 905.4414367675781, + "y": 489.00274331892626, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 140.88473510742188, + "height": 0.30871324352858664, + "seed": 1938194002, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691671822447, + "link": null, + "locked": false, + "startBinding": { + "elementId": "CHmgrq0ai57DieZpBpP-A", + "focus": 0.003452398665398077, + "gap": 2.521270751953125 + }, + "endBinding": { + "elementId": "Ph0DcnJVgqfDBTazrLIPw", + "focus": -0.05833994666563345, + "gap": 13.0677490234375 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 140.88473510742188, + 0.30871324352858664 + ] + ] + }, + { + "type": "text", + "version": 94, + "versionNonce": 1615340882, + "isDeleted": false, + "id": "Ph0DcnJVgqfDBTazrLIPw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1059.3939208984375, + "y": 477.3401184082031, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 165.68359375, + "height": 23, + "seed": 1261480338, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "00j74CecUimyC8XrJnRus", + "type": "arrow" + } + ], + "updated": 1691671822446, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "To graph database", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "To graph database", + "lineHeight": 1.15, + "baseline": 18 + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/images/kubehound-detailed.png b/docs/images/kubehound-detailed.png new file mode 100644 index 000000000..ad825ccf7 Binary files /dev/null and b/docs/images/kubehound-detailed.png differ diff --git a/docs/images/kubehound-high-level.excalidraw b/docs/images/kubehound-high-level.excalidraw new file mode 100644 index 000000000..311de5492 --- /dev/null +++ b/docs/images/kubehound-high-level.excalidraw @@ -0,0 +1,2439 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "type": "line", + "version": 590, + "versionNonce": 884923627, + "isDeleted": false, + "id": "1q7NTtjuzdQ2AuN5MM2vA", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 609.9926247584258, + "y": 464.7894662263899, + "strokeColor": "#326ce5", + "backgroundColor": "#326ce5", + "width": 170.5479126392067, + "height": 165.8878192491774, + "seed": 1920910379, + "groupIds": [ + "9J-kkt8Ft7Da_84YzLM7a", + "iU6cNm0_6Jc7tHERqDYR_" + ], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + -4.396962054402086, + 1.1646874339146518 + ], + [ + -63.9402715195358, + 29.56596636773484 + ], + [ + -63.9402715195358, + 29.56596636773484 + ], + [ + -67.88778686931525, + 32.68804950762777 + ], + [ + -70.0842642471441, + 37.216572224302446 + ], + [ + -84.65888566945968, + 100.95916519983552 + ], + [ + -84.65888566945968, + 100.95916519983552 + ], + [ + -84.76907687141536, + 105.46565159474414 + ], + [ + -83.05610475455529, + 109.65158466072563 + ], + [ + -82.41499236471051, + 110.54913805780342 + ], + [ + -41.2769501625808, + 161.69922653927426 + ], + [ + -41.2769501625808, + 161.69922653927426 + ], + [ + -37.31206815320828, + 164.80126809034192 + ], + [ + -32.397540410633006, + 165.88781924917737 + ], + [ + 33.58360912709668, + 165.88781924917697 + ], + [ + 33.58360912709668, + 165.88781924917697 + ], + [ + 38.509483664717834, + 164.7592029175085 + ], + [ + 42.47369821555802, + 161.6511389543416 + ], + [ + 83.590366618572, + 110.49037113635723 + ], + [ + 83.590366618572, + 110.49037113635723 + ], + [ + 85.77883576779129, + 105.97187048787097 + ], + [ + 85.7274057950955, + 100.94848586332202 + ], + [ + 71.05662649840332, + 37.15246053949655 + ], + [ + 71.05662649840332, + 37.15246053949655 + ], + [ + 68.85613290539939, + 32.62393782282196 + ], + [ + 64.91262485436425, + 29.501854682928673 + ], + [ + 5.465486737767181, + 1.1700299681670852 + ], + [ + 5.465486737767181, + 1.1700299681670852 + ], + [ + -0.0534221580855956, + 0 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1114, + "versionNonce": 551156549, + "isDeleted": false, + "id": "NAKzxrkH2FHtA4wZYAHiB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 609.9906980892406, + "y": 485.91078838407805, + "strokeColor": "#326ce5", + "backgroundColor": "#fff", + "width": 124.88167478224784, + "height": 122.53590960399487, + "seed": 302712523, + "groupIds": [ + "iU6cNm0_6Jc7tHERqDYR_" + ], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + -2.5591124386745037, + 1.2615221012119529 + ], + [ + -3.4994086573241248, + 3.9535275716717213 + ], + [ + -3.4994086573241248, + 4.957935475127422 + ], + [ + -3.4994086573241248, + 4.957935475127422 + ], + [ + -3.007889137213411, + 8.339805194456696 + ], + [ + -2.6552774183318633, + 14.804355072319312 + ], + [ + -3.819967081354406, + 16.647551998958733 + ], + [ + -3.9001028660344446, + 18.154166401693924 + ], + [ + -3.9001028660344446, + 18.154166401693924 + ], + [ + -10.32725468568539, + 19.147892421084155 + ], + [ + -16.83713569759547, + 21.134422246167567 + ], + [ + -22.949822836761424, + 24.04505605161777 + ], + [ + -28.566654522909538, + 27.826198445836983 + ], + [ + -33.58894879535297, + 32.42425913233075 + ], + [ + -34.87117230126708, + 31.516016208532427 + ], + [ + -34.87117230126708, + 31.516016208532427 + ], + [ + -36.981502946299365, + 31.302312290880103 + ], + [ + -41.77381954115481, + 26.974801589540924 + ], + [ + -44.10853598790492, + 24.490495457496134 + ], + [ + -44.89923997370828, + 23.860068136156226 + ], + [ + -44.89923997370828, + 23.860068136156226 + ], + [ + -47.37286422168759, + 22.925111585763457 + ], + [ + -50.209787167717224, + 24.185966228443267 + ], + [ + -50.8575786010987, + 26.9921657015825 + ], + [ + -49.333600086321944, + 29.437743953454792 + ], + [ + -48.59632080615586, + 30.02542845322292 + ], + [ + -48.59632080615586, + 30.02542845322292 + ], + [ + -45.6472036854915, + 31.751088989419035 + ], + [ + -40.315285080696654, + 35.49091519099007 + ], + [ + -39.604721974676664, + 37.54247381947327 + ], + [ + -38.440032311654235, + 38.610993407734945 + ], + [ + -38.440032311654235, + 38.610993407734945 + ], + [ + -42.453414609326, + 46.02661055262045 + ], + [ + -45.03080063598091, + 53.98366394463282 + ], + [ + -46.12661978771645, + 62.27630631540628 + ], + [ + -45.69528872287185, + 70.69866492105825 + ], + [ + -47.19121614643827, + 71.12607275636286 + ], + [ + -47.19121614643827, + 71.12607275636286 + ], + [ + -48.71920195995935, + 72.66474300150108 + ], + [ + -55.09826874223004, + 73.71723848988879 + ], + [ + -58.517536519770886, + 73.98436456562676 + ], + [ + -59.46317495422912, + 74.19807357838249 + ], + [ + -59.57002691305527, + 74.19807357838249 + ], + [ + -59.57002691305527, + 74.19807357838249 + ], + [ + -61.323967820110155, + 74.94968283657575 + ], + [ + -62.39454328255286, + 76.39698768936387 + ], + [ + -61.90248113394084, + 79.94255798257318 + ], + [ + -61.63761473651582, + 80.24590005255747 + ], + [ + -59.93547829224923, + 81.20498191706895 + ], + [ + -57.983274178088365, + 81.12742425465802 + ], + [ + -57.91382027747376, + 81.12742425465802 + ], + [ + -56.95215264803821, + 81.02057993848678 + ], + [ + -56.95215264803821, + 81.02057993848678 + ], + [ + -53.7572757673185, + 79.85589027546439 + ], + [ + -47.54917008112836, + 78.03940442786777 + ], + [ + -45.508295884262296, + 78.76065706060814 + ], + [ + -43.905516501869705, + 78.49352079466358 + ], + [ + -43.905516501869705, + 78.49352079466358 + ], + [ + -40.60528817024521, + 86.23996299672599 + ], + [ + -35.999798823142164, + 93.20705819823723 + ], + [ + -30.2182679228674, + 99.23250697872516 + ], + [ + -23.389922574382894, + 104.15405067854242 + ], + [ + -24.041718758957046, + 105.51640996913648 + ], + [ + -24.041718758957046, + 105.51640996913648 + ], + [ + -23.721160334926928, + 107.52522577604792 + ], + [ + -26.94275338979269, + 113.35935342767391 + ], + [ + -28.855404217046726, + 116.20695571021739 + ], + [ + -29.309525678945842, + 117.16862588720463 + ], + [ + -29.309525678945842, + 117.16862588720463 + ], + [ + -29.792684134543613, + 119.01465314372642 + ], + [ + -29.307171741221893, + 120.74817032920896 + ], + [ + -28.046964176660957, + 122.0337464130935 + ], + [ + -26.206021833231233, + 122.53590960399487 + ], + [ + -25.836830648216146, + 122.51657878208012 + ], + [ + -24.033276172791297, + 121.78030578481567 + ], + [ + -22.88237385929482, + 120.20856831926949 + ], + [ + -22.438936829012828, + 119.30032539547108 + ], + [ + -22.438936829012828, + 119.30032539547108 + ], + [ + -21.41315496721958, + 116.0413342823939 + ], + [ + -20.167662060985002, + 112.55195278836115 + ], + [ + -18.66171766433351, + 109.65158561605767 + ], + [ + -17.13373185081244, + 108.90362445182609 + ], + [ + -16.332343433392012, + 107.44508999136787 + ], + [ + -16.332343433392012, + 107.44508999136787 + ], + [ + -8.233534077406446, + 109.73426895238698 + ], + [ + 0.07808755315407723, + 110.51101745025544 + ], + [ + 8.393408228709504, + 109.77484635505681 + ], + [ + 16.50329433926609, + 107.52522577604792 + ], + [ + 17.21386763549272, + 108.8875952568486 + ], + [ + 17.21386763549272, + 108.8875952568486 + ], + [ + 19.030343292882677, + 109.98282847170483 + ], + [ + 21.466577125305406, + 115.9665381659706 + ], + [ + 22.503043418715677, + 119.23086894730498 + ], + [ + 22.946480448997775, + 120.1391118711032 + ], + [ + 22.946480448997775, + 120.1391118711032 + ], + [ + 24.06736241385906, + 121.68340711028317 + ], + [ + 25.715597760329914, + 122.4074009085981 + ], + [ + 29.06454801724695, + 121.14341787249288 + ], + [ + 29.288141530401873, + 120.8389956406094 + ], + [ + 29.859924212775155, + 118.97848810051305 + ], + [ + 29.3736271735454, + 117.09382977078147 + ], + [ + 28.90882128002913, + 116.13215959379427 + ], + [ + 28.90882128002913, + 116.13215959379427 + ], + [ + 26.99617045277519, + 113.29523664776464 + ], + [ + 23.79060659288676, + 107.64810947740314 + ], + [ + 24.15390783848862, + 105.51107030087962 + ], + [ + 23.560878575360448, + 104.0739047036557 + ], + [ + 30.37127897002722, + 99.12240179644283 + ], + [ + 36.131354390311685, + 93.07148768966871 + ], + [ + 40.71238214647833, + 86.08394074351675 + ], + [ + 43.98564973899843, + 78.32255969858304 + ], + [ + 45.50294093069587, + 78.58969596452754 + ], + [ + 45.50294093069587, + 78.58969596452754 + ], + [ + 47.49573773283649, + 77.85241413680993 + ], + [ + 53.70384596657826, + 79.6688999844065 + ], + [ + 56.8987202997463, + 80.89769623713153 + ], + [ + 57.817642560058374, + 81.09537605490989 + ], + [ + 57.88709900822471, + 81.09537605490989 + ], + [ + 57.88709900822471, + 81.09537605490989 + ], + [ + 59.7933300053224, + 81.18200300119241 + ], + [ + 61.387088507324904, + 80.34487752923569 + ], + [ + 62.38084764488653, + 78.84379895623448 + ], + [ + 62.487131499694996, + 76.93855640917657 + ], + [ + 62.38022604228418, + 76.54882176766148 + ], + [ + 61.264918120431545, + 74.94530104773905 + ], + [ + 59.47385683829488, + 74.16601518842774 + ], + [ + 58.43739054488442, + 73.92025797592403 + ], + [ + 58.43739054488442, + 73.92025797592403 + ], + [ + 55.01811767224032, + 73.65312170997949 + ], + [ + 48.639058532624574, + 72.60063641179842 + ], + [ + 47.10038828748644, + 71.06196616666014 + ], + [ + 45.657883022005635, + 70.63455833135549 + ], + [ + 45.657883022005635, + 70.63455833135549 + ], + [ + 46.03678547390773, + 62.22105501523648 + ], + [ + 44.89768341965083, + 53.94499720569996 + ], + [ + 42.28747218999483, + 46.00916491892614 + ], + [ + 38.253036925493305, + 38.616338171095194 + ], + [ + 39.51389156817304, + 37.45164850807274 + ], + [ + 39.51389156817304, + 37.45164850807274 + ], + [ + 40.17636708926102, + 35.43214317444094 + ], + [ + 45.46554287248419, + 31.713690931207466 + ], + [ + 48.41465999314843, + 29.988030395011364 + ], + [ + 49.19467954733483, + 29.3576030736714 + ], + [ + 49.19467954733483, + 29.3576030736714 + ], + [ + 50.88472531147386, + 26.20214955472445 + ], + [ + 50.38192013755673, + 24.47356442923497 + ], + [ + 48.99704049038279, + 23.16080596925247 + ], + [ + 48.48411644131477, + 22.935796017380596 + ], + [ + 46.50069462924344, + 22.828946606106054 + ], + [ + 44.76566929318453, + 23.7959564513502 + ], + [ + 43.974960212277935, + 24.42638377269011 + ], + [ + 43.974960212277935, + 24.42638377269011 + ], + [ + 41.64024121797614, + 26.910694999838206 + ], + [ + 36.976153087836124, + 31.307657054240284 + ], + [ + 34.81773485787174, + 31.542729835126885 + ], + [ + 33.46606509399801, + 32.504400012114104 + ], + [ + 33.46606509399801, + 32.504400012114104 + ], + [ + 27.138578589970592, + 26.96979310299842 + ], + [ + 19.97866429922756, + 22.687363875645108 + ], + [ + 12.169613467832335, + 19.74726508781922 + ], + [ + 3.8947581026741886, + 18.239646949734194 + ], + [ + 3.8146121277875693, + 16.652894214767297 + ], + [ + 2.649922464765183, + 14.879151188742481 + ], + [ + 3.055961436835645, + 8.430627958305543 + ], + [ + 3.5474860520496065, + 5.04876078652791 + ], + [ + 3.5474860520496065, + 3.9802411982661803 + ], + [ + 3.5474860520496065, + 3.9802411982661803 + ], + [ + 2.6091922089963617, + 1.288235727806406 + ], + [ + 0.048077394725396516, + 0.02671362659445572 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 754, + "versionNonce": 1850345355, + "isDeleted": false, + "id": "oAVWoM9FTOJ84Xb3pJTBR", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 605.5507359961043, + "y": 513.9438709117968, + "strokeColor": "#326ce5", + "backgroundColor": "#326ce5", + "width": 21.43452383045392, + "height": 21.35438295067055, + "seed": 137753963, + "groupIds": [ + "iU6cNm0_6Jc7tHERqDYR_" + ], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.0685195882617524, + 18.66171256923035 + ], + [ + -1.148660468045076, + 18.661712569230446 + ], + [ + -1.148660468045076, + 18.661712569230446 + ], + [ + -2.9224034940699255, + 21.354382950670548 + ], + [ + -6.1279673539584385, + 21.065882916595058 + ], + [ + -21.434523830453912, + 10.22040017930772 + ], + [ + -21.434523830453912, + 10.22040017930772 + ], + [ + -13.28278144629947, + 4.181714320450315 + ], + [ + -3.78790869139976, + 0.60905336300238 + ], + [ + -0.010684431617111318, + 1.7758364223574574e-14 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 752, + "versionNonce": 2028227237, + "isDeleted": false, + "id": "KUqmLYnYb0Oa29MD5rEcD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 614.703060131676, + "y": 513.5106776267022, + "strokeColor": "#326ce5", + "backgroundColor": "#326ce5", + "width": 21.316984892458994, + "height": 21.439863498710842, + "seed": 1682575371, + "groupIds": [ + "iU6cNm0_6Jc7tHERqDYR_" + ], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 11.501951131586363, + 3.3885443046504036 + ], + [ + 21.316984892459004, + 10.279167100753504 + ], + [ + 6.15468098055286, + 21.055198484977964 + ], + [ + 6.15468098055286, + 21.055198484977964 + ], + [ + 2.8529521410069645, + 21.439863498710867 + ], + [ + 1.5546994401155487, + 20.29654779402594 + ], + [ + 1.0578351566446038, + 18.640338610892833 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 757, + "versionNonce": 777444907, + "isDeleted": false, + "id": "n2spbU_7IbYY3qnznsd6N", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 578.8292850836692, + "y": 530.9116323914815, + "strokeColor": "#326ce5", + "backgroundColor": "#326ce5", + "width": 20.189698382751402, + "height": 23.186897993244525, + "seed": 1749145259, + "groupIds": [ + "iU6cNm0_6Jc7tHERqDYR_" + ], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 13.997619343986948, + 12.49100239370014 + ], + [ + 13.997619343987013, + 12.571143273483521 + ], + [ + 13.997619343987013, + 12.571143273483521 + ], + [ + 14.99134281582555, + 15.637799332142835 + ], + [ + 12.763478327901545, + 17.961833894827436 + ], + [ + 12.763478327901568, + 18.015250957809787 + ], + [ + -5.198355566925851, + 23.181553229884337 + ], + [ + -5.198355566925851, + 23.181553229884337 + ], + [ + -4.5279316846921045, + 11.154643415238663 + ], + [ + 0.005339668256897138, + -0.005344763360215503 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 754, + "versionNonce": 766356997, + "isDeleted": false, + "id": "rAI8TWMDdXoqyyRbW0MNf", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 641.3357430114843, + "y": 530.919123645792, + "strokeColor": "#326ce5", + "backgroundColor": "#326ce5", + "width": 20.21641200934586, + "height": 23.117436449974957, + "seed": 851953995, + "groupIds": [ + "iU6cNm0_6Jc7tHERqDYR_" + ], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 4.563918399290026, + 11.121963422681532 + ], + [ + 5.353292563132349, + 23.11743644997496 + ], + [ + -12.635254958289572, + 17.935115173129766 + ], + [ + -12.635254958289533, + 17.865658724963506 + ], + [ + -12.635254958289533, + 17.865658724963506 + ], + [ + -14.863119446213531, + 15.541629257382146 + ], + [ + -13.869390879271627, + 12.474978293826098 + ], + [ + 0.021368863234242145, + 0.04273772646850472 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 754, + "versionNonce": 265281739, + "isDeleted": false, + "id": "4WyJXFXc24eKFSIYXAM6L", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 607.1217167532573, + "y": 544.2146158910938, + "strokeColor": "#326ce5", + "backgroundColor": "#326ce5", + "width": 12.784847191135828, + "height": 12.474983388929397, + "seed": 691431403, + "groupIds": [ + "iU6cNm0_6Jc7tHERqDYR_" + ], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 5.727273145248169, + -1.3322676295501878e-15 + ], + [ + 9.226671612365799, + 4.445049639334108 + ], + [ + 7.955137633172139, + 10.001351498295145 + ], + [ + 2.8102093194351676, + 12.474983388929395 + ], + [ + -2.3454034259189, + 10.001351498295142 + ], + [ + -3.5581755787700295, + 4.445049639334092 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 755, + "versionNonce": 2117313893, + "isDeleted": false, + "id": "zcT13IENVU0aP9LkOK3OY", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 625.4682156618142, + "y": 559.3769198029996, + "strokeColor": "#326ce5", + "backgroundColor": "#326ce5", + "width": 21.984810272010485, + "height": 21.78714064443878, + "seed": 563622539, + "groupIds": [ + "iU6cNm0_6Jc7tHERqDYR_" + ], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0.7212526327404134, + 5.10702591327572e-15 + ], + [ + 19.244052305638295, + 3.1254280752084505 + ], + [ + 19.244052305638295, + 3.1254280752084505 + ], + [ + 16.768260091205423, + 8.668625328485522 + ], + [ + 13.409934844218869, + 13.692427751505338 + ], + [ + 9.262235433389911, + 18.09815338358097 + ], + [ + 4.4183309176363466, + 21.787140644438793 + ], + [ + -2.740757966372229, + 4.455739166054528 + ], + [ + -2.740757966372229, + 4.455739166054528 + ], + [ + -2.5152181237572835, + 1.5630757899384222 + ], + [ + -0.021368863234245236, + 0.08014597488666866 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 753, + "versionNonce": 1817153387, + "isDeleted": false, + "id": "8YhZb3uoUhfEw7FRfjPTy", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 594.623294619108, + "y": 559.8203203036147, + "strokeColor": "#326ce5", + "backgroundColor": "#326ce5", + "width": 21.8512472341415, + "height": 21.632198553128937, + "seed": 1286056235, + "groupIds": [ + "iU6cNm0_6Jc7tHERqDYR_" + ], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 2.5858209701657273, + 1.4318157387603865 + ], + [ + 2.8369229460296426, + 4.370243332704308 + ], + [ + 2.8369229460296426, + 4.439699780870577 + ], + [ + -4.279428211510453, + 21.63219855312897 + ], + [ + -4.279428211510453, + 21.63219855312897 + ], + [ + -13.169517299972037, + 13.615624164382494 + ], + [ + -19.01432428811188, + 3.1628159432134098 + ], + [ + -0.6517961845741633, + 0.04807739472538941 + ], + [ + -0.6517961845741633, + 0.04807739472538941 + ], + [ + -0.032058389954645605, + 0.04807739472538499 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 757, + "versionNonce": 1841541317, + "isDeleted": false, + "id": "P8oul5rTlQ1zLWpnrP9Rk", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 610.0591683223424, + "y": 566.9438268892583, + "strokeColor": "#326ce5", + "backgroundColor": "#326ce5", + "width": 23.694451803435832, + "height": 19.92456449240321, + "seed": 1607420875, + "groupIds": [ + "iU6cNm0_6Jc7tHERqDYR_" + ], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 1.6676476900384873, + 0.4162597492873822 + ], + [ + 2.868981335984324, + 1.6455247515160254 + ], + [ + 2.938437784150559, + 1.645524751516041 + ], + [ + 11.988808632178861, + 17.977857994701516 + ], + [ + 8.371866131963033, + 19.0463826780665 + ], + [ + 8.371866131963033, + 19.0463826780665 + ], + [ + -1.737012426345295, + 19.92456449240325 + ], + [ + -11.705643171256973, + 18.00991638465619 + ], + [ + -2.6232139332739735, + 1.6775729512641009 + ], + [ + -2.6232139332739735, + 1.6775729512641009 + ], + [ + 0.04808758493198971, + 0.10150464791430291 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "rectangle", + "version": 256, + "versionNonce": 972771365, + "isDeleted": false, + "id": "Qa-1IAlwB_PPJKn3zJrHW", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 869, + "y": 484, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 291, + "height": 136, + "seed": 396080715, + "groupIds": [], + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "LacPdwjp42kHYUhWkFWmt" + }, + { + "id": "4v25pr07QkyUeTy48CPzk", + "type": "arrow" + }, + { + "id": "jYF9DOMdn-Nr5elnlLzns", + "type": "arrow" + }, + { + "id": "Nd2uv8W9gE-JZ8Puh2Q8A", + "type": "arrow" + }, + { + "id": "UNoDOVrcISvh3tn4USPJz", + "type": "arrow" + } + ], + "updated": 1691670360808, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 235, + "versionNonce": 1916596395, + "isDeleted": false, + "id": "LacPdwjp42kHYUhWkFWmt", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 940.548828125, + "y": 535.9, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 147.90234375, + "height": 32.199999999999996, + "seed": 1200260037, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 2, + "text": "KubeHound", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Qa-1IAlwB_PPJKn3zJrHW", + "originalText": "KubeHound", + "lineHeight": 1.15, + "baseline": 26 + }, + { + "type": "image", + "version": 105, + "versionNonce": 7441547, + "isDeleted": false, + "id": "CQVVILbzbnmyPkQWzctxx", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1300, + "y": 481.298, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 393.99999999999994, + "height": 131.202, + "seed": 337742213, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "status": "saved", + "fileId": "3f5e12b6a50c2eca8b5b822029a61788d400f053", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 152, + "versionNonce": 390830341, + "isDeleted": false, + "id": "4v25pr07QkyUeTy48CPzk", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 700, + "y": 556, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 165, + "height": 1.9157447768529892, + "seed": 1060694891, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "Qa-1IAlwB_PPJKn3zJrHW", + "focus": -0.005000396856893404, + "gap": 4 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 165, + -1.9157447768529892 + ] + ] + }, + { + "type": "arrow", + "version": 201, + "versionNonce": 127542731, + "isDeleted": false, + "id": "jYF9DOMdn-Nr5elnlLzns", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1162, + "y": 549.3869814054576, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 157, + "height": 1.1638228724989403, + "seed": 2050281003, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Qa-1IAlwB_PPJKn3zJrHW", + "focus": -0.053655117813421256, + "gap": 2 + }, + "endBinding": { + "elementId": "ZInMjpv74vj_jOD2Pr9i6", + "focus": -0.04032631931594341, + "gap": 4 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 157, + 1.1638228724989403 + ] + ] + }, + { + "type": "ellipse", + "version": 232, + "versionNonce": 1931664325, + "isDeleted": false, + "id": "5LyHW7R44FjlVJOBA9ETT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1196, + "y": 462, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 68, + "height": 64, + "seed": 6460453, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "iHYx5s9EKjtw0YSwnJUVu" + } + ], + "updated": 1691670360808, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 148, + "versionNonce": 243653571, + "isDeleted": false, + "id": "iHYx5s9EKjtw0YSwnJUVu", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1220.4243728576262, + "y": 476.37258300203047, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 19.0679931640625, + "height": 35, + "seed": 1262663115, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691745546739, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "3", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "5LyHW7R44FjlVJOBA9ETT", + "originalText": "3", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "ellipse", + "version": 192, + "versionNonce": 1108432299, + "isDeleted": false, + "id": "Tn0J6q5dcixAc_2KfTgDH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 746, + "y": 472, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 68, + "height": 64, + "seed": 1559307365, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "YZPTSM29qN6HxblihfN-D" + } + ], + "updated": 1691670360808, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 107, + "versionNonce": 1781069293, + "isDeleted": false, + "id": "YZPTSM29qN6HxblihfN-D", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 776.1643707213957, + "y": 486.37258300203047, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 7.5879974365234375, + "height": 35, + "seed": 913919941, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691745546740, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "1", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Tn0J6q5dcixAc_2KfTgDH", + "originalText": "1", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "image", + "version": 189, + "versionNonce": 1146054731, + "isDeleted": false, + "id": "qaXykhX7_G0Ur4gfN8l5U", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1446, + "y": 180, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 149, + "height": 149, + "seed": 821435717, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "BXpY9BWfInuATqONCSUeP", + "type": "arrow" + } + ], + "updated": 1691670360808, + "link": null, + "locked": false, + "status": "saved", + "fileId": "a63456e84b50bbd6ab2da19ff5ab9115a91a260c", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 181, + "versionNonce": 2029147621, + "isDeleted": false, + "id": "BXpY9BWfInuATqONCSUeP", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1524, + "y": 338, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 0, + "height": 155.99999999999994, + "seed": 307424037, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "startBinding": { + "elementId": "qaXykhX7_G0Ur4gfN8l5U", + "gap": 9, + "focus": -0.04697986577181208 + }, + "endBinding": { + "elementId": "ZInMjpv74vj_jOD2Pr9i6", + "gap": 8.000000000000057, + "focus": 0.05511811023622048 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0, + 155.99999999999994 + ] + ] + }, + { + "type": "ellipse", + "version": 330, + "versionNonce": 108144363, + "isDeleted": false, + "id": "wGfwZnnA3zUk8qU5IRmiV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548, + "y": 374, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 68, + "height": 64, + "seed": 1082170059, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "3GPfWW4TUmkXjys_kHqid" + } + ], + "updated": 1691670360808, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 248, + "versionNonce": 1635478371, + "isDeleted": false, + "id": "3GPfWW4TUmkXjys_kHqid", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1572.9983703551848, + "y": 388.37258300203047, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 17.919998168945312, + "height": 35, + "seed": 2061044075, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691745546741, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "4", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "wGfwZnnA3zUk8qU5IRmiV", + "originalText": "4", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "text", + "version": 98, + "versionNonce": 1881661605, + "isDeleted": false, + "id": "GmA2C6XJkzXOAGxfNxonK", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 649.9768829345703, + "y": 374, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 269.212890625, + "height": 64.39999999999999, + "seed": 1648806763, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 2, + "text": "Read resources from \nthe K8s API", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Read resources from \nthe K8s API", + "lineHeight": 1.15, + "baseline": 58 + }, + { + "type": "text", + "version": 196, + "versionNonce": 1866442795, + "isDeleted": false, + "id": "xS0Mb_4zwzIE5yaVRjQDm", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1137.697265625, + "y": 364.79999999999995, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 194.60546875, + "height": 64.39999999999999, + "seed": 1261186117, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691670360808, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 2, + "text": "Ingest into \ngraph database", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Ingest into \ngraph database", + "lineHeight": 1.15, + "baseline": 58 + }, + { + "type": "ellipse", + "version": 359, + "versionNonce": 167288069, + "isDeleted": false, + "id": "Lead40U49aI9gLHoKkzMu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 974, + "y": 676, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 68, + "height": 64, + "seed": 2135129259, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "type": "text", + "id": "zgjaRuFaTCRCGRM3t6Z5z" + }, + { + "id": "Nd2uv8W9gE-JZ8Puh2Q8A", + "type": "arrow" + }, + { + "id": "UNoDOVrcISvh3tn4USPJz", + "type": "arrow" + } + ], + "updated": 1691670383187, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 275, + "versionNonce": 382578765, + "isDeleted": false, + "id": "zgjaRuFaTCRCGRM3t6Z5z", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 997.990374749716, + "y": 690.3725830020305, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 19.935989379882812, + "height": 35, + "seed": 111456075, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691745546743, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "2", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Lead40U49aI9gLHoKkzMu", + "originalText": "2", + "lineHeight": 1.25, + "baseline": 25 + }, + { + "type": "arrow", + "version": 154, + "versionNonce": 1213767461, + "isDeleted": false, + "id": "Nd2uv8W9gE-JZ8Puh2Q8A", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 902, + "y": 626, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 73.30030377912567, + "height": 70.23391850877931, + "seed": 1732962981, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691670384089, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Qa-1IAlwB_PPJKn3zJrHW", + "focus": 0.7864197530864196, + "gap": 6 + }, + "endBinding": { + "elementId": "Lead40U49aI9gLHoKkzMu", + "focus": 0.27172350358387015, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 6, + 64 + ], + [ + 73.30030377912567, + 70.23391850877931 + ] + ] + }, + { + "type": "arrow", + "version": 98, + "versionNonce": 2120225195, + "isDeleted": false, + "id": "UNoDOVrcISvh3tn4USPJz", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1042.9065780270603, + "y": 695.760342212372, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 78.09342197293972, + "height": 71.76034221237205, + "seed": 1948650469, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1691670384089, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Lead40U49aI9gLHoKkzMu", + "focus": -0.2876411508604094, + "gap": 3.2259661543258815 + }, + "endBinding": { + "elementId": "Qa-1IAlwB_PPJKn3zJrHW", + "focus": -0.7555791710945803, + "gap": 4 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 67.09342197293972, + -5.760342212372052 + ], + [ + 78.09342197293972, + -71.76034221237205 + ] + ] + }, + { + "type": "text", + "version": 261, + "versionNonce": 645541195, + "isDeleted": false, + "id": "rBCScTBc2va9bhZSefvGL", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 869.814453125, + "y": 754.8, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 272.37109375, + "height": 32.199999999999996, + "seed": 1663532325, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691670360809, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 2, + "text": "Compute attack paths", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Compute attack paths", + "lineHeight": 1.15, + "baseline": 26 + }, + { + "type": "rectangle", + "version": 87, + "versionNonce": 931291365, + "isDeleted": false, + "id": "ZInMjpv74vj_jOD2Pr9i6", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1323, + "y": 502, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 381, + "height": 96, + "seed": 290761579, + "groupIds": [], + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "id": "jYF9DOMdn-Nr5elnlLzns", + "type": "arrow" + }, + { + "id": "BXpY9BWfInuATqONCSUeP", + "type": "arrow" + } + ], + "updated": 1691670360809, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 272, + "versionNonce": 1090276331, + "isDeleted": false, + "id": "Ub4UGl4aMzQLxlEMzXEJg", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1622.060546875, + "y": 390.79999999999995, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 243.87890625, + "height": 32.199999999999996, + "seed": 667055051, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1691670360809, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 2, + "text": "Visualize and query", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Visualize and query", + "lineHeight": 1.15, + "baseline": 26 + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "3f5e12b6a50c2eca8b5b822029a61788d400f053": { + "mimeType": "image/png", + "id": "3f5e12b6a50c2eca8b5b822029a61788d400f053", + "dataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAFNCAYAAACT7UWQAAAgAElEQVR4XuydCZgU1fX2q6p7dlaFiIiKBGMCrsEsmA2N/xiNJvolYtyRZdC4RokrMDOguMUlJi4sbriQgFGjRqJRwbhgVKKgGEFERHaQffbpru99e6rNgNPd1d3V3TXdbz3PeQZmuqtu/e6t5b3n3HNMQ5sIiIAIiIAIiIAIiIAIiIAIiIAIiEDOCZg5b4EaIAIiIAIiIAIiIAIiIAIiIAIiIAIiYEigaxCIgAiIgAiIgAiIgAiIgAiIgAiIgA8ISKD7oBPUBBEQAREQAREQAREQAREQAREQARGQQNcYEAEREAEREAEREAEREAEREAEREAEfEJBA90EnqAkiIAIiIAIiIAIiIAIiIAIiIAIiIIGuMSACIiACIiACIiACIiACIiACIiACPiAgge6DTlATREAEREAEREAEREAEREAEREAEREACXWNABERABERABERABERABERABERABHxAQALdB52gJoiACIiACIiACIiACIiACIiACIiABLrGgAiIgAiIgAiIgAiIgAiIgAiIgAj4gIAEug86QU0QAREQAREQAREQAREQAREQAREQAQl0jQEREAEREAEREAEREAEREAEREAER8AEBCXQfdIKaIAIiIAIiIAIiIAIiIAIiIAIiIAIS6BoDIiACIiACIiACIiACIiACIiACIuADAhLoPugENUEEREAEREAEREAEREAEREAEREAEJNA1BkRABERABERABERABERABERABETABwQk0H3QCWqCCIiACIiACIiACIiACIiACIiACEigawyIgAiIgAiIgAiIgAiIgAiIgAiIgA8ISKD7oBPUBBEQAREQAREQAREQAREQAREQARGQQNcYEAEREAEREAEREAEREAEREAEREAEfEJBA90EnqAkiIAIiIAIiIAIiIAIiIAIiIAIiIIGuMSACIiACIiACIiACIiACIiACIiACPiAgge6DTlATREAEREAEREAEREAEREAEREAEREACXWNABERABERABERABERABERABERABHxAQALdB52gJoiACIiACIiACIiACIiACIiACIiABLrGgAiIgAiIgAiIgAiIgAiIgAiIgAj4gIAEug86QU0QAREQAREQAREQAREQAREQAREQAQl0jQEREAEREAEREAEREAEREAEREAER8AEBCXQfdIKaIAIiIAIiIAIiIAIiIAIiIAIiIAIS6BoDIiACIiACIiACIiACIiACIiACIuADAhLoPugENUEEREAEREAEREAEREAEREAEREAEJNA1BkRABERABERABERABERABERABETABwQk0H3QCWqCCIiACIiACIiACIiACIiACIiACEigawyIgAiIgAiIgAiIgAiIgAiIgAiIgA8ISKD7oBPUBBEQAREQAREQAREQAREQAREQARGQQNcYEAEREAEREAEREAEREAEREAEREAEfEJBA90EnqAkiIAIiIAIiIAIiIAIiIAIiIAIiIIGuMSACIiACIiACIiACIiACIiACIiACPiAgge6DTlATREAEREAEREAEREAEREAEREAEREACXWNABERABERABERABERABERABERABHxAQALdB52gJoiACIiACIiACIiACIiACIiACIiABLrGgAiIgAiIgAiIgAiIgAiIgAiIgAj4gIAEug86QU0QAREQAREQAREQAREQAREQAREQAQl0jQEREAEREAEREAEREAEREAEREAER8AEBCXQfdIKaIAIiIAIiIAIiIAIiIAIiIAIiIAIS6BoDIiACIiACIiACIiACIiACIiACIuADAhLoPugENUEEREAEREAEREAEREAEREAEREAEJNA1BkRABERABERABERABERABERABETABwQk0H3QCWqCCIiACIiACIiACIiACIiACIiACEigawyIgAiIgAiIgAiIgAiIgAiIgAiIgA8ISKD7oBPUBBEQAREQAREQAREQAREQAREQARGQQNcYEAEREAEREAEREAEREAEREAEREAEfEJBA90EnqAkiIAIiIAIiIAIiIAIiIAIiIAIiIIGuMSACIiACIiACIiACIiACIiACIiACPiAgge6DTlATREAEREAEREAEREAEREAEREAEREACXWNABERABERABERABERABERABERABHxAQALdB52gJoiACIiACIiACIiACIiACIiACIiABLrGgO8J2Lbddpx+8e9Zs2btNH5PPvlke5eTifzfNM1df+/7c1YDRUAEREAEREAEREAEREAECo+ABHrh9bmvztgR3+bo0aMDS5YsCaxZs6Zox44dxatWrSpBQ2mlsApYZ+cn/08LwMpgRc4JhfCzDhaGNThWi5/bYfzJ3zXyZ//+/Zt69uzZfNBB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", + "created": 1691669750698, + "lastRetrieved": 1691669750698 + }, + "a63456e84b50bbd6ab2da19ff5ab9115a91a260c": { + "mimeType": "image/png", + "id": "a63456e84b50bbd6ab2da19ff5ab9115a91a260c", + "dataURL": "data:image/png;base64,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", + "created": 1691669984446, + "lastRetrieved": 1691669984446 + } + } +} \ No newline at end of file diff --git a/docs/images/kubehound-high-level.png b/docs/images/kubehound-high-level.png new file mode 100644 index 000000000..e215527df Binary files /dev/null and b/docs/images/kubehound-high-level.png differ diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..c79109dda --- /dev/null +++ b/docs/index.md @@ -0,0 +1,21 @@ +# Home + +Welcome to the KubeHound documentation! + +KubeHound creates a graph of attack paths in a Kubernetes cluster, allowing you to identify direct and multi-hop routes an attacker is able to take, visually or through complex graph queries. + +[![](./images/example-graph.png)](./images/example-graph.png) +
*A KubeHound graph showing attack paths between pods, nodes, and identities (click to enlarge)*
+ +After the data is ingested in a graph database, you can ask advanced questions such as: + +- What are all possible container escapes in the cluster? +- What is the shortest exploitable path between an exposed service and a critical asset? +- Is there an attack path from a specific container to a node in the cluster? + +KubeHound was built with efficiency in mind and can consequently handle very large clusters. Ingestion and computation of attack paths typically takes 1 minute for a cluster with 1'000 running pods, 15 minutes for 10'000 pods, and 25 minutes for 25'000 pods. + +Next steps: + +- Learn more about KubeHound [architecture](./architecture.md) and [terminology](./terminology.md) +- [Get started](./user-guide/getting-started.md) using KubeHound \ No newline at end of file diff --git a/docs/js/tablesort.js b/docs/js/tablesort.js new file mode 100644 index 000000000..281c7d892 --- /dev/null +++ b/docs/js/tablesort.js @@ -0,0 +1,12 @@ +/*! + * tablesort v5.2.1 (2020-06-02) + * http://tristen.ca/tablesort/demo/ + * Copyright (c) 2020 ; Licensed MIT +*/ +(function() {function a(b,c){if(!(this instanceof a))return new a(b,c);if(!b||"TABLE"!==b.tagName)throw new Error("Element must be a table");this.init(b,c||{})}var b=[],c=function(a){var b;return window.CustomEvent&&"function"==typeof window.CustomEvent?b=new CustomEvent(a):(b=document.createEvent("CustomEvent"),b.initCustomEvent(a,!1,!1,void 0)),b},d=function(a){return a.getAttribute("data-sort")||a.textContent||a.innerText||""},e=function(a,b){return a=a.trim().toLowerCase(),b=b.trim().toLowerCase(),a===b?0:a0)if(a.tHead&&a.tHead.rows.length>0){for(e=0;e0&&n.push(m),o++;if(!n)return}for(o=0;o + +# CE_MODULE_LOAD | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Container](../vertices/CONTAINER.md) | [Node](../vertices/NODE.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | +| [Container](../entities/container.md) | [Node](../entities/node.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | + +Load a kernel module from within an overprivileged container to breakout into the node. ## Details @@ -14,7 +25,7 @@ Container isolation mechanisms are restricted to user-space execution. If an att Execution within a container process with the `CAP_SYS_MODULE` capability enabled. -See the [example pod spec](../../test/setup/test-cluster/attacks/CE_MODULE_LOAD.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setuptest-cluster/attacks/CE_MODULE_LOAD.yaml). ## Checks @@ -55,7 +66,7 @@ Avoid running containers as the root user. Specify an unprivileged user account ## Calculation -+ [EscapeModuleLoad](../../pkg/kubehound/graph/edge/escape_module_load.go) ++ [EscapeModuleLoad](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/escape_module_load.go) ## References: diff --git a/docs/edges/CE_NSENTER.md b/docs/reference/attacks/CE_NSENTER.md similarity index 83% rename from docs/edges/CE_NSENTER.md rename to docs/reference/attacks/CE_NSENTER.md index 8e6445c50..d580a5e6b 100644 --- a/docs/edges/CE_NSENTER.md +++ b/docs/reference/attacks/CE_NSENTER.md @@ -1,10 +1,21 @@ -# CE_NSENTER +--- +title: CE_NSENTER +--- -Container escape via the nsenter built-in linux program that allows executing a binary into another namespace. + + +# CE_NSENTER | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Container](../vertices/CONTAINER.md) | [Node](../vertices/NODE.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | +| [Container](../entities/container.md) | [Node](../entities/node.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | + +Container escape via the nsenter built-in linux program that allows executing a binary into another namespace. ## Details @@ -14,7 +25,7 @@ When both `hostPID: true` and `privileged: true` are set, the pod can see all of Execution within a container process created with `--privileged` AND the `--pid=host` enabled. -See the [example pod spec](../../test/setup/test-cluster/attacks/CE_NSENTER.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setuptest-cluster/attacks/CE_NSENTER.yaml). ## Checks @@ -68,7 +79,7 @@ Avoid running containers as the root user. Specify an unprivileged user account ## Calculation -+ [EscapeNsenter](../../pkg/kubehound/graph/edge/escape_nsenter.go) ++ [EscapeNsenter](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/escape_nsenter.go) ## References: diff --git a/docs/edges/CE_PRIV_MOUNT.md b/docs/reference/attacks/CE_PRIV_MOUNT.md similarity index 80% rename from docs/edges/CE_PRIV_MOUNT.md rename to docs/reference/attacks/CE_PRIV_MOUNT.md index 1768207e4..5fee3b6c8 100644 --- a/docs/edges/CE_PRIV_MOUNT.md +++ b/docs/reference/attacks/CE_PRIV_MOUNT.md @@ -1,10 +1,21 @@ -# CE_PRIV_MOUNT +--- +title: CE_PRIV_MOUNT +--- -Mount the host disk and gain access to the host via arbitrary filesystem write + + +# CE_PRIV_MOUNT | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Container](../vertices/CONTAINER.md) | [Node](../vertices/NODE.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | +| [Container](../entities/container.md) | [Node](../entities/node.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | + +Mount the host disk and gain access to the host via arbitrary filesystem write ## Details @@ -14,7 +25,7 @@ A container running with `privileged: true` disables almost all the container is Execution within a privileged container process. -See the [example pod spec](../../test/setup/test-cluster/attacks/CE_PRIV_MOUNT.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setuptest-cluster/attacks/CE_PRIV_MOUNT.yaml). ## Checks @@ -67,7 +78,7 @@ Avoid running containers as the root user. Specify an unprivileged user account ## Calculation -+ [EscapePrivMount](../../pkg/kubehound/graph/edge/escape_priv_mount.go) ++ [EscapePrivMount](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/escape_priv_mount.go) ## References: diff --git a/docs/edges/CE_SYS_PTRACE.md b/docs/reference/attacks/CE_SYS_PTRACE.md similarity index 80% rename from docs/edges/CE_SYS_PTRACE.md rename to docs/reference/attacks/CE_SYS_PTRACE.md index 20d6de008..93bf8668c 100644 --- a/docs/edges/CE_SYS_PTRACE.md +++ b/docs/reference/attacks/CE_SYS_PTRACE.md @@ -1,10 +1,21 @@ -# CE_SYS_PTRACE +--- +title: CE_SYS_PTRACE +--- -Given the requisite capabilities, abuse the legitimate OS debugging mechanisms to escape the container via attaching to a node process. + + +# CE_SYS_PTRACE | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Container](../vertices/CONTAINER.md) | [Node](../vertices/NODE.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | +| [Container](../entities/container.md) | [Node](../entities/node.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | + +Given the requisite capabilities, abuse the legitimate OS debugging mechanisms to escape the container via attaching to a node process. ## Details @@ -14,7 +25,7 @@ The `SYS_PTRACE` capability, which allows the use of `ptrace()`. This system cal To perform this attack, the container must be started with the option `--pid=host`, which enables the sharing of the PID address space between the container and the host operating system, allowing the container process to see every other process running on the host. And the container needs to be granted `SYS_PTRACE` and `SYS_ADMIN` capabilities. -See the [example pod spec](../../test/setup/test-cluster/attacks/CE_SYS_PTRACE.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setuptest-cluster/attacks/CE_SYS_PTRACE.yaml). ## Checks @@ -68,7 +79,7 @@ Avoid running containers as the root user. Specify an unprivileged user account ## Calculation -+ [EscapeSysPtrace](../../pkg/kubehound/graph/edge/escape_sys_ptrace.go) ++ [EscapeSysPtrace](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/escape_sys_ptrace.go) ## References: diff --git a/docs/edges/CE_UMH_CORE_PATTERN.md b/docs/reference/attacks/CE_UMH_CORE_PATTERN.md similarity index 87% rename from docs/edges/CE_UMH_CORE_PATTERN.md rename to docs/reference/attacks/CE_UMH_CORE_PATTERN.md index 3735d74ad..9a6b2e921 100644 --- a/docs/edges/CE_UMH_CORE_PATTERN.md +++ b/docs/reference/attacks/CE_UMH_CORE_PATTERN.md @@ -1,10 +1,17 @@ + + # CE_UMH_CORE_PATTERN Container escape via the `core_pattern` `usermode_helper` in the case of an exposed `/proc` mount. | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Container](../vertices/CONTAINER.md) | [Node](../vertices/NODE.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | +| [Container](../entities/container.md) | [Node](../entities/node.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | ## Details @@ -14,7 +21,7 @@ Container escape via the `core_pattern` `usermode_helper` in the case of an expo Execution within a container process with the host `/proc/sys/kernel` (or any parent directory) mounted inside the container. -See the [example pod spec](../../test/setup/test-cluster/attacks/CE_UMH_CORE_PATTERN.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setup/test-cluster/attacks/CE_UMH_CORE_PATTERN.yaml). ## Checks @@ -94,7 +101,7 @@ Avoid running containers as the root user. Specify an unprivileged user account ## Calculation -+ [EscapeUmhCorePattern](../../pkg/kubehound/graph/edge/escape_umh_core_pattern.go) ++ [EscapeUmhCorePattern](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/escape_umh_core_pattern.go) ## References: diff --git a/docs/edges/CONTAINER_ATTACH.md b/docs/reference/attacks/CONTAINER_ATTACH.md similarity index 84% rename from docs/edges/CONTAINER_ATTACH.md rename to docs/reference/attacks/CONTAINER_ATTACH.md index 3bd4c884a..e9436873d 100644 --- a/docs/edges/CONTAINER_ATTACH.md +++ b/docs/reference/attacks/CONTAINER_ATTACH.md @@ -1,10 +1,21 @@ -# CONTAINER_ATTACH +--- +title: CONTAINER_ATTACH +--- -Attach to a container running within a pod given access to the pod. + + +# CONTAINER_ATTACH | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Pod](../vertices/POD.md) | [Container](../vertices/CONTAINER.md) | [Lateral Movement, TA0008](https://attack.mitre.org/tactics/TA0008/) | +| [Pod](../entities/pod.md) | [Container](../entities/container.md) | [Lateral Movement, TA0008](https://attack.mitre.org/tactics/TA0008/) | + +Attach to a container running within a pod given access to the pod. ## Details @@ -54,7 +65,7 @@ kubectl describe pod ## Calculation -+ [ContainerAttach](../../pkg/kubehound/graph/edge/container_attach.go) ++ [ContainerAttach](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/container_attach.go) ## References: diff --git a/docs/edges/ENDPOINT_EXPLOIT.md b/docs/reference/attacks/ENDPOINT_EXPLOIT.md similarity index 67% rename from docs/edges/ENDPOINT_EXPLOIT.md rename to docs/reference/attacks/ENDPOINT_EXPLOIT.md index 7b2b7021a..9a05e3706 100644 --- a/docs/edges/ENDPOINT_EXPLOIT.md +++ b/docs/reference/attacks/ENDPOINT_EXPLOIT.md @@ -1,10 +1,20 @@ +--- +title: ENDPOINT_EXPLOIT +--- + + # ENDPOINT_EXPLOIT Represents a network endpoint exposed by a container that could be exploited by an attacker (via means known or unknown). This can correspond to a Kubernetes service, node service, node port, or container port. | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Endpoint](../vertices/ENDPOINT.md) | [Container](../vertices/CONTAINER.md) | [Network Service Discovery, T1046](https://attack.mitre.org/techniques/T1046/) | +| [Endpoint](../entities/endpoint.md) | [Container](../entities/container.md) | [Exploitation of Remote Services, T1210](https://attack.mitre.org/techniques/T1210/) | ## Details @@ -34,8 +44,8 @@ None ## Calculation -+ [EndpointExploitInternal](../../pkg/kubehound/graph/edge/endpoint_exploit_internal.go) -+ [EndpointExploitExternal](../../pkg/kubehound/graph/edge/endpoint_exploit_external.go) ++ [EndpointExploitInternal](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/endpoint_exploit_internal.go) ++ [EndpointExploitExternal](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/endpoint_exploit_external.go) ## References: diff --git a/docs/edges/EXPLOIT_CONTAINERD_SOCK.md b/docs/reference/attacks/EXPLOIT_CONTAINERD_SOCK.md similarity index 86% rename from docs/edges/EXPLOIT_CONTAINERD_SOCK.md rename to docs/reference/attacks/EXPLOIT_CONTAINERD_SOCK.md index 87896e4d6..c3894e2ec 100644 --- a/docs/edges/EXPLOIT_CONTAINERD_SOCK.md +++ b/docs/reference/attacks/EXPLOIT_CONTAINERD_SOCK.md @@ -1,10 +1,21 @@ -# EXPLOIT_CONTAINERD_SOCK +--- +title: EXPLOIT_CONTAINERD_SOCK +--- -Container escape via the `containerd.sock` file that allows executing a binary into another container. + + +# EXPLOIT_CONTAINERD_SOCK | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Container](../vertices/CONTAINER.md) | [Container](../vertices/CONTAINER.md) | [Lateral Movement, TA0008](https://attack.mitre.org/tactics/TA0008/) | +| [Container](../entities/container.md) | [Container](../entities/container.md) | [Lateral Movement, TA0008](https://attack.mitre.org/tactics/TA0008/) | + +Container escape via the `containerd.sock` file that allows executing a binary into another container. ## Details @@ -31,7 +42,7 @@ docker run -v /var/run/docker.sock:/var/run/docker.sock:ro --rm -it alpine sh docker ps ``` -See the [example pod spec](../../test/setup/test-cluster/attacks/EXPLOIT_CONTAINERD_SOCK.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setuptest-cluster/attacks/EXPLOIT_CONTAINERD_SOCK.yaml). ## Checks @@ -110,7 +121,7 @@ Use a pod security policy or admission controller to prevent or limit the creati ## Calculation -+ [ExploitContainerdSock](../../pkg/kubehound/graph/edge/exploit_containerd_sock.go) ++ [ExploitContainerdSock](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/exploit_containerd_sock.go) ## References: diff --git a/docs/edges/EXPLOIT_HOST_READ.md b/docs/reference/attacks/EXPLOIT_HOST_READ.md similarity index 83% rename from docs/edges/EXPLOIT_HOST_READ.md rename to docs/reference/attacks/EXPLOIT_HOST_READ.md index 51db835be..24d09b477 100644 --- a/docs/edges/EXPLOIT_HOST_READ.md +++ b/docs/reference/attacks/EXPLOIT_HOST_READ.md @@ -1,10 +1,21 @@ -# EXPLOIT_HOST_READ +--- +title: EXPLOIT_HOST_READ +--- -Exploit an arbitrary read from a sensitive host path mounted into the container to gain execution on the host. + + +# EXPLOIT_HOST_READ | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Container](../vertices/CONTAINER.md) | [Node](../vertices/NODE.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | +| [Container](../entities/container.md) | [Node](../entities/node.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | + +Exploit an arbitrary read from a sensitive host path mounted into the container to gain execution on the host. ## Details @@ -14,7 +25,7 @@ If a sensitive host directory is exposed to a container, even as readonly, it ca Execution within a container with a sensitive host path mounted as readonly. -See the [example pod spec](../../test/setup/test-cluster/attacks/EXPLOIT_HOST_READ_TRAVERSE.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setuptest-cluster/attacks/EXPLOIT_HOST_READ_TRAVERSE.yaml). ## Checks @@ -65,7 +76,7 @@ Avoid running containers as the root user. Specify an unprivileged user account ## Calculation -+ [ExploitHostRead](../../pkg/kubehound/graph/edge/exploit_host_read.go) ++ [ExploitHostRead](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/exploit_host_read.go) ## References: diff --git a/docs/edges/EXPLOIT_HOST_TRAVERSE.md b/docs/reference/attacks/EXPLOIT_HOST_TRAVERSE.md similarity index 92% rename from docs/edges/EXPLOIT_HOST_TRAVERSE.md rename to docs/reference/attacks/EXPLOIT_HOST_TRAVERSE.md index 4519e6377..b29d19ba9 100644 --- a/docs/edges/EXPLOIT_HOST_TRAVERSE.md +++ b/docs/reference/attacks/EXPLOIT_HOST_TRAVERSE.md @@ -1,10 +1,21 @@ -# EXPLOIT_HOST_TRAVERSE +--- +title: EXPLOIT_HOST_TRAVERSE +--- -This attack represents the ability to steal a K8s API token from a container via access to a mounted parent volume of the `/var/lib/kubelet/pods` directory. + + +# EXPLOIT_HOST_TRAVERSE | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Volume](../vertices/VOLUME.md) | [Volume](../vertices/VOLUME.md) | [Unsecured Credentials, T1552](https://attack.mitre.org/techniques/T1552/) | +| [Volume](../entities/volume.md) | [Volume](../entities/volume.md) | [Unsecured Credentials, T1552](https://attack.mitre.org/techniques/T1552/) | + +This attack represents the ability to steal a K8s API token from a container via access to a mounted parent volume of the `/var/lib/kubelet/pods` directory. ## Details @@ -84,7 +95,7 @@ automountServiceAccountToken: false ## Calculation -+ [ExploitHostTraverseToken](../../pkg/kubehound/graph/edge/exploit_host_traverse_token.go) ++ [ExploitHostTraverseToken](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/exploit_host_traverse_token.go) ## References: diff --git a/docs/edges/EXPLOIT_HOST_WRITE.md b/docs/reference/attacks/EXPLOIT_HOST_WRITE.md similarity index 72% rename from docs/edges/EXPLOIT_HOST_WRITE.md rename to docs/reference/attacks/EXPLOIT_HOST_WRITE.md index e5de2833c..fa4cbff04 100644 --- a/docs/edges/EXPLOIT_HOST_WRITE.md +++ b/docs/reference/attacks/EXPLOIT_HOST_WRITE.md @@ -1,20 +1,31 @@ -# EXPLOIT_HOST_WRITE +--- +title: EXPLOIT_HOST_WRITE +--- -Exploit an arbitrary write from a sensitive host path mounted into the container to gain execution on the host. + + +# EXPLOIT_HOST_WRITE | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Container](../vertices/CONTAINER.md) | [Node](../vertices/NODE.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | +| [Container](../entities/container.md) | [Node](../entities/node.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | + +Exploit an arbitrary write from a sensitive host path mounted into the container to gain execution on the host. ## Details -If a sensitive host directory is mounted in a container with write permissions there are a huge variety of techniques to achieve execution within a container. Given the array of techniques available we choose to assume that any writeable mount in a container is exploitable unless it corresponds to an entry in the ["known-good" list](../../pkg/kubehound/graph/edge/exploit_host_write.go#:~:text=SafeWriteMountList) of mounts. For illustration purposes we will consider an escape to host via creating a cron job to launch a reverse shell as the host's superuser if the host `/etc` directory is mounted with write permissions. +If a sensitive host directory is mounted in a container with write permissions there are a huge variety of techniques to achieve execution within a container. Given the array of techniques available we choose to assume that any writeable mount in a container is exploitable unless it corresponds to an entry in the ["known-good" list](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/exploit_host_write.go#:~:text=SafeWriteMountList) of mounts. For illustration purposes we will consider an escape to host via creating a cron job to launch a reverse shell as the host's superuser if the host `/etc` directory is mounted with write permissions. ## Prerequisites Execution within a container with a sensitive host directory mounted with write permissions. -See the [example pod spec](../../test/setup/test-cluster/attacks/EXPLOIT_HOST_WRITE.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setuptest-cluster/attacks/EXPLOIT_HOST_WRITE.yaml). ## Checks @@ -55,7 +66,7 @@ Avoid running containers as the root user. Specify an unprivileged user account ## Calculation -+ [ExploitHostWrite](../../pkg/kubehound/graph/edge/exploit_host_write.go) ++ [ExploitHostWrite](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/exploit_host_write.go) ## References: diff --git a/docs/edges/IDENTITY_ASSUME.md b/docs/reference/attacks/IDENTITY_ASSUME.md similarity index 82% rename from docs/edges/IDENTITY_ASSUME.md rename to docs/reference/attacks/IDENTITY_ASSUME.md index 59827d578..0e84037df 100644 --- a/docs/edges/IDENTITY_ASSUME.md +++ b/docs/reference/attacks/IDENTITY_ASSUME.md @@ -1,10 +1,21 @@ -# IDENTITY_ASSUME +--- +title: IDENTITY_ASSUME +--- + + -Represents the capacity to act as an [Identity](../vertices/IDENTITY.md) via ownership of a service account token, user PKI certificate, etc. +# IDENTITY_ASSUME | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Container](../vertices/CONTAINER.md), [Node](../vertices/NODE.md) | [Identity](../vertices/IDENTITY.md) | [Valid Accounts, T1078](https://attack.mitre.org/techniques/T1078/) | +| [Container](../entities/container.md), [Node](../entities/node.md) | [Identity](../entities/identity.md) | [Valid Accounts, T1078](https://attack.mitre.org/techniques/T1078/) | + +Represents the capacity to act as an [Identity](../entities/identity.md) via ownership of a service account token, user PKI certificate, etc. ## Details @@ -81,8 +92,8 @@ Use a pod security policy or admission controller to prevent or limit the identi ## Calculation -+ [IdentityAssumeContainer](../../pkg/kubehound/graph/edge/identity_assume_container.go) -+ [IdentityAssumeNode](../../pkg/kubehound/graph/edge/identity_assume_node.go) ++ [IdentityAssumeContainer](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/identity_assume_container.go) ++ [IdentityAssumeNode](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/identity_assume_node.go) ## References: diff --git a/docs/edges/IDENTITY_IMPERSONATE.md b/docs/reference/attacks/IDENTITY_IMPERSONATE.md similarity index 73% rename from docs/edges/IDENTITY_IMPERSONATE.md rename to docs/reference/attacks/IDENTITY_IMPERSONATE.md index 2c44777b2..d7934df1e 100644 --- a/docs/edges/IDENTITY_IMPERSONATE.md +++ b/docs/reference/attacks/IDENTITY_IMPERSONATE.md @@ -1,10 +1,17 @@ + + # IDENTITY_IMPERSONATE With a [user impersonation privilege](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation) an attacker can impersonate a more privileged account. | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [PermissionSet](../vertices/PERMISSIONSET.md) | [Identity](../vertices/IDENTITY.md) | [Valid Accounts, T1078](https://attack.mitre.org/techniques/T1078/) | +| [PermissionSet](../entities/permissionset.md) | [Identity](../entities/identity.md) | [Valid Accounts, T1078](https://attack.mitre.org/techniques/T1078/) | ## Details @@ -14,7 +21,7 @@ Obtaining the `impersonate users/groups` permission will allow an attacker to ex Ability to interrogate the K8s API with a role allowing impersonate access to users and/or groups. -See the [example pod spec](../../test/setup/test-cluster/attacks/IDENTITY_IMPERSONATE.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setup/test-cluster/attacks/IDENTITY_IMPERSONATE.yaml). ## Checks @@ -45,8 +52,8 @@ Impersonating users is a very powerful privilege and should not be required by t ## Calculation -+ [IdentityImpersonate](../../pkg/kubehound/graph/edge/identity_impersonate.go) -+ [IdentityImpersonateNamespace](../../pkg/kubehound/graph/edge/identity_impersonate_namespace.go) ++ [IdentityImpersonate](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/identity_impersonate.go) ++ [IdentityImpersonateNamespace](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/identity_impersonate_namespace.go) ## References: diff --git a/docs/edges/PERMISSION_DISCOVER.md b/docs/reference/attacks/PERMISSION_DISCOVER.md similarity index 74% rename from docs/edges/PERMISSION_DISCOVER.md rename to docs/reference/attacks/PERMISSION_DISCOVER.md index 1541dad42..95c71a760 100644 --- a/docs/edges/PERMISSION_DISCOVER.md +++ b/docs/reference/attacks/PERMISSION_DISCOVER.md @@ -1,10 +1,21 @@ -# PERMISSION_GRANT +--- +title: PERMISSION_DISCOVER +--- + + + +# PERMISSION_DISCOVER Represents the permissions granted to an identity that can be discovered by an attacker. | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Identity](../vertices/IDENTITY.md) | [PermissionSet](../vertices/PERMISSIONSET.md) | [Valid Accounts, T1078](https://attack.mitre.org/techniques/T1078/) | +| [Identity](../entities/identity.md) | [PermissionSet](../entities/permissionset.md) | [Permission Groups Discovery, T1069](https://attack.mitre.org/techniques/T1078/) | ## Details @@ -38,7 +49,7 @@ None ## Calculation -+ [PermissionDiscover](../../pkg/kubehound/graph/edge/permission_discover.go) ++ [PermissionDiscover](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/permission_discover.go) ## References: diff --git a/docs/edges/POD_ATTACH.md b/docs/reference/attacks/POD_ATTACH.md similarity index 96% rename from docs/edges/POD_ATTACH.md rename to docs/reference/attacks/POD_ATTACH.md index 72f5351cf..a7f25b7cf 100644 --- a/docs/edges/POD_ATTACH.md +++ b/docs/reference/attacks/POD_ATTACH.md @@ -1,10 +1,21 @@ -# POD_ATTACH +--- +title: POD_ATTACH +--- -Attach to a running K8s pod from a K8s node. + + +# POD_ATTACH | Source | Destination | MITRE | | --------------------------- | ------------------------------------- |----------------------------------| -| [Node](../vertices/NODE.md) | [Pod](../vertices/POD.md) | [Lateral Movement, TA0008](https://attack.mitre.org/tactics/TA0008/) | +| [Node](../entities/node.md) | [Pod](../entities/pod.md) | [Lateral Movement, TA0008](https://attack.mitre.org/tactics/TA0008/) | + +Attach to a running K8s pod from a K8s node. ## Details @@ -128,7 +139,7 @@ ctr -n k8s.io task exec -t --exec-id full-control 0f36d12d60d12d041df8941 ## Calculation -+ [PodAttach](../../pkg/kubehound/graph/edge/pod_attach.go) ++ [PodAttach](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/pod_attach.go) ## References: diff --git a/docs/edges/POD_CREATE.md b/docs/reference/attacks/POD_CREATE.md similarity index 85% rename from docs/edges/POD_CREATE.md rename to docs/reference/attacks/POD_CREATE.md index 12dea009b..5087f325e 100644 --- a/docs/edges/POD_CREATE.md +++ b/docs/reference/attacks/POD_CREATE.md @@ -1,10 +1,21 @@ +--- +title: POD_CREATE +--- + + + # POD_CREATE Create a pod with significant privilege (`CAP_SYSADMIN`, `hostPath=/`, etc) and schedule on a target node via setting the `nodeName` selector. | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [PermissionSet](../vertices/PERMISSIONSET.md) | [Node](../vertices/NODE.md) | [Container Orchestration Job, T1053.007](https://attack.mitre.org/techniques/T1053/007/) | +| [PermissionSet](../entities/permissionset.md) | [Node](../entities/node.md) | [Container Orchestration Job, T1053.007](https://attack.mitre.org/techniques/T1053/007/) | ## Details @@ -79,7 +90,7 @@ Use a pod security policy or admission controller to prevent or limit the creati ## Calculation -+ [PodCreate](../../pkg/kubehound/graph/edge/pod_create.go) ++ [PodCreate](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/pod_create.go) ## References: diff --git a/docs/edges/POD_EXEC.md b/docs/reference/attacks/POD_EXEC.md similarity index 69% rename from docs/edges/POD_EXEC.md rename to docs/reference/attacks/POD_EXEC.md index 8de23e206..c7c53694c 100644 --- a/docs/edges/POD_EXEC.md +++ b/docs/reference/attacks/POD_EXEC.md @@ -1,10 +1,21 @@ +--- +title: POD_EXEC +--- + + + # POD_EXEC With the correct privileges an attacker can use the Kubernetes API to obtain a shell on a running pod. | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [PermissionSet](../vertices/PERMISSIONSET.md) | [Pod](../vertices/POD.md) | [Lateral Movement, TA0008](https://attack.mitre.org/tactics/TA0008/) | +| [PermissionSet](../entities/permissionset.md) | [Pod](../entities/pod.md) | [Lateral Movement, TA0008](https://attack.mitre.org/tactics/TA0008/) | ## Details @@ -14,7 +25,7 @@ An attacker with sufficient permissions can execute arbitrary commands inside th Ability to interrogate the K8s API with a role allowing exec access to pods. -See the [example pod spec](../../test/setup/test-cluster/attacks/POD_EXEC.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setup/test-cluster/attacks/POD_EXEC.yaml). ## Checks @@ -45,8 +56,8 @@ Pod interactive execution is a very powerful privilege and should not be require ## Calculation -+ [PodExec](../../pkg/kubehound/graph/edge/pod_exec.go) -+ [PodExecNamespace](../../pkg/kubehound/graph/edge/pod_exec_namespace.go) ++ [PodExec](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/pod_exec.go) ++ [PodExecNamespace](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/pod_exec_namespace.go) ## References: diff --git a/docs/edges/POD_PATCH.md b/docs/reference/attacks/POD_PATCH.md similarity index 83% rename from docs/edges/POD_PATCH.md rename to docs/reference/attacks/POD_PATCH.md index 86505f5c4..3418e37bb 100644 --- a/docs/edges/POD_PATCH.md +++ b/docs/reference/attacks/POD_PATCH.md @@ -1,10 +1,21 @@ +--- +title: POD_PATCH +--- + + + # POD_PATCH With the correct privileges an attacker can use the Kubernetes API to modify certain properties of an existing pod and achieve code execution within the pod | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [PermissionSet](../vertices/PERMISSIONSET.md) | [Pod](../vertices/POD.md) | [Lateral Movement, TA0008](https://attack.mitre.org/tactics/TA0008/) | +| [PermissionSet](../entities/permissionset.md) | [Pod](../entities/pod.md) | [Lateral Movement, TA0008](https://attack.mitre.org/tactics/TA0008/) | ## Details @@ -21,7 +32,7 @@ However, this is still just enough to allow an attacker to achieve execution in Ability to interrogate the K8s API with a role allowing pod patch access. -See the [example pod spec](../../test/setup/test-cluster/attacks/POD_PATCH.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setup/test-cluster/attacks/POD_PATCH.yaml). ## Checks @@ -64,8 +75,8 @@ Pod patch is a very powerful privilege and should not be required by the majorit ## Calculation -+ [PodPatch](../../pkg/kubehound/graph/edge/pod_patch.go) -+ [PodPatchNamespace](../../pkg/kubehound/graph/edge/pod_patch_namespace.go) ++ [PodPatch](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/pod_patch.go) ++ [PodPatchNamespace](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/pod_patch_namespace.go) ## References: diff --git a/docs/edges/ROLE_BIND.md b/docs/reference/attacks/ROLE_BIND.md similarity index 78% rename from docs/edges/ROLE_BIND.md rename to docs/reference/attacks/ROLE_BIND.md index 113c1af86..deb78a7c0 100644 --- a/docs/edges/ROLE_BIND.md +++ b/docs/reference/attacks/ROLE_BIND.md @@ -1,10 +1,22 @@ +--- +title: ROLE_BIND +--- + + + + # ROLE_BIND A role that grants permission to create or modify `(Cluster)RoleBindings` can allow an attacker to escalate privileges on a compromised user. | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [PermissionSet](../vertices/PERMISSIONSET.md) | [PermissionSet](../vertices/PERMISSIONSET.md) | [Valid Accounts, T1078](https://attack.mitre.org/techniques/T1078/) | +| [PermissionSet](../entities/permissionset.md) | [PermissionSet](../entities/permissionset.md) | [Valid Accounts, T1078](https://attack.mitre.org/techniques/T1078/) | ## Details @@ -14,7 +26,7 @@ An attacker with sufficient permission can create a `RoleBinding` with the defau Ability to interact with the K8s API with a role allowing modify or create access to `(Cluster)RoleBindings`. -See the [example pod spec](../../test/setup/test-cluster/attacks/ROLE_BIND.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setup/test-cluster/attacks/ROLE_BIND.yaml). ## Checks @@ -63,8 +75,8 @@ Creating `(Cluster)RoleBinding` is a very powerful privilege and should not be r ## Calculation -+ [RoleBind](../../pkg/kubehound/graph/edge/role_bind.go) -+ [RoleBindNamespace](../../pkg/kubehound/graph/edge/role_bind_namespace.go) ++ [RoleBind](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/role_bind.go) ++ [RoleBindNamespace](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/role_bind_namespace.go) ## References: diff --git a/docs/edges/SHARED_PS_NAMESPACE.md b/docs/reference/attacks/SHARED_PS_NAMESPACE.md similarity index 80% rename from docs/edges/SHARED_PS_NAMESPACE.md rename to docs/reference/attacks/SHARED_PS_NAMESPACE.md index 6d758d816..dd9e763a2 100644 --- a/docs/edges/SHARED_PS_NAMESPACE.md +++ b/docs/reference/attacks/SHARED_PS_NAMESPACE.md @@ -1,11 +1,22 @@ -# SHARED_PS_NAMESPACE - -Represents a relationship between containers within the same pod that share a process namespace. +--- +title: SHARED_PS_NAMESPACE +--- + + +# SHARED_PS_NAMESPACE | Source | Destination | MITRE | | --------------------------- | ------------------------------------- |----------------------------------| -| [Container](../vertices/CONTAINER.md) | [Container](../vertices/CONTAINER.md) | [Lateral Movement, TA0008](https://attack.mitre.org/tactics/TA0008/) | +| [Container](../entities/container.md) | [Container](../entities/container.md) | [Lateral Movement, TA0008](https://attack.mitre.org/tactics/TA0008/) | + +Represents a relationship between containers within the same pod that share a process namespace. ## Details @@ -15,7 +26,7 @@ Pods represent one or more containers with shared storage and network resources. Access to a container within a pod running other containers with shared process nanespaces -See the [example pod spec](../../test/setup/test-cluster/attacks/SHARED_PS_NAMESPACE.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setuptest-cluster/attacks/SHARED_PS_NAMESPACE.yaml). ## Checks @@ -76,7 +87,7 @@ Prevent the use of shared namespaces in pods, where containers have different ri ## Calculation -+ [SharedPsNamespace](../../pkg/kubehound/graph/edge/shared_ps_namespace.go) ++ [SharedPsNamespace](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/shared_ps_namespace.go) ## References: diff --git a/docs/edges/TOKEN_BRUTEFORCE.md b/docs/reference/attacks/TOKEN_BRUTEFORCE.md similarity index 75% rename from docs/edges/TOKEN_BRUTEFORCE.md rename to docs/reference/attacks/TOKEN_BRUTEFORCE.md index 850ee9f3c..c2ddb6549 100644 --- a/docs/edges/TOKEN_BRUTEFORCE.md +++ b/docs/reference/attacks/TOKEN_BRUTEFORCE.md @@ -1,10 +1,21 @@ -# TOKEN_BRUTEFORCE +--- +title: TOKEN_BRUTEFORCE +--- -An identity with a role that allows *get* on secrets (vs list) can potentially view all the serviceaccount tokens in a specific namespace or in the whole cluster (with ClusterRole). + + +# TOKEN_BRUTEFORCE | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [PermissionSet](../vertices/PERMISSIONSET.md) | [Identity](../vertices/IDENTITY.md) | [Steal Application Access Token, T1528](https://attack.mitre.org/techniques/T1528/) | +| [PermissionSet](../entities/permissionset.md) | [Identity](../entities/identity.md) | [Steal Application Access Token, T1528](https://attack.mitre.org/techniques/T1528/) | + +An identity with a role that allows *get* on secrets (vs list) can potentially view all the serviceaccount tokens in a specific namespace or in the whole cluster (with ClusterRole). ## Details @@ -14,7 +25,7 @@ An attacker in possession of a token with permission to read a secret cannot use Ability to interrogate the K8s API with a role allowing get access to secrets. -See the [example pod spec](../../test/setup/test-cluster/attacks/TOKEN_BRUTEFORCE.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setup/test-cluster/attacks/TOKEN_BRUTEFORCE.yaml). ## Checks @@ -41,8 +52,8 @@ Even *get* on secrets is a very powerful privilege and should not be required by ## Calculation -+ [TokenBruteforce](../../pkg/kubehound/graph/edge/token_bruteforce.go) -+ [TokenBruteforceNamespace](../../pkg/kubehound/graph/edge/token_bruteforce_namespace.go) ++ [TokenBruteforce](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/token_bruteforce.go) ++ [TokenBruteforceNamespace](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/token_bruteforce_namespace.go) ## References: diff --git a/docs/edges/TOKEN_LIST.md b/docs/reference/attacks/TOKEN_LIST.md similarity index 73% rename from docs/edges/TOKEN_LIST.md rename to docs/reference/attacks/TOKEN_LIST.md index 631620946..b9d46742f 100644 --- a/docs/edges/TOKEN_LIST.md +++ b/docs/reference/attacks/TOKEN_LIST.md @@ -1,10 +1,21 @@ -# TOKEN_LIST +--- +title: TOKEN_LIST +--- -An identity with a role that allows listing secrets can potentially view all the secrets in a specific namespace or in the whole cluster (with ClusterRole). + + +# TOKEN_LIST | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [PermissionSet](../vertices/PERMISSIONSET.md) | [Identity](../vertices/IDENTITY.md) | [Steal Application Access Token, T1528](https://attack.mitre.org/techniques/T1528/) | +| [PermissionSet](../entities/permissionset.md) | [Identity](../entities/identity.md) | [Steal Application Access Token, T1528](https://attack.mitre.org/techniques/T1528/) | + +An identity with a role that allows listing secrets can potentially view all the secrets in a specific namespace or in the whole cluster (with ClusterRole). ## Details @@ -14,7 +25,7 @@ Obtaining the listing secrets permission will be a significant advantage to an a Ability to interrogate the K8s API with a role allowing list access to secrets. -See the [example pod spec](../../test/setup/test-cluster/attacks/TOKEN_LIST.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setup/test-cluster/attacks/TOKEN_LIST.yaml). ## Checks @@ -44,8 +55,8 @@ Listing secrets is a very powerful privilege and should not be required by the m ## Calculation -+ [TokenList](../../pkg/kubehound/graph/edge/token_list.go) -+ [TokenListNamespace](../../pkg/kubehound/graph/edge/token_list_namespace.go) ++ [TokenList](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/token_list.go) ++ [TokenListNamespace](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/token_list_namespace.go) ## References: diff --git a/docs/edges/TOKEN_STEAL.md b/docs/reference/attacks/TOKEN_STEAL.md similarity index 88% rename from docs/edges/TOKEN_STEAL.md rename to docs/reference/attacks/TOKEN_STEAL.md index 19aefe5ed..576fcc2c6 100644 --- a/docs/edges/TOKEN_STEAL.md +++ b/docs/reference/attacks/TOKEN_STEAL.md @@ -1,10 +1,21 @@ -# TOKEN_STEAL +--- +title: TOKEN_STEAL +--- -This attack represents the ability to steal a K8s API token from an accessible volume. + + +# TOKEN_STEAL | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Volume](../vertices/VOLUME.md) | [Identity](../vertices/IDENTITY.md) | [Unsecured Credentials, T1552](https://attack.mitre.org/techniques/T1552/) | +| [Volume](../entities/volume.md) | [Identity](../entities/identity.md) | [Unsecured Credentials, T1552](https://attack.mitre.org/techniques/T1552/) | + +This attack represents the ability to steal a K8s API token from an accessible volume. ## Details @@ -94,7 +105,7 @@ automountServiceAccountToken: false ## Calculation -+ [TokenSteal](../../pkg/kubehound/graph/edge/token_steal.go) ++ [TokenSteal](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/token_steal.go) ## References: diff --git a/docs/edges/TOKEN_VAR_LOG_SYMLINK.md b/docs/reference/attacks/TOKEN_VAR_LOG_SYMLINK.md similarity index 84% rename from docs/edges/TOKEN_VAR_LOG_SYMLINK.md rename to docs/reference/attacks/TOKEN_VAR_LOG_SYMLINK.md index 21456d0cd..eca64a899 100644 --- a/docs/edges/TOKEN_VAR_LOG_SYMLINK.md +++ b/docs/reference/attacks/TOKEN_VAR_LOG_SYMLINK.md @@ -1,10 +1,21 @@ -# TOKEN_VAR_LOG_SYMLINK +--- +title: TOKEN_VAR_LOG_SYMLINK +--- -Steal all K8s API tokens from a node via an exposed `/var/log` mount. + + +# TOKEN_VAR_LOG_SYMLINK | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Container](../vertices/CONTAINER.md) | [Node](../vertices/NODE.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | +| [Container](../entities/container.md) | [Node](../entities/node.md) | [Escape to Host, T1611](https://attack.mitre.org/techniques/T1611/) | + +Steal all K8s API tokens from a node via an exposed `/var/log` mount. ## Details @@ -14,7 +25,7 @@ A pod running as root and with a mount point to the node’s `/var/log` director Execution as root within a container process with the host `/var/log/` (or any parent directory) mounted inside the container. -See the [example pod spec](../../test/setup/test-cluster/attacks/TOKEN_VAR_LOG_SYMLINK.yaml). +See the [example pod spec](https://github.com/DataDog/KubeHound/tree/main/test/setuptest-cluster/attacks/TOKEN_VAR_LOG_SYMLINK.yaml). ## Checks @@ -56,9 +67,12 @@ ln -s / /host/var/log/root_link Call the kubelet API to read the “logs” and extract pod service account tokens: +TODO Christophe: I was unable to call the kubelet on EKS + ```bash $ KUBE_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) $ NODEIP=$(ip route | awk '/^default/{print $3}') +# On Amazon EKS, if you have access to the IMDS: NODEIP=$(curl http://169.254.169.254/latest/meta-data/local-ipv4) # Find all the pods $ curl -sk -H "Authorization: Bearer $KUBE_TOKEN" https://$NODEIP:10250/logs/root_link/var/lib/kubelet/pods/ @@ -103,7 +117,7 @@ Avoid running containers as the root user. Specify an unprivileged user account ## Calculation -+ [TokenVarLogSymlink](../../pkg/kubehound/graph/edge/token_var_log_symlink.go) ++ [TokenVarLogSymlink](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/token_var_log_symlink.go) ## References: diff --git a/docs/edges/VOLUME_ACCESS.md b/docs/reference/attacks/VOLUME_ACCESS.md similarity index 77% rename from docs/edges/VOLUME_ACCESS.md rename to docs/reference/attacks/VOLUME_ACCESS.md index 7c75c95f1..faa039fb2 100644 --- a/docs/edges/VOLUME_ACCESS.md +++ b/docs/reference/attacks/VOLUME_ACCESS.md @@ -1,10 +1,21 @@ -# VOLUME_ACCESS +--- +title: VOLUME_ACCESS +--- -Represents an attacker with access to a node filesystem gaining access to any volumes mounted inside a container (by definition). + + +# VOLUME_ACCESS | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Node](../vertices/CONTAINER.md) | [Volume](../vertices/VOLUME.md) | [Container and Resource Discovery, T1613](https://attack.mitre.org/techniques/T1613/) | +| [Node](../entities/container.md) | [Volume](../entities/volume.md) | [Container and Resource Discovery, T1613](https://attack.mitre.org/techniques/T1613/) | + +Represents an attacker with access to a node filesystem gaining access to any volumes mounted inside a container (by definition). ## Details @@ -28,7 +39,7 @@ None ## Calculation -+ [VolumeAccess](../../pkg/kubehound/graph/edge/volume_access.go) ++ [VolumeAccess](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/volume_access.go) ## References: diff --git a/docs/edges/VOLUME_DISCOVER.md b/docs/reference/attacks/VOLUME_DISCOVER.md similarity index 91% rename from docs/edges/VOLUME_DISCOVER.md rename to docs/reference/attacks/VOLUME_DISCOVER.md index f8472c191..af0a54e46 100644 --- a/docs/edges/VOLUME_DISCOVER.md +++ b/docs/reference/attacks/VOLUME_DISCOVER.md @@ -1,10 +1,21 @@ -# VOLUME_DISCOVER +--- +title: VOLUME_DISCOVER +--- -Represents an attacker within a container discovering a mounted volume. + + +# VOLUME_DISCOVER | Source | Destination | MITRE | | ----------------------------------------- | ------------------------------------- |----------------------------------| -| [Container](../vertices/CONTAINER.md) | [Volume](../vertices/VOLUME.md) | [Container and Resource Discovery, T1613](https://attack.mitre.org/techniques/T1613/) | +| [Container](../entities/container.md) | [Volume](../entities/volume.md) | [Container and Resource Discovery, T1613](https://attack.mitre.org/techniques/T1613/) | + +Represents an attacker within a container discovering a mounted volume. ## Details @@ -86,7 +97,7 @@ None ## Calculation -+ [VolumeDiscover](../../pkg/kubehound/graph/edge/volume_discover.go) ++ [VolumeDiscover](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/graph/edge/volume_discover.go) ## References: diff --git a/docs/reference/attacks/gen-index.py b/docs/reference/attacks/gen-index.py new file mode 100644 index 000000000..c7fbc73d2 --- /dev/null +++ b/docs/reference/attacks/gen-index.py @@ -0,0 +1,38 @@ +import glob +import yaml + +COMMENT_PREFIX = '' + + +table = """--- +hide: + - toc +--- + +# Attack Reference + +| ID | Name | MITRE ATT&CK Technique | MITRE ATT&CK Tactic | +| :----: | :--: | :-----------------: | :--------------------: | +""" + +for file in sorted(glob.glob('*.md')): + if file == 'index.md': + continue + + with open(file, 'r') as f: + contents = f.read() + startIndex = contents.find(COMMENT_PREFIX) + if startIndex >= 0: + print("Parsing", file) + docsConfig = yaml.safe_load(contents[startIndex+len(COMMENT_PREFIX):contents.find(COMMENT_SUFFIX)]) + attackTacticId, attackTacticName = docsConfig["mitreAttackTactic"].split(' - ') + attackTechniqueId, attackTechniqueName = docsConfig["mitreAttackTechnique"].split(' - ') + table += f'| [{docsConfig["id"]}](./{file}) | {docsConfig["name"]} | {attackTechniqueName} | { attackTacticName} | \n' + else: + print(f"WARNING: {file} does not have a docs config") + + +with open('index.md', 'w') as f: + f.write(table) + \ No newline at end of file diff --git a/docs/reference/attacks/index.md b/docs/reference/attacks/index.md new file mode 100644 index 000000000..9f518ea24 --- /dev/null +++ b/docs/reference/attacks/index.md @@ -0,0 +1,35 @@ +--- +hide: + - toc +--- + +# Attack Reference + +| ID | Name | MITRE ATT&CK Technique | MITRE ATT&CK Tactic | +| :----: | :--: | :-----------------: | :--------------------: | +| [CE_MODULE_LOAD](./CE_MODULE_LOAD.md) | Container escape: Load kernel module | Escape to host | Privilege escalation | +| [CE_NSENTER](./CE_NSENTER.md) | Container escape: nsenter | Escape to host | Privilege escalation | +| [CE_PRIV_MOUNT](./CE_PRIV_MOUNT.md) | Container escape: Mount host filesystem | Escape to host | Privilege escalation | +| [CE_SYS_PTRACE](./CE_SYS_PTRACE.md) | Container escape: Attach to host process via SYS_PTRACE | Escape to host | Privilege escalation | +| [CE_UMH_CORE_PATTERN](./CE_UMH_CORE_PATTERN.md) | Container escape: through core_pattern usermode_helper | Escape to host | Privilege escalation | +| [CONTAINER_ATTACH](./CONTAINER_ATTACH.md) | Attach to running container | N/A | Lateral Movement | +| [ENDPOINT_EXPLOIT](./ENDPOINT_EXPLOIT.md) | Exploit exposed endpoint | Exploitation of Remote Services | Lateral Movement | +| [EXPLOIT_CONTAINERD_SOCK](./EXPLOIT_CONTAINERD_SOCK.md) | Container escape: Through mounted container runtime socket | N/A | Lateral Movement | +| [EXPLOIT_HOST_READ](./EXPLOIT_HOST_READ.md) | Read file from sensitive host mount | Escape to host | Privilege escalation | +| [EXPLOIT_HOST_TRAVERSE](./EXPLOIT_HOST_TRAVERSE.md) | Steal service account token through kubelet host mount | Unsecured Credentials | Credential Access | +| [EXPLOIT_HOST_WRITE](./EXPLOIT_HOST_WRITE.md) | Container escape: Write to sensitive host mount | Escape to host | Privilege escalation | +| [IDENTITY_ASSUME](./IDENTITY_ASSUME.md) | Act as identity | Valid Accounts | Privilege escalation | +| [IDENTITY_IMPERSONATE](./IDENTITY_IMPERSONATE.md) | Impersonate user/group | Valid Accounts | Privilege escalation | +| [PERMISSION_DISCOVER](./PERMISSION_DISCOVER.md) | Enumerate permissions | Permission Groups Discovery | Discovery | +| [POD_ATTACH](./POD_ATTACH.md) | Attach to running pod | N/ATODO | Lateral Movement | +| [POD_CREATE](./POD_CREATE.md) | Create privileged pod | Scheduled Task/Job: Container Orchestration Job | Privilege escalation | +| [POD_EXEC](./POD_EXEC.md) | Exec into running pod | N/A | Lateral Movement | +| [POD_PATCH](./POD_PATCH.md) | Patch running pod | N/A | Lateral Movement | +| [ROLE_BIND](./ROLE_BIND.md) | Create role binding | Valid Accounts | Privilege Escalation | +| [SHARED_PS_NAMESPACE](./SHARED_PS_NAMESPACE.md) | Access container in shared process namespace | N/A | Lateral Movement | +| [TOKEN_BRUTEFORCE](./TOKEN_BRUTEFORCE.md) | Brute-force secret name of service account token | Steal Application Access Token | Credential Access | +| [TOKEN_LIST](./TOKEN_LIST.md) | Access service account token secrets | Steal Application Access Token | Credential Access | +| [TOKEN_STEAL](./TOKEN_STEAL.md) | Steal service account token from volume | Unsecured Credentials | Credential Access | +| [TOKEN_VAR_LOG_SYMLINK](./TOKEN_VAR_LOG_SYMLINK.md) | Steal service account token from volume | Unsecured Credentials | Credential Access | +| [VOLUME_ACCESS](./VOLUME_ACCESS.md) | Access host volume | Container and Resource Discovery | Discovery | +| [VOLUME_DISCOVER](./VOLUME_DISCOVER.md) | Enumerate mounted volumes | Container and Resource Discovery | Discovery | diff --git a/docs/vertices/COMMON.md b/docs/reference/entities/common.md similarity index 100% rename from docs/vertices/COMMON.md rename to docs/reference/entities/common.md diff --git a/docs/vertices/CONTAINER.md b/docs/reference/entities/container.md similarity index 83% rename from docs/vertices/CONTAINER.md rename to docs/reference/entities/container.md index 75145fb79..a40cbd29e 100644 --- a/docs/vertices/CONTAINER.md +++ b/docs/reference/entities/container.md @@ -25,17 +25,17 @@ Properties that are interesting to attackers can be set at a Pod level such as h ## Common Properties -+ [storeID](./COMMON.md#store-information) -+ [app](./COMMON.md#ownership-information) -+ [team](./COMMON.md#ownership-information) -+ [service](./COMMON.md#ownership-information) -+ [compromised](./COMMON.md#risk-information) -+ [namespace](./COMMON.md#namespace-information) -+ [isNamespaced](./COMMON.md#namespace-information) ++ [storeID](./common.md#store-information) ++ [app](./common.md#ownership-information) ++ [team](./common.md#ownership-information) ++ [service](./common.md#ownership-information) ++ [compromised](./common.md#risk-information) ++ [namespace](./common.md#namespace-information) ++ [isNamespaced](./common.md#namespace-information) ## Definition -[vertex.Container](../../pkg/kubehound/models/graph/container.go) +[vertex.Container](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/models/graph/container.go) ## References diff --git a/docs/vertices/ENDPOINT.md b/docs/reference/entities/endpoint.md similarity index 68% rename from docs/vertices/ENDPOINT.md rename to docs/reference/entities/endpoint.md index ea6bf76f2..23d77170e 100644 --- a/docs/vertices/ENDPOINT.md +++ b/docs/reference/entities/endpoint.md @@ -14,22 +14,22 @@ A network endpoint exposed by a container accessible via a Kubernetes service, e | port | `int` | Exposed port of the endpoint | | portName | `string` | Name of the exposed port | | protocol | `string` | Endpoint protocol (TCP, UDP, etc) | -| exposure | `string` | Enum value describing the level of exposure of the endpoint (see [EndpointExposureType](../../pkg/kubehound/models/shared/constants.go)) | +| exposure | `string` | Enum value describing the level of exposure of the endpoint (see [EndpointExposureType](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/models/shared/constants.go)) | ## Common Properties -+ [storeID](./COMMON.md#store-information) -+ [app](./COMMON.md#ownership-information) -+ [team](./COMMON.md#ownership-information) -+ [service](./COMMON.md#ownership-information) -+ [compromised](./COMMON.md#risk-information) -+ [namespace](./COMMON.md#namespace-information) -+ [isNamespaced](./COMMON.md#namespace-information) ++ [storeID](./common.md#store-information) ++ [app](./common.md#ownership-information) ++ [team](./common.md#ownership-information) ++ [service](./common.md#ownership-information) ++ [compromised](./common.md#risk-information) ++ [namespace](./common.md#namespace-information) ++ [isNamespaced](./common.md#namespace-information) ## Definition -[vertex.Endpoint](../../pkg/kubehound/models/graph/endpoint.go) +[vertex.Endpoint](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/models/graph/endpoint.go) ## References diff --git a/docs/vertices/IDENTITY.md b/docs/reference/entities/identity.md similarity index 61% rename from docs/vertices/IDENTITY.md rename to docs/reference/entities/identity.md index 6a20b9134..4c9a901a3 100644 --- a/docs/vertices/IDENTITY.md +++ b/docs/reference/entities/identity.md @@ -11,17 +11,17 @@ Identity represents a Kubernetes user or service account. ## Common Properties -+ [storeID](./COMMON.md#store-information) -+ [app](./COMMON.md#ownership-information) -+ [team](./COMMON.md#ownership-information) -+ [service](./COMMON.md#ownership-information) -+ [critical](./COMMON.md#risk-information) -+ [namespace](./COMMON.md#namespace-information) -+ [isNamespaced](./COMMON.md#namespace-information) ++ [storeID](./common.md#store-information) ++ [app](./common.md#ownership-information) ++ [team](./common.md#ownership-information) ++ [service](./common.md#ownership-information) ++ [critical](./common.md#risk-information) ++ [namespace](./common.md#namespace-information) ++ [isNamespaced](./common.md#namespace-information) ## Definition -[vertex.Identity](../../pkg/kubehound/models/graph/identity.go) +[vertex.Identity](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/models/graph/identity.go) ## References diff --git a/docs/reference/entities/index.md b/docs/reference/entities/index.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/vertices/NODE.md b/docs/reference/entities/node.md similarity index 52% rename from docs/vertices/NODE.md rename to docs/reference/entities/node.md index 08db3031b..162c7d034 100644 --- a/docs/vertices/NODE.md +++ b/docs/reference/entities/node.md @@ -10,18 +10,18 @@ A Kubernetes node. Kubernetes runs workloads by placing containers into Pods to ## Common Properties -+ [storeID](./COMMON.md#store-information) -+ [app](./COMMON.md#ownership-information) -+ [team](./COMMON.md#ownership-information) -+ [service](./COMMON.md#ownership-information) -+ [compromised](./COMMON.md#risk-information) -+ [critical](./COMMON.md#risk-information) -+ [namespace](./COMMON.md#namespace-information) -+ [isNamespaced](./COMMON.md#namespace-information) ++ [storeID](./common.md#store-information) ++ [app](./common.md#ownership-information) ++ [team](./common.md#ownership-information) ++ [service](./common.md#ownership-information) ++ [compromised](./common.md#risk-information) ++ [critical](./common.md#risk-information) ++ [namespace](./common.md#namespace-information) ++ [isNamespaced](./common.md#namespace-information) ## Definition -[vertex.Node](../../pkg/kubehound/models/graph/node.go) +[vertex.Node](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/models/graph/node.go) ## References diff --git a/docs/vertices/PERMISSIONSET.md b/docs/reference/entities/permissionset.md similarity index 59% rename from docs/vertices/PERMISSIONSET.md rename to docs/reference/entities/permissionset.md index 8cc3e85ea..8fc2edcc7 100644 --- a/docs/vertices/PERMISSIONSET.md +++ b/docs/reference/entities/permissionset.md @@ -7,21 +7,21 @@ A permission set represents a Kubernetes RBAC `Role` or `ClusterRole`, which con | Property | Type | Description | | ----------------| --------- |----------------------------------------| | name | `string` | Name of the underlying role in Kubernetes | -| rules | `[]string` | List of strings representing the access granted by the role (see generator function [flattenPolicyRules](../../pkg/kubehound/models/converter/graph.go))| +| rules | `[]string` | List of strings representing the access granted by the role (see generator function [flattenPolicyRules](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/models/converter/graph.go))| ## Common Properties -+ [storeID](./COMMON.md#store-information) -+ [app](./COMMON.md#ownership-information) -+ [team](./COMMON.md#ownership-information) -+ [service](./COMMON.md#ownership-information) -+ [critical](./COMMON.md#risk-information) -+ [namespace](./COMMON.md#namespace-information) -+ [isNamespaced](./COMMON.md#namespace-information) ++ [storeID](./common.md#store-information) ++ [app](./common.md#ownership-information) ++ [team](./common.md#ownership-information) ++ [service](./common.md#ownership-information) ++ [critical](./common.md#risk-information) ++ [namespace](./common.md#namespace-information) ++ [isNamespaced](./common.md#namespace-information) ## Definition -[vertex.PermissionSet](../../pkg/kubehound/models/graph/permission_set.go) +[vertex.PermissionSet](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/models/graph/permission_set.go) ## References diff --git a/docs/vertices/POD.md b/docs/reference/entities/pod.md similarity index 67% rename from docs/vertices/POD.md rename to docs/reference/entities/pod.md index 501de5695..e82d9dac8 100644 --- a/docs/vertices/POD.md +++ b/docs/reference/entities/pod.md @@ -13,18 +13,18 @@ A Kubernetes pod - the smallest deployable units of computing that you can creat ## Common Properties -+ [storeID](./COMMON.md#store-information) -+ [app](./COMMON.md#ownership-information) -+ [team](./COMMON.md#ownership-information) -+ [service](./COMMON.md#ownership-information) -+ [compromised](./COMMON.md#risk-information) -+ [critical](./COMMON.md#risk-information) -+ [namespace](./COMMON.md#namespace-information) -+ [isNamespaced](./COMMON.md#namespace-information) ++ [storeID](./common.md#store-information) ++ [app](./common.md#ownership-information) ++ [team](./common.md#ownership-information) ++ [service](./common.md#ownership-information) ++ [compromised](./common.md#risk-information) ++ [critical](./common.md#risk-information) ++ [namespace](./common.md#namespace-information) ++ [isNamespaced](./common.md#namespace-information) ## Definition -[vertex.Pod](../../pkg/kubehound/models/graph/pod.go) +[vertex.Pod](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/models/graph/pod.go) ## References diff --git a/docs/vertices/VOLUME.md b/docs/reference/entities/volume.md similarity index 70% rename from docs/vertices/VOLUME.md rename to docs/reference/entities/volume.md index e924e0916..aa98d75b2 100644 --- a/docs/vertices/VOLUME.md +++ b/docs/reference/entities/volume.md @@ -14,16 +14,16 @@ Volume represents a volume mounted in a container and exposed by a node. ## Common Properties -+ [storeID](./COMMON.md#store-information) -+ [app](./COMMON.md#ownership-information) -+ [team](./COMMON.md#ownership-information) -+ [service](./COMMON.md#ownership-information) -+ [namespace](./COMMON.md#namespace-information) -+ [isNamespaced](./COMMON.md#namespace-information) ++ [storeID](./common.md#store-information) ++ [app](./common.md#ownership-information) ++ [team](./common.md#ownership-information) ++ [service](./common.md#ownership-information) ++ [namespace](./common.md#namespace-information) ++ [isNamespaced](./common.md#namespace-information) ## Definition -[vertex.Volume](../../pkg/kubehound/models/graph/volume.go) +[vertex.Volume](https://github.com/DataDog/KubeHound/tree/main/pkg/kubehound/models/graph/volume.go) ## References diff --git a/docs/terminology.md b/docs/terminology.md new file mode 100644 index 000000000..c42592d6b --- /dev/null +++ b/docs/terminology.md @@ -0,0 +1,5 @@ +# Terminology + +TODO +- Entity/edge/resource +- Attack/relationship diff --git a/docs/user-guide/common-operations.md b/docs/user-guide/common-operations.md new file mode 100644 index 000000000..30404ce4c --- /dev/null +++ b/docs/user-guide/common-operations.md @@ -0,0 +1 @@ +TODO \ No newline at end of file diff --git a/docs/user-guide/getting-started.md b/docs/user-guide/getting-started.md new file mode 100644 index 000000000..665e6f68c --- /dev/null +++ b/docs/user-guide/getting-started.md @@ -0,0 +1,99 @@ +# Getting started + +## Prerequisites + +To get started with KubeHound, you'll need the following pre-requirements on your system: + +- [Golang](https://go.dev/doc/install) >= 1.20 (`go version`) +- [Docker](https://docs.docker.com/engine/install/) >= 19.03 (`docker version`) +- [Docker Compose](https://docs.docker.com/compose/compose-file/compose-versioning/) >= v2.0 (`docker compose version`) + +## Running KubeHound + +??? info "tl;dr" + + ```bash + make kubehound && bin/kubehound + ``` + +KubeHound ships with a sensible default configuration designed to get new users up and running quickly. First, prepare the application by running: + +```bash +make kubehound +``` + +This will start [backend services](../architecture.md) via docker compose (wiping any existing data), and compile the kubehound binary from source + +Next, make sure your current kubectl context points at the target cluster: + +```bash +# View the current context +kubectl config current-context + +# Set your context +kubectl config set-context + +# alternatively, use https://github.com/ahmetb/kubectx +``` + +Finally, run KubeHound with the default [configuration](TODO): + +``` +bin/kubehound +``` + +Sample output: + +```text +INFO[0000] Starting KubeHound (run_id: aff49337-5e36-46ea-ac1f-ed224bf215ba) component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0000] Initializing launch options component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0000] Loading application configuration from default embedded component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0000] Initializing application telemetry component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0000] Loading cache provider component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0000] Loaded MemCacheProvider cache provider component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0000] Loading store database provider component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0000] Loaded MongoProvider store provider component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0000] Loading graph database provider component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0000] Loaded JanusGraphProvider graph provider component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0001] Starting Kubernetes raw data ingest component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0001] Loading Kubernetes data collector client component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0001] Loaded k8s-api-collector collector client component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +... +INFO[0028] Building edge ExploitHostWrite component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0028] Edge writer 22 ContainerAttach::CONTAINER_ATTACH written component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0028] Building edge IdentityAssumeNode component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0029] Edge writer 8 ExploitHostWrite::EXPLOIT_HOST_WRITE written component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +... +INFO[0039] Completed edge construction component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0039] Completed graph construction component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +INFO[0039] Attack graph generation complete in 39.108174109s component=kubehound run_id=aff49337-5e36-46ea-ac1f-ed224bf215ba service=kubehound +``` + + +## Access the KubeHound data + +At this point, the KubeHound data has been ingested in KubeHound's [graph database](../architecture.md). +You can use any client that supports accessing JanusGraph - we recommend using [gdotv](https://gdotv.com/): + +- [Download and install] gdotv from the [official website](https://gdotv.com/) +- [Create a connection] to the local KubeHound JanusGraph instance + 1. Click on the `New database connection` button + 2. Enter `localhost` as an hostname, and click on the `Test connection` button + 3. Once the connection is successful, click `Submit` - you're good to go! + +## Visualize and query the KubeHound data + +Once the data is loaded in the graph database, it's time to visualize and query it! + +You can explore it interactively in your graph client. Then, refer to KubeHound's [query library](../queries/index.md) to start asking questions to your data. + +## Generating sample data + +If you don't have a cluster at your disposal, install [kind](https://kind.sigs.k8s.io/#installation-and-usage) and run the following command: + +```bash +make sample-graph +``` + +This will spin up a temporary local kind cluster, run KubeHound on it, and destroy the cluster. + diff --git a/docs/user-guide/troubleshooting.md b/docs/user-guide/troubleshooting.md new file mode 100644 index 000000000..30404ce4c --- /dev/null +++ b/docs/user-guide/troubleshooting.md @@ -0,0 +1 @@ +TODO \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 000000000..52d8dc0b8 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,88 @@ +site_name: KubeHound +repo_url: https://github.com/DataDog/KubeHound +repo_name: datadog/KubeHound +plugins: + - search + - awesome-pages +theme: + name: material + palette: + - scheme: default + primary: black + toggle: + icon: material/toggle-switch-off-outline + name: Switch to dark mode + - scheme: slate + primary: black + toggle: + icon: material/toggle-switch + name: Switch to light mode + features: + - navigation.expand + - navigation.indexes + - navigation.top + - navigation.tabs + - navigation.tabs.sticky + - content.code.copy + icon: + admonition: + note: octicons/tag-16 + abstract: octicons/checklist-16 + info: octicons/info-16 + tip: octicons/squirrel-16 + success: octicons/check-16 + question: octicons/question-16 + warning: octicons/alert-16 + failure: octicons/x-circle-16 + danger: octicons/zap-16 + bug: octicons/bug-16 + example: octicons/beaker-16 + quote: octicons/quote-16 + use_directory_urls: true + extra_javascript: + - path: js/tablesort.js #TODO not working + extra: + social: {} + +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.superfences + - pymdownx.magiclink + - tables + - meta + - abbr + - def_list + - attr_list + - md_in_html + - admonition + - pymdownx.details + - footnotes + - markdown_captions + - pymdownx.tabbed: + alternate_style: true + +nav: + - KubeHound: + - index.md + - Architecture: architecture.md + - Terminology: terminology.md + - Frequently Asked Questions: faq.md + - Comparison with Other Tools: comparison.md + - Contributing: contributing.md + - User Guide: + - Getting Started: user-guide/getting-started.md + - Common Operations: user-guide/common-operations.md + - Troubleshooting: user-guide/troubleshooting.md + - Reference: + - ... |reference/*/*.md + #- Attacks: reference/attacks/index.md + #- Entities: reference/entities/index.md + #- ... | reference/attacks/*.md + #- ... | reference/entities/*.md + - Query Library: + - queries/index.md + +copyright: Copyright 2023-Present Datadog, Inc. \ No newline at end of file