<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Isabel Andrade</title>
    <description>The latest articles on DEV Community by Isabel Andrade (@beandrad).</description>
    <link>https://dev.to/beandrad</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F516695%2F2c1785d4-41ce-4ee4-bc15-c73e8e2af69d.jpeg</url>
      <title>DEV Community: Isabel Andrade</title>
      <link>https://dev.to/beandrad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/beandrad"/>
    <language>en</language>
    <item>
      <title>Terraform module for custom Azure policies</title>
      <dc:creator>Isabel Andrade</dc:creator>
      <pubDate>Wed, 02 Dec 2020 15:46:14 +0000</pubDate>
      <link>https://dev.to/cse/terraform-module-for-custom-azure-policies-1oek</link>
      <guid>https://dev.to/cse/terraform-module-for-custom-azure-policies-1oek</guid>
      <description>&lt;p&gt;Terraform modules are used to create reusable components that include groups of resources meant to be deployed together. This is a natural fit for custom Azure policies and initiatives since it allows organizations to implement all those definitions in a centralized component.&lt;/p&gt;

&lt;p&gt;This post goes through an example that shows how to implement and test a Terraform module that defines custom Azure policies and initiatives. The full version of the code can be found in the following repo: &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/beandrad" rel="noopener noreferrer"&gt;
        beandrad
      &lt;/a&gt; / &lt;a href="https://github.com/beandrad/terraform-azurerm-policy-sample" rel="noopener noreferrer"&gt;
        terraform-azurerm-policy-sample
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Minimal Terraform module defining Azure policies and initiatives
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h1&gt;
  
  
  Module structure
&lt;/h1&gt;

&lt;p&gt;Hashicorp published a set of &lt;a href="https://www.terraform.io/docs/modules/index.html" rel="noopener noreferrer"&gt;guidelines on module definitions&lt;/a&gt; stating some naming conventions and the general module structure.&lt;/p&gt;

&lt;p&gt;According to those guidelines, module repository names follow the format &lt;code&gt;terraform-&amp;lt;PROVIDER&amp;gt;-&amp;lt;NAME&amp;gt;&lt;/code&gt;, where &lt;code&gt;PROVIDER&lt;/code&gt; in our case is AzureRM and &lt;code&gt;NAME&lt;/code&gt; is a label describing the infrastructure provided. In our case, the Terraform module is called &lt;code&gt;terraform-azurerm-policy-sample&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The module structure follows the standard practices recommended by Hashicorp; note, however, that some of the paths defined are specific to this module.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/beandrad/terraform-azurerm-policy-sample/blob/main/main.tf" rel="noopener noreferrer"&gt;&lt;code&gt;main.tf&lt;/code&gt;&lt;/a&gt;. Defines the configuration requirements. It may also configure other resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/beandrad/terraform-azurerm-policy-sample/blob/main/variables.tf" rel="noopener noreferrer"&gt;&lt;code&gt;variables.tf&lt;/code&gt;&lt;/a&gt;. Declares the module input variables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/beandrad/terraform-azurerm-policy-sample/blob/main/outputs.tf" rel="noopener noreferrer"&gt;&lt;code&gt;outputs.tf&lt;/code&gt;&lt;/a&gt;. Declares the module outputs; in this case, the initiative IDs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/beandrad/terraform-azurerm-policy-sample/tree/main/policies" rel="noopener noreferrer"&gt;&lt;code&gt;/policies&lt;/code&gt;&lt;/a&gt;. (Module specific) Includes the definitions of custom Azure policies. Each policy has its own folder, where the file &lt;code&gt;policy-rule.json&lt;/code&gt; has the definition and &lt;code&gt;policy-parameters.json&lt;/code&gt;, the parameters if applicable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;lt;label&amp;gt;-initiative.tf&lt;/code&gt;. (Module specific) Configures the definition of policies and initiatives in Azure. Policies are grouped into initiatives based on the resources they affect and/or by industry-level standards (such as the CIS Hardening Guidelines).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/beandrad/terraform-azurerm-policy-sample/blob/main/initiative-parameters.json" rel="noopener noreferrer"&gt;&lt;code&gt;initiative-parameters.tf&lt;/code&gt;&lt;/a&gt;. (Module specific) Declares the input parameters of all the initiatives defined in the module.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/beandrad/terraform-azurerm-policy-sample/tree/main/tests" rel="noopener noreferrer"&gt;&lt;code&gt;/tests&lt;/code&gt;&lt;/a&gt;. Implements the module acceptance tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Definition of policies and initiatives
&lt;/h1&gt;

&lt;p&gt;This module defines custom policies and initiatives under a management group (&lt;code&gt;definition_management_group&lt;/code&gt; in &lt;code&gt;variables.tf&lt;/code&gt;) or current subscription if the management group name is not defined.&lt;/p&gt;

&lt;p&gt;Custom policy definitions are created using the &lt;code&gt;azurerm_policy_definition&lt;/code&gt; resource and built-in policies are imported using the &lt;code&gt;azurerm_policy_definition&lt;/code&gt; data resource. Both resources are included in the corresponding initiatives Terraform configuration files; unless they are shared across initiatives, in which case they are defined in the &lt;code&gt;main.tf&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;It is important to note that policy data resources should be imported using its policy &lt;code&gt;name&lt;/code&gt; (as opposed to the &lt;code&gt;displayName&lt;/code&gt;). The reason is that the &lt;code&gt;displayName&lt;/code&gt; is not unique and it may change, whereas the &lt;code&gt;name&lt;/code&gt; is unique and it remains the same until the policy is deleted. In the configuration, the &lt;code&gt;displayName&lt;/code&gt; appears commented out as it describes the policy being imported.&lt;/p&gt;

&lt;h1&gt;
  
  
  Acceptance tests
&lt;/h1&gt;

&lt;p&gt;The acceptance tests deploy resources to Azure to check whether the defined initiatives actually work: non-compliant resources cannot be deployed whereas compliant ones are allowed to be deployed.&lt;/p&gt;

&lt;p&gt;The following conventions were followed when testing the policy module:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Tests check that the initiative is working as expected, as opposed to testing individual policies. The reason is that this module only outputs initiatives, all the policies are linked from an initiative.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Only the behavior of custom policies is tested; built-in policies are expected to work.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tests are implemented using the &lt;a href="https://golang.org/pkg/testing/" rel="noopener noreferrer"&gt;Go testing framework&lt;/a&gt; together with the &lt;a href="https://terratest.gruntwork.io/docs/" rel="noopener noreferrer"&gt;Terratest module&lt;/a&gt;. This configuration allows calling the Terraform configuration from the Go tests.&lt;/p&gt;

&lt;p&gt;The lifecycle of the tests is as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setup: load the policy module to define policies and initiatives and assign initiatives in Azure (&lt;a href="https://github.com/beandrad/terraform-azurerm-policy-sample/blob/main/tests/terraform/main.tf" rel="noopener noreferrer"&gt;&lt;code&gt;tests/terraform/main.tf&lt;/code&gt;&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Run: try to create compliant resources (for example, &lt;a href="https://github.com/beandrad/terraform-azurerm-policy-sample/tree/main/tests/terraform/resource-location-allow" rel="noopener noreferrer"&gt;&lt;code&gt;tests/terraform/resource-location-allow&lt;/code&gt;&lt;/a&gt;) and non-compliant resources (for example, &lt;a href="https://github.com/beandrad/terraform-azurerm-policy-sample/tree/main/tests/terraform/resource-location-audit" rel="noopener noreferrer"&gt;&lt;code&gt;tests/terraform/resource-location-audit&lt;/code&gt;&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Assert: check whether the policy has been correctly applied using the returned error from the Terraform apply for &lt;code&gt;deny&lt;/code&gt; effect or the policy state for &lt;code&gt;audit&lt;/code&gt; effect.&lt;/li&gt;
&lt;li&gt;Teardown: delete test resources from Azure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Running this kind of tests is slow, in particular, those checking effects other than &lt;code&gt;deny&lt;/code&gt;. There are two main components that cause this delay: the first one is policy definition and assignment, and the second one is policy evaluation (which, as stated above, is required to check the &lt;code&gt;audit&lt;/code&gt; effect).&lt;/p&gt;

&lt;p&gt;In order to speed up the tests, test cases are run in parallel using the &lt;a href="https://golang.org/pkg/testing/#T.Parallel" rel="noopener noreferrer"&gt;&lt;code&gt;Parallel() function&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Finally, regarding the teardown, it is important to note that it is done in two different steps: one for the resources provisioned during the setup and the other for the resources deployed by each of the test cases. In the first case, the &lt;a href="https://godoc.org/testing#T.Cleanup" rel="noopener noreferrer"&gt;Cleanup function&lt;/a&gt; is used; defer wouldn't work since deferred functions are run before parallel subtests are executed. On the other hand, resources created by the test cases are destroyed in a deferred function.&lt;/p&gt;

&lt;h1&gt;
  
  
  Final thoughts
&lt;/h1&gt;

&lt;p&gt;As stated in the beginning, the aim of this post is to provide a baseline example of an Azure policy module; however, it is important to point out that quite a few opinionated design decisions have been made and, therefore, this example shouldn't be taken as the only correct way of implementing an Azure policy module.&lt;/p&gt;

&lt;p&gt;Having said that, I hope this post helps those devs out there looking for some guidance on how to implement Terraform modules, define Azure custom policies and initiatives, and test those definitions.&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>azure</category>
      <category>test</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Bypassing policies in Azure</title>
      <dc:creator>Isabel Andrade</dc:creator>
      <pubDate>Thu, 19 Nov 2020 09:13:24 +0000</pubDate>
      <link>https://dev.to/cse/bypassing-policies-in-azure-29fc</link>
      <guid>https://dev.to/cse/bypassing-policies-in-azure-29fc</guid>
      <description>&lt;p&gt;Azure policies allow your Azure infrastructure to stay compliant by auditing and enforcing rules over the resources those policies are evaluated against. &lt;/p&gt;

&lt;p&gt;In some instances, however, we need to be able to bypass a particular policy or initiative. One way of doing this is by using bypass tags.&lt;/p&gt;

&lt;p&gt;Bypass tags can be defined in custom policies so that if a particular tag is included in a resource, the policy is ignored. This approach has two main shortcomings:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;It only applies to custom policies; if a built-in policy wants to be bypassed, a new custom policy that also includes the corresponding tag needs to be defined;  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;auditing of bypass tags requires further configuration since it is not integrated into the Azure portal out of the box. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"if"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"allOf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"not"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('allowedLocations')]"&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tags['bypassLocationPolicy']"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"exists"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"then"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deny"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;However, there’s a better way of bypassing policies: &lt;a href="https://docs.microsoft.com/en-us/azure/governance/policy/concepts/exemption-structure" rel="noopener noreferrer"&gt;Azure policy exemptions&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is a policy exemption?
&lt;/h1&gt;

&lt;p&gt;Policy exemptions allow bypassing policies in a particular scope so that the policies are not evaluated for the resources under this scope. &lt;/p&gt;

&lt;p&gt;As opposed to bypass tags, Azure automatically audits policy exemptions, so that they can be easily monitored as shown in the picture below.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4ylef5dsr3mu94ilwyqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4ylef5dsr3mu94ilwyqs.png" alt="exemption_monitoring"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another advantage is that policy exemptions can be applied to any policy including build-in policies, without the need of defining additional policies.&lt;/p&gt;

&lt;p&gt;One of the issues with policy exemptions, as opposed to bypass tags, is that it is involved to exempt individual resources from policies with &lt;code&gt;deny&lt;/code&gt; effect. The reason for that is that in order to be able to apply a policy exemption, the exemption scope, the resource itself in this case, needs to exist. One way of achieving this result is by assigning the exemption to a broader scope, for example, a resource group, create the resource, then assign the exemption to the individual resource and remove it from the broader scope.&lt;/p&gt;

&lt;h1&gt;
  
  
  Limiting the scope of exemptions
&lt;/h1&gt;

&lt;p&gt;As mentioned above, policy exemptions are applied to a particular scope. This, in principle, would allow disabling exemptions for entire management groups or subscriptions, which may defeat the purpose of applying policies in the first place.  &lt;/p&gt;

&lt;p&gt;However, there’s one way we can limit the scope to which exemptions can be applied: through a custom policy! &lt;/p&gt;

&lt;p&gt;The idea of this custom policy would be to block the creation of policy exemptions with particular scopes. There’s one minor issue, however, the policy exemption scope doesn’t exist as an alias, and therefore, it cannot be used as a filter in the policy definition. The solution to this is to use the policy exemption ID, which happens to embed the scope. In our case, we wanted to block policy exemptions with scopes broader than the resource group level, so our policy definition looks as follows.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"if"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"allOf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"equals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Authorization/policyExemptions"&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"notContains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"resourceGroup"&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"then"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deny"&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;br&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Follow up&lt;br&gt;
&lt;/h1&gt;

&lt;p&gt;At the time of writing this post, policy exemptions are still a preview feature in Azure and therefore you may face some limitations when using them. Nevertheless, I invite you to try them out if you need to work in highly regulated environments (they have proven quite handy to us!). Please, find below some links that will help you get started!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.microsoft.com/en-us/azure/governance/policy/overview" rel="noopener noreferrer"&gt;Azure policies overview&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.microsoft.com/en-us/azure/governance/policy/concepts/exemption-structure" rel="noopener noreferrer"&gt;Azure policy exemption structure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.microsoft.com/en-us/azure/governance/policy/tutorials/create-and-manage" rel="noopener noreferrer"&gt;Tutorial on how to create and manage policies in Azure&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azure</category>
      <category>security</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
