Skip to content

Commit 5eb8e3c

Browse files
committed
feat: added alerts for key kault certificates nearing or past expiry
1 parent 7ceb658 commit 5eb8e3c

3 files changed

Lines changed: 174 additions & 0 deletions

File tree

infrastructure/modules/key-vault/alerts.tf

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,101 @@ QUERY
9595
]
9696
}
9797
}
98+
99+
resource "azurerm_monitor_scheduled_query_rules_alert_v2" "kv_certificate_near_expiry" {
100+
count = var.enable_alerting == true ? 1 : 0
101+
102+
name = "${azurerm_key_vault.keyvault.name}-certificate-near-expiry"
103+
resource_group_name = var.resource_group_name_monitoring != null ? var.resource_group_name_monitoring : var.resource_group_name
104+
location = var.location
105+
106+
evaluation_frequency = var.certificate_near_expiry_alert.evaluation_frequency
107+
window_duration = var.certificate_near_expiry_alert.window_duration
108+
scopes = [azurerm_key_vault.keyvault.id]
109+
severity = 2
110+
111+
criteria {
112+
query = <<-QUERY
113+
AzureDiagnostics
114+
| where ResourceProvider == "MICROSOFT.KEYVAULT"
115+
| where OperationName contains "CertificateNearExpiry"
116+
| project
117+
CertificateName = column_ifexists("eventGridEventProperties_data_ObjectName_s","")
118+
| summarize Events=count() by CertificateName
119+
QUERY
120+
121+
time_aggregation_method = "Total"
122+
threshold = var.certificate_near_expiry_alert.threshold
123+
operator = "GreaterThanOrEqual"
124+
125+
resource_id_column = "CertificateName"
126+
metric_measure_column = "Events"
127+
128+
dimension {
129+
name = "CertificateName"
130+
operator = "Include"
131+
values = ["*"]
132+
}
133+
}
134+
135+
description = "The Key Vault certificate is nearing expiration."
136+
137+
action {
138+
action_groups = [var.action_group_id]
139+
}
140+
141+
lifecycle {
142+
ignore_changes = [
143+
tags
144+
]
145+
}
146+
}
147+
148+
resource "azurerm_monitor_scheduled_query_rules_alert_v2" "kv_certificate_expired" {
149+
count = var.enable_alerting == true ? 1 : 0
150+
151+
name = "${azurerm_key_vault.keyvault.name}-certificate-expired"
152+
resource_group_name = var.resource_group_name_monitoring != null ? var.resource_group_name_monitoring : var.resource_group_name
153+
location = var.location
154+
155+
evaluation_frequency = var.certificate_expired_alert.evaluation_frequency
156+
window_duration = var.certificate_expired_alert.window_duration
157+
scopes = [azurerm_key_vault.keyvault.id]
158+
severity = 2
159+
160+
criteria {
161+
query = <<-QUERY
162+
AzureDiagnostics
163+
| where ResourceProvider == "MICROSOFT.KEYVAULT"
164+
| where OperationName contains "CertificateExpired"
165+
| project
166+
CertificateName = column_ifexists("eventGridEventProperties_data_ObjectName_s","")
167+
| summarize Events=count() by CertificateName
168+
QUERY
169+
170+
time_aggregation_method = "Total"
171+
threshold = var.certificate_expired_alert.threshold
172+
operator = "GreaterThanOrEqual"
173+
174+
resource_id_column = "CertificateName"
175+
metric_measure_column = "Events"
176+
177+
dimension {
178+
name = "CertificateName"
179+
operator = "Include"
180+
values = ["*"]
181+
}
182+
}
183+
184+
description = "The Key Vault certificate has expired."
185+
186+
action {
187+
action_groups = [var.action_group_id]
188+
}
189+
190+
lifecycle {
191+
ignore_changes = [
192+
tags
193+
]
194+
}
195+
}

infrastructure/modules/key-vault/tfdocs.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,34 @@ object({
184184
})
185185
```
186186

187+
### <a name="input_certificate_near_expiry_alert"></a> [certificate\_near\_expiry\_alert](#input\_certificate\_near\_expiry\_alert)
188+
189+
Description: Configuration for the Key Vault certificate near expiry alert.
190+
191+
Type:
192+
193+
```hcl
194+
object({
195+
evaluation_frequency = string
196+
window_duration = string
197+
threshold = number
198+
})
199+
```
200+
201+
### <a name="input_certificate_expired_alert"></a> [secret\_certificate\_alert](#input\_certificate\_expired\_alert)
202+
203+
Description: Configuration for the Key Vault certificate expired alert.
204+
205+
Type:
206+
207+
```hcl
208+
object({
209+
evaluation_frequency = string
210+
window_duration = string
211+
threshold = number
212+
})
213+
```
214+
187215
## Modules
188216

189217
The following Modules are called:

infrastructure/modules/key-vault/variables.tf

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,54 @@ variable "secret_expired_alert" {
105105
}
106106
}
107107

108+
variable "certificate_near_expiry_alert" {
109+
type = object({
110+
evaluation_frequency = string
111+
window_duration = string
112+
threshold = number
113+
})
114+
115+
validation {
116+
condition = contains(
117+
["PT1M", "PT5M", "PT15M", "PT30M", "PT1H", "PT6H", "PT12H", "P1D"],
118+
var.certificate_near_expiry_alert.evaluation_frequency
119+
)
120+
error_message = "certificate_near_expiry_alert.evaluation_frequency must be one of: PT1M, PT5M, PT15M, PT30M, PT1H, PT6H, PT12H, P1D"
121+
}
122+
123+
validation {
124+
condition = contains(
125+
["PT1M", "PT5M", "PT15M", "PT30M", "PT1H", "PT6H", "PT12H", "P1D"],
126+
var.certificate_near_expiry_alert.window_duration
127+
)
128+
error_message = "certificate_near_expiry_alert.window_duration must be one of: PT1M, PT5M, PT15M, PT30M, PT1H, PT6H, PT12H, P1D"
129+
}
130+
}
131+
132+
variable "certificate_expired_alert" {
133+
type = object({
134+
evaluation_frequency = string
135+
window_duration = string
136+
threshold = number
137+
})
138+
139+
validation {
140+
condition = contains(
141+
["PT1M", "PT5M", "PT15M", "PT30M", "PT1H", "PT6H", "PT12H", "P1D"],
142+
var.certificate_expired_alert.evaluation_frequency
143+
)
144+
error_message = "certificate_expired_alert.evaluation_frequency must be one of: PT1M, PT5M, PT15M, PT30M, PT1H, PT6H, PT12H, P1D"
145+
}
146+
147+
validation {
148+
condition = contains(
149+
["PT1M", "PT5M", "PT15M", "PT30M", "PT1H", "PT6H", "PT12H", "P1D"],
150+
var.certificate_expired_alert.window_duration
151+
)
152+
error_message = "certificate_expired_alert.window_duration must be one of: PT1M, PT5M, PT15M, PT30M, PT1H, PT6H, PT12H, P1D"
153+
}
154+
}
155+
108156
variable "name" {
109157
description = "The name of the Key Vault."
110158
type = string

0 commit comments

Comments
 (0)