{"id":3507,"date":"2024-12-04T01:05:23","date_gmt":"2024-12-04T07:05:23","guid":{"rendered":"https:\/\/microsoftgeek.com\/?p=3507"},"modified":"2024-12-04T01:05:23","modified_gmt":"2024-12-04T07:05:23","slug":"deploy-azure-firewall-mon-to-a-static-web-app","status":"publish","type":"post","link":"https:\/\/microsoftgeek.com\/?p=3507","title":{"rendered":"Deploy Azure-Firewall-mon to a Static Web App"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\" id=\"overview\">Overview<a href=\"https:\/\/luke.geek.nz\/azure\/deploy-azure-firewall-mon-to-a-static-web-app\/#overview\">\u200b<\/a><\/h3>\n\n\n\n<p>Azure-Firewall-mon&nbsp;<em>(AFM or Azure Firewall Monitor)<\/em>&nbsp;is a custom solution&nbsp;<em>(currently in a functional beta)<\/em>&nbsp;created by an Italian Microsoft Cloud Solution Architect called:&nbsp;<a href=\"https:\/\/nicolgit.github.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Nicola Delfino<\/a>, its worth mentioning that although a Microsoft CSA makes AFM,&nbsp;<strong>IT IS NOT A SUPPORTED MICROSOFT PRODUCT<\/strong>.<\/p>\n\n\n\n<p>Monitoring Azure Firewall can be a pain &#8211; with trawling through logs &#8211; using the&nbsp;<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/firewall\/firewall-workbook?WT.mc_id=AZ-MVP-5004796\" target=\"_blank\" rel=\"noreferrer noopener\">Azure Firewall Workbook<\/a>&nbsp;&#8211; helps fill in the gap &#8211; especially around the application and network rule traffic. Still, you may want something more straightforward and designed for real-time traffic to assist with in-the-moment troubleshooting.<\/p>\n\n\n\n<p>Azure-Firewall-mon is an open-source,\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-page_application\" target=\"_blank\" rel=\"noreferrer noopener\">single Page Application<\/a>\u00a0written in\u00a0<a href=\"https:\/\/angular.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Angular<\/a>\u00a0and hosted on an\u00a0Azure WebApp\u00a0&#8211; so to use this, you don&#8217;t need to deploy to your environment.. add in an Event Hub connection string, and away you go\u00a0<em>(there is also a demo mode &#8211; so you can see what the experience will be like)<\/em>!<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/luke.geek.nz\/assets\/images\/az-firewall-mon-5ee91a5e050fe29ab5cb0ab490d9f68a.png\" alt=\"az-firewall-mon landing page\" title=\"az-firewall-mon\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/luke.geek.nz\/assets\/images\/azfirewallmon-60df2768099b9ac2627a844cd78480bb.png\" alt=\"az-firewall-mon landing page\" title=\"az-firewall-mon\"\/><\/figure>\n\n\n\n<p><strong>We can deploy it to an Azure<\/strong>&nbsp;<a href=\"https:\/\/azure.microsoft.com\/en-us\/products\/app-service\/static\/?WT.mc_id=AZ-MVP-5004796\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Static Web App<\/strong><\/a>&nbsp;<strong>for those who would instead host it in our environment.<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&#8220;Azure Static Web Apps is a service that automatically builds and deploys full-stack web apps to Azure from a code repository. When you create an Azure Static Web Apps resource, Azure interacts directly with GitHub or Azure DevOps to monitor a branch of your choice. Every time you push commits or accept pull requests into the watched branch, a build is automatically run and your app and API is deployed to Azure.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/luke.geek.nz\/assets\/images\/azure-static-web-apps-overview-db72be97bdda7bc3b20f59753dd62022.png\" alt=\"Azure Static WebApps - Overview\" title=\"Azure Static WebApps - Overview\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"deployment\">Deployment<a href=\"https:\/\/luke.geek.nz\/azure\/deploy-azure-firewall-mon-to-a-static-web-app\/#deployment\">\u200b<\/a><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"prerequisites\">Prerequisites<a href=\"https:\/\/luke.geek.nz\/azure\/deploy-azure-firewall-mon-to-a-static-web-app\/#prerequisites\">\u200b<\/a><\/h4>\n\n\n\n<p>Today, we are going to deploy Azure-Firewall-mon into an Azure Static Web App &#8211; to do this; we will need the following prerequisites:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A\u00a0<a href=\"https:\/\/github.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a>\u00a0account<\/li>\n\n\n\n<li>An\u00a0<a href=\"https:\/\/azure.microsoft.com\/en-us\/?WT.mc_id=AZ-MVP-5004796\" target=\"_blank\" rel=\"noreferrer noopener\">Azure<\/a>\u00a0subscription_(with permissions to deploy Event Hub, deploy an Azure Static WebApp, and configure Diagnostics on the Azure Firewall)_<\/li>\n\n\n\n<li>Azure Firewall\u00a0<em>(provisioned)<\/em><\/li>\n<\/ul>\n\n\n\n<p><em>Note: Also, ensure that your Event Hub is in the same region as your Azure Firewall so that you can use Diagnostics settings. Regarding the Azure Static WebApp &#8211; it doesn&#8217;t matter; this is a global service &#8211; and you will be entering the Event Hub listener.<\/em><\/p>\n\n\n\n<p>We will use the Azure Portal and a browser to provision the workflow&nbsp;<em>(however, I will have added Azure Bicep to the bottom of the article for reference)<\/em>.<\/p>\n\n\n\n<p>This article &#8211; assumes you have basic knowledge of GitHub and Microsoft Azure.<\/p>\n\n\n\n<p>For this demo, I am using a&nbsp;<a href=\"https:\/\/learn.microsoft.com\/azure\/architecture\/reference-architectures\/hybrid-networking\/hub-spoke?tabs=cli&amp;WT.mc_id=AZ-MVP-5004796\" target=\"_blank\" rel=\"noreferrer noopener\">Hub &amp; Spoke Azure<\/a>&nbsp;topology.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/luke.geek.nz\/assets\/images\/AzMonArchitecture-2a808a28e6a53d30a3d54b9efc5bfee0.png\" alt=\"Azure Firewall Monitor - High Level Architecture\" title=\"Azure Firewall Monitor - High Level Architecture\"\/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"fork-the-github-repository\">Fork the GitHub repository<a href=\"https:\/\/luke.geek.nz\/azure\/deploy-azure-firewall-mon-to-a-static-web-app\/#fork-the-github-repository\">\u200b<\/a><\/h4>\n\n\n\n<p>The first thing we need to do is clone the Azure-Firewall-mon repository; this repository holds the source control of Azure-Firewall-mon. First, however, we need a clone of it &#8211; to use in our Static Web App &#8211; this will also allow us to pull down and build the latest changes and updates of the Azure-Firewall-mon tool while having the stability of maintaining your version of the device.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In your favourite browser of choice, navigate to:\u00a0<a href=\"https:\/\/github.com\/nicolgit\/azure-firewall-mon\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/nicolgit\/azure-firewall-mon<\/a>.<\/li>\n\n\n\n<li>Click\u00a0<strong>Fork<\/strong>\u00a0<em>(top right of the repository)<\/em><\/li>\n\n\n\n<li><img loading=\"lazy\" decoding=\"async\" width=\"789\" height=\"531\" src=\"https:\/\/luke.geek.nz\/assets\/images\/github_azfirewall_mon_createfork-a564e58393e28ac3483ef8936c00af4c.png\" alt=\"GitHub - Create a new fork\"><\/li>\n\n\n\n<li>Click\u00a0<strong>Create fork<\/strong><\/li>\n\n\n\n<li>You have now created a fork of the &#8216;azure-firewall-mon&#8217; repository; when a new update of Azure-Firewall-mon comes out &#8211; you can also select &#8216;Sync fork&#8217; &#8211; to keep your fork up-to-date and trigger a new build.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"create-static-web-app-and-deploy-azure-firewall-mon\">Create Static Web App and deploy azure-firewall-mon<a href=\"https:\/\/luke.geek.nz\/azure\/deploy-azure-firewall-mon-to-a-static-web-app\/#create-static-web-app-and-deploy-azure-firewall-mon\">\u200b<\/a><\/h4>\n\n\n\n<p>Now that you have created a fork, it&#8217;s time to make your Azure Static WebApp!<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Navigate to the\u00a0<a href=\"https:\/\/portal.azure.com\/#home\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Azure Portal<\/strong><\/a><\/li>\n\n\n\n<li>Click\u00a0<strong>+ Create a resource<\/strong><\/li>\n\n\n\n<li>Type in:\u00a0<strong>Static Web App<\/strong><\/li>\n\n\n\n<li>Select and click\u00a0<strong>Create<\/strong><\/li>\n\n\n\n<li>Create or\u00a0<strong>select<\/strong>\u00a0a\u00a0<strong>Resource Group<\/strong><\/li>\n\n\n\n<li><strong>Type<\/strong>\u00a0in the\u00a0<strong>name<\/strong>\u00a0of your Static Web App<\/li>\n\n\n\n<li>For the plan type, we will go with\u00a0<strong>Free<\/strong><\/li>\n\n\n\n<li>Please select your\u00a0<strong>region<\/strong>\u00a0<em>(this is the staging environment used to create your resource so the Azure Static Web App can then be replicated geographically)<\/em>.<\/li>\n\n\n\n<li>Select\u00a0<strong>Source<\/strong>, as\u00a0<strong>GitHub<\/strong><\/li>\n\n\n\n<li>Click\u00a0<strong>Sign in<\/strong>\u00a0with\u00a0<strong>GitHub<\/strong>\u00a0<em>(and sign in with an account with access to the GitHub Repository fork of azure-firewall-mon created earlier)<\/em>.<\/li>\n\n\n\n<li><strong>Authorise<\/strong>\u00a0the\u00a0<strong>Azure Static Web Apps<\/strong>\u00a0to have access to your repositories<\/li>\n\n\n\n<li><strong>Select<\/strong>\u00a0your\u00a0<strong>organisation<\/strong>\u00a0and the azure-firewall-mon\u00a0<strong>repository<\/strong>\u00a0you forked earlier.<\/li>\n\n\n\n<li>Select &#8216;<strong>main<\/strong>&#8216; for the branch<\/li>\n\n\n\n<li>Under Build Presents, select\u00a0<strong>Angular<\/strong><\/li>\n\n\n\n<li>For App location, enter &#8220;<strong>\/firewall-mon-app\/<\/strong>&#8220;<\/li>\n\n\n\n<li>Leave the API location empty<\/li>\n\n\n\n<li>For the Output location, enter:\u00a0<strong>&#8220;dist\/firewall-mon-app&#8221;<\/strong><\/li>\n\n\n\n<li><img loading=\"lazy\" decoding=\"async\" width=\"798\" height=\"315\" src=\"https:\/\/luke.geek.nz\/assets\/images\/github_azfirewall_mon_createbuildangular-a12ee728543a0ee418ac652c833a6d1d.png\" alt=\"Azure Static WebApps - Angular Build\"><\/li>\n\n\n\n<li>If you navigate to your own forked GitHub repository, you should see a new folder created under .github\/workflows &#8211; and a new GitHub Actions workflow file!<\/li>\n\n\n\n<li><img loading=\"lazy\" decoding=\"async\" width=\"1300\" height=\"873\" src=\"https:\/\/luke.geek.nz\/assets\/images\/create_azstaticwebapp_portal_azfw-mon-1f247c2b24ef6bdf6f4f84a02190df76.gif\" alt=\"Create Azure Static WebApp - Angular - Azure Portal\"><\/li>\n\n\n\n<li>If you select\u00a0<strong>Actions<\/strong>\u00a0in GitHub, you should see a deployment start.<\/li>\n\n\n\n<li>After roughly 5 minutes, your\u00a0<strong>Azure Static App &#8211; will have deployed azure-firewall-mon<\/strong>!<\/li>\n\n\n\n<li><strong>Navigate<\/strong>\u00a0to your newly created\u00a0<strong>Azure Static App<\/strong>\u00a0in the Azure Portal<\/li>\n\n\n\n<li>Click\u00a0<strong>Browse<\/strong><\/li>\n\n\n\n<li>You should now see\u00a0<strong>azure-firewall-mon<\/strong>!<\/li>\n\n\n\n<li><img loading=\"lazy\" decoding=\"async\" width=\"1902\" height=\"998\" src=\"https:\/\/luke.geek.nz\/assets\/images\/azure_azfirewall_mon_deployed-30347db0fe83fdfb7a9c45f5b210e0ca.png\" alt=\"azure-firewall-mon\"><\/li>\n<\/ol>\n\n\n\n<p><em>Note: In GitHub, under Actions and the Build and Deploy Job, you may see a message about Note.js 12 actions being deprecated; you can set the node version to be higher.<\/em><\/p>\n\n\n\n<p>Add the step to set the node version below submodules and above the Build and Deploy step:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      - uses: actions\/setup-node@v1<br>        with:<br>          node-version: \"18.x\"<\/code><\/pre>\n\n\n\n<p>Refer to a copy of my Github Actions file here:&nbsp;<a href=\"https:\/\/gist.github.com\/lukemurraynz\/3f300a5eb73b2693d3a9378261a023db\" target=\"_blank\" rel=\"noreferrer noopener\">AzureStaticWebAppsCICD.yml<\/a>&nbsp;for a comparison of GitHub action &#8211; a setup-node step running on the latest version of 18.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"create-event-hub-namespace-and-shared-access-policy\">Create Event Hub namespace and shared access policy<a href=\"https:\/\/luke.geek.nz\/azure\/deploy-azure-firewall-mon-to-a-static-web-app\/#create-event-hub-namespace-and-shared-access-policy\">\u200b<\/a><\/h4>\n\n\n\n<p>Even if you use the externally hosted version of\u00a0Azure Firewall Monitor, you still need an Event Hub and Namespace to stream the events from our Azure Firewall to the Azure Firewall Monitor.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Navigate to the\u00a0<strong>Azure Portal<\/strong><\/li>\n\n\n\n<li>Click\u00a0<strong>+ Create a resource<\/strong><\/li>\n\n\n\n<li>Type in:\u00a0<strong>Event Hubs<\/strong><\/li>\n\n\n\n<li>Select and click\u00a0<strong>Create<\/strong><\/li>\n\n\n\n<li>Select your subscription and\u00a0<strong>Resource Group<\/strong>;<\/li>\n\n\n\n<li>Type in the\u00a0<strong>Namespace<\/strong>\u00a0of the event hub\u00a0<em>(i.e. AzureFirewallMonitor)<\/em><\/li>\n\n\n\n<li>Select your\u00a0<strong>location<\/strong>\u00a0<em>(make sure this is the same region as your Azure Firewall)<\/em><\/li>\n\n\n\n<li>Select your\u00a0<strong>Pricing Tier<\/strong>\u00a0<em>(in this example, I am going with Basic)<\/em><\/li>\n\n\n\n<li>Click\u00a0<strong>Review + create<\/strong><\/li>\n\n\n\n<li>Once the Namespace has been created, it&#8217;s time to make our Event Hub; navigate to your newly created AzFirewallMonitor namespace.<\/li>\n\n\n\n<li>Under\u00a0<strong>Entitles<\/strong>, click\u00a0<strong>+ Event Hub<\/strong><\/li>\n\n\n\n<li>Under the name, enter the Event Hub name\u00a0<em>(i.e. AzMonitorCapture)<\/em><\/li>\n\n\n\n<li>Leave the defaults\u00a0<em>(and Message retention to 1 day)<\/em><\/li>\n\n\n\n<li>Click\u00a0<strong>Review + Create<\/strong><\/li>\n\n\n\n<li>Click\u00a0<strong>Create<\/strong><\/li>\n\n\n\n<li><img loading=\"lazy\" decoding=\"async\" width=\"837\" height=\"350\" src=\"https:\/\/luke.geek.nz\/assets\/images\/azure_azfirewall_mon_createeventhub-5a668a3e7de5b9a898c12c041d87ac23.png\" alt=\"Create Azure Event Hub\"><\/li>\n\n\n\n<li>Now that the Event Hub is created, we need to create a Shared access policy; in the Event Hub namespace, click on\u00a0<strong>Shared access policies.<\/strong><\/li>\n\n\n\n<li>Click\u00a0<strong>+ Add<\/strong><\/li>\n\n\n\n<li>Type in a\u00a0<strong>Policy name<\/strong><em>(i.e. AzMonitorListener)<\/em><\/li>\n\n\n\n<li>Select\u00a0<strong>Send<\/strong><\/li>\n\n\n\n<li>Click\u00a0<strong>Create<\/strong><\/li>\n\n\n\n<li><img loading=\"lazy\" decoding=\"async\" width=\"1633\" height=\"317\" src=\"https:\/\/luke.geek.nz\/assets\/images\/azure_azfirewall_mon_sharedaccesspolicy-f2f1f482b00b1f0b407b66e4ede00daa.png\" alt=\"Azure Event Hub - Create shared access policy\">Configure Azure Firewall to stream to Event Hub and run Azure Firewall monitor<a href=\"https:\/\/luke.geek.nz\/azure\/deploy-azure-firewall-mon-to-a-static-web-app\/#configure-azure-firewall-to-stream-to-event-hub-and-run-azure-firewall-monitor\">\u200b<\/a>Now that we have an Event Hub configured and a Shared access policy set to Listen &#8211; it&#8217;s time to configure the Azure Firewall to direct logs to the Namespace.<\/li>\n\n\n\n<li>Navigate to the\u00a0<strong>Azure Portal<\/strong><\/li>\n\n\n\n<li>Navigate to your\u00a0<strong>Azure Firewall<\/strong><\/li>\n\n\n\n<li>Select\u00a0<strong>Diagnostic Settings<\/strong><\/li>\n\n\n\n<li>Click\u00a0<strong>+ Add diagnostic setting<\/strong><\/li>\n\n\n\n<li><img loading=\"lazy\" decoding=\"async\" width=\"1300\" height=\"676\" src=\"https:\/\/luke.geek.nz\/assets\/images\/azure_azfirewall_create_diagsettings-392fac216bbd70568dc3e5616013a2f4.png\" alt=\"Azure Firewall - Diagnostic Settings\"><\/li>\n\n\n\n<li>Type in a Diagnostic setting name\u00a0<em>(i.e. AzureFirewallMonitor)<\/em><\/li>\n\n\n\n<li>Select\u00a0<strong>All Logs<\/strong><\/li>\n\n\n\n<li>Select\u00a0<strong>Stream to an event hub<\/strong><\/li>\n\n\n\n<li>Select your subscription, event hub namespace, event hub and policy created earlier.<\/li>\n\n\n\n<li><img loading=\"lazy\" decoding=\"async\" width=\"1208\" height=\"724\" src=\"https:\/\/luke.geek.nz\/assets\/images\/azure_azfirewall_configure_diagsettings-750b70e33b8cb744ffe625adc16a1793.png\" alt=\"Azure Firewall - Diagnostic setting\"><\/li>\n\n\n\n<li>Click\u00a0<strong>Save<\/strong><\/li>\n\n\n\n<li>Please navigate back to your\u00a0<strong>Event Hub<\/strong>\u00a0namespace and select your\u00a0<strong>Event Hub entity<\/strong>; now, we need to create a Shared access policy to\u00a0<strong>Listen<\/strong>\u00a0<em>(for the entity, not the Namespace)<\/em><\/li>\n\n\n\n<li>Click Shared access policies, and create a new Shared access policy with\u00a0<strong>Listen.<\/strong><\/li>\n\n\n\n<li>Copy the\u00a0<strong>Connection string-primary key<\/strong><\/li>\n\n\n\n<li><strong>Navigate<\/strong>\u00a0to your newly created\u00a0<strong>Azure Static App<\/strong>\u00a0in the Azure Portal<\/li>\n\n\n\n<li>Click\u00a0<strong>Browse<\/strong><\/li>\n\n\n\n<li>You should now see\u00a0<strong>azure-firewall-mon<\/strong>, and enter in the\u00a0<strong>Connection string-primary key copied<\/strong>\u00a0earlier!<\/li>\n\n\n\n<li><strong>Congratulations you have now set up Azure Firewall Monitor on an Azure Static Web App and can troubleshoot your Azure Firewall quickly in real-time!<\/strong><\/li>\n\n\n\n<li><img loading=\"lazy\" decoding=\"async\" width=\"1522\" height=\"873\" src=\"https:\/\/luke.geek.nz\/assets\/images\/run_azstaticwebapp_portal_azfw-mon-4fc7782c49343576059701ddcc7ee8e4.gif\" alt=\"Run Azure Firewall Monitor\"><\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"references-github-action\"><\/h4>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Overview\u200b Azure-Firewall-mon&nbsp;(AFM or Azure Firewall Monitor)&nbsp;is a custom solution&nbsp;(currently in a functional beta)&nbsp;created by an Italian Microsoft Cloud Solution Architect called:&nbsp;Nicola Delfino, its worth mentioning that although a Microsoft CSA makes AFM,&nbsp;IT IS NOT A SUPPORTED MICROSOFT PRODUCT. Monitoring Azure Firewall can be a pain &#8211; with trawling through logs &#8211; using the&nbsp;Azure Firewall Workbook&nbsp;&#8211; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[69,35],"tags":[],"class_list":["post-3507","post","type-post","status-publish","format-standard","hentry","category-azure","category-cloud-computing"],"_links":{"self":[{"href":"https:\/\/microsoftgeek.com\/index.php?rest_route=\/wp\/v2\/posts\/3507","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/microsoftgeek.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/microsoftgeek.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/microsoftgeek.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/microsoftgeek.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3507"}],"version-history":[{"count":1,"href":"https:\/\/microsoftgeek.com\/index.php?rest_route=\/wp\/v2\/posts\/3507\/revisions"}],"predecessor-version":[{"id":3508,"href":"https:\/\/microsoftgeek.com\/index.php?rest_route=\/wp\/v2\/posts\/3507\/revisions\/3508"}],"wp:attachment":[{"href":"https:\/\/microsoftgeek.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3507"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/microsoftgeek.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3507"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/microsoftgeek.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}