phpVirtualBox Benutzerauthentifizierung per LDAP

phpVirtualBox ist eine fantastische Software zum Steuern von virtuelle Maschinen per Webbrowser. Dies ist z.B dann sehr hilfreich, wenn auf dem Server keine grafische Benutzeroberfläche installiert ist weil der Server sowieso unzugänglich im dunklen Serverraum steht. Die Administration der virtuellen Maschinen per Kommandozeile ist zwar möglich, jedoch unbequem und nicht wirklich intuitiv. Auf einem Server System mit virtuellen Maschinen sollte somit phpVirtualBox unter keinen Umständen fehlen, wobei man die Absicherung dieser Weboberfläche nicht auf die vernachlässigen sollte. Ein Login mit Standardwerten ist keine wirkungsvolle Absicherung.

Obwohl phpVirtualBox konstant weiterentwickelt wird, werden die verschiedenen Authentifizierungsmethoden nur stiefmütterlich behandelt. Die Dokumentation zur LDAP Authentifizierung besteht aus gerade mal zwei Sätzen und sechs Zeilen Code ohne aussagekräftige Dokumentation. Eine Berechtigungssteuerung per Gruppenmitgliedschaft fehlt vollständig. Sobald ein LDAP-Benutzer in der Datenbank enthalten ist, hat er vollen Zugriff auf phpVirtualBox.

Dies muss aber nicht sein. In diesem Artikel zeige ich, wie man beim Login von phpVirtualBox die zentrale LDAP-Benutzerauthentifizierung nutzen kann und welche Code-Ergänzungen notwendig sind um auch eine “Gruppenauthorisierung” zu ermöglichen.

Aufmerksame Leser dieses Blogs wissen, dass wir begeisterte Nutzer von phpVirtualBox sind und die Software auf dem ionas-Server Small Business nutzen um darin eine VoIP-Telefonanlage und ein Odoo-CRM laufen zu lassen. Darüber hinaus haben wir in der Vergangenheit bereits mehrere Artikel über Virtualbox oder phpVirtualBox geschrieben.

phpVirtualBox bietet zwar eine experimentelle LDAP-Anbindung an, die wir bisher aufgrund einer fehlenden Berechtigungsprüfung gegen eine Gruppenzugehörigkeit nicht genutzt haben. Stattdessen nutzt man einen eigenen Nutzer mit Passwort, was natürlich dem Gedanken einer zentralen Benutzerauthentifizierung widerspricht. Um nun phpVirtualVox und LDAP zu verheiraten, müssen lediglich drei Dinge geschehen:

  1. die OpenLDAP Struktur anlegen
  2. die LDAP Authentifizierung in phpVirtualBox ergänzen
  3. phpVirtualBox konfigurieren – Aktivierung der Gruppenvalidierung

Worauf warten wir also. Lassen Sie uns anfangen – umso früher sind wir fertig!

Die OpenLDAP Struktur anlegen

Wie anfangs erwähnt, wollen wir zwei Dinge beim Login abklären. Ist der sich anmeldende User in der LDAP-Datenbank enthalten und hat dieser die Berechtigung phpVirtualBox zu nutzen. Deshalb gehe ich im folgenden von einer zweigeteilten LDAP Struktur aus. Jeder Anwender ist als Benutzer unter users angelegt. Weiterhin gibt es eine Berechtigungsgruppe virtualbox, der die Benutzer zugeordnet werden können.

Um phpVirtualBox mit LDAP-Authentifizierung zu ermöglichen, muss die folgende Struktur angelegt werden

Die LDAP Struktur für phpVirtualBox

Die Logik ist einfach. Wenn ein Benutzer der Gruppe virtualbox angehört, darf er sich bei phpVirtualBox einloggen und die virtuellen Maschinen verwalten. Wenn er kein Mitglied der Gruppe ist, wird der Login verweigert.

Die LDAP Authentifizierung von phpVirtualBox erweitern

Die LDAP-Authentifierung findet man z.B bei phpVirtualbox 4.3 in der Datei “/virtualbox/lib/auth/LDAP.php”. Die LDAP Authentifizierung kann im Standard nach der Installation nur prüfen, ob ein LDAP User existiert. Dafür erfolgt eine simple Abfrage des Benutzernamens und des Passworts gegen den angegebenen LDAP-Bind. Die Kommentare dienen nur der Verdeutlichung.

// wenn Authentifizierung nicht erfolgreich ist, liefere false zurück.
if(!@ldap_bind($auth, sprintf($this->config['bind_dn'], $username), $password))
    return false;

// wenn erfolgreich, darf der Benutzer phpVirtualBox nutzen
$_SESSION['valid'] = true;

Um nun zukünftig auch die LDAP-Gruppenzugehörigkeit zu prüfen, ergänzen wir den Code um den folgenden Block.

if(!@ldap_bind($auth, sprintf($this->config['bind_dn'], $username), $password))
    return false;

if($this->config['ldap_admin_group'] != ""){
    $_SESSION['valid'] = false;
    $dn = "ou=groups,dc=ionas,dc=lan";
    $filter="(&(cn=".$this->config['ldap_admin_group'].")(objectClass=groupOfNames))";
    $justthese = array();
    $sr=ldap_search($auth, $dn, $filter, $justthese);
    $info = ldap_get_entries($auth, $sr);
    foreach($info[0]['member'] as $member){
        $member = str_replace("cn=","",$member);
    	$member = str_replace(",ou=users,dc=ionas,dc=lan","",$member);
    	if($member == $username){
	    $_SESSION['valid'] = true;
        }
    }
}
else{
    $_SESSION['valid'] = true;
}

Diese neue Prüfung wird nur aktiv, wenn “ldap_admin_group” mit einem Wert gefüllt ist. Diese Erweiterung für eine Gruppenvalidierung ist somit optional und nicht verpflichtend und muss über die Konfigurationsdatei von phpVirtualBox aktiviert werden.

phpVirtualBox konfigurieren – Aktivierung der Gruppenvalidierung

In der config.php von phpVirtuaBox muss nun als letztes die Gruppenvalidierung hinzugefügt werden. Dafür fügt man den folgenden Codeblock an beliebiger Stelle zwischen den geschweiften Klammern ein.

var $authLib = 'LDAP';
var $authConfig = array(
  'host' => '127.0.0.1',
  'ldap_admin_group' => 'virtualbox',
  'bind_dn' => 'cn=%s, ou=users,dc=ionas,dc=lan',
  'adminUser' => ''
);

Wenn die Webseite nun neu aufgerufen wird, erfolgt die Benutzerauthentifizierung durch LDAP und prüft dabei die Gruppenzugehörigkeit. Diese Ergänzung der LDAP-Authentifizierung mag quick-und-dirty sein, erfüllt jedoch seinen Zweck. phpVirtualbox ist zuverlässig abgesichert und der Administrator des Servers muss sich ein Passwort weniger merken.

geschrieben von

Christoph Dyllick-Brenzinger

Christoph ist Gründer und Chefentwickler von datamate. Er ist ein absoluter Linux-Fan und hat schon früh seine Leidenschaft für Technik und Programmierung entdeckt. Seine langjährige Erfahrung als Unternehmensberater spürt man regelmäßig, wenn er nach optimalen Lösungen für die Kunden sucht. Wenn er nicht gerade den Tennisplatz unsicher macht oder bei Overwatch sein Liga-Ranking verbessert, verbringt Christoph seine Freizeit mit seiner Frau und seinen drei Kindern.