# cloud-guardrails **Repository Path**: mirrors_salesforce/cloud-guardrails ## Basic Information - **Project Name**: cloud-guardrails - **Description**: Rapidly apply hundreds of security controls in Azure - **Primary Language**: Unknown - **License**: BSD-3-Clause - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-07-23 - **Last Updated**: 2025-12-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Azure Guardrails Azure Guardrails allows you to rapidly cherry-pick cloud security guardrails by generating Terraform files that create Azure Policy Initiatives.  [](https://pepy.tech/project/cloud-guardrails) [](https://twitter.com/kmcquade3)
```hcl locals { name_no_params = "example_NP_Audit" subscription_name_no_params = "example" management_group_no_params = "" enforcement_mode_no_params = false policy_ids_no_params = [ # ----------------------------------------------------------------------------------------------------------------- # Key Vault # ----------------------------------------------------------------------------------------------------------------- "c39ba22d-4428-4149-b981-70acb31fc383", # Azure Key Vault Managed HSM should have purge protection enabled "0b60c0b2-2dc2-4e1c-b5c9-abbed971de53", # Key vaults should have purge protection enabled "1e66c121-a66a-4b1f-9b83-0fd99bf0fc2d", # Key vaults should have soft delete enabled "55615ac9-af46-4a59-874e-391cc3dfb490", # Firewall should be enabled on Key Vault "152b15f7-8e1f-4c1f-ab71-8c010ba5dbc0", # Key Vault keys should have an expiration date "98728c90-32c7-4049-8429-847dc0f4fe37", # Key Vault secrets should have an expiration date "587c79fe-dd04-4a5e-9d0b-f89598c7261b", # Keys should be backed by a hardware security module (HSM) "5f0bc445-3935-4915-9981-011aa2b46147", # Private endpoint should be configured for Key Vault "75262d3e-ba4a-4f43-85f8-9f72c090e5e3", # Secrets should have content type set ] } # --------------------------------------------------------------------------------------------------------------------- # Azure Policy name lookups: # Because the policies are built-in, we can just look up their IDs by their names. # --------------------------------------------------------------------------------------------------------------------- data "azurerm_policy_definition" "no_params" { count = length(local.policy_ids_no_params) name = element(local.policy_ids_no_params, count.index) } locals { no_params_policy_definitions = flatten([tolist([ for definition in data.azurerm_policy_definition.no_params.*.id : map("policyDefinitionId", definition) ]) ]) } # --------------------------------------------------------------------------------------------------------------------- # Conditional data lookups: If the user supplies management group, look up the ID of the management group # --------------------------------------------------------------------------------------------------------------------- data "azurerm_management_group" "no_params" { count = local.management_group_no_params != "" ? 1 : 0 display_name = local.management_group_no_params } ### If the user supplies subscription, look up the ID of the subscription data "azurerm_subscriptions" "no_params" { count = local.subscription_name_no_params != "" ? 1 : 0 display_name_contains = local.subscription_name_no_params } locals { no_params_scope = local.management_group_no_params != "" ? data.azurerm_management_group.no_params[0].id : element(data.azurerm_subscriptions.no_params[0].subscriptions.*.id, 0) } # --------------------------------------------------------------------------------------------------------------------- # Policy Initiative # --------------------------------------------------------------------------------------------------------------------- resource "azurerm_policy_set_definition" "no_params" { name = local.name_no_params policy_type = "Custom" display_name = local.name_no_params description = local.name_no_params management_group_name = local.management_group_no_params == "" ? null : local.management_group_no_params policy_definitions = tostring(jsonencode(local.no_params_policy_definitions)) metadata = tostring(jsonencode({ category = local.name_no_params })) } # --------------------------------------------------------------------------------------------------------------------- # Azure Policy Assignments # Apply the Policy Initiative to the specified scope # --------------------------------------------------------------------------------------------------------------------- resource "azurerm_policy_assignment" "no_params" { name = local.name_no_params policy_definition_id = azurerm_policy_set_definition.no_params.id scope = local.no_params_scope enforcement_mode = local.enforcement_mode_no_params } # --------------------------------------------------------------------------------------------------------------------- # Outputs # --------------------------------------------------------------------------------------------------------------------- output "no_params_policy_assignment_ids" { value = azurerm_policy_assignment.no_params.id description = "The IDs of the Policy Assignments." } output "no_params_scope" { value = local.no_params_scope description = "The target scope - either the management group or subscription, depending on which parameters were supplied" } output "no_params_policy_set_definition_id" { value = azurerm_policy_set_definition.no_params.id description = "The ID of the Policy Set Definition." } output "no_params_count_of_policies_applied" { description = "The number of Policies applied as part of the Policy Initiative" value = length(local.policy_ids_no_params) } ```
```hcl locals { name_example_PO_Audit = "example_PO_Audit" subscription_name_example_PO_Audit = "example" management_group_example_PO_Audit = "" category_example_PO_Audit = "Testing" enforcement_mode_example_PO_Audit = false policy_ids_example_PO_Audit = [ # ----------------------------------------------------------------------------------------------------------------- # Key Vault # ----------------------------------------------------------------------------------------------------------------- "a2a5b911-5617-447e-a49e-59dbe0e0434b", # Resource logs in Azure Key Vault Managed HSM should be enabled "cf820ca0-f99e-4f3e-84fb-66e913812d21", # Resource logs in Key Vault should be enabled "8e826246-c976-48f6-b03e-619bb92b3d82", # Certificates should be issued by the specified integrated certificate authority "0a075868-4c26-42ef-914c-5bc007359560", # Certificates should have the specified maximum validity period "1151cede-290b-4ba0-8b38-0ad145ac888f", # Certificates should use allowed key types "bd78111f-4953-4367-9fd5-7e08808b54bf", # Certificates using elliptic curve cryptography should have allowed curve names "75c4f823-d65c-4f29-a733-01d0077fdbcb", # Keys should be the specified cryptographic type RSA or EC "ff25f3c8-b739-4538-9d07-3d6d25cfb255", # Keys using elliptic curve cryptography should have the specified curve names ] policy_definition_map = { "Resource logs in Azure Key Vault Managed HSM should be enabled" = "/providers/Microsoft.Authorization/policyDefinitions/a2a5b911-5617-447e-a49e-59dbe0e0434b", "Resource logs in Key Vault should be enabled" = "/providers/Microsoft.Authorization/policyDefinitions/cf820ca0-f99e-4f3e-84fb-66e913812d21", "Certificates should be issued by the specified integrated certificate authority" = "/providers/Microsoft.Authorization/policyDefinitions/8e826246-c976-48f6-b03e-619bb92b3d82", "Certificates should have the specified maximum validity period" = "/providers/Microsoft.Authorization/policyDefinitions/0a075868-4c26-42ef-914c-5bc007359560", "Certificates should use allowed key types" = "/providers/Microsoft.Authorization/policyDefinitions/1151cede-290b-4ba0-8b38-0ad145ac888f", "Certificates using elliptic curve cryptography should have allowed curve names" = "/providers/Microsoft.Authorization/policyDefinitions/bd78111f-4953-4367-9fd5-7e08808b54bf", "Keys should be the specified cryptographic type RSA or EC" = "/providers/Microsoft.Authorization/policyDefinitions/75c4f823-d65c-4f29-a733-01d0077fdbcb", "Keys using elliptic curve cryptography should have the specified curve names" = "/providers/Microsoft.Authorization/policyDefinitions/ff25f3c8-b739-4538-9d07-3d6d25cfb255", } } # --------------------------------------------------------------------------------------------------------------------- # Conditional data lookups: If the user supplies management group, look up the ID of the management group # --------------------------------------------------------------------------------------------------------------------- data "azurerm_management_group" "example_PO_Audit" { count = local.management_group_example_PO_Audit != "" ? 1 : 0 display_name = local.management_group_example_PO_Audit } ### If the user supplies subscription, look up the ID of the subscription data "azurerm_subscriptions" "example_PO_Audit" { count = local.subscription_name_example_PO_Audit != "" ? 1 : 0 display_name_contains = local.subscription_name_example_PO_Audit } locals { scope = local.management_group_example_PO_Audit != "" ? data.azurerm_management_group.example_PO_Audit[0].id : element(data.azurerm_subscriptions.example_PO_Audit[0].subscriptions.*.id, 0) } # --------------------------------------------------------------------------------------------------------------------- # Azure Policy Definition Lookups # --------------------------------------------------------------------------------------------------------------------- data "azurerm_policy_definition" "example_PO_Audit_definition_lookups" { count = length(local.policy_ids_example_PO_Audit) name = local.policy_ids_example_PO_Audit[count.index] } # --------------------------------------------------------------------------------------------------------------------- # Azure Policy Initiative Definition # --------------------------------------------------------------------------------------------------------------------- resource "azurerm_policy_set_definition" "example_PO_Audit" { name = local.name_example_PO_Audit policy_type = "Custom" display_name = local.name_example_PO_Audit description = local.name_example_PO_Audit management_group_name = local.management_group_example_PO_Audit == "" ? null : local.management_group_example_PO_Audit metadata = tostring(jsonencode({ category = local.category_example_PO_Audit })) policy_definition_reference { policy_definition_id = lookup(local.policy_definition_map, "Resource logs in Azure Key Vault Managed HSM should be enabled") parameter_values = jsonencode({ effect = { "value" : "AuditIfNotExists" } requiredRetentionDays = { "value" : "365" } }) reference_id = null } policy_definition_reference { policy_definition_id = lookup(local.policy_definition_map, "Resource logs in Key Vault should be enabled") parameter_values = jsonencode({ effect = { "value" : "AuditIfNotExists" } requiredRetentionDays = { "value" : "365" } }) reference_id = null } policy_definition_reference { policy_definition_id = lookup(local.policy_definition_map, "Certificates should be issued by the specified integrated certificate authority") parameter_values = jsonencode({ allowedCAs = { "value" : ["DigiCert", "GlobalSign"] } effect = { "value" : "audit" } }) reference_id = null } policy_definition_reference { policy_definition_id = lookup(local.policy_definition_map, "Certificates should have the specified maximum validity period") parameter_values = jsonencode({ maximumValidityInMonths = { "value" : 12 } effect = { "value" : "audit" } }) reference_id = null } policy_definition_reference { policy_definition_id = lookup(local.policy_definition_map, "Certificates should use allowed key types") parameter_values = jsonencode({ allowedKeyTypes = { "value" : ["RSA", "RSA-HSM"] } effect = { "value" : "audit" } }) reference_id = null } policy_definition_reference { policy_definition_id = lookup(local.policy_definition_map, "Certificates using elliptic curve cryptography should have allowed curve names") parameter_values = jsonencode({ allowedECNames = { "value" : ["P-256", "P-256K", "P-384", "P-521"] } effect = { "value" : "audit" } }) reference_id = null } policy_definition_reference { policy_definition_id = lookup(local.policy_definition_map, "Keys should be the specified cryptographic type RSA or EC") parameter_values = jsonencode({ allowedKeyTypes = { "value" : ["RSA", "RSA-HSM", "EC", "EC-HSM"] } effect = { "value" : "Audit" } }) reference_id = null } policy_definition_reference { policy_definition_id = lookup(local.policy_definition_map, "Keys using elliptic curve cryptography should have the specified curve names") parameter_values = jsonencode({ allowedECNames = { "value" : ["P-256", "P-256K", "P-384", "P-521"] } effect = { "value" : "Audit" } }) reference_id = null } } # --------------------------------------------------------------------------------------------------------------------- # Azure Policy Assignments # Apply the Policy Initiative to the specified scope # --------------------------------------------------------------------------------------------------------------------- resource "azurerm_policy_assignment" "example_PO_Audit" { name = local.name_example_PO_Audit policy_definition_id = azurerm_policy_set_definition.example_PO_Audit.id scope = local.scope enforcement_mode = local.enforcement_mode_example_PO_Audit } # --------------------------------------------------------------------------------------------------------------------- # Outputs # --------------------------------------------------------------------------------------------------------------------- output "example_PO_Audit_policy_assignment_ids" { value = azurerm_policy_assignment.example_PO_Audit.id description = "The IDs of the Policy Assignments." } output "example_PO_Audit_scope" { value = local.scope description = "The target scope - either the management group or subscription, depending on which parameters were supplied" } output "example_PO_Audit_policy_set_definition_id" { value = azurerm_policy_set_definition.example_PO_Audit.id description = "The ID of the Policy Set Definition." } ```
```yaml #### # match_only_keywords: Use this to only apply policies that match any of these keywords # exclude_keywords: Use this to skip policies that have any of these keywords in the display name # exclude_services: Specify services that you want to exclude entirely. # exclude_policies: Specify Azure Policy Definition displayNames that you want to exclude from the results, sorted by service #### # Use this to only apply policies that match any of these keywords # Example: "encrypt", "SQL", "HTTP" match_only_keywords: - "" exclude_keywords: - "" - "virtual network service endpoint" #- "private link" # Specify services that you want to exclude entirely. # Uncomment the services mentioned below if you want to exclude them. exclude_services: - "" - "Guest Configuration" #- "API Management" #- "API for FHIR" #- "App Configuration" #- "App Platform" #- "App Service" #- "Attestation" #- "Automanage" #- "Automation" #- "Azure Active Directory" #- "Azure Data Explorer" #- "Azure Stack Edge" #- "Backup" #- "Batch" #- "Bot Service" #- "Cache" #- "Cognitive Services" #- "Compute" #- "Container Instance" #- "Container Registry" #- "Cosmos DB" #- "Custom Provider" #- "Data Box" #- "Data Factory" #- "Data Lake" #- "Event Grid" #- "Event Hub" #- "General" #- "HDInsight" #- "Internet of Things" #- "Key Vault" #- "Kubernetes" #- "Kubernetes service" #- "Lighthouse" #- "Logic Apps" #- "Machine Learning" #- "Managed Application" #- "Media Services" #- "Migrate" #- "Monitoring" #- "Network" #- "Portal" #- "SQL" #- "Search" #- "Security Center" #- "Service Bus" #- "Service Fabric" #- "SignalR" #- "Site Recovery" #- "Storage" #- "Stream Analytics" #- "Synapse" #- "Tags" #- "VM Image Builder" #- "Web PubSub" # Specify Azure Policy Definition displayNames that you want to exclude from the results exclude_policies: General: - "Allow resource creation only in Asia data centers" - "Allow resource creation only in European data centers" - "Allow resource creation only in India data centers" - "Allow resource creation only in United States data centers" Tags: - "Allow resource creation if 'department' tag set" - "Allow resource creation if 'environment' tag value in allowed values" API Management: # This collides with the same one from App Platform - "API Management services should use a virtual network" App Platform: # This collides with the same one from API Management - "Azure Spring Cloud should use network injection" Guest Configuration: # This outputs a parameter called "Cert:" that breaks the parameter yaml format - "Audit Windows machines that contain certificates expiring within the specified number of days" Network: # This one is overly cumbersome for most organizations - "Network interfaces should not have public IPs" API for FHIR: - "" App Configuration: - "" App Service: - "" Attestation: - "" Automanage: - "" Automation: - "" Azure Active Directory: - "" Azure Data Explorer: - "" Azure Stack Edge: - "" Backup: - "" Batch: - "" Bot Service: - "" Cache: - "" Cognitive Services: - "" Compute: - "" Container Instance: - "" Container Registry: - "" Cosmos DB: - "" Custom Provider: - "" Data Box: - "" Data Factory: - "" Data Lake: - "" Event Grid: - "" Event Hub: - "" HDInsight: - "" Internet of Things: - "" Key Vault: - "" Kubernetes: - "" Kubernetes service: - "" Lighthouse: - "" Logic Apps: - "" Machine Learning: - "" Managed Application: - "" Media Services: - "" Migrate: - "" Monitoring: - "" Portal: - "" SQL: - "" Search: - "" Security Center: - "" Service Bus: - "" Service Fabric: - "" SignalR: - "" Site Recovery: - "" Storage: - "" Stream Analytics: - "" Synapse: - "" VM Image Builder: - "" Web PubSub: - "" ```
| Characteristic | Support | Description |
|---|---|---|
Parameters |
||
| Policies with No Parameters | ✅ | These policies do not require any parameters. These are the easiest policies to apply. |
| Policies with Optional Parameters | ✅ | These policies allow the use of parameters, but the parameters have default values. These are easy to apply at first, but you will likely want to adjust the parameters throughout the lifecycle. |
| Policies with Required Parameters | ✅ | These policies require parameters which do not have default values. While rollout is significantly less time consuming than the Azure recommended workflow, finding the best values for your environment requires careful thinking. |
Effects |
||
| Policies with "Deny" Effects | ✅ | These Policies block bad actions, acting as true guardrails. |
| Policies with "Audit" Effects | ✅ | These Policies do not actually prevent bad actions, even if “enforcement mode” is set to True - they just flag the bad actions. |
| Policies with "Deploy" Effects | ❌ | Some Azure Policies have DeployIfNotExists effects, which create resources via an ARM Template when the condition is met. For example, the policy "Deploy network watcher when virtual networks are created" will create a resource group called networkWatcherRG. |
| Policies with "Modify" Effects | ❌ | Some Azure Policies have Policy Effects that allow the modification of resources, such as the "Modify" or "Append" effects. |
Built-in vs. Custom |
||
| Built-in Policies | ✅ | Microsoft provides 400+ built-in policy definitions. cloud-guardrails leverages these Built-in Policy definitions so you can get rapidly started and maximize your coverage. |
| Custom Policies | ❌ | cloud-guardrails does not support creation of Custom Policies. Consider leveraging Custom Policies after you have built out your process and workflow using cloud-guardrails. |