Punti chiave
- Avvisi automatici: Lo script fornisce avvisi automatici per i certificati prossimi alla scadenza.
- Parametri personalizzabili: Gli utenti possono impostare parametri per i tempi di scadenza e l’esclusione dei certificati autofirmati.
- Maggiore sicurezza: Gli avvisi tempestivi aiutano a mantenere la sicurezza prevenendo le vulnerabilità legate ai certificati scaduti.
- Compatibilità e requisiti: Supporta Windows 7 e Server 2008 e versioni successive, con requisiti specifici di versione di PowerShell e privilegi.
- Scalabilità: Più scalabile e personalizzabile rispetto agli strumenti di gestione dei certificati basati su GUI.
- Conformità proattiva: Contribuisce a mantenere la conformità assicurando il rinnovo dei certificati nei tempi previsti.
- Integrazione con gli strumenti MSP: Può essere integrato con soluzioni MSP come NinjaOne per una gestione completa dell’IT.
La gestione dei certificati digitali è un aspetto cruciale della sicurezza e della conformità informatica. La mancata considerazione della scadenza dei certificati può comportare rischi significativi per la sicurezza, interruzioni del sistema e perdita della fiducia. Un approccio proattivo alla gestione dei certificati è essenziale per mantenere l’integrità e l’affidabilità dei sistemi IT.
Background
Questo script PowerShell è uno strumento versatile per i professionisti IT e i fornitori di servizi gestiti (MSP). Avvisa gli utenti dei certificati locali prossimi alla scadenza, con la possibilità di ignorare i certificati autofirmati, a lunga scadenza o a breve termine. Questo script è particolarmente importante in ambienti in cui la scadenza del certificato può causare interruzioni o vulnerabilità della sicurezza.
Lo script:
<# .SYNOPSIS Alerts when a local certificate will expire in a configurable number of days. Can optionally ignore self-signed certificates, certificates that have been expired for a long time and certificates that were only valid for an extremely short time frame. .DESCRIPTION Alerts when a local certificate will expire in a configurable number of days. Can optionally ignore self-signed certificates, certificates that have been expired for a long time and certificates that were only valid for an extremely short time frame. .EXAMPLE (No Parameters) Checking for certificates that were valid before 10/10/2023 09:07:23 and will expire before 11/11/2023 09:07:23. No Certificates were found with an expiration date before 11/11/2023 09:07:23 and after 07/13/2023 09:07:23. PARAMETER: -DaysUntilExpiration "ReplaceWithNumber" Alerts if a certificate is set to expire within the specified number of days. .EXAMPLE -DaysUntilExpiration "366" Checking for certificates that were valid before 10/10/2023 09:08:14 and will expire before 10/12/2024 09:08:14. WARNING: Expired Certificates found! ### Expired Certificates ### SerialNumber HasPrivateKey ExpirationDate Subject ------------ ------------- -------------- ------- 0AA60783EBB5076EBC2D12DA9B04C290 False 6/10/2024 4:59:59 PM CN=Insecure.Com LLC, O=Insecure.Com... 619DCC976458E38D471DC3DCE3603C2C True 3/29/2024 10:19:00 AM CN=KYLE-SRV22-TEST.test.lan 0AA60783EBB5076EBC2D12DA9B04C290 False 6/10/2024 4:59:59 PM CN=Insecure.Com LLC, O=Insecure.Com... 7D5FC733E3A8CF9344CDDFC0AB01CCB9 True 4/9/2024 9:53:53 AM CN=KYLE-SRV22-TEST.test.lan 4EDC0A79D6CD5A8D4D1E3705BC20C206 True 4/9/2024 9:58:06 AM CN=KYLLE-SRV22-TEST.test.lan PARAMETER: -MustBeValidBefore "ReplaceWithNumber" Only alert on certificates that are older than X days. This is primarily to silence alerts about certificates that were only valid for 24 hours in their entire lifetime. PARAMETER: -Cutoff "ReplaceWithNumber" Don't alert on certificates that have been expired for longer than X days (default is 91 days). PARAMETER: -IgnoreSelfSignedCerts Ignore certificates where the subject of the certificate and the issuer of the certificate are identical. .OUTPUTS None .NOTES Minimum OS Architecture Supported: Windows 7, Server 2008 Release Notes: Initial Release By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/it/condizioni-utilizzo Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA). #> [CmdletBinding()] param ( [Parameter()] [String]$ExpirationFromCustomField = "certExpirationAlertDays", [Parameter()] [int]$DaysUntilExpiration = 30, [Parameter()] [int]$MustBeValidBefore = 2, [Parameter()] [int]$Cutoff = 91, [Parameter()] [Switch]$IgnoreSelfSignedCerts = [System.Convert]::ToBoolean($env:ignoreSelfSignedCerts) ) begin { # Retrieve script variables from the dynamic script form. if ($env:expirationFromCustomFieldName -and $env:expirationFromCustomFieldName -notlike "null") { $ExpirationFromCustomField = $env:expirationFromCustomFieldName } if ($env:daysUntilExpiration -and $env:daysUntilExpiration -notlike "null") { $DaysUntilExpiration = $env:daysUntilExpiration } if ($env:certificateMustBeOlderThanXDays -and $env:certificateMustBeOlderThanXDays -notlike "null") { $MustBeValidBefore = $env:certificateMustBeOlderThanXDays } if ($env:skipCertsExpiredForMoreThanXDays -and $env:skipCertsExpiredForMoreThanXDays -notlike "null") { $Cutoff = $env:skipCertsExpiredForMoreThanXDays } function Test-IsElevated { $id = [System.Security.Principal.WindowsIdentity]::GetCurrent() $p = New-Object System.Security.Principal.WindowsPrincipal($id) $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator) } # If using the custom field option, check for the default value and replace it if necessary. if ($PSVersionTable.PSVersion.Major -gt 2) { $CustomField = Ninja-Property-Get -Name $ExpirationFromCustomField 2>$Null } if ($CustomField -and $DaysUntilExpiration -eq 30 -and (Test-IsElevated) -and $PSVersionTable.PSVersion.Major -gt 2) { Write-Host "Retrieved value of $CustomField days from Custom Field $ExpirationFromCustomField. Using it for expiration value." $DaysUntilExpiration = $CustomField } elseif (-not (Test-IsElevated) -or $PSVersionTable.PSVersion.Major -le 2) { Write-Warning "Skipping CustomField retrieval due to either incompatible PowerShell version or lack of elevation." } } process { # Calculate expiration and cutoff dates. $ExpirationDate = (Get-Date "11:59pm").AddDays($DaysUntilExpiration) $CutoffDate = (Get-Date "12am").AddDays(-$Cutoff) $MustBeValidBeforeDate = (Get-Date "12am").AddDays(-$MustBeValidBefore) # Retrieve all certificates. $Certificates = Get-ChildItem -Path "Cert:\" -Recurse Write-Host "Checking for certificates that were valid before $MustBeValidBeforeDate and will expire before $ExpirationDate." # Filter down to certificates that are expired in our desired date range $ExpiredCertificates = $Certificates | Where-Object { $_.NotAfter -le $ExpirationDate -and $_.NotAfter -gt $CutoffDate -and $_.NotBefore -lt $MustBeValidBeforeDate } # If we're asked to ignore self signed certs we'll filter them out if ($IgnoreSelfSignedCerts -and $ExpiredCertificates) { Write-Host "Removing Self-Signed certificates from list." $ExpiredCertificates = $ExpiredCertificates | Where-Object { $_.Subject -ne $_.Issuer } } if ($ExpiredCertificates) { Write-Host "" Write-Warning "Expired Certificates found!" Write-Host "" $Report = $ExpiredCertificates | ForEach-Object { # Subject can be a long property, we'll truncate it to maintain readability New-Object PSObject -Property @{ SerialNumber = $_.SerialNumber HasPrivateKey = $_.HasPrivateKey ExpirationDate = $_.NotAfter Subject = if ($_.Subject.Length -gt 35) { $_.Subject.Substring(0, 35) + "..." }else { $_.Subject } } } Write-Host "### Expired Certificates ###" $Report | Format-Table -AutoSize | Out-String | Write-Host exit 1 } else { Write-Host "No Certificates were found with an expiration date before $ExpirationDate and after $CutoffDate." } } end { }
Accedi a oltre 700 script nel Dojo NinjaOne
Analisi dettagliata
Lo script opera in alcune fasi distinte:
- Inizializzazione: Si inizia con l’impostazione di parametri predefiniti, come il numero di giorni fino alla scadenza del certificato e vari limiti. Queste possono essere sovrascritte da variabili d’ambiente.
- Controlli ambientali: Lo script verifica i privilegi necessari e la compatibilità della versione di PowerShell, adattando il suo comportamento di conseguenza.
- Elaborazione dei dati: Recupera tutti i certificati dall’archivio locale e li filtra in base alla scadenza, al periodo di validità e al fatto che siano autofirmati, secondo i parametri forniti.
- Reportistica: Se vengono trovati certificati scaduti, viene generato un report che ne elenca i dettagli, altrimenti indica che non sono stati trovati certificati relativi.
Per rendere il processo più comprensibile, si possono utilizzare supporti visivi come i diagrammi di flusso che illustrano efficacemente queste fasi.
Casi d’uso potenziali
Considera un MSP che supervisiona l’infrastruttura IT di un’organizzazione. Questo script viene utilizzato per scansionare regolarmente i certificati prossimi alla scadenza. Il sistema di allerta precoce consente di effettuare rinnovi tempestivi, evitando interruzioni del servizio o violazioni della sicurezza.
Confronti
Questo approccio PowerShell è più personalizzabile e integrato rispetto agli strumenti di gestione dei certificati basati su GUI. Permette l’automazione ed è più scalabile per le grandi imprese rispetto ai controlli manuali.
Domande frequenti
- Come fa lo script a determinare i certificati su cui effettuare l’avviso?
Lo script utilizza parametri come la data di scadenza, il periodo di validità e lo stato autofirmato per filtrare i certificati. - Questo script può essere eseguito su qualsiasi dispositivo Windows?
Supporta Windows 7 e Server 2008 e versioni successive, ma richiede determinati privilegi e versioni di PowerShell per un’ottima funzionalità. - È possibile personalizzare i criteri di avviso?
Sì, lo script consente di personalizzare parametri come i giorni fino alla scadenza e i periodi di interruzione.
Implicazioni
Il mancato rinnovo dei certificati può portare a vulnerabilità della sicurezza e alla perdita di fiducia dei clienti. Lo script aiuta a mantenere una postura di sicurezza ottimale gestendo in modo proattivo i rinnovi dei certificati.
Raccomandazioni
- Pianifica regolarmente l’esecuzione dello script per garantire avvisi tempestivi.
- Personalizza i parametri per adattarli alle esigenze specifiche del tuo ambiente IT.
- Assicurati che i privilegi e le impostazioni dell’ambiente siano appropriati per un’esecuzione accurata.
Considerazioni finali
Nel contesto di una gestione completa dell’IT, strumenti come NinjaOne possono aumentare le capacità di questo script. NinjaOne offre soluzioni integrate che possono affiancare tali script per semplificare le operazioni IT, migliorare la sicurezza e garantire la conformità.