<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:webfeeds="http://webfeeds.org/rss/1.0" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Getting Started on Mart&#39;s blog</title>
    <link>https://blog.martdegraaf.nl/tags/getting-started/</link>
    <description>Recent content in Getting Started on Mart&#39;s blog</description>
    <webfeeds:analytics id="G-ZFQGR29JJQ" engine="GoogleAnalytics"/>
    <webfeeds:accentColor>0078D3</webfeeds:accentColor>
    <webfeeds:related layout="card" target="browser"/>
    <webfeeds:icon>https://gravatar.com/userimage/91624600/fb51d6d9172e5043a1e59d59f3f84e62.jpeg?v=1666815123000&amp;size=200</webfeeds:icon>
    <generator>Hugo -- 0.166.0</generator>
    <language>en-us</language>
    <managingEditor>blog@martdegraaf.nl (Mart de Graaf)</managingEditor>
    <webMaster>blog@martdegraaf.nl (Mart de Graaf)</webMaster>
    <copyright>Mart de Graaf</copyright>
    <lastBuildDate>Tue, 04 Nov 2025 23:06:08 +0100</lastBuildDate>
    <atom:link href="https://blog.martdegraaf.nl/tags/getting-started/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Getting Started With Application Gateway</title>
      <link>https://blog.martdegraaf.nl/posts/getting-started-with-application-gateway/</link>
      <pubDate>Tue, 21 Oct 2025 14:16:30 +0200</pubDate><author>blog@martdegraaf.nl (Mart de Graaf)</author>
      <guid>https://blog.martdegraaf.nl/posts/getting-started-with-application-gateway/</guid>
      <description><![CDATA[How secure are your web applications? Deploy an Azure Application Gateway with Web Application Firewall (WAF). This is a powerful tool to protect your applications while ensuring seamless performance. Let&rsquo;s dive in and explore how you can get started!]]></description>
      <enclosure url="https://blog.martdegraaf.nl/posts/getting-started-with-application-gateway/cover.png" type="image/png" />
      <media:content url="https://blog.martdegraaf.nl/posts/getting-started-with-application-gateway/cover.png" medium="image" type="image/png">
        <media:title>Getting Started</media:title>
      </media:content><content:encoded><![CDATA[<img src="https://blog.martdegraaf.nl/posts/getting-started-with-application-gateway/cover.png" alt="Getting Started" /><br/><br/><p>How secure are your web applications? Deploy an Azure Application Gateway with Web Application Firewall (WAF). This is a powerful tool to protect your applications while ensuring seamless performance. Let&rsquo;s dive in and explore how you can get started!</p>
<h2 id="why-deploy-an-application-gateway">Why deploy an Application Gateway?</h2>
<p>Have you ever heard about the <a href="https://owasp.org/www-project-top-ten/" target="_blank" rel="noopener">OWASP Top 10</a>? It is a list of the most common web application security risks. Could you even name all ten risks? If not, you are not alone. But you want to protect against these risks, right? An Application Gateway with Web Application Firewall (WAF) can help you with that. It is a managed service that provides a web application firewall to protect your web applications from common threats and vulnerabilities.</p>
<h3 id="alternatives">Alternatives</h3>
<p>An alternative is using the Azure FrontDoor service. Or look outside of Azure, but I will not discuss those options in this blog. Frontdoor has some additional features like CDN and global load balancing.</p>
<h2 id="how-to-migrate-to-an-application-gateway">How to migrate to an Application Gateway?</h2>
<p>Let&rsquo;s say you have a web application running on Azure App Service. You want to migrate this application to use an Application Gateway with WAF. Here are the steps you need to take:</p>
<ol>
<li>Create a Key Vault to store the SSL/TLS certificates.</li>
<li>Create a Vnet and subnet for the Application Gateway.</li>
<li>Create a Public IP Address for the Application Gateway.</li>
<li>Create a new Application Gateway with WAF enabled.</li>
<li>Configure the backend pool to point to your Azure App Service.</li>
<li>Create a new routing rule to forward traffic to the backend pool.</li>
<li>Update your DNS settings to point to the Application Gateway.</li>
</ol>
<p>I assume you have a Key Vault and know how to provide it with an SSL/TLS certificate. Let&rsquo;s combine the 2,3, 4, and 5 steps in a Bicep deployment.</p>
<h3 id="deploy-application-gateway-using-bicep">Deploy Application gateway using bicep</h3>
<p>Let&rsquo;s deploy an Application Gateway with a backend pool pointing to an Azure App Service.</p>
<div class="codecontainer" hi="mart"><div class="code-name">main.bicep</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span><span class="lnt">129
</span><span class="lnt">130
</span><span class="lnt">131
</span><span class="lnt">132
</span><span class="lnt">133
</span><span class="lnt">134
</span><span class="lnt">135
</span><span class="lnt">136
</span><span class="lnt">137
</span><span class="lnt">138
</span><span class="lnt">139
</span><span class="lnt">140
</span><span class="lnt">141
</span><span class="lnt">142
</span><span class="lnt">143
</span><span class="lnt">144
</span><span class="lnt">145
</span><span class="lnt">146
</span><span class="lnt">147
</span><span class="lnt">148
</span><span class="lnt">149
</span><span class="lnt">150
</span><span class="lnt">151
</span><span class="lnt">152
</span><span class="lnt">153
</span><span class="lnt">154
</span><span class="lnt">155
</span><span class="lnt">156
</span><span class="lnt">157
</span><span class="lnt">158
</span><span class="lnt">159
</span><span class="lnt">160
</span><span class="lnt">161
</span><span class="lnt">162
</span><span class="lnt">163
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bicep" data-lang="bicep"><span class="line"><span class="cl"><span class="kd">param</span><span class="w"> </span><span class="nv">location</span><span class="w"> </span><span class="nv">string</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nf">resourceGroup</span><span class="p">().</span><span class="nv">location</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">param</span><span class="w"> </span><span class="nv">region</span><span class="w"> </span><span class="nv">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">param</span><span class="w"> </span><span class="nv">environment</span><span class="w"> </span><span class="nv">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">param</span><span class="w"> </span><span class="nv">tags</span><span class="w"> </span><span class="nv">object</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">resource</span><span class="w"> </span><span class="nv">virtualNetwork</span><span class="w"> </span><span class="s">&#39;Microsoft.Network/virtualNetworks@2023-09-01&#39;</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;vnet-</span><span class="si">${</span><span class="nv">region</span><span class="si">}</span><span class="s">-</span><span class="si">${</span><span class="nv">environment</span><span class="si">}</span><span class="s">&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">location</span><span class="p">:</span><span class="w"> </span><span class="nv">location</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">tags</span><span class="p">:</span><span class="w"> </span><span class="nv">tags</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">properties</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">addressSpace</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nv">addressPrefixes</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="s">&#39;10.0.0.0/16&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">subnets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;snet-agw&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nv">properties</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nv">addressPrefix</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;10.0.1.0/24&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nv">privateEndpointNetworkPolicies</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;Disabled&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nv">privateLinkServiceNetworkPolicies</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;Disabled&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="p">{</span><span class="w"> </span><span class="c1">// Sample for if your backends are in Azure Container apps</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;snet-containerapp&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nv">properties</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nv">addressPrefix</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;10.0.2.0/23&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nv">delegations</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;Microsoft.App/environments&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nv">properties</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nv">serviceName</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;Microsoft.App/environments&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">module</span><span class="w"> </span><span class="nv">keyvault</span><span class="w"> </span><span class="s">&#39;br/public:avm/res/key-vault/vault:0.13.3&#39;</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;</span><span class="si">${</span><span class="nf">deployment</span><span class="p">().</span><span class="nv">name</span><span class="si">}</span><span class="s">-kv&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">scope</span><span class="p">:</span><span class="w"> </span><span class="nf">resourceGroup</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">params</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;kv-</span><span class="si">${</span><span class="nv">region</span><span class="si">}</span><span class="s">-</span><span class="si">${</span><span class="nv">environment</span><span class="si">}</span><span class="s">&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Other parameters...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">module</span><span class="w"> </span><span class="nv">wafPolicy</span><span class="w"> </span><span class="s">&#39;br/public:avm/res/network/application-gateway-web-application-firewall-policy:0.2.0&#39;</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;applicationGatewayWebApplicationFirewallPolicyDeployment&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">params</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Required parameters</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">managedRules</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nv">managedRuleSets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nv">ruleGroupOverrides</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nv">ruleSetType</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;OWASP&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nv">ruleSetVersion</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;3.2&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nv">ruleSetType</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;Microsoft_BotManagerRuleSet&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nv">ruleSetVersion</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;0.1&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;mycoolwaf&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Non-required parameters</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">location</span><span class="p">:</span><span class="w"> </span><span class="nv">location</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">policySettings</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nv">fileUploadLimitInMb</span><span class="p">:</span><span class="w"> </span><span class="nv">10</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nv">jsChallengeCookieExpirationInMins</span><span class="p">:</span><span class="w"> </span><span class="nv">60</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nv">mode</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;Detection&#39;</span><span class="w"> </span><span class="c1">// &#39;Detection&#39; or &#39;Prevention&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nv">state</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;Enabled&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">module</span><span class="w"> </span><span class="nv">publicIp</span><span class="w"> </span><span class="s">&#39;br/public:avm/res/network/public-ip-address:0.6.0&#39;</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;</span><span class="si">${</span><span class="nf">deployment</span><span class="p">().</span><span class="nv">name</span><span class="si">}</span><span class="s">-pip&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">scope</span><span class="p">:</span><span class="w"> </span><span class="nf">resourceGroup</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">params</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;pip-ag-</span><span class="si">${</span><span class="nv">region</span><span class="si">}</span><span class="s">-</span><span class="si">${</span><span class="nv">environment</span><span class="si">}</span><span class="s">&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Other parameters...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span><span class="w"> </span><span class="nv">gatewayId</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nf">resourceId</span><span class="p">(</span><span class="s">&#39;Microsoft.Network/applicationGateways/probes&#39;</span><span class="p">,</span><span class="w"> </span><span class="s">&#39;ag-</span><span class="si">${</span><span class="nv">region</span><span class="si">}</span><span class="s">-</span><span class="si">${</span><span class="nv">environment</span><span class="si">}</span><span class="s">&#39;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">module</span><span class="w"> </span><span class="nv">appGateway</span><span class="w"> </span><span class="s">&#39;br/public:avm/res/network/application-gateway:0.7.1&#39;</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;</span><span class="si">${</span><span class="nf">deployment</span><span class="p">().</span><span class="nv">name</span><span class="si">}</span><span class="s">-agw&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">scope</span><span class="p">:</span><span class="w"> </span><span class="nf">resourceGroup</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nv">params</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;ag-</span><span class="si">${</span><span class="nv">region</span><span class="si">}</span><span class="s">-</span><span class="si">${</span><span class="nv">environment</span><span class="si">}</span><span class="s">&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">sku</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;WAF_v2&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">gatewayIPConfigurations</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;appGatewayIpConfig&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nv">properties</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nv">subnet</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nv">id</span><span class="p">:</span><span class="w"> </span><span class="nv">virtualNetwork</span><span class="p">.</span><span class="nv">properties</span><span class="p">.</span><span class="nv">subnets</span><span class="p">[</span><span class="nv">0</span><span class="p">].</span><span class="nv">id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">frontendIPConfigurations</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;appGwFrontend&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nv">properties</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nv">publicIPAddress</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                    </span><span class="nv">id</span><span class="p">:</span><span class="w"> </span><span class="nv">publicIp</span><span class="p">.</span><span class="nv">outputs</span><span class="p">.</span><span class="nv">resourceId</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nv">privateAllocationMethod</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;Dynamic&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// Add IPv6 frontend configuration if needed, see my other blog post</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">firewallPolicyResourceId</span><span class="p">:</span><span class="w"> </span><span class="nv">wafPolicy</span><span class="p">.</span><span class="nv">outputs</span><span class="p">.</span><span class="nv">resourceId</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">backendAddressPools</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;appGwBackendPool&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nv">properties</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nv">backendAddresses</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                    </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                        </span><span class="nv">fqdn</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;your-app-service.azurewebsites.net&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">httpListeners</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;appGwHttpListener&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nv">properties</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nv">frontendIpConfiguration</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                    </span><span class="nv">id</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;</span><span class="si">${</span><span class="nv">gatewayId</span><span class="si">}</span><span class="s">/frontendIpConfigurations/appGwFrontend&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nv">frontendPort</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                    </span><span class="nv">id</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;</span><span class="si">${</span><span class="nv">gatewayId</span><span class="si">}</span><span class="s">/frontendPorts/appGwFrontendPort&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nv">protocol</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;Http&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nv">requestRoutingRules</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nv">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;appGwRoutingRule&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nv">properties</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nv">httpListener</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                    </span><span class="nv">id</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;</span><span class="si">${</span><span class="nv">gatewayId</span><span class="si">}</span><span class="s">/httpListeners/appGwHttpListener&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nv">backendAddressPool</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                    </span><span class="nv">id</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;</span><span class="si">${</span><span class="nv">gatewayId</span><span class="si">}</span><span class="s">/backendAddressPools/appGwBackendPool&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nv">backendHttpSettings</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                    </span><span class="nv">id</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;</span><span class="si">${</span><span class="nv">gatewayId</span><span class="si">}</span><span class="s">/backendHttpSettings/appGwBackendHttpSettings&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div></div><h3 id="configure-dns-for-application-gateway">Configure DNS for Application Gateway</h3>
<p>After deploying the Application Gateway, you need to update your DNS settings to point to the Application Gateway&rsquo;s public IP address. This ensures that all incoming traffic to your web application is routed through the Application Gateway, allowing it to provide the necessary security and performance enhancements.</p>
<div style="
border: #0078D3 1px solid;
padding: 15px;
background: var(--entry);
border-left-width: 3px;">
   &#x1f4d3; See also my other blog post on <a href="https://martdegraaf.github.io/blog/content/posts/application-gateway-ipv6/" target="_blank" rel="noopener">Dual stack support with Application Gateway and IPv6</a> for more details on updating DNS for dual stack support.
</div>
<h2 id="detection-vs-prevention-mode">Detection vs Prevention mode</h2>
<p>When configuring the WAF policy, you have the option to set the mode to either &ldquo;Detection&rdquo; or &ldquo;Prevention&rdquo;. In Detection mode, the WAF will monitor and log potential threats without blocking any traffic. This is useful for testing and tuning the WAF rules before enforcing them. In Prevention mode, the WAF will actively block traffic that matches the defined rules, providing a higher level of security for your web applications.</p>
<p>I recommend starting with Detection mode to understand the traffic patterns and potential threats to your application. Once you are confident that the WAF rules are properly configured, you can switch to Prevention mode for enhanced protection.</p>
<p>See my next blog post on how to find false positives and tune your WAF rules.</p>
<h2 id="next-steps">Next steps</h2>
<p>We now got an Application gateway before your application. Your next steps could be:</p>
<ul>
<li>Configure custom WAF rules to tailor the security settings to your specific application needs.</li>
<li>Set up monitoring and alerting to keep an eye on the WAF logs and performance metrics. ( see <a href="https://blog.martdegraaf.nl/posts/monitor-your-waf/">WAF monitoring</a>)</li>
<li>If you see no false positives you can switch from Detection to Prevention mode. (see <a href="https://blog.martdegraaf.nl/posts/troubleshoot-web-application-firewall-in-production/">Troubleshoot Application Gateway in Production</a>)</li>
<li>Implement ip restrictions for your Application gateway on Staging or acceptance environments. (see <a href="https://blog.martdegraaf.nl/posts/apply-ip-restrictions-application-firewall/">Implement IP Restrictions</a>)</li>
<li>Learn more about ipv6. (see <a href="https://blog.martdegraaf.nl/posts/application-gateway-ipv6/">Application Gateway with IPv6 support</a>).</li>
</ul>
]]></content:encoded>
      <category>application gateway</category>
      <category>WAF</category>
      <category>azure</category>
      <category>bicep</category>
      <category>getting started</category>
      <category>security</category>
    </item>
  </channel>
</rss>
