Diventare maestri degli avvisi di scadenza dei certificati con PowerShell per una maggiore sicurezza IT

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

Ottieni l’accesso

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à.

Passi successivi

La creazione di un team IT efficiente ed efficace richiede una soluzione centralizzata che funga da principale strumento per la fornitura di servizi. NinjaOne consente ai team IT di monitorare, gestire, proteggere e supportare tutti i dispositivi, ovunque essi si trovino, senza la necessità di una complessa infrastruttura locale.

Per saperne di più su NinjaOne Endpoint Management, fai un tour dal vivo, o inizia la tua prova gratuita della piattaforma NinjaOne.

Categorie:

Ti potrebbe interessare anche

Guarda una demo×
×

Guarda NinjaOne in azione!

Inviando questo modulo, accetto La politica sulla privacy di NinjaOne.

Termini e condizioni NinjaOne

Cliccando sul pulsante “Accetto” qui sotto, dichiari di accettare i seguenti termini legali e le nostre condizioni d’uso:

  • Diritti di proprietà: NinjaOne possiede e continuerà a possedere tutti i diritti, i titoli e gli interessi relativi allo script (compreso il copyright). NinjaOne ti concede una licenza limitata per l’utilizzo dello script in conformità con i presenti termini legali.
  • Limitazione d’uso: Puoi utilizzare lo script solo per legittimi scopi personali o aziendali interni e non puoi condividere lo script con altri soggetti.
  • Divieto di ripubblicazione: In nessun caso ti è consentito ripubblicare lo script in una libreria di script appartenente o sotto il controllo di un altro fornitore di software.
  • Esclusione di garanzia: Lo script viene fornito “così com’è” e “come disponibile”, senza garanzie di alcun tipo. NinjaOne non promette né garantisce che lo script sia privo di difetti o che soddisfi le tue esigenze o aspettative specifiche.
  • Assunzione del rischio: L’uso che farai dello script è da intendersi a tuo rischio. Riconosci che l’utilizzo dello script comporta alcuni rischi intrinseci, che comprendi e sei pronto ad assumerti.
  • Rinuncia e liberatoria: Non riterrai NinjaOne responsabile di eventuali conseguenze negative o indesiderate derivanti dall’uso dello script e rinuncerai a qualsiasi diritto legale o di equità e a qualsiasi rivalsa nei confronti di NinjaOne in relazione all’uso dello script.
  • EULA: Se sei un cliente NinjaOne, l’uso dello script è soggetto al Contratto di licenza con l’utente finale (EULA) applicabile.