Showing posts with label KeyVault Expiration. Show all posts
Showing posts with label KeyVault Expiration. Show all posts

Tuesday, May 5, 2020

This Runbook will Check if any of the Secrets, Keys and Certificates within Key Vault and Webhook within Runbook is nearing expiry or is expiring today
       

           Param(
        [string]$SubscriptionID='XXXX',
        [int]$DaysNearExpiration=5000,
        [string]$VaultName = 'XXX',
        [string]$AutomationAccountResourceGroup = 'XXX'
)
 
 
write-verbose "Connecting to Azure"
$connectionName = "AzureRunAsConnection"

try
{
    # Get the connection "AzureRunAsConnection "
    $servicePrincipalConnection = Get-AutomationConnection -Name $connectionName         

    "Logging in to Azure..."
    Add-AzureRmAccount `
        -ServicePrincipal `
        -TenantId $servicePrincipalConnection.TenantId `
        -ApplicationId $servicePrincipalConnection.ApplicationId `
        -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 
}
catch {
    if (!$servicePrincipalConnection)
    {
        $ErrorMessage = "Connection $connectionName not found."
        throw $ErrorMessage
    } else{
        Write-Error -Message $_.Exception.Message
        throw $_.Exception
    }
}

Select-AzureRmSubscription -SubscriptionId $SubscriptionID

$ExpiredSecrets = @()
$NearExpirationSecrets = @()
$ExpiredSecretsToday = @()

#gather all key vaults from subscription
if ($VaultName) {
    $KeyVaults = Get-AzureRmKeyVault -VaultName $VaultName
}
else {
    $KeyVaults = Get-AzureRmKeyVault 
}
#check date which will notify about expiration
$ExpirationDate = (Get-Date (Get-Date).AddDays($DaysNearExpiration) -Format yyyyMMdd)
$CurrentDate = (Get-Date -Format yyyyMMdd)
 
# iterate across all key vaults in subscription
foreach ($KeyVault in $KeyVaults) {
    # gather all secrets in each key vault
    $SecretsArray = Get-AzureKeyVaultSecret -VaultName $KeyVault.VaultName
    foreach ($secret in $SecretsArray) {
        # check if expiration date is set
        if ($secret.Expires) {
            $secretExpiration = Get-date $secret.Expires -Format yyyyMMdd
            
            # check if expiration date set on secret is before notify expiration date
            if ($ExpirationDate -gt $secretExpiration) {
                # check if secret did not expire yet but will expire soon
                if ($CurrentDate -lt $secretExpiration) {
                    $NearExpirationSecrets += New-Object PSObject -Property @{
                        Name           = $secret.Name;
                        Category       = 'SecretNearExpiration';
                        KeyVaultName   = $KeyVault.VaultName;
                        ExpirationDate = $secret.Expires;
                    }
                }
                elseif ($CurrentDate -eq $secretExpiration)
                {
                    $ExpiredSecretsToday += New-Object PSObject -Property @{
                        Name           = $secret.Name;
                        Category       = 'SecretExpiringToday';
                        KeyVaultName   = $KeyVault.VaultName;
                        ExpirationDate = $secret.Expires;
                    }

                }
                # secret is already expired
                else {
                    $ExpiredSecrets += New-Object PSObject -Property @{
                        Name           = $secret.Name;
                        Category       = 'SecretNearExpiration';
                        KeyVaultName   = $KeyVault.VaultName;
                        ExpirationDate = $secret.Expires;
                    }
                }
 
            }
        }
    }
    $certArray = Get-AzureKeyVaultCertificate $KeyVault.VaultName
    foreach ($cert in $certArray) {
        # check if expiration date is set
        if ($cert.Expires) {
            $certExpiration = Get-date $cert.Expires -Format yyyyMMdd
            
            # check if expiration date set on secret is before notify expiration date
            if ($ExpirationDate -gt $certExpiration) {
                # check if secret did not expire yet but will expire soon
                if ($CurrentDate -lt $certExpiration) {
                    $NearExpirationSecrets += New-Object PSObject -Property @{
                        Name           = $cert.Name;
                        Category       = 'CertNearExpiration';
                        ServiceName   = $KeyVault.VaultName;
                        ExpirationDate = $cert.Expires;
                    }
                }
                elseif ($CurrentDate -eq $certExpiration)
                {
                    $ExpiredSecretsToday += New-Object PSObject -Property @{
                        Name           = $cert.Name;
                        Category       = 'CertExpiringToday';
                        ServiceName   = $KeyVault.VaultName;
                        ExpirationDate = $cert.Expires;
                    }

                }
                # secret is already expired
                else {
                    $ExpiredSecrets += New-Object PSObject -Property @{
                        Name           = $cert.Name;
                        Category       = 'CertNearExpiration';
                        ServiceName   = $KeyVault.VaultName;
                        ExpirationDate = $cert.Expires;
                    }
                }
 
            }
        }
    }
    
    $keysArray = Get-AzureKeyVaultKey $KeyVault.VaultName
    foreach ($key in $keysArray) {
        # check if expiration date is set
        if ($key.Expires) {
            $keyExpiration = Get-date $key.Expires -Format yyyyMMdd
            
            # check if expiration date set on secret is before notify expiration date
            if ($ExpirationDate -gt $keyExpiration) {
                # check if secret did not expire yet but will expire soon
                if ($CurrentDate -lt $keyExpiration) {
                    $NearExpirationSecrets += New-Object PSObject -Property @{
                        Name           = $key.Name;
                        Category       = 'KeyNearExpiration';
                        ServiceName    = $KeyVault.VaultName;
                        ExpirationDate = $key.Expires;
                    }
                }
                elseif ($CurrentDate -eq $keyExpiration)
                {
                    $ExpiredSecretsToday += New-Object PSObject -Property @{
                        Name           = $key.Name;
                        Category       = 'KeyExpiringToday';
                        ServiceName    = $KeyVault.VaultName;
                        ExpirationDate = $key.Expires;
                    }

                }
                # secret is already expired
                else {
                    $ExpiredSecrets += New-Object PSObject -Property @{
                        Name           = $key.Name;
                        Category       = 'KeyNearExpiration';
                        ServiceName    = $KeyVault.VaultName;
                        ExpirationDate = $key.Expires;
                    }
                }
 
            }
        }
    }    
}
Get-AzureRmResourceGroup  -Name $AutomationAccountResourceGroup | `
Get-AzureRmAutomationAccount | `
Get-AzureRmAutomationWebhook | `
ForEach($_ )`
{  
    if ($_.ExpiryTime) {
        $cstzone = [System.TimeZoneInfo]::FindSystemTimeZoneById("Central Standard Time")
        $csttime = [System.TimeZoneInfo]::ConvertTimeFromUtc($_.ExpiryTime.UtcDateTime, $cstzone)
      
        $webhkExpiration = Get-date $csttime  -Format yyyyMMdd 
        
        # check if expiration date set on secret is before notify expiration date
        if ($ExpirationDate -gt $webhkExpiration) {
            # check if secret did not expire yet but will expire soon
            if ($CurrentDate -lt $webhkExpiration) {
                $NearExpirationSecrets += New-Object PSObject -Property @{
                    Name           = $_.Name;
                    Category       = 'WebHookNearExpiration';
                    ServiceName    = ($_.AutomationAccountName)+"\"+($_.RunbookName);
                    ExpirationDate = $_.ExpiryTime;
                }
            }
            elseif ($CurrentDate -eq $webhkExpiration)
            {
                $ExpiredSecretsToday += New-Object PSObject -Property @{
                    Name           = $_.Name;
                    Category       = 'WebHookExpiringToday';
                    ServiceName    = ($_.AutomationAccountName)+"\"+($_.RunbookName);
                    ExpirationDate = $_.ExpiryTime;
                }

            }
            # secret is already expired
            else {
                $ExpiredSecrets += New-Object PSObject -Property @{
                    Name           = $_.Name;
                    Category       = 'WebHookNearExpiration';
                    ServiceName    = ($_.AutomationAccountName)+"\"+($_.RunbookName);
                    ExpirationDate = $_.ExpiryTime;
                }
            }

        }
    }
}

if ($ExpiredSecretsToday.Count -gt 0 -or $NearExpirationSecrets.Count -gt 0)
{
   $data=($ExpiredSecretsToday)
    $message_array01="SecretExpiringToday:" + "[TotalCount: $($ExpiredSecretsToday.Count)]"
    foreach ($dt in $data)
    {
        $message_array01 += "[Name:"+$dt.Name+" ExpDate:"+$dt.ExpirationDate+"]"
    }
    $data=($NearExpirationSecrets)
    $message_array02="SecretNearExpiration:"+ "[Total Count: $($ExpiredSecretsToday.Count)]" 
    foreach ($dt in $data)
    {
        $message_array02 += "[Name:"+$dt.Name+" ExpDate:"+$dt.ExpirationDate+"]"
    }
    Write-Output $message_array01 + "`r`n" + $message_array02
    throw $message_array01 + "`r`n" + $message_array02
     
}

       
 

LinkWithin

Related Posts with Thumbnails