VM Hardening – Mit vRealize Orchestrator oder PowerCLI

Um eine Security Baseline in der vSphere Infrastruktur zu etablieren ist es initial notwendig einige erweiterte Optionen an allen VMs zu setzen. Dieses Vorgehen wird im allgemeinen als VM Hardening bezeichnet. Später können dann z.B. DMZ VMs besonders geschützt werden.

Die hier aufgeführten Optionen sind meine persönliche Auswahl aus dem VMware Security Hardening Guide für vSphere 5.5 Update 1 VMs (Download).
Die Optionen sind kein Best Practice, nur meines erachtens nach ein gutes Maß an Sicherheit für die unterliegende Infrastruktur ohne Funktionen einzubüßen.

Hier die gewählten Optionen:

Option Wert
isolation.tools.diskShrink.disable true
isolation.tools.diskWiper.disable true
isolation.tools.copy.disable true
isolation.tools.paste.disable true
isolation.tools.dnd.disable true
isolation.tools.setGUIOptions.enable false
log.keepOld 10
log.rotateSize 100000
RemoteDisplay.maxConnections 2
RemoteDisplay.vnc.enabled false

Für die automatisierte Anwendung der Optionen auf die VMs möchte ich hier zwei Wege aufzeigen:

  • PowerCLI Script
  • vRealize Orchestrator Workflow

VM Hardening – Script bzw. Workflow

VMware PowerCLI

VM Hardening PowerCLI

PowerCLI – Konsolen Ausgabe

GitHub Gist:

GitHub Project:

https://github.com/mycloudrevolution/vm-hardening-ps

In dem Project ist das aktuelle VM-Hardening Script als JavaScript oder PowerShell zu finden.

Neu in dem Projekt:

Ich habe dem Projekt ein PowerShell Modul mit der Funktion „Apply-Hardening“ hinzugefügt. Mit dieser soll die Anwendung der Optionen enorm vereinfacht werden:

Apply-Hardening

vRealize Orchestrator

VM Hardening Workflow

VM Hardening - vCO Workflow

vRO Workflow Übersicht

Workflow Attibute

VM Hardening - vCO Attributes

vRO Workflow Attribute

 

VM Hardening - vCO Define Composite Type

Aufbau des „Composite Type“

 

VM-Hardening_vCO_Array of CompositeType

Inhalt des „Composite Type“

vRealize Orchestrator Scriptable Task

var VcVMConfigSpec = new VcVirtualMachineConfigSpec();  
var changeValue = new Array();
System.log ("Config From Array:");
for (var i = 0; i <  VcVmConfig.length; i++) {
	System.log ("Name: " + VcVmConfig[i].key + " - " + "Value: " + VcVmConfig[i].value);
	changeValue[i] = new VcOptionValue();
	changeValue[i].key = VcVmConfig[i].key;
	changeValue[i].value = VcVmConfig[i].value;
}

VcVMConfigSpec.extraConfig = changeValue;
System.log ("Number of VM to Process:" + VcVmS.length);

for (var j = 0; j <  VcVmS.length; j++) {
System.log ("VM to Set Options:" + VcVmS[j].Name);
ConfigTask = VcVmS[j].reconfigVM_Task(VcVMConfigSpec);
try {
		var actionResult = System.getModule("com.vmware.library.vc.basic").vim3WaitTaskEnd(ConfigTask,progress,pollrate);
		System.log("Config performed for VM : " + VcVmS[j].name);
		Server.log("Config performed for VM : " + VcVmS[j].name);
	}
	catch (e) {
		System.error("Config failed for VM : " + VcVmS[j].name + ". Reason: " + e);
		Server.error("Config failed for VM : " + VcVmS[j].name + ". Reason: " + e);
	}
MoveTask = VcVmS[j].relocateVM_Task(relocateSpec);
try {
	var actionResult = System.getModule("com.vmware.library.vc.basic").vim3WaitTaskEnd(MoveTask,progress,pollrate);
	System.log("vMotion/storage vMotion performed for VM : " + VcVmS[j].name);
	Server.log("vMotion/storage vMotion performed for VM : " + VcVmS[j].name);
	}
	catch (e) {
		System.error("vMotion/storage vMotion failed for VM : " + VcVmS[j].name + ". Reason: " + e);
		Server.error("vMotion/storage vMotion failed for VM : " + VcVmS[j].name + ". Reason: " + e);
	}
}

 

2 Comments

  1. Hauce 18. November 2016

Leave a Reply