In AWS kann man diesen Zugriffe auf seine Lab-Umgebung leicht einschränken indem man seine eigene öffentliche IP seines Internetzugangs in den jeweiligen Security Gruppen einträgt. Aber bei jedem IP-Wechsel händisch die IP aktualisieren? Das geht auch mit Powershell ganz automatisch.
Damit man seine AWS-Umgebung mit Powershell verwalten kann benötigt man zuerst einen Benutzer mit einem Access key ID.
Dazu im Portal unter Find Services nach „IAM“ suchen, auswählen und auf „Users“ wechseln. Oder einfach auf diesen Link klicken. Mit „Add User“ einen neuen Benutzer erstellen und bei Access type „Programmatic access“ auswählen. Im nächsten Schritt gibt man dem Benutzer noch die AdministratorAccess Berechtigung und nach ein paar Klicks erhält schon die „Access key ID“ und den „Secret access key“. Beides gut aufbewahren.
Hat man beide ID’s einfach das unten angeführte Script als .ps1 abspeichern und die Nummern in den jeweiligen Variablen (Zeile 9 und 10) befüllen.
Am Anfang wird das benötigte ASWPowerShell Modul installiert.
Danach die öffentliche IP ausgelesen und in den gewünschten Gruppen eingetragen. Mit dem Parameter „-Port“ kann man noch die gewünschten Ports filtern (z.B.: nur 22 oder 3689).
#---------------------------------------------------------[Initialisations]--------------------------------------------------------
# Install ASWPowerShell Module
if (!(Get-Module -ListAvailable -Name AWSPowerShell)) {
Find-Module -Name AWSPowerShell | Install-Module -Force
}
#----------------------------------------------------------[Declarations]----------------------------------------------------------
# Set and Initialize AWS Credential and Profile for login and authentication
$AccessKey = "xxxxxxxxxxxxxxxxxx"
$SecretKey = "xxxxxxxxxxxxxxxxxx"
#-----------------------------------------------------------[Functions]------------------------------------------------------------
FUNCTION Update-EC2SecurityGroupIpRange{
[cmdletbinding()]
Param(
[Parameter(
Position=0,
Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
HelpMessage="GroupId")]
[string]$GroupId,
[Parameter(
Position=1,
Mandatory=$false,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
HelpMessage="New IpRange")]
[ValidatePattern('((?:(?:1\d\d|2[0-5][0-5]|2[0-4]\d|0?[1-9]\d|0?0?\d)\.){3}(?:1\d\d|2[0-5][0-5]|2[0-4]\d|0?[1-9]\d|0?0?\d))/\d+')]
[string]$IpRange = "0.0.0.0/0",
[Parameter(
Position=2,
Mandatory=$false,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
HelpMessage="Update only selected Ports")]
[string[]]$Ports
)
Get-EC2SecurityGroup | where {$_.GroupId -eq $GroupId} | %{
$SecurityGroup = $_
IF ($Ports){
$IpPermissionsList = $SecurityGroup.IpPermissions | where {$_.ToPort -in $Ports}
}ELSE{
$IpPermissionsList = $SecurityGroup.IpPermissions
}
$IpPermissionsList | %{
$IpPermissions = $_
$FromPort = $IpPermissions.FromPort
$ToPort = $IpPermissions.ToPort
$IpProtocol = $IpPermissions.IpProtocol
$NewIpRange = $($IpRange.Split("/")[0])
$OldIpRange = $($IpPermissions.IpRange.Split("/")[0])
if ($NewIpRange -ne $OldIpRange){
Write-Host "[*] update rule $FromPort/$IpProtocol from IpRange $($IpPermissions.IpRange) to IpRange $IpRange"
Revoke-EC2SecurityGroupIngress -GroupId $securityGroup.GroupId -IpPermissions $IpPermissions | Out-Null
$iprule = New-Object Amazon.EC2.Model.IpPermission
$iprule.ToPort = $ToPort
$iprule.FromPort = $FromPort
$iprule.IpProtocol = $IpProtocol
$iprule.IpRanges.Add("$IpRange")
Grant-EC2SecurityGroupIngress -GroupId $securityGroup.GroupId -IpPermission $iprule -Force | Out-Null
}
}
}
}
#-----------------------------------------------------------[Execution]------------------------------------------------------------
# connect to aws
IF (!(Get-AWSCredential)){
Write-Host "[*] connect to AWS"
Set-AWSCredential -AccessKey $AccessKey -SecretKey $SecretKey -StoreAs AWS
}
# get publich ip
$PublicIPInfo = Invoke-RestMethod -Uri ('http://ipinfo.io/'+(Invoke-WebRequest -uri "http://ifconfig.me/ip").Content)
$CurrentPublicIP = $PublicIPInfo.IP
# update groups
Update-EC2SecurityGroupIpRange -GroupId sg-6549846546546546 -Ports 22,3389 -IpRange $($CurrentPublicIP+"/32")
Update-EC2SecurityGroupIpRange -GroupId sg-9879832986549499 -IpRange $($CurrentPublicIP+"/32")
<#
# update all groups
Get-EC2SecurityGroup | %{
$GroupId = $_.GroupId
Update-EC2SecurityGroupIpRange -GroupId $GroupId -IpRange $($CurrentPublicIP+"/32")
}
#>