{
  "properties": {
    "displayName": "Keys should have more than the specified number of days before expiration",
    "policyType": "BuiltIn",
    "mode": "Microsoft.KeyVault.Data",
    "description": "If a key is too close to expiration, an organizational delay to rotate the key may result in an outage. Keys should be rotated at a specified number of days prior to expiration to provide sufficient time to react to a failure.",
    "metadata": {
      "version": "1.0.0-preview",
      "category": "Key Vault",
      "preview": true
    },
    "parameters": {
      "minimumDaysBeforeExpiration": {
        "type": "Integer",
        "metadata": {
          "displayName": "The minimum days before expiration",
          "description": "Specify the minimum number of days that a key should remain usable prior to expiration."
        }
      },
      "effect": {
        "type": "String",
        "metadata": {
          "displayName": "Effect",
          "description": "'Audit' allows a non-compliant resource to be created, but flags it as non-compliant. 'Deny' blocks the resource creation. 'Disable' turns off the policy."
        },
        "allowedValues": [
          "Audit",
          "Deny",
          "Disabled"
        ],
        "defaultValue": "Audit"
      }
    },
 "policyRule": {
      "if": {
        "allOf": [
          {
            "field": "type",
            "equals": "Microsoft.KeyVault.Data/vaults/keys"
          },
          {
            "field": "Microsoft.KeyVault.Data/vaults/keys/attributes.expiresOn",
            "exists": true
          },
          {
            "field": "Microsoft.KeyVault.Data/vaults/keys/attributes.expiresOn",
            "less": "[addDays(utcNow(), parameters('minimumDaysBeforeExpiration'))]"
          }
        ]
      },
      "then": {
        "effect": "[parameters('effect')]"
      }
    }
  },
  "id": "/providers/Microsoft.Authorization/policyDefinitions/5ff38825-c5d8-47c5-b70e-069a21955146",
  "name": "5ff38825-c5d8-47c5-b70e-069a21955146"
}