Configuración de políticas de seguridad de vSwitch con PowerCLI

Una de las 3 políticas que podemos configurar a un vSwitch/Port Group de un ESXi son las políticas de seguridad, éstas tienen 3 parámetros. MAC Address Changes, Forged Transmits y Promiscuous Mode. Cuando se crea un vSwitch/Port Group Standard en un host ESXi, éstos son los valores default:

Promiscuous Mode. Default: Reject.
MAC Address Changes. Default: Accept
Forged Transmits. Defaul: Accept

Por alguna razón, los valores por default de los vSwitches Standard en cuanto a MAC Address Changes y Forged Transmits está en “Accept”, siendo que el default en los switches distribuídos cambia, por default MAC Address Changes y Forged Transmits se encuentran en “Reject”.

No es la intención de este post explicar a detalle la función que desempeña cada parámetro. Chris Wahl tiene un par de posts excelentes donde explica MAC Address Changes y Forged Transmits. En cuanto a Promiscuous Mode, cuando se habilita, permite a las VMs que se encuentran en el PortGroup “escuchar” todo el tráfico que se está transmitiendo en dicho Portgroup, el caso típico es cuando se instala un sniffer como WireShark para monitorear el tráfico de red.

¿Cual es la mejor práctica? De acuerdo al “Hardening Guide” para vSphere 5.5, una buena práctica es dejar en “Reject” los tres parámetros de las políticas de seguridad. La intención de este post es ofrecer una opción para automatizar esta configuración empleando PowerCLI.

Un detalle importante, el documento de hardening se refieren en general al vSwitch, sin embargo, el script lo vamos a aplicar directamente a los Port Groups que llevan el tráfico de red de las máquinas virtuales, no vamos editar a los Port Groups de tipo “vmkernel” que le dan servicio de red al host ESXi.

Ok, ahí vamos…

Vamos a empezar desde abajo con un host, en este caso “esx-daftpunk.infra.lab” y un virtual switch “VM Network”. Con esta línea editamos las políticas de seguridad del PortGroup:

Get-VirtualPortGroup -VMHost esx-daftpunk* -Name "VM Network" | Get-SecurityPolicy | Set-SecurityPolicy -MacChanges $false -ForgedTransmits $false -AllowPromiscuous $false

Revisamos la configuración de la política de seguridad del PortGroup y observamos que nuestra línea de PowerCLI funcionó, fue fácil porque lo aplicamos a sólo un host y conocemos el nombre del PortGroup.

skitch

¿Pero como automatizar este proceso cuando tenemos en nuestro centro de datos distintos Port Groups en cada host que llevan el tráfico de red de las máquinas virtuales y muchos hosts ESXi?

Modificamos un poco el script y con un “one-liner” podemos modificar la configuración en todo nuestro Datacenter, aunque también podría hacerse por Cluster, Carpeta, hosts “taggeados” o haciendo una lista específica de hosts.

Get-VMHost $misESXi | Get-VirtualPortGroup | Where {$_.Port.Type -ne "host"} | Get-SecurityPolicy | Set-SecurityPolicy -MacChanges $false -ForgedTransmits $false -AllowPromiscuous $false

Ok, con esta linea deberíamos de tener la configuración de seguridad de todos nuestros Port Groups de acuerdo a lo que nos sugiere el “Hardening”.

Ahora, podemos correr este otro script para sacar un pequeño reporte y documentar lo que acabamos de hacer.

Por default, PowerCLI le llama “True” a lo que en la GUI vemos como “Accept”, y “False” a “Reject”. Así que le incluí una condición de PowerShell para que salga como aparece en la GUI.

$truePG = "True"
$reject = "Reject"
$accept = "Accept"
$hosts = Get-VMHost -Location HA-DRS
foreach ($miesx in $hosts){ 
Write-Host "-- Configuración PortGroup Security Policy VM Networking en host $miesx"
Get-VMHost $miesx | Get-VirtualPortGroup | Where {$_.Port.Type -ne "host"} | Get-SecurityPolicy | 
Format-Table @{Name="Port Group";E={$_.VirtualPortGroup};a="left"},
@{Name="Promiscuous Mode";Expression={ if ($_.AllowPromiscuous -eq $truePG) { $accept } else { $reject }};a="center"},
@{Name="Mac Address Changes";Expression={ if ($_.MacChanges -eq $truePG) { $accept } else { $reject }};a="center"},
@{Name="Forged Transmits";Expression={ if ($_.ForgedTransmits -eq $truePG) { $accept } else { $reject }};a="center"} -a
}

Ojalá les sea de utilidad.

gc