ezeelogin Installation unter Ubuntu 18.04

ezeelogin Installation unter Ubuntu 18.04

ezeelogin ist eine on-premises Jump Server Lösung, die die Zugriffsverwaltung für Windows und Linux Server sicher und komfortabel macht. Den Einsatz von ezeelogin bei datamate haben wir im Artikel Servermanagement per SSH-Jump Server beschrieben. In diesem Beitrag führen wir durch die Installation von ezeelogin auf einem Ubuntu Server 18.04 und erläutern die Konfiguration der Zielhosts. Auch wenn die Installation nicht kompliziert ist, gibt es doch ein paar Fallstricke zu beachten, bevor man mit der Verwaltung der eigenen Server loslegen kann.

ezeelogin verlangt einen Linux Server als Plattform und kommt mit geringen Hardware Ressourcen aus. Mindestanforderungen an den (virtuellen oder dedizierten) Linux Server sind 512 MB Arbeitsspeicher und CPU-Kern mit 1 Ghz. Eine gute Wahl sind aus unserer Sicht der virtuelle Servern des deutschen Anbieters netcup. Der VPS 200 G8 kostet gerade mal 2,69 € im Monat und bringt ausreichend Ressourcen und seine eigene IPv4-Adresse mit. Natürlich ist aber auch eine on-premises Installation in Form einer virtuellen Maschine möglich.

Übersicht der notwendigen Installations- und Konfigurationsschritte

  • Registration einer 30-Tage Testlizenz
  • Installation von MySQL und PHP
  • Installation des ionCube Encoders
  • Beantragung eines Let’s Encrypt Zertifikats
  • Installation von ezeelogin
  • Erste Schritte mit ezeelogin
  • Zusätzliche Absicherungen
  • Backup & Restore

Installation von ezeelogin

Registration einer 30-Tage Testlizenz

Der erste Schritt der Installation führt uns nicht auf die Kommandozeile unseres Servers, sondern ins Customer Portal von ezeelogin. Dort registriert man sich mit seiner E-Mail-Adresse und erhält umgehend einen temporären Registrierungscode zugeschickt. Durch Eingabe dieses Registrierungscodes und seines Passworts erhält man Zugang zum Customer Portal von ezeelogin.

Im Customer Portal klickt man auf die grüne Schaltfläche Get free trial, um sich eine Serverlizenz zu erstellen. Wichtig ist, dass im Feld Server IP die IP-Adresse angegeben wird, unter der später der ezeelogin installiert wird. Wird ezeelogin in einem lokalen Netzwerk hinter einem NAT installiert, dann muss in diesem Feld nicht die lokale IP-Adresse, sondern die WAN-Adresse, d.h. die öffentlich IP-Adresse des Internetanschlusses, angegeben werden. Am einfachsten findet man dies auf dem zukünftigen ezeelogin Server heraus, wenn man den folgenden Befehl in die Kommandozeile eintippt:

curl https://api.datamate.org/checkip.php
92.60.36.190

Installation von MySQL und PHP

Nun geht es auf der Kommandozeile des Linux Servers weiter. In einer root Shell installiert man als Erstes den Webserver nginx und die Script-Sprache PHP.

apt-get install -y nginx mysql-server php7.2 php7.2-fpm php7.2-xml php7.2-curl php7.2-mysql php7.2-ldap nodejs

Hinweis: ezeelogin benötigt zusätzlich das Paket php7.2-mcrypt, welches jedoch ab Ubuntu 18.04 nicht mehr in den offiziellen Paketquellen von php7.2 enthalten ist. Auch wenn die folgenden Befehle kompliziert erscheinen, geht es lediglich darum dieses Paket nachzuinstallieren. Nachfragen während der Installationsschritte können mit Enter bestätigt werden.

apt-get install -y php-dev libmcrypt-dev php-pear ; apt-get -y install gcc make autoconf libc-dev pkg-config
apt-get -y install php7.2-dev ; apt-get -y install libmcrypt-dev
sudo pecl install mcrypt-1.0.1
echo "extension=mcrypt.so" >> /etc/php/7.2/fpm/php.ini
echo "extension=mcrypt.so" >> /etc/php/7.2/cli/php.ini

Installation des ionCube Encoders

Normalerweise ist der Quellcode von php-Applikationen frei einsehbar. Der ionCube Encoder ist proprietäre Software, die es den Entwicklern ermöglicht, ihren PHP Code zu schützen. Dies erfolgt durch die Umwandlung des php-Codes in unleserlichen Bytecode, welchen der ionCube Encoder fehlerfrei interpretieren kann. Im Folgenden wird die 64-bit Version des ioncube Encoders installiert. Sollte man ein 32 bit System haben, muss man die entspreche Datei unter dem folgenden Link entsprechend anpassen.

wget https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar -zxf ioncube_loaders_lin_x86-64.tar.gz && mv ioncube /usr/local
rm ioncube_loaders_lin_x86-64.tar.gz
echo "zend_extension = /usr/local/ioncube/ioncube_loader_lin_7.2.so" >> /etc/php/7.2/fpm/php.ini
echo "zend_extension = /usr/local/ioncube/ioncube_loader_lin_7.2.so" >> /etc/php/7.2/cli/php.ini
systemctl restart nginx php7.2-fpm

Beantragung eines Let’s Encrypt Zertifikats

Im Folgenden geht es darum, den Webserver mit einem gültigen Let’s Encrypt Zertifikat auszustatten. Dies geht natürlich nur, wenn eine eigene Domain oder Subdomain auf die IP-Adresse des Servers verweist und die Ports 80 und 443 nicht durch irgendwelche Router oder Firewalls geblockt werden. Im ersten Schritt schreiben wir eine minimale nginx-Konfiguration und ersetzen dafür den Inhalt der Datei /etc/nginx/sites-available/default mit dem folgenden Inhalt: (Die Konfiguration funktioniert für IPv4 genauso wie für IPv6.)

server {
  listen 80 default_server;
  listen [::]:80 default_server;
  server_name _;
  
  # rewrite to https
  location / {
    rewrite ^ https://$http_host$request_uri? permanent;
  }

  # Let's Encrypt Challenge
  location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root         /var/www;
  }
  location = /.well-known/acme-challenge/ {
    return 404;
  }
}

Anschließend kann man mit den folgenden Befehlen ein Zertifikat für die eigene Domain oder Subdomain beantragen. E-MAIL-ADRESSE und DOMAIN-URL müssen entsprechend ersetzt werden:

nginx -t
systemctl restart nginx
mkdir -p /var/www/.well-known/acme-challenge
chown www-data: -R /var/www/.well-known
add-apt-repository -y ppa:certbot/certbot
apt-get update
apt-get install -y certbot
certbot certonly --standalone --dry-run -m E-MAIL-ADRESSE -n
echo "max-log-backups = 0
authenticator = webroot
webroot-path = /var/www
agree-tos = true
non-interactive = true
renew-hook = systemctl restart nginx" > /etc/letsencrypt/cli.ini
certbot certonly -d DOMAIN-URL -m E-MAIL-ADRESSE

Das Ergebnis dieser Befehle sollte ein Congratulations sein. Dieses bestätigt, dass man ein Let’s Encrypt Zertifikat für die gewünschte eigene Domain erhalten hat. Nun kann die nginx-Konfigurationsdatei /etc/nginx/sites-available/default um den folgenden Teil zum HTTPS-Zugriff ergänzt werden:

server {
  listen 443 default_server;
  listen [::]:443 default_server;
  server_name DOMAIN-URL;
  root /var/www/html;
  index index.php;

  ssl on;
  ssl_certificate /etc/letsencrypt/live/DOMAIN-URL/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/DOMAIN-URL/privkey.pem;
  ssl_session_timeout 5m;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
  ssl_prefer_server_ciphers on;

  location / {
    try_files $uri $uri/ =404;
  }

  # General PHP Support
  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    fastcgi_index index.php;
    include fastcgi_params;
  }

  # ezeelogin
  if (!-f $request_filename) {
    rewrite ^/(.*)$  /ezlogin/index.php?$1 last;
  }
}
ezeelogin mit ionCube Encoder

Zum Abschluss folgt der ultimative Test, ob alle vorangegangen Befehle richtig funktioniert haben. Mit dem folgenden Befehl legt man eine PHP-Testseite an, die man dann per Browser über die eigene Domain erreichen kann. Die HTTPS-Verbindung sollte mit einem grünen Schloss versehen sein und auf der PHP-Informationsseite sollte man mit Hilfe der Suchfunktion des Browsers die Begriffe ionCube und mcrypt finden.

nginx -t
systemctl restart nginx
echo "" > /var/www/html/phpinfo.php

Nach diesem Test kann die phpinfo.php wieder entfernt werden. Man kann aber sicher sein, dass alle notwendigen Voraussetzungen für die Installation von ezeelogin erfüllt sind. Die Installation der Datenbank, der PHP-Scriptsprache, des Webservers und des HTTPS-Zertifikats war erfolgreich.

Installation von ezeelogin

Bis hierher war somit alles nur reines Vorgeplänkel. Jetzt geht es an die tatsächliche Installation von ezeelogin. Im Customer Portal lädt man sich die aktuelle Version von ezeelogin für PHP 7.2 (bzw. 7.1) herunter und startet das Installationsscript.

wget https://downloads.ezeelogin.com/ezlogin_7.16.0_php71.bin
sh ezlogin_7.16.0_php71.bin

Zuerst springt man mit mehrmaligem Drücker der ENTER-Taste ans Ende der Lizenzbedingungen und bestätigt diese mit dem englischen I AGREE. Wenn im Customer Center nicht die richtige IP-Adresse eingetragen wurde, kommt es jetzt zu einer Fehlermeldung. Ansonsten startet der automatische Installationsprozess, bei dem man sämtliche Fragen mit Enter bestätigen kann. Lediglich beim MySQL-Passwort wird ein Wert verlangt. Hier kann jedoch bei Ubuntu 18.04 irgendein beliebiger Wert eingetragen werden, da sich der root-User gegenüber der Datenbank nicht authentifizieren muss.

Die Installation endet mit einer Übersicht sämtlicher Zugänge und Zugangsdaten. Diese Liste sollte man sorgfältig abspeichern, denn man wird sie noch benötigen.

Review settings:
Install web panel files in                                : /var/www/html/ezlogin/
Install web panel system files in                         : /var/www/ezlogin/
URI path to access web panel                              : /ezlogin/
MySQL server                                              : localhost
MySQL port/socket                                         : 3306
MySQL database                                            : ezlogin_thw
MySQL user                                                : ezlogin_wakzq
MySQL password                                            : Rs3B/C@.k6[P
Force HTTPS for web panel?                                : yes
Secure MySQL connection?                                  : no
Admin user                                                : ezadm422
Admin password                                            : dM{DM(USyzt8(*DNuwV!3Aye(
Admin security code                                       : vpu5FZNX]HDzpP$dSX

Konfiguration über die Weboberfläche von ezeelogin

Erste Schritte mit ezeelogin

Nun kann man einen beliebigen Browser öffnen und die Login-Seite von ezeelogin aufrufen. Mit dem Admin-User und dem Admin-Passwort kann man sich nun an der Weboberfläche anmelden. Es lohnt sich zunächst die folgenden grundlegende Einstellungen vorzunehmen:

Logo und Seitenname

Unter Settings > Branding kann man ein eigenes Logo hochladen und die Seitentitel an die eigenen Bedürfnisse anpassen.

2-Faktorauthentifizierung

Unter Settings > General > Two Factor Authentification empfehlen wir die folgenden beiden Einstellungen: Enable Google Authenticator und Force Two Factor Auth. Nach dem Speichern springt man zu Account > Google Authenticator und scannt auf dieser Seite den angezeigten Barcode mit der Google Authenticator App. So hat man das Webinterface ein ganzes Stück sicherer gemacht. Die App gibt es kostenlos für iOS und Android im jeweiligen App Store.

Ezsh Shell erlauben

Bevor man den ersten Host in ezeelogin hinzufügt, sollte man noch eine Gruppenberechtigung setzen. Diese ist notwendig, damit sich die Anwender später per SSH mit ezeelogin verbinden können. Sollte man dies nicht machen, verweigert ezeelogin später den Zugriff auf die Ezsh Sheell und beendet unmittelbar die aufgebaute SSH-Verbindung. Dafür setzt man unter Access Control > UserGroup-Action > Admins > Servers den Haken bei Ezsh Shell. Um diese Einstellung speichern zu können, muss man noch am Ende des Formulars das Zugangspasswort des Administrators eingeben.

Anlage eines ersten Ziel-Hosts

Nun ist alles vorbereitet, um den ersten zu verwaltenden Server anzulegen. Zuerst klickt man auf Servers > Server Groups und legt über den kleinen Pfeil auf der rechten Seite eine neue Servergruppe an. Anschließend klickt man erneut auf Servers und dann auf den kleinen Pfeil auf der rechten Seite. Es genügen lediglich vier Werte, um einen ersten Host anzulegen: Hostname, IP-Adresse, Remote SSH-Login und SSH-Passwort.

Nun fehlt noch ein Anwender, der sich per SSH mit ezeelogin verbinden kann, um von dort zum Zielsystem weiterzuspringen. Diesen Anwender erzeugt man durch einen Klick auf Users und dann wieder auf den kleinen Pfeil und das Plus auf der rechten Seite. Die Benutzeranlage beinhaltet viele Pflichtfelder, die es auszufüllen gilt. Es mag beim ersten Mal verwirrend sein, was genau der Unterschied zwischen Passwort, Security Code und Authorization Password ist, dies ist jedoch schnell erklärt. Das Authorization Password ist das Passwort des aktuell angemeldeten Administrators. Wie schon beim Setzen der Gruppenberechtigung muss der Administrator sich selbst authentifizieren. Das Passwort und der Security Code sind zwei verschiedene Authentifizierungsmittel eines Anwenders. Solange keine 2 Faktorauthentifizierung aktiviert ist, verlangt ezeelogin immer beides. Sobald ein zweiter Faktor, z.B. über den Google Authenticator, gesetzt ist, genügt das Passwort und der zweite Faktor. Trotzdem sollte sich jeder Anwender beide Passwörter gut notieren. Zuletzt noch ein kleiner Hinweis. Rote Warnfelder können einfach weggeklickt werden, indem man diese anklickt. Damit ist auch schon der erste ezeelogin Anwender angelegt.

Die Anmeldung des Anwenders

Nun kann es auf zweierlei Arten weitergehen. Wenn man den zweiten Faktor verpflichtend gemacht hat, muss sich der Anwender zuerst auf dem Webinterface von ezeelogin einloggen um diesen zweiten Faktor festzulegen. Erst dann kann er sich per SSH mit ezeelogin verbinden. Sollte kein zweiter Faktor notwendig sein, kann er sich auch direkt per ssh mit ezeelogin verbinden. Die Verbindung funktioniert wie gewohnt per Kommandozeile oder per Putty mit dem Benutzernamen und der URL/IP von ezeelogin. Natürlich bietet ezeelogin dem Anwender auch die Möglichkeit seinen Public Key zu hinterlegen. Dies geht durch einen Klick auf F2, sobald man per SSH mit ezeelogin verbunden ist.

ssh USERNAME@IP-VON-EZEELOGIN

Sobald die SSH-Verbindung hergestellt ist, muss der Anwender entweder den zweiten Faktor eingeben oder sich durch den Security Code ausweisen. Anschließend kann er zum Zielsystem weiterspringen.

Zusätzliche Absicherung

ezeelogin ist aufgrund seiner Aufgabe als Jump Server für Hacker ein besonders lohnenswertes Ziel. Deshalb sollte man große Sorgfalt darauf legen, das System gut zu schützen und die Angriffsfläche zu minimieren. Deshalb möchten wir an dieser Stelle noch ein paar Empfehlungen geben, wie ezeelogin abgesichert werden kann.

Firewall und Schutz gegen Bruteforce-Angriffe

Zunächst sollte man sich nicht auf die 2-Faktorauthentifizierung von ezeelogin verlassen, sondern diesen Schutz durch die Installation des Brute-Force Schutzes fail2ban ergänzen. Zusätzlich würden wir noch die Firewall ufw installieren und sämtliche Ports bis auf 80, 443 und 22 schliesen.

Weboberfläche

Die Verwendung eines Let’s Encrypt Zertifikats zur Absicherung der Zugriffe auf der Webseite gehört zu den Pflichtübungen. Ebenfalls empfehlenswert ist die Absicherung des Logins durch einen reCaptcha. Zusätzlich ist es überlegenswert, Zugriffe auf die Weboberfläche von ezeelogin auf gewisse IP-Adressen einzuschränken. Dies kann entweder über die Firewall ufw oder über die Paramenter allow und deny innerhalb der nginx Konfiguration erfolgen. Ein noch höheres Schutzniveau ist möglich, wenn ezeelogin nur über einen VPN-Kanal erreichbar ist. Dadurch lassen sich sämtliche Ports bis auf den VPN-Port schließen und ein zusätzlicher Authentifizierungsfaktor einfügen.

Absicherung des SSH-Zugriffs

ezeelogin bietet zwei verschiedene SSH-Logins an. Zum einen gibt es den System-Administrator und die ezeelogin-User. Während die ezeelogin-User durch einen zweiten Faktor geschützt werden können, gilt dies nicht für den allgemeinen Ubuntu Administrator. Dieser kann sich weiterhin “nur” über seinen Benutzer und sein Passwort anmelden. Auch hier kann man die Möglichkeiten von SSH nutzen und diesen Zugriff für den user “sshadmin” auf das Pubkey-Verfahren umstellen. Im Folgenden ist eine beispielhafte Konfiguration der /etc/sshd/sshd_config aufgeführt.

# Global:
PasswordAuthentication no 
PubkeyAuthentication no 
PermitRootLogin no

# Local root 
Match Address 127.0.0.1
  PasswordAuthentication yes
  PubkeyAuthentication yes
  PermitRootLogin yes

# jump-server users
Match Group ezuser
  PasswordAuthentication yes
  PubkeyAuthentication yes
  PermitRootLogin no

# sshadmin
Match User sshadmin
  PasswordAuthentication no
  PubkeyAuthentication yes
  PermitRootLogin no

Aufbau eines Clusters

Umso mehr Server mit ezeelogin verwaltet werden, desto wichtiger wird die uneingeschränkte Erreichbarkeit des Systems. Hierfür bietet ezeelogin die Möglichkeit zwei Server zu einem Cluster zu verbinden. Sobald die Konfiguration dieser beiden Server abgeschlossen ist, werden alle Änderungen auf beiden Systemen gespeichert und der Verbindungsaufbau ist über beide Systeme möglich. Man sollte so einen Aufbau jedoch nicht auf die leichte Schulter nehmen. Der Aufbau eines ezeelogin Cluster hat einige zusätzliche, nicht ganz einface Voraussetzungen wie z.B. eine verschlüsselte Datebankkommunikation. (Die Einrichtung des Clusters wird hier nicht weiter erläutert.)

Backup anfertigen

Kein IT System ist vollständig ohne ein anständiges Backup. Glücklicherweise bietet auch hier ezeelogin gute Hilfsmittel, um schnell zum Ziel zu kommen. Der grundsätzliche Gedanke des Backupvorgehens von ezeelogin ist es, ein komplett eigenständiges Installationsskript zu erzeugen, was das System wieder vollständig herstellen kann. Dieses Backupskript erzeugt man lediglich durch die Eingabe eines Befehls.

/usr/local/sbin/backup_ezlogin.php
Backup eines ezeelogin Systems

Nach der Ausführung dieses Befehls erzeugt ezeelogin z.B. folgende ausführbare Datei /var/ezlogin_backup_v7.16.0_ b5db3443a5f4dcc0db83e2ab5_Fri_Oct_25_2019_ 22_04_02_CEST.bin.

Dieses Script kann man anstelle des Installationsskriptes aus dem Customer Portal verwenden, um einfach ein Restore auf einem anderen System durchzuführen. Es enthält sämtliche Einstellungen inklusive Hosts, Anwendern und Gruppen.

Further reading

Mit dem Ende dieses Artikels sollten Sie einen voll einsatzfähigen und gut abgesicherten ezeelogin Jump Server haben. Natürlich stellt dies jedoch noch nicht das Ende der ezeelogin Reise dar. Aus diesem Grund empfehle ich Ihnen die folgenden Links als Start für weiterführende Information:

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.