{"id":2424,"date":"2025-05-12T13:50:13","date_gmt":"2025-05-12T11:50:13","guid":{"rendered":"https:\/\/masero.nl\/?p=2424"},"modified":"2025-05-12T14:28:17","modified_gmt":"2025-05-12T12:28:17","slug":"een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4","status":"publish","type":"post","link":"https:\/\/masero.nl\/en\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/","title":{"rendered":"Building a Codeless Connector Platform (CCP) data connector: part 4"},"content":{"rendered":"<p><strong>In deze blogserie laat ik je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) data-connector kunt maken. Als dit je startpunt is, raad ik je aan eerst de vorige delen te lezen, want deze blog is best pittig als standalone.<\/strong><\/p>\n<p><a href=\"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-1\/\">Een Codeless Connector Platform data-connector bouwen: deel 1<\/a><\/p>\n<p><a href=\"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-2\/\">Een Codeless Connector Platform data-connector bouwen: deel 2<\/a><\/p>\n<p><a href=\"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/\">Een Codeless Connector Platform data-connector bouwen: deel 3<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Welkom bij de vierde en laatste blog in de serie, over het bouwen van een connector met behulp van Microsofts Sentinel Codeless Connector Platform (CCP). In het vorige deel legde ik uit hoe je je API-poller bouwt: het mechanisme dat ervoor zorgt dat Sentinel jouw API aanroept. In deze blog gaan we de laatste losse eindjes aan elkaar knopen: aan het eind heb je je eigen CCP-connector gedeployed en draaiend in je Sentinel-werkruimte.<\/p>\n<figure id=\"attachment_2427\" aria-describedby=\"caption-attachment-2427\" style=\"width: 262px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2427 size-full\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/CCP4-image-1.webp\" alt=\"\" width=\"262\" height=\"105\" \/><figcaption id=\"caption-attachment-2427\" class=\"wp-caption-text\">Na deze blog zal je connector helemaal verbonden zijn. Laten we het fiksen!<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p>Zoals altijd zijn alle bestanden die ik in deze blog gebruik terug te vinden op <a href=\"https:\/\/github.com\/timtim589\/CCP_Demo\/tree\/main\">GitHub<\/a>, dus voel je vrij om jouw bestanden te vergelijken met de mijne om het volgen wat makkelijker te maken. Laten we beginnen!<\/p>\n<h3><\/h3>\n<h3>De laatste puntjes op de i<\/h3>\n<p>Als je tot nu toe hebt meegebouwd, ben je bijna klaar met je connector. Je hebt de API verkend, een GUI gebouwd die gebruikersinput accepteert en een mechanisme gemaakt dat Sentinel vertelt hoe de API van 1Password aangeroepen moet worden. Maar we moeten nog wat laatste dingen toevoegen. Om de connector te kunnen deployen, hebben we twee sjablonen nodig: eentje voor een Data Collection Rule (DCR) en eentje voor een Log Analytics Workspace (LAW)-tabel. Tot slot moeten we de vier sjablonen (UI, poller, DCR en tabel) samenvoegen in een groot deployment-bestand met behulp van het PowerShell-script <a href=\"https:\/\/github.com\/Azure\/Azure-Sentinel\/tree\/master\/Tools\/Create-Azure-Sentinel-Solution\/V3\">createSolutionV3<\/a>. We beginnen met de sjablonen!<\/p>\n<p>&nbsp;<\/p>\n<h3>Aan de slag met de sjablonen<\/h3>\n<p>Voor het deployen van onze connector hebben we nog twee bestanden nodig:<\/p>\n<ul>\n<li>Een Data Collection Rule (DCR)-bestand. Een DCR definieert hoe de datastroom verloopt: waar begint het, waar eindigt het en wat gebeurt er onderweg. Je kunt een DCR gebruiken om data te transformeren (velden toevoegen, verwijderen of aanpassen), volledige rijen te filteren en te bepalen in welke tabel een record terechtkomt.<\/li>\n<li>Een Log Analytics Workspace (LAW)-tabel. Een LAW-tabelbestand definieert de structuur van de tabel: welke kolommen er zijn en welk type gegevens ze bevatten (string, integer, datetime, enz.).<\/li>\n<\/ul>\n<p><strong>DCR&#8217;s<\/strong> kunnen vrij complex zijn, dus ik heb geprobeerd het sjabloon zo eenvoudig mogelijk te houden. Een DCR bestaat uit drie hoofdonderdelen:<\/p>\n<ul>\n<li><strong>streamDeclarations:<\/strong> definieert de inkomende datastroom(en) en het formaat van de binnenkomende data.<\/li>\n<li><strong>destinations:<\/strong> definieert waar de data naartoe kan. In ons geval is dat een Log Analytics Workspace.<\/li>\n<li><strong>dataFlows:<\/strong> ontvangt een of meerdere streams, past eventueel Kusto Query Language (KQL) toe voor filtering of transformatie, en stuurt het resultaat door naar de bestemming en de output-tabel.<\/li>\n<\/ul>\n<p>We beginnen met de<strong data-start=\"126\" data-end=\"170\"><code data-start=\"147\" data-end=\"167\">streamDeclarations<\/code>.<\/strong> Er zijn meerdere manieren om deze te defini\u00ebren. Onderstaande codeblok toont het verwachte formaat: we defini\u00ebren een naam voor een stream (beginnend met <code data-start=\"325\" data-end=\"333\">Custom<\/code>, aangezien we geen gebruik maken van een ingebouwde stream), gevolgd door het specificeren van de property-naam en het datatype voor elke kolom.<\/p>\n<p><span class=\"hljs-attr\" style=\"color: #6c757d; font-size: 0.875em;\">&#8220;streamDeclarations&#8221;<\/span><span class=\"hljs-punctuation\" style=\"color: #6c757d; font-size: 0.875em;\">:<\/span> <span class=\"hljs-punctuation\" style=\"color: #6c757d; font-size: 0.875em;\">{<\/span><\/p>\n<footer class=\"blockquote-footer\"><span class=\"hljs-attr\">&#8220;Custom-SomeStreamName&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;columns&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;somename&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><\/footer>\n<p>&nbsp;<\/p>\n<p class=\"\" data-start=\"103\" data-end=\"557\">Om deze DCR zo eenvoudig mogelijk te houden, heb ik de drie datatypes die 1Password aanbiedt (aanmeldingsgebeurtenissen, auditlogboeken en itemgebruik) samengevoegd in \u00e9\u00e9n enkele inkomende stream. Dit is niet aan te raden voor productieomgevingen, omdat filteren extra kosten met zich mee kan brengen, maar het is een eenvoudige implementatie die gemakkelijk te reproduceren is. In onderstaand codefragment zie je onze gecombineerde inkomende stream.<\/p>\n<p><span class=\"hljs-attr\" style=\"color: #6c757d; font-size: 0.875em;\">&#8220;streamDeclarations&#8221;<\/span><span class=\"hljs-punctuation\" style=\"color: #6c757d; font-size: 0.875em;\">:<\/span> <span class=\"hljs-punctuation\" style=\"color: #6c757d; font-size: 0.875em;\">{<\/span><\/p>\n<footer class=\"blockquote-footer\"><span class=\"hljs-attr\">&#8220;Custom-OnePasswordEvents&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;columns&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;uuid&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;timestamp&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;datetime&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;action&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;actor_details&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;dynamic&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;actor_uuid&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;aux_details&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;dynamic&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;aux_id&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;aux_info&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;dynamic&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;aux_uuid&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;category&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;client&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;dynamic&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;country&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;details&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;dynamic&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;item_uuid&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;dynamic&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;location&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;dynamic&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;object_details&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;dynamic&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;object_type&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;object_uuid&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;session&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;dynamic&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;session_uuid&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;target_user&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;dynamic&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;used_version&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;int&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;user&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;dynamic&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;vault_uuid&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;type&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;string&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><\/footer>\n<p>&nbsp;<\/p>\n<p>Daarna moeten we de gecombineerde stream opsplitsen in drie tabellen op basis van unieke eigenschappen per datatype. Hiervoor gebruiken we KQL-transformaties binnen de dataFlows. De opzet van een dataFlows object zie je hieronder.<\/p>\n<footer class=\"blockquote-footer\"><span class=\"hljs-attr\">&#8220;dataFlows&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;streams&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><span class=\"hljs-punctuation\">]<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;transformKql&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;destinations&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><span class=\"hljs-punctuation\">]<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;outputStream&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><\/footer>\n<p>&nbsp;<\/p>\n<p class=\"\" data-start=\"128\" data-end=\"398\">Het is een vrij eenvoudig object: we defini\u00ebren de stream die we als input willen gebruiken, transformeren deze tot op zekere hoogte met behulp van KQL, en sturen de resultaten vervolgens naar een bestemming en een specifieke <code data-start=\"358\" data-end=\"372\">outputStream<\/code> (in ons geval een tabel). Aangezien onze inputstream echter een combinatie is van alle mogelijke logtypes van 1Password, zullen we wat KQL moeten gebruiken om deze van elkaar te scheiden. Gelukkig kunnen we de verschillende logtypen eenvoudig splitsen op basis van een unieke eigenschap:<\/p>\n<ul data-start=\"663\" data-end=\"861\">\n<li class=\"\" data-start=\"663\" data-end=\"723\">\n<p class=\"\" data-start=\"665\" data-end=\"723\">De property <code data-start=\"677\" data-end=\"690\">object_type<\/code> is uniek voor de Audit Events.<\/p>\n<\/li>\n<li class=\"\" data-start=\"724\" data-end=\"779\">\n<p class=\"\" data-start=\"726\" data-end=\"779\">De property <code data-start=\"738\" data-end=\"744\">type<\/code> is uniek voor de Sign-In Events.<\/p>\n<\/li>\n<li class=\"\" data-start=\"780\" data-end=\"861\">\n<p class=\"\" data-start=\"782\" data-end=\"861\">De properties <code data-start=\"796\" data-end=\"807\">item_uuid<\/code> en <code data-start=\"811\" data-end=\"823\">vault_uuid<\/code> zijn uniek voor de Item Usage Events.<\/p>\n<\/li>\n<\/ul>\n<p class=\"\" data-start=\"863\" data-end=\"952\">Wanneer we dit toepassen op onze skeleton-template, krijgen we het onderstaande sjabloon.<\/p>\n<footer class=\"blockquote-footer\">\n<p data-start=\"863\" data-end=\"952\"><span class=\"hljs-attr\">&#8220;dataFlows&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;streams&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-string\">&#8220;Custom-OnePasswordEvents&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;destinations&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-string\">&#8220;clv2ws1&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;transformKql&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;source | where isnotempty(object_type) | project-rename TimeGenerated = timestamp, EventId = uuid&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;outputStream&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;Custom-OnePasswordAuditEvents_CL&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;streams&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-string\">&#8220;Custom-OnePasswordEvents&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;destinations&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-string\">&#8220;clv2ws1&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;transformKql&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;source | where isnotempty(type) | project-rename TimeGenerated = timestamp, EventId = uuid, SignInType = type&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;outputStream&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;Custom-OnePasswordSignInEvents_CL&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;streams&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-string\">&#8220;Custom-OnePasswordEvents&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;destinations&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-string\">&#8220;clv2ws1&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;transformKql&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;source | where isnotempty(item_uuid) or isnotempty(vault_uuid) | project-rename TimeGenerated = timestamp, EventId = uuid&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;outputStream&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;Custom-OnePasswordItemUsageEvents_CL&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><\/p>\n<\/footer>\n<p class=\"\" data-start=\"119\" data-end=\"206\">Een scherp oog zal wellicht een paar zaken opmerken die wat extra uitleg verdienen:<\/p>\n<ul data-start=\"208\" data-end=\"1239\">\n<li class=\"\" data-start=\"208\" data-end=\"437\">\n<p class=\"\" data-start=\"210\" data-end=\"437\">Alle <code data-start=\"215\" data-end=\"226\">dataFlows<\/code> gebruiken de stream <code data-start=\"247\" data-end=\"273\">Custom-OnePasswordEvents<\/code> als input. Let erop dat deze naam exact overeen moet komen met de eerder gedefinieerde streamnaam \u2014 anders weet de DCR niet waar de inputdata vandaan moet komen.<\/p>\n<\/li>\n<li class=\"\" data-start=\"438\" data-end=\"930\">\n<p class=\"\" data-start=\"440\" data-end=\"930\">De property <code data-start=\"452\" data-end=\"466\">transformKql<\/code> doet meer dan alleen data filteren: we hernoemen ook kolommen (met <code data-start=\"534\" data-end=\"550\">project-rename<\/code>)! Dat doen we om een paar redenen: elke logregel die via een DCR wordt ingelezen, moet een <code data-start=\"642\" data-end=\"657\">TimeGenerated<\/code>-property van het type <code data-start=\"680\" data-end=\"690\">datetime<\/code> bevatten. Daarnaast zijn er enkele \u201cgereserveerde\u201d kolommen die we niet mogen gebruiken. De kolommen <code data-start=\"792\" data-end=\"798\">type<\/code> en <code data-start=\"802\" data-end=\"808\">uuid<\/code> vallen daaronder, dus hernoemen we die. Als we dat niet zouden doen, zou de DCR bij het deployen een foutmelding geven.<\/p>\n<\/li>\n<li class=\"\" data-start=\"931\" data-end=\"1239\">\n<p class=\"\" data-start=\"933\" data-end=\"1239\">Je zult ook zien dat de verschillende dataflows allemaal verwijzen naar een <code data-start=\"1009\" data-end=\"1022\">destination<\/code>, die we nog niet hebben gedefinieerd. Gelukkig is dat onderdeel heel eenvoudig: we defini\u00ebren het type bestemming \u2014 in dit geval <code data-start=\"1152\" data-end=\"1166\">logAnalytics<\/code> \u2014 en geven vervolgens de <code data-start=\"1192\" data-end=\"1204\">resourceId<\/code> en een naam op voor de bestemming.<\/p>\n<\/li>\n<\/ul>\n<footer class=\"blockquote-footer\"><span class=\"hljs-attr\">&#8220;destinations&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;logAnalytics&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;workspaceResourceId&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;{{workspaceResourceId}}&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;clv2ws1&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><\/footer>\n<p>&nbsp;<\/p>\n<p class=\"\" data-start=\"151\" data-end=\"932\">Zoals je misschien is opgevallen, is de<strong data-start=\"151\" data-end=\"240\"><code data-start=\"193\" data-end=\"214\">workspaceResourceId<\/code><\/strong>niet echt gedefinieerd: deze wordt ingevuld met een placeholder (aangegeven tussen accolades). Dat is logisch als je er even over nadenkt: stel je voor dat je connector uitgerold wordt naar duizenden workspaces wereldwijd \u2014 je zou nooit van tevoren de locatie of de resource ID van al die omgevingen kunnen weten. Gelukkig lost het Codeless Connector Platform (CCP) dit probleem voor ons op: wanneer we de connector defini\u00ebren, kunnen we placeholders gebruiken voor bepaalde eigenschappen. Zodra iemand onze (straks verpakte) connector uitrolt, worden die placeholders automatisch ingevuld met gegevens uit de deployment. Op die manier zijn zaken zoals <code data-start=\"870\" data-end=\"882\">resourceId<\/code> en locatie altijd afgestemd op de doelworkspaces.<\/p>\n<p class=\"\" data-start=\"934\" data-end=\"1393\">Als je al bekend bent met DCR\u2019s, vraag je je wellicht af waar ons Data Collection Endpoint (DCE)-bestand gebleven is. E\u00e9n van de handige dingen aan het CCP is dat het veel werk op de achtergrond voor ons verricht. Een daarvan is het automatisch uitrollen van een DCE wanneer iemand onze connector deployt, en deze vervolgens koppelen aan de juiste DCR. We kunnen het DCE-bestand dus gerust weglaten, in de wetenschap dat het CCP dit automatisch afhandelt.<\/p>\n<p data-start=\"934\" data-end=\"1393\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2428 size-full alignnone\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/zi04r1ae.png\" alt=\"\" width=\"466\" height=\"510\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/zi04r1ae.png 466w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/zi04r1ae-274x300.png 274w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/p>\n<p class=\"\" data-start=\"103\" data-end=\"551\">Nu we onze DCR hebben gedefinieerd, hebben we ook drie tabellen nodig. Het aanmaken van LAW-tabellen (Log Analytics Workspace) is vrij eenvoudig \u2014 zolang je maar zeker weet dat de property-namen en datatypes correct zijn. Je kunt zowel het <a href=\"https:\/\/github.com\/timtim589\/CCP_Demo\/blob\/main\/MediumDemo\/Data%20Connectors\/1Password_CCP\/Table.json\">tabelbestand<\/a> als <a href=\"https:\/\/github.com\/timtim589\/CCP_Demo\/blob\/main\/MediumDemo\/Data%20Connectors\/1Password_CCP\/DCR.json\">het volledige DCR-bestand<\/a> terugvinden op GitHub. Voor de leesbaarheid heb ik hier enkele details en properties weggelaten, dus raadpleeg zeker de originele bestanden als je zelf meebouwt.<\/p>\n<h3 class=\"\" data-start=\"558\" data-end=\"583\">Het verpakkingsproces<\/h3>\n<p class=\"\" data-start=\"585\" data-end=\"988\">Goed, we hebben nu vier verschillende templates: een UI-bestand, een poller-bestand, een DCR en een tabelbestand. Als je nieuwsgierig bent ingesteld, heb je misschien al geprobeerd deze te deployen \u2014 met als resultaat een reeks foutmeldingen. Dat komt omdat deze templates eerst gebundeld en verpakt moeten worden als een Sentinel Content Hub-oplossing, voordat ze succesvol uitgerold kunnen worden.<\/p>\n<p class=\"\" data-start=\"990\" data-end=\"1113\">Om dat te doen, gebruiken we het PowerShell-script <code data-start=\"1041\" data-end=\"1059\"><a href=\"https:\/\/github.com\/Azure\/Azure-Sentinel\/tree\/master\/Tools\/Create-Azure-Sentinel-Solution\/V3\">createSolutionV3<\/a><\/code>, dat deel uitmaakt van de <a href=\"https:\/\/github.com\/Azure\/Azure-Sentinel\">Sentinel GitHub-repository<\/a>. Het verpakkingsproces kan licht vari\u00ebren, afhankelijk van het besturingssysteem en de code-editor die je gebruikt, maar het verloop is in grote lijnen hetzelfde. Enige basiskennis van Git is handig, maar zeker niet vereist. De eerste stap is het clonen van de Sentinel-repository. Ga naar de <a href=\"https:\/\/github.com\/Azure\/Azure-Sentinel\">Sentinel GitHub-pagina<\/a> en klik op de knop \u201cCode\u201d. Kopieer de lokale HTTPS-URL; die gebruiken we om de repository lokaal te klonen.<\/p>\n<figure id=\"attachment_2429\" aria-describedby=\"caption-attachment-2429\" style=\"width: 916px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2429\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/n7frmhnp.png\" alt=\"\" width=\"916\" height=\"420\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/n7frmhnp.png 916w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/n7frmhnp-300x138.png 300w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/n7frmhnp-768x352.png 768w\" sizes=\"auto, (max-width: 916px) 100vw, 916px\" \/><figcaption id=\"caption-attachment-2429\" class=\"wp-caption-text\">De kloon link ophalen van GitHub.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p>Open een nieuw venster in Visual Studio Code en navigeer naar het tabblad Versiebeheer. Klik op de knop <em data-start=\"104\" data-end=\"122\">Clone Repository<\/em> en plak de URL uit de vorige stap in het pop-upvenster. Je moet nu een pad opgeven waar de repository naartoe gekloond moet worden. Normaal gesproken maakt dat niet zoveel uit, maar aangezien veel scripts in de Sentinel GitHub gebruikmaken van semi-hardcoded paden, kun je het beste klonen naar <code data-start=\"418\" data-end=\"429\">C:\\Github<\/code>. Doe je dat niet, dan wacht je een wereld van ellende (en foutopsporing).<\/p>\n<figure id=\"attachment_2430\" aria-describedby=\"caption-attachment-2430\" style=\"width: 384px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2430 size-full\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/6snjz8gx.png\" alt=\"\" width=\"384\" height=\"234\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/6snjz8gx.png 384w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/6snjz8gx-300x183.png 300w\" sizes=\"auto, (max-width: 384px) 100vw, 384px\" \/><figcaption id=\"caption-attachment-2430\" class=\"wp-caption-text\">Klonen in Visual Studio Code.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p class=\"\" data-start=\"91\" data-end=\"507\">Het kloonproces kan even duren, aangezien de Sentinel GitHub-repository vrij groot is. Zodra het voltooid is, open je je nieuwe project en bekijk je de Verkenner (File Explorer) in Visual Studio Code. In de rootmap (de hoofdmap) van de repository zie je een reeks verschillende submappen. Elke map heeft een specifieke functie \u2014 bijvoorbeeld voor het opslaan van losse analytische regels, workbooks of playbooks. Om onze CCP-connector te kunnen maken, moeten we een oplossing (<em data-start=\"573\" data-end=\"583\">solution<\/em>) aanmaken. Navigeer naar de map <code data-start=\"616\" data-end=\"627\">Solutions<\/code> en maak daar een nieuwe submap aan. Voor dit artikel heb ik gekozen voor de naam \u201cMediumDemo\u201d, maar je kunt uiteraard een naam kiezen die voor jouw use case logisch is.<\/p>\n<p class=\"\" data-start=\"798\" data-end=\"857\">Binnen je nieuwe map maak je vervolgens twee submappen aan:<\/p>\n<ul data-start=\"859\" data-end=\"1289\">\n<li class=\"\" data-start=\"859\" data-end=\"1096\">\n<p class=\"\" data-start=\"861\" data-end=\"1096\"><strong data-start=\"861\" data-end=\"871\"><code data-start=\"863\" data-end=\"869\">data<\/code><\/strong>: Deze map bevat een JSON-bestand dat je solution bij elkaar houdt. In dit bestand geef je o.a. aan wie de auteur is, welk logo gebruikt moet worden, welke content erin zit, welke metadata toegevoegd moet worden, enzovoort.<\/p>\n<\/li>\n<li class=\"\" data-start=\"1097\" data-end=\"1289\">\n<p class=\"\" data-start=\"1099\" data-end=\"1289\"><strong data-start=\"1099\" data-end=\"1120\"><code data-start=\"1101\" data-end=\"1118\">Data Connectors<\/code><\/strong>: Deze map bevat alle dataconnectoren voor je solution. In ons geval zullen hier uiteindelijk de bestanden terechtkomen die we hebben voorbereid voor onze CCP-connector.<\/p>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2431 alignnone\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/x8hb37vk.png\" alt=\"\" width=\"172\" height=\"109\" \/><\/p>\n<p>&nbsp;<\/p>\n<p class=\"\" data-start=\"104\" data-end=\"516\">Voordat we in het verpakkingsproces duiken, wil ik nog kort een aantal nuttige documentatiebronnen aanstippen die in de repository staan \u2014 maar die lastig te vinden zijn als je niet precies weet waar je moet zoeken. Deze blog behandelt alles wat relevant is voor de CCP-deployment, maar als je van plan bent om je eigen Sentinel-oplossing te bouwen, is het aan te raden om de volgende documenten te bekijken:<\/p>\n<ul data-start=\"518\" data-end=\"717\">\n<li class=\"\" data-start=\"518\" data-end=\"570\">\n<p class=\"\" data-start=\"520\" data-end=\"570\"><em data-start=\"520\" data-end=\"568\">Guide to building Microsoft Sentinel Solutions<\/em><\/p>\n<\/li>\n<li class=\"\" data-start=\"571\" data-end=\"630\">\n<p class=\"\" data-start=\"573\" data-end=\"630\"><em data-start=\"573\" data-end=\"628\">Guide to packaging Solutions using the packaging tool<\/em><\/p>\n<\/li>\n<li class=\"\" data-start=\"631\" data-end=\"680\">\n<p class=\"\" data-start=\"633\" data-end=\"680\"><em data-start=\"633\" data-end=\"678\">Guide to packaging Solutions, CCP specifics<\/em><\/p>\n<\/li>\n<li class=\"\" data-start=\"681\" data-end=\"717\">\n<p class=\"\" data-start=\"683\" data-end=\"717\"><em data-start=\"683\" data-end=\"715\">Setting up the connector files<\/em><\/p>\n<\/li>\n<\/ul>\n<h3 data-start=\"724\" data-end=\"779\"><\/h3>\n<h3 class=\"\" data-start=\"724\" data-end=\"779\">Laten we beginnen met het opzetten van de connector<\/h3>\n<p class=\"\" data-start=\"781\" data-end=\"1037\">In je <code data-start=\"787\" data-end=\"804\">Data Connectors<\/code>-submap maak je een nieuwe map aan. De naam mag je zelf kiezen, maar het is gangbare praktijk om de naam te laten eindigen op \u201cCCP\u201d wanneer je een CCP-connector bouwt. Voor dit artikel heb ik gekozen voor de naam \u201c1Password CCP\u201d. Nu je de map voor je connector hebt, kunnen we de bestanden toevoegen die we in de eerdere blogs hebben opgebouwd. Er is wel een conventie qua naamgeving die je moet volgen \u2014 anders herkent de packaging tool je bestanden mogelijk niet correct.<\/p>\n<p class=\"\" data-start=\"1284\" data-end=\"1322\">De naamgeving moet als volgt eindigen:<\/p>\n<ul data-start=\"1324\" data-end=\"1490\">\n<li class=\"\" data-start=\"1324\" data-end=\"1387\">\n<p class=\"\" data-start=\"1326\" data-end=\"1387\">Het UI-bestand van de connector: <code data-start=\"1359\" data-end=\"1385\">connectorDefinition.json<\/code><\/p>\n<\/li>\n<li class=\"\" data-start=\"1388\" data-end=\"1432\">\n<p class=\"\" data-start=\"1390\" data-end=\"1432\">Het poller-bestand: <code data-start=\"1410\" data-end=\"1430\">PollingConfig.json<\/code><\/p>\n<\/li>\n<li class=\"\" data-start=\"1433\" data-end=\"1455\">\n<p class=\"\" data-start=\"1435\" data-end=\"1455\">De DCR: <code data-start=\"1443\" data-end=\"1453\">DCR.json<\/code><\/p>\n<\/li>\n<li class=\"\" data-start=\"1456\" data-end=\"1490\">\n<p class=\"\" data-start=\"1458\" data-end=\"1490\">Het tabelbestand: <code data-start=\"1476\" data-end=\"1488\">Table.json<\/code><\/p>\n<\/li>\n<\/ul>\n<p class=\"\" data-start=\"1492\" data-end=\"1683\">Je kunt er ook voor kiezen om g\u00e9\u00e9n prefix te gebruiken en exact deze bestandsnamen aan te houden \u2014 dat heb ik in dit voorbeeld gedaan. Het resultaat is een set-up zoals hieronder weergegeven.<\/p>\n<figure id=\"attachment_2432\" aria-describedby=\"caption-attachment-2432\" style=\"width: 229px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2432\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/c5ih4wls.png\" alt=\"\" width=\"229\" height=\"152\" \/><figcaption id=\"caption-attachment-2432\" class=\"wp-caption-text\">Setup van de connector bestanden in de Data Connectors map.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<h3 class=\"\" data-start=\"149\" data-end=\"194\">Het voorbereiden van een metadata-bestand<\/h3>\n<p class=\"\" data-start=\"196\" data-end=\"674\">De volgende stap is het aanmaken van het metadata-bestand. Dit bestand is vrij rechttoe rechtaan en vereist voor het verpakkingsproces van een CCP-connector. Als je als doel hebt om een oplossing te publiceren in de Sentinel Content Hub, dan gebeurt hier de magie: je kunt dit bestand koppelen aan een <code data-start=\"502\" data-end=\"511\">offerId<\/code> en <code data-start=\"515\" data-end=\"528\">publisherId<\/code> (beide afkomstig uit het Microsoft Partner Center Marketplace), waardoor het gebruik van jouw oplossing gelinkt kan worden aan je partnerprofiel. Daarnaast kun je ook beschrijvende tags toevoegen aan je oplossing en contactgegevens opgeven voor ondersteuning.<\/p>\n<p class=\"\" data-start=\"795\" data-end=\"1161\">Voor ons voorbeeld volstaat het om het bestand te vullen met een aantal placeholders. Maar als je serieus aan de slag wilt met het bouwen van een production-ready oplossing, lees dan zeker de eerder genoemde documentatie grondig door. Daarin vind je uitgebreide informatie over dit bestand \u00e9n instructies voor het opzetten van een aanbieding in de Azure Marketplace.<\/p>\n<footer class=\"blockquote-footer\">\n<p data-start=\"795\" data-end=\"1161\"><span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;publisherId&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;test&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;offerId&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;test&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;firstPublishDate&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;2025-04-28&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;providers&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-string\">&#8220;test&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;categories&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;domains&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-string\">&#8220;Security &#8211; Network&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;support&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;Tim Groothuis&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;email&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;test@example.com&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;tier&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;Partner&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;link&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;https:\/\/www.example.com&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><\/p>\n<\/footer>\n<h3 class=\"\" data-start=\"98\" data-end=\"144\">Het aanmaken van een solution-data-bestand<\/h3>\n<p class=\"\" data-start=\"146\" data-end=\"395\">Dit is het laatste bestand dat we moeten aanmaken voordat we onze connector kunnen verpakken en uitrollen. Dit bestand hoort thuis in de map <code data-start=\"287\" data-end=\"293\">data<\/code> en moet beginnen met de prefix <code data-start=\"325\" data-end=\"336\">solution_<\/code>. Ik heb het mijne genoemd: <strong data-start=\"364\" data-end=\"394\"><code data-start=\"366\" data-end=\"392\">solution_MediumDemo.json<\/code><\/strong>.<\/p>\n<footer class=\"blockquote-footer\">\n<p data-start=\"146\" data-end=\"395\"><span class=\"hljs-punctuation\">{<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;Name&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;MediumDemo&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;Author&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;Tim Groothuis&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;Logo&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;&lt;img src=\\&#8221;https:\/\/raw.githubusercontent.com\/Azure\/Azure-Sentinel\/master\/Logos\/1password.svg\\&#8221; width=\\&#8221;75px\\&#8221; height=\\&#8221;75px\\&#8221;&gt;&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;Description&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;A demo solution for a medium article about the CCP&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;Data Connectors&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span><br \/>\n<span class=\"hljs-string\">&#8220;Data Connectors\/1Password_CCP\/connectorDefinition.json&#8221;<\/span><br \/>\n<span class=\"hljs-punctuation\">]<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;BasePath&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;C:\\\\GitHub\\\\Azure-Sentinel\\\\Solutions\\\\MediumDemo&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;Version&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;3.0.0&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;Metadata&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">&#8220;SolutionMetadata.json&#8221;<\/span><span class=\"hljs-punctuation\">,<\/span><br \/>\n<span class=\"hljs-attr\">&#8220;TemplateSpec&#8221;<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-literal\"><span class=\"hljs-keyword\">true<\/span><\/span><br \/>\n<span class=\"hljs-punctuation\">}<\/span><\/p>\n<\/footer>\n<p class=\"\" data-start=\"117\" data-end=\"208\">Ik zal niet alle eigenschappen van het bestand behandelen, maar licht de belangrijkste toe:<\/p>\n<ul data-start=\"210\" data-end=\"1488\">\n<li class=\"\" data-start=\"210\" data-end=\"459\">\n<p class=\"\" data-start=\"212\" data-end=\"459\"><strong data-start=\"212\" data-end=\"222\"><code data-start=\"214\" data-end=\"220\">Name<\/code><\/strong> moet exact overeenkomen met de naam van de map die je hebt aangemaakt onder de map <code data-start=\"306\" data-end=\"317\">Solutions<\/code>. Sommige tools gebruiken deze naam om naar bepaalde paden te navigeren \u2014 een andere naam dan die van je solution zal dus leiden tot fouten.<\/p>\n<\/li>\n<li class=\"\" data-start=\"460\" data-end=\"687\">\n<p class=\"\" data-start=\"462\" data-end=\"687\"><strong data-start=\"462\" data-end=\"472\"><code data-start=\"464\" data-end=\"470\">Logo<\/code><\/strong> verwijst naar een logo. Let op: alleen SVG-bestanden worden ondersteund. Als je van plan bent een volledige oplossing te bouwen, zorg er dan voor dat je het logo toevoegt aan de <code data-start=\"655\" data-end=\"661\">Logo<\/code>-map in je pull request.<\/p>\n<\/li>\n<li class=\"\" data-start=\"688\" data-end=\"1152\">\n<p class=\"\" data-start=\"690\" data-end=\"1152\"><strong data-start=\"690\" data-end=\"711\"><code data-start=\"692\" data-end=\"709\">Data Connectors<\/code><\/strong> is het hart van de oplossing: hierin geef je aan waar je dataconnector zich bevindt. Let op dat dit een array is \u2014 een solution kan meerdere connectors bevatten! Voor een Codeless Connector verwijs je naar het <code data-start=\"926\" data-end=\"947\">connectorDefinition<\/code>-bestand (het UI-bestand uit deel 2). De packaging tool gebruikt dat bestand als startpunt en vindt van daaruit het bijbehorende poller-bestand, dat op zijn beurt verwijst naar de DCR- en tabelbestanden.<\/p>\n<\/li>\n<li class=\"\" data-start=\"1153\" data-end=\"1214\">\n<p class=\"\" data-start=\"1155\" data-end=\"1214\"><strong data-start=\"1155\" data-end=\"1169\"><code data-start=\"1157\" data-end=\"1167\">Basepath<\/code><\/strong> is simpelweg het pad naar je solution-map.<\/p>\n<\/li>\n<li class=\"\" data-start=\"1215\" data-end=\"1438\">\n<p class=\"\" data-start=\"1217\" data-end=\"1438\"><strong data-start=\"1217\" data-end=\"1231\"><code data-start=\"1219\" data-end=\"1229\">Metadata<\/code><\/strong> moet overeenkomen met de naam van je metadata-bestand. Deze property is verplicht en mag niet ontbreken \u2014 je hebt dus hoe dan ook een metadata-bestand nodig, ook als je maar \u00e9\u00e9n CCP-connector wilt bouwen.<\/p>\n<\/li>\n<li class=\"\" data-start=\"1439\" data-end=\"1488\">\n<p class=\"\" data-start=\"1441\" data-end=\"1488\"><strong data-start=\"1441\" data-end=\"1459\"><code data-start=\"1443\" data-end=\"1457\">TemplateSpec<\/code><\/strong> moet altijd op <code data-start=\"1475\" data-end=\"1481\">true<\/code> staan.<\/p>\n<\/li>\n<\/ul>\n<p class=\"\" data-start=\"1490\" data-end=\"1600\">Na het invullen van al deze onderdelen zou je solution-map eruit moeten zien zoals op de afbeelding hieronder.<\/p>\n<p data-start=\"1490\" data-end=\"1600\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2433 alignnone\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/vcsxvs2q.png\" alt=\"\" width=\"229\" height=\"219\" \/><\/p>\n<h3 class=\"\" data-start=\"91\" data-end=\"127\">De connector bouwen en verpakken<\/h3>\n<p class=\"\" data-start=\"129\" data-end=\"512\">We zijn bijna bij de finish! Het enige wat we nu nog hoeven te doen is onze connector verpakken met behulp van de packaging tool. Open een terminal in Visual Studio Code (of een andere omgeving naar keuze). Als je je nog steeds in de root van de repository bevindt, vind je de packaging tool op het volgende pad:<br data-start=\"441\" data-end=\"444\" \/><strong data-start=\"444\" data-end=\"512\"><code data-start=\"446\" data-end=\"510\">.\\Tools\\create-Azure-Sentinel-Solution\\V3\\createSolutionV3.ps1<\/code><\/strong><\/p>\n<p class=\"\" data-start=\"514\" data-end=\"706\">Wanneer je dit PowerShell-script aanroept, wordt je gevraagd om het pad naar het solution data-bestand. Geef hier het pad op naar je <strong data-start=\"647\" data-end=\"661\"><code data-start=\"649\" data-end=\"655\">data<\/code><\/strong>-map (dus <em data-start=\"667\" data-end=\"673\">niet<\/em> naar het solution-bestand zelf).<\/p>\n<p data-start=\"514\" data-end=\"706\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2434 alignnone\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/yl761wld.png\" alt=\"\" width=\"643\" height=\"55\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/yl761wld.png 643w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/yl761wld-300x26.png 300w\" sizes=\"auto, (max-width: 643px) 100vw, 643px\" \/><\/p>\n<p class=\"\" data-start=\"98\" data-end=\"323\">De packaging tool begint nu met het controleren van je bestanden. Dit is het moment waarop fouten het vaakst optreden \u2014 maar gelukkig worden die meestal vergezeld van een (minstens vage) beschrijving van wat er misgaat. Wanneer het fouten betreft rond CCP-connectors, is de oorzaak meestal te vinden in de onderlinge koppelingen tussen templates.<\/p>\n<p class=\"\" data-start=\"457\" data-end=\"747\">In je <code data-start=\"463\" data-end=\"484\">connectorDefinition<\/code>-bestand bevindt zich een property <code data-start=\"519\" data-end=\"523\">id<\/code> onder de sectie <code data-start=\"540\" data-end=\"559\">connectorUiConfig<\/code>. De waarde van deze <code data-start=\"580\" data-end=\"584\">id<\/code> moet exact overeenkomen met de property <code data-start=\"625\" data-end=\"650\">connectorDefinitionName<\/code> in het <code data-start=\"658\" data-end=\"673\">PollingConfig<\/code>-bestand. Dit is de koppeling tussen het UI-bestand en het poller-bestand.<\/p>\n<figure id=\"attachment_2435\" aria-describedby=\"caption-attachment-2435\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2435\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ixyun0cf.png\" alt=\"\" width=\"1100\" height=\"251\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ixyun0cf.png 1100w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ixyun0cf-300x68.png 300w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ixyun0cf-1024x234.png 1024w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ixyun0cf-768x175.png 768w\" sizes=\"auto, (max-width: 1100px) 100vw, 1100px\" \/><figcaption id=\"caption-attachment-2435\" class=\"wp-caption-text\">De koppelingsproperty tussen UI-bestand en het poller-bestand.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p>Evenzo bevat je <strong data-start=\"16\" data-end=\"35\"><code data-start=\"18\" data-end=\"33\" data-is-only-node=\"\">PollingConfig<\/code><\/strong>-bestand een property genaamd <strong data-start=\"65\" data-end=\"81\"><code data-start=\"67\" data-end=\"79\" data-is-only-node=\"\">streamName<\/code><\/strong>, die zich bevindt onder de sectie <strong data-start=\"116\" data-end=\"131\"><code data-start=\"118\" data-end=\"129\" data-is-only-node=\"\">DcrConfig<\/code><\/strong>. De waarde van deze <code data-start=\"152\" data-end=\"164\">streamName<\/code> moet exact overeenkomen met de naam van de stream die je hebt gedefinieerd onder <code data-start=\"246\" data-end=\"266\">streamDeclarations<\/code> in je DCR-bestand \u2014 dit vormt de koppeling tussen beide componenten.<\/p>\n<figure id=\"attachment_2436\" aria-describedby=\"caption-attachment-2436\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2436\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/clhc5lfs.png\" alt=\"\" width=\"1100\" height=\"267\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/clhc5lfs.png 1100w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/clhc5lfs-300x73.png 300w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/clhc5lfs-1024x249.png 1024w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/clhc5lfs-768x186.png 768w\" sizes=\"auto, (max-width: 1100px) 100vw, 1100px\" \/><figcaption id=\"caption-attachment-2436\" class=\"wp-caption-text\">De koppelingsproperty tussen een poller en een DCR.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p>Tot slot is er de koppeling tussen je <strong data-start=\"38\" data-end=\"45\">DCR<\/strong> en je <strong data-start=\"52\" data-end=\"68\">tabelbestand<\/strong>. In je DCR bevindt zich onder <code data-start=\"99\" data-end=\"110\">dataFlows<\/code> een property genaamd <strong data-start=\"132\" data-end=\"150\"><code data-start=\"134\" data-end=\"148\" data-is-only-node=\"\">outputStream<\/code><\/strong>. De waarde hiervan moet exact overeenkomen met een tabelnaam zoals gedefinieerd in je tabelbestand \u2014 maar zonder de<strong data-start=\"257\" data-end=\"287\"><code data-start=\"269\" data-end=\"278\">Custom-<\/code><\/strong>prefix.<\/p>\n<figure id=\"attachment_2437\" aria-describedby=\"caption-attachment-2437\" style=\"width: 1010px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2437\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/aqgces3s.png\" alt=\"\" width=\"1010\" height=\"243\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/aqgces3s.png 1010w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/aqgces3s-300x72.png 300w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/aqgces3s-768x185.png 768w\" sizes=\"auto, (max-width: 1010px) 100vw, 1010px\" \/><figcaption id=\"caption-attachment-2437\" class=\"wp-caption-text\">De koppelingsproperty tussen een DCR en een tabel.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p class=\"\" data-start=\"98\" data-end=\"425\">Als je <strong data-start=\"105\" data-end=\"137\"><code data-start=\"107\" data-end=\"125\">solutionMetaData<\/code><\/strong>-bestanden, je solution-data-bestand en de onderlinge koppelingen tussen de templates correct zijn, zou de packaging tool zonder grote problemen moeten draaien. Het kan zijn dat er hier en daar een test faalt, maar doorgaans is dat niet de moeite waard om uitgebreid te gaan troubleshooten. De tool maakt een nieuwe map aan onder je solution-map, genaamd <strong data-start=\"491\" data-end=\"504\"><code data-start=\"493\" data-end=\"502\">Package<\/code><\/strong>. Daarin worden meerdere bestanden gegenereerd, maar het enige bestand dat voor ons van belang is, is <strong data-start=\"606\" data-end=\"629\"><code data-start=\"608\" data-end=\"627\">mainTemplate.json<\/code><\/strong>. Deze template kan uitgerold worden als een gewone ARM-template, waarmee we eindelijk onze connector kunnen deployen!<\/p>\n<blockquote data-start=\"749\" data-end=\"1176\">\n<p class=\"\" data-start=\"751\" data-end=\"1176\">Kleine kanttekening: ik heb gemerkt dat de packaging tool soms niet goed omgaat met meerdere tabellen die in \u00e9\u00e9n bestand zijn gedefinieerd. Het is verstandig om dat even te controleren voordat je doorgaat naar de volgende stap. Rond regel 393 in het gegenereerde bestand zou de definitie van je tabellen moeten beginnen. Als dat er niet uitziet zoals verwacht (zoals op de afbeelding hieronder), dan is er iets misgegaan.<\/p>\n<figure id=\"attachment_2438\" aria-describedby=\"caption-attachment-2438\" style=\"width: 429px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2438\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/psuco3yn.png\" alt=\"\" width=\"429\" height=\"422\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/psuco3yn.png 429w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/psuco3yn-300x295.png 300w\" sizes=\"auto, (max-width: 429px) 100vw, 429px\" \/><figcaption id=\"caption-attachment-2438\" class=\"wp-caption-text\">Zoals je kunt zien voegde de tool niet meerdere tabellen toe, maar \u00e9\u00e9n tabel met meerdere argumenten per property.<\/figcaption><\/figure><\/blockquote>\n<p class=\"\" data-start=\"0\" data-end=\"254\">Gelukkig is de oplossing vrij eenvoudig: selecteer het volledige object dat de foutieve tabel definieert en verwijder het uit de<strong data-start=\"41\" data-end=\"152\"><code data-start=\"131\" data-end=\"150\">mainTemplate.json<\/code><\/strong>. Als je dezelfde templates gebruikt als ik, betreft dit doorgaans regel 393 tot en met regel 570. Ga vervolgens naar je oorspronkelijke tabelbestand en kopieer de volledige inhoud, met uitzondering van de array-haken (dus <em data-start=\"388\" data-end=\"396\">zonder<\/em> de <code data-start=\"400\" data-end=\"403\">[<\/code> en <code data-start=\"407\" data-end=\"410\">]<\/code>). Plak dit dan op exact dezelfde plek in de <code data-start=\"455\" data-end=\"474\">mainTemplate.json<\/code> waar je zojuist het foutieve object hebt verwijderd.<\/p>\n<p class=\"\" data-start=\"529\" data-end=\"651\">De sectie zou er uiteindelijk ongeveer zo uit moeten zien als op de onderstaande afbeelding (in het oorspronkelijke blog).<\/p>\n<figure id=\"attachment_2439\" aria-describedby=\"caption-attachment-2439\" style=\"width: 485px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2439\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/oln62vvo.png\" alt=\"\" width=\"485\" height=\"399\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/oln62vvo.png 485w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/oln62vvo-300x247.png 300w\" sizes=\"auto, (max-width: 485px) 100vw, 485px\" \/><figcaption id=\"caption-attachment-2439\" class=\"wp-caption-text\">Je wilt dat je tabellen er zo uit komen te zien.<\/figcaption><\/figure>\n<h3 class=\"\" data-start=\"0\" data-end=\"53\">De grote finale: het deployen van onze connector!<\/h3>\n<p class=\"\" data-start=\"55\" data-end=\"266\">Je hebt je templates zorgvuldig opgebouwd, alles verpakt, misschien een foutje opgelost, en nu is het moment eindelijk daar: je bent klaar om je connector te deployen en die heerlijke logs binnen te halen. Op dit punt heb je een reguliere ARM-template in handen, en kun je die uitrollen via eender welke methode je voorkeur heeft: PowerShell, Azure CLI, of de REST API. Maar om het eenvoudig te houden, gebruik ik in dit voorbeeld de Azure Portal UI.<\/p>\n<p class=\"\" data-start=\"522\" data-end=\"704\">Navigeer naar de Azure Portal en zoek bovenaan in de zoekbalk op \u201cdeploy\u201d. Selecteer vervolgens de optie \u201cDeploy a custom template\u201d (<em data-start=\"663\" data-end=\"702\">Een aangepaste template implementeren<\/em>).<\/p>\n<p data-start=\"522\" data-end=\"704\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2440 alignnone\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ua5ycycb.png\" alt=\"\" width=\"462\" height=\"177\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ua5ycycb.png 462w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ua5ycycb-300x115.png 300w\" sizes=\"auto, (max-width: 462px) 100vw, 462px\" \/><\/p>\n<p data-start=\"522\" data-end=\"704\">Selecteer de &#8220;Build your own template in the editor&#8221; optie.<\/p>\n<p data-start=\"522\" data-end=\"704\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2441 alignnone\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/8xlkx4vm.png\" alt=\"\" width=\"644\" height=\"224\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/8xlkx4vm.png 644w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/8xlkx4vm-300x104.png 300w\" sizes=\"auto, (max-width: 644px) 100vw, 644px\" \/><\/p>\n<p class=\"\" data-start=\"0\" data-end=\"223\">In de editor kun je nu je volledige <code data-start=\"38\" data-end=\"57\">mainTemplate.json<\/code>-bestand uploaden of plakken. Klik daarna op \u201cOpslaan\u201d, waarmee je terechtkomt bij het laatste deel van de deployment: het invoeren van de parameters. Wat je hier invult, bepaalt naar welke Log Analytics Workspace jouw connector uitgerold wordt. Het lijkt misschien vanzelfsprekend, maar controleer goed of Microsoft Sentinel geactiveerd is op de workspace die je kiest \u2014 anders zal de connector niet correct functioneren.<\/p>\n<figure id=\"attachment_2442\" aria-describedby=\"caption-attachment-2442\" style=\"width: 642px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2442\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/paq65q4q.png\" alt=\"\" width=\"642\" height=\"229\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/paq65q4q.png 642w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/paq65q4q-300x107.png 300w\" sizes=\"auto, (max-width: 642px) 100vw, 642px\" \/><figcaption id=\"caption-attachment-2442\" class=\"wp-caption-text\">Geef de benodigde input.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p class=\"\" data-start=\"0\" data-end=\"155\">Zodra je alles hebt ingevuld, klik je op \u201cBeoordelen + maken\u201d (<em data-start=\"67\" data-end=\"84\">Review + Create<\/em>) en vervolgens op \u201cMaken\u201d (<em data-start=\"116\" data-end=\"124\">Create<\/em>) om je template te deployen. De deployment zou binnen enkele seconden voltooid moeten zijn. Als alles goed is gegaan, kun je nu naar de opgegeven Sentinel-instantie navigeren, het tabblad Connectors openen \u2014 en jezelf aangenaam laten verrassen!<\/p>\n<p class=\"\" data-start=\"382\" data-end=\"530\">Is de connector nog niet zichtbaar? Klik dan even op de vernieuw-knop (<em data-start=\"457\" data-end=\"466\">Refresh<\/em>), soms loopt de UI iets achter op de daadwerkelijke deployment.<\/p>\n<figure id=\"attachment_2443\" aria-describedby=\"caption-attachment-2443\" style=\"width: 209px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2443\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/tjxgnoqp.png\" alt=\"\" width=\"209\" height=\"94\" \/><figcaption id=\"caption-attachment-2443\" class=\"wp-caption-text\">Hoera, onze connector is daar!<\/figcaption><\/figure>\n<h3 class=\"\" data-start=\"0\" data-end=\"26\">De connector koppelen<\/h3>\n<p class=\"\" data-start=\"28\" data-end=\"314\">Onze connector is succesvol gedeployed \u2014 maar we zijn er nog niet helemaal. Zoals je in de UI kunt zien, is de connector nog niet verbonden. Pas wanneer je in de UI de vereiste informatie invult en op de knop \u201cConnect\u201d klikt, wordt het laatste deel van de deployment uitgevoerd. Op dat moment worden de poller, de DCR en de tabel daadwerkelijk uitgerold. Dat betekent ook dat eventuele fouten in die templates pas zichtbaar worden tijdens het verbinden van de connector, niet tijdens het eerdere packaging- of deployproces. Let hier goed op bij het bouwen en testen van je eigen connector: test altijd een volledige deployment inclusief connectie, anders is de kans groot dat je kritieke fouten in je templates over het hoofd ziet!<\/p>\n<figure id=\"attachment_2444\" aria-describedby=\"caption-attachment-2444\" style=\"width: 478px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2444\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/k7nuwi9s.png\" alt=\"\" width=\"478\" height=\"199\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/k7nuwi9s.png 478w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/k7nuwi9s-300x125.png 300w\" sizes=\"auto, (max-width: 478px) 100vw, 478px\" \/><figcaption id=\"caption-attachment-2444\" class=\"wp-caption-text\">Geef de juiste informatie in en klik op &#8216;connect&#8217;<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p class=\"\" data-start=\"0\" data-end=\"224\">Voorzie de UI van de vereiste informatie en klik op \u201cConnect\u201d. Je zult zien dat er daadwerkelijk een deploymentproces opgestart wordt \u2014 dit kun je volgen via het notificatievenster rechtsboven in de Azure Portal.\u00a0Na ongeveer een halve minuut zou je de melding \u201cDeployment succeeded\u201d moeten zien. Dit betekent dat:<\/p>\n<ul data-start=\"332\" data-end=\"521\">\n<li class=\"\" data-start=\"332\" data-end=\"396\">\n<p class=\"\" data-start=\"334\" data-end=\"396\">de onderliggende templates zonder fouten zijn uitgerold,<\/p>\n<\/li>\n<li class=\"\" data-start=\"397\" data-end=\"450\">\n<p class=\"\" data-start=\"399\" data-end=\"450\">de poller succesvol de API heeft aangeroepen,<\/p>\n<\/li>\n<li class=\"\" data-start=\"451\" data-end=\"521\">\n<p class=\"\" data-start=\"453\" data-end=\"521\">en dat er een geldige statuscode is teruggegeven op het verzoek.<\/p>\n<\/li>\n<\/ul>\n<figure id=\"attachment_2445\" aria-describedby=\"caption-attachment-2445\" style=\"width: 400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2445\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/685l3fam.png\" alt=\"\" width=\"400\" height=\"92\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/685l3fam.png 400w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/685l3fam-300x69.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><figcaption id=\"caption-attachment-2445\" class=\"wp-caption-text\">We zijn verbonden!<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p>Het zou nu niet lang meer moeten duren voordat de eerste logs beginnen binnen te komen. Zorg ervoor dat er daadwerkelijk gebeurtenissen zijn om op te vangen \u2014 log een paar keer in en uit bij 1Password \u2014 en binnen ongeveer 30 minuten zouden de eerste logs zichtbaar moeten zijn in je Log Analytics Workspace.<\/p>\n<figure id=\"attachment_2446\" aria-describedby=\"caption-attachment-2446\" style=\"width: 467px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2446\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ll6nig47.png\" alt=\"\" width=\"467\" height=\"250\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ll6nig47.png 467w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ll6nig47-300x161.png 300w\" sizes=\"auto, (max-width: 467px) 100vw, 467px\" \/><figcaption id=\"caption-attachment-2446\" class=\"wp-caption-text\">Logs!<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p class=\"\" data-start=\"0\" data-end=\"277\">Gefeliciteerd! Door deze blogreeks te volgen, ben je nu in staat om een API te verkennen, de gevonden eigenschappen te gebruiken om een Codeless Connector-template vanaf nul op te bouwen, en de volledige connector te packagen en uit te rollen binnen Microsoft Sentinel.<\/p>\n<h3 data-start=\"284\" data-end=\"296\"><\/h3>\n<h3 class=\"\" data-start=\"284\" data-end=\"296\">Tot slot<\/h3>\n<p class=\"\" data-start=\"298\" data-end=\"709\">Al met al vind ik de Codeless Connector een fantastische toevoeging aan de toolkit van Sentinel. Ik zou niet zeggen dat het instappen eenvoudig is, maar de voordelen wegen wat mij betreft ruimschoots op tegen de complexiteit van het ontwikkelproces. Ik hoop dat deze blogreeks je goed heeft geholpen om het merendeel van dat proces te begrijpen, en ik ben benieuwd naar de connectors die jullie gaan bouwen!<\/p>\n<p class=\"\" data-start=\"830\" data-end=\"1041\">En tot slot: enorme dank als je het tot hier hebt volgehouden! Ik waardeer alle positieve feedback die ik heb ontvangen op de eerdere blogs enorm, en ik hoop dat ook deze reeks de moeite waard voor je was.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this blog series, I will show you how to create your own Sentinel Codeless Connector Platform (CCP) data connector. As<\/p>","protected":false},"author":5,"featured_media":2179,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2424","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Een Codeless Connector Platform data-connector bouwen: deel 4<\/title>\n<meta name=\"description\" content=\"In deze blogserie laat Tim je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) connector kunt maken.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/masero.nl\/en\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Een Codeless Connector Platform data-connector bouwen: deel 4\" \/>\n<meta property=\"og:description\" content=\"In deze blogserie laat Tim je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) connector kunt maken.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/masero.nl\/en\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/\" \/>\n<meta property=\"og:site_name\" content=\"Masero\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-12T11:50:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-12T12:28:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/03\/Sentinel.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"750\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tim Groothuis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tim Groothuis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/\"},\"author\":{\"name\":\"Tim Groothuis\",\"@id\":\"https:\\\/\\\/masero.nl\\\/#\\\/schema\\\/person\\\/253f4280be6f54af76d51185ed3ff27d\"},\"headline\":\"Een Codeless Connector Platform (CCP) data-connector bouwen: deel 4\",\"datePublished\":\"2025-05-12T11:50:13+00:00\",\"dateModified\":\"2025-05-12T12:28:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/\"},\"wordCount\":3890,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/masero.nl\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Sentinel.png\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/\",\"url\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/\",\"name\":\"Een Codeless Connector Platform data-connector bouwen: deel 4\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/masero.nl\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Sentinel.png\",\"datePublished\":\"2025-05-12T11:50:13+00:00\",\"dateModified\":\"2025-05-12T12:28:17+00:00\",\"description\":\"In deze blogserie laat Tim je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) connector kunt maken.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/#primaryimage\",\"url\":\"https:\\\/\\\/masero.nl\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Sentinel.png\",\"contentUrl\":\"https:\\\/\\\/masero.nl\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Sentinel.png\",\"width\":1000,\"height\":750},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/masero.nl\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Een Codeless Connector Platform (CCP) data-connector bouwen: deel 4\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/masero.nl\\\/#website\",\"url\":\"https:\\\/\\\/masero.nl\\\/\",\"name\":\"Masero\",\"description\":\"Cyber Security\",\"publisher\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/masero.nl\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/masero.nl\\\/#organization\",\"name\":\"Masero\",\"url\":\"https:\\\/\\\/masero.nl\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/masero.nl\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/masero.nl\\\/wp-content\\\/uploads\\\/2023\\\/01\\\/cropped-MSO003-Logo-RGB.png\",\"contentUrl\":\"https:\\\/\\\/masero.nl\\\/wp-content\\\/uploads\\\/2023\\\/01\\\/cropped-MSO003-Logo-RGB.png\",\"width\":10019,\"height\":2840,\"caption\":\"Masero\"},\"image\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/masero.nl\\\/#\\\/schema\\\/person\\\/253f4280be6f54af76d51185ed3ff27d\",\"name\":\"Tim Groothuis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9cdeb82b5b2b55957d1df149ba5c434975c414db80cca296043bcd96c540cba6?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9cdeb82b5b2b55957d1df149ba5c434975c414db80cca296043bcd96c540cba6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9cdeb82b5b2b55957d1df149ba5c434975c414db80cca296043bcd96c540cba6?s=96&d=mm&r=g\",\"caption\":\"Tim Groothuis\"},\"url\":\"https:\\\/\\\/masero.nl\\\/en\\\/author\\\/tim\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Een Codeless Connector Platform data-connector bouwen: deel 4","description":"In deze blogserie laat Tim je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) connector kunt maken.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/masero.nl\/en\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/","og_locale":"en_GB","og_type":"article","og_title":"Een Codeless Connector Platform data-connector bouwen: deel 4","og_description":"In deze blogserie laat Tim je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) connector kunt maken.","og_url":"https:\/\/masero.nl\/en\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/","og_site_name":"Masero","article_published_time":"2025-05-12T11:50:13+00:00","article_modified_time":"2025-05-12T12:28:17+00:00","og_image":[{"width":1000,"height":750,"url":"https:\/\/masero.nl\/wp-content\/uploads\/2025\/03\/Sentinel.png","type":"image\/png"}],"author":"Tim Groothuis","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Tim Groothuis","Estimated reading time":"23 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/#article","isPartOf":{"@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/"},"author":{"name":"Tim Groothuis","@id":"https:\/\/masero.nl\/#\/schema\/person\/253f4280be6f54af76d51185ed3ff27d"},"headline":"Een Codeless Connector Platform (CCP) data-connector bouwen: deel 4","datePublished":"2025-05-12T11:50:13+00:00","dateModified":"2025-05-12T12:28:17+00:00","mainEntityOfPage":{"@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/"},"wordCount":3890,"commentCount":0,"publisher":{"@id":"https:\/\/masero.nl\/#organization"},"image":{"@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/#primaryimage"},"thumbnailUrl":"https:\/\/masero.nl\/wp-content\/uploads\/2025\/03\/Sentinel.png","articleSection":["Blog"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/","url":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/","name":"Een Codeless Connector Platform data-connector bouwen: deel 4","isPartOf":{"@id":"https:\/\/masero.nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/#primaryimage"},"image":{"@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/#primaryimage"},"thumbnailUrl":"https:\/\/masero.nl\/wp-content\/uploads\/2025\/03\/Sentinel.png","datePublished":"2025-05-12T11:50:13+00:00","dateModified":"2025-05-12T12:28:17+00:00","description":"In deze blogserie laat Tim je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) connector kunt maken.","breadcrumb":{"@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/#primaryimage","url":"https:\/\/masero.nl\/wp-content\/uploads\/2025\/03\/Sentinel.png","contentUrl":"https:\/\/masero.nl\/wp-content\/uploads\/2025\/03\/Sentinel.png","width":1000,"height":750},{"@type":"BreadcrumbList","@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/masero.nl\/"},{"@type":"ListItem","position":2,"name":"Een Codeless Connector Platform (CCP) data-connector bouwen: deel 4"}]},{"@type":"WebSite","@id":"https:\/\/masero.nl\/#website","url":"https:\/\/masero.nl\/","name":"Masero","description":"Cyber Security","publisher":{"@id":"https:\/\/masero.nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/masero.nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/masero.nl\/#organization","name":"Masero","url":"https:\/\/masero.nl\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/masero.nl\/#\/schema\/logo\/image\/","url":"https:\/\/masero.nl\/wp-content\/uploads\/2023\/01\/cropped-MSO003-Logo-RGB.png","contentUrl":"https:\/\/masero.nl\/wp-content\/uploads\/2023\/01\/cropped-MSO003-Logo-RGB.png","width":10019,"height":2840,"caption":"Masero"},"image":{"@id":"https:\/\/masero.nl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/masero.nl\/#\/schema\/person\/253f4280be6f54af76d51185ed3ff27d","name":"Tim Groothuis","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/9cdeb82b5b2b55957d1df149ba5c434975c414db80cca296043bcd96c540cba6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9cdeb82b5b2b55957d1df149ba5c434975c414db80cca296043bcd96c540cba6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9cdeb82b5b2b55957d1df149ba5c434975c414db80cca296043bcd96c540cba6?s=96&d=mm&r=g","caption":"Tim Groothuis"},"url":"https:\/\/masero.nl\/en\/author\/tim\/"}]}},"_links":{"self":[{"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/posts\/2424","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/comments?post=2424"}],"version-history":[{"count":5,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/posts\/2424\/revisions"}],"predecessor-version":[{"id":2452,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/posts\/2424\/revisions\/2452"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/media\/2179"}],"wp:attachment":[{"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/media?parent=2424"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/categories?post=2424"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/tags?post=2424"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}