aws.psm1

<#
.SYNOPSIS
Discover privileged Assets on an Aws server.
 
.DESCRIPTION
This cmdlet may be used to discover privileged Assets on an Aws server.
 
.PARAMETER Region
The AWS region to query for instances
 
.PARAMETER Credential
A PowerShell credential object that can be used to connect to the AWS server to
execute the discovery job where UserName = AccessKey and Password = SecretKey
 
.INPUTS
None.
 
.OUTPUTS
System.Management.Automation.PSObject.
 
.EXAMPLE
Get-SgDiscAwsAsset Aws.test.env
 
.EXAMPLE
Get-SgDiscAwsAsset Aws.test.env us-west-2 -NetworkAddress SafeguardAWS
#>

function Get-SgDiscAwsAsset
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true,Position=0)]
        [string]$Region,
        [Parameter(Mandatory=$false)]
        [PSCredential]$Credential = $null
    )

    if (-not $PSBoundParameters.ContainsKey("ErrorAction")) { $ErrorActionPreference = "Stop" }
    if (-not $PSBoundParameters.ContainsKey("Verbose")) { $VerbosePreference = $PSCmdlet.GetVariableValue("VerbosePreference") }

    if (-not $Credential) 
    {
        $Credential = Get-Credential
    }

    # make sure Awspowershell is installed
    if (-not (Get-Module Awspowershell)) 
    { 
        try 
        {
            Import-Module Awspowershell
        }
        catch 
        {
            throw "AWS Asset discovery in safeguard-discovery requires Awspowershell. Please run: Install-Module Awspowershell."
        }
    }
    
    $local:NetworkCredential = $Credential.GetNetworkCredential()
    Initialize-AWSDefaults -AccessKey $local:NetworkCredential.UserName -SecretKey $local:NetworkCredential.Password -Region $Region

    $local:Results = @()
    $local:systems = Get-EC2Instance | ForEach-Object { $_.Instances }
    foreach ($local:system in $local:systems)
    {  
        $local:name = $local:system.Tag | Where-Object { $_.Key -eq 'Name'} | Select-Object -ExpandProperty Value
        if (-not $local:name)
        {
            $local:name = $local:system.InstanceId
        }

        $local:Results += New-Object PSObject -Property ([ordered]@{
            AssetName = $local:name;
            State = $local:system.State.Name;
            OperatingSystem = $local:system.Platform;
            HostName = $local:system.PublicDnsName;
            IpAddress = $local:system.PublicIpAddress;
            Description = "safeguard-discovery"
        })
    }

    $local:Results
}