2 Faktor-Authentifizierung für Webmin unter CentOS 7

Eigentlich ist die Aktivierung der 2-Faktor-Authentifizierung für Webmin ganz einfach. Allerdings scheitert das unter CentOS 7 beim Installieren der nötigen CPAN-Pakete. Über die Webmin-GUI hat es bei mir absolut nicht geklappt.

Lösung brachte es, diese Befehl per SSH am Server auszuführen:

yum -y install perl CPAN
perl -MCPAN -e "install Test::Moose"
perl -MCPAN -e "install Types::Standard"
perl -MCPAN -e "install Moo"
perl -MCPAN -e "install Authen::OATH"

Danach kann dann die 2FA über Webmin „normal“ aktiviert werden.

Linux – Inhalt in vielen Dateien suchen / ersetzen

Manchmal hat man die Themenstellung, das man in vielen Textdateien einen bestimmten Text suchen und ersetzen muss. Manuell ist das natürlich viel zu viel Aufwand, aber unter Linux geht das zum Glück recht einfach.

Soll das ganze in nur einer einzelnen Datei gemacht werden, hilft dieser Befehl weiter:

sed -i 's/SUCHMUSTER/ERSETZUNGSTEXT/g' /pfad/zur/datei

Sollen alle Dateien in einem Verzeichnis entsprechend bearbeitet werden, dann hilft diese Kombination aus find und sed weiter:

find /pfad/zu/dateien -type f -exec sed -i 's/SUCHMUSTER/ERSETZUNGSTEXT/g' {} \;

Ein Beispiel aus der Praxis währe dann zum Beispiel:

find /pfad/zu/dateien -type f name „*.html“ -exec sed -i ’s/iso-8859-1/UTF-8/g‘ {} \; 

CentOS7 – PHP auf 7.2 updaten

CentOS 7 hat ja ein mitlerweile steinaltes PHP 5.4 on board. Sicherheitsupdates dafür sind Fehlanzeige, Support ebenso. Was liegt also näher, als auf PHP 7.2 updzudaten? Voraussetzung ist natürlich, das man vorher geprüft hat, das damit alle Webanwendungen die man verwendet, funktionieren.

Schritt 1: Zunächst müssen wir die Yum-Utils und das Epel-Repository installieren.

yum install epel-release yum-utils -y

Schritt 2: Remipo herunteraden und installieren

yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

Schritt 3: Das PHP 7.2 Repository aktivieren. Gültige Parameter wären auch remi-php70 oder remi-php71 je nach gewünschter Version.

yum-config-manager --enable remi-php72

Schritt 4: PHP installieren.

yum install php php-common php-opcache php-mcrypt php-cli php-gd php-curl php-mysql -y

Um alle PHP-Module anzuzeigen, hilft dieser Befehl weiter:

yum search php | more

Schritt 5: Installation prüfen. Zunächst sollte man an der Shell einfach php -v eintippen. Hier muss nun die PHP-Version 7.2 (oder die man gerade installiert hat) zurückgegeben werden. Nun sollte man noch ins Webserver-Verzeichnis eine PHP-Datei ablegen und diese dann im Browser aufrufen – auch hier muss die aktuelle Versionsnummer angezeigt werden. Inhalt:

<?php
phpinfo();
?>

ownCloud / nextCloud – Dateien als Ordner in Documents am iPad

Seit langem nutze ich die App „Documents“ von Readdle. Seit dem letzten ownCloud-Update auf onwCloud 10.x werden hier Dateien als Ordner angezeigt. Andere WebDAV-Clients funktionieren soweit ich das beurteilen konnte.

Ich habe dann länger nach der Ursache geforscht. Unter anderem habe ich das ganze auch mit einer aktuellen nextCloud-Installation getestet, mit dem gleichen Ergebnis. Mit einer alten ownCloud 9 hingegen hat alles richtig funktioniert. Nach längerer Recherche fand ich dann die Lösung in diesem GitHub-Issue.

Zusammengefasst:

Im ownCloud-Verzeichnis gibt es die Datei /lib/composer/sabre/dav/lib/DAV/Server.php

In dieser sucht man nach @param PropFind und löscht den darunter folgenden Block raus und fügt den hier ein. Und schon funktioniert es wieder mit Readdle Documents und ownCloud 10.

 * Small helper to support PROPFIND with DEPTH_INFINITY.
 *
 *
 * @param PropFind $propFind
 * @param array $yieldFirst
 * @return \Iterator
 */
private function generatePathNodes(PropFind $propFind, array $yieldFirst = null) {
    if ($yieldFirst !== null) {
        yield $yieldFirst;
    }
    $newDepth = $propFind->getDepth();
    $path = $propFind->getPath();

    if ($newDepth !== self::DEPTH_INFINITY) {
        $newDepth--;
    }

//FIX in order to create new PropFind objects and not clone them
$propertyNames = $propFind->getRequestedProperties();
$propFindType = $propertyNames ? PropFind::NORMAL : PropFind::ALLPROPS;

    foreach ($this->tree->getChildren($path) as $childNode) {
     //FIX : no cloning, creating new PropFind objects
        //$subPropFind = clone $propFind;
        //$subPropFind->setDepth($newDepth);
        if ($path !== '') {
            $subPath = $path . '/' . $childNode->getName();
        } else {
            $subPath = $childNode->getName();
        }
        //$subPropFind->setPath($subPath);

     //FIX : create a new PropFind object with the right parameters
     $subPropFind = new PropFind($subPath, $propertyNames, $newDepth, $propFindType);

        yield [
            $subPropFind,
            $childNode
        ];

        if (($newDepth === self::DEPTH_INFINITY || $newDepth >= 1) && $childNode instanceof ICollection) {
            foreach ($this->generatePathNodes($subPropFind) as $subItem) {
                yield $subItem;
            }
        }

    }
}

Webserver-Administration mit VirtualMin – Plesk ist tot…

Bisher (siehe alte Blog-Einträge) war ich ein zufriedener Nutzer der kommerziellen Server-Administrationsoberfläche Plesk. Leider hat der Softwarehersteller seine Lizenzpolitik zum Jahresende 2017 so geändert, so das ich jetzt mehr Geld für die Administrationsoberfläche als für den vServer gezahlt hätte. Das war nicht mehr tragbar und so sah ich mich nach einer zukunftsfähigen Lösung um, die meine Anforderungen abdeckte. Diese wären:

  • Einfach Administration von Domains und Subdomains
  • Einfach Administration vom Mailadressen, Mailpostfächern und mySQL-Datenbanken
  • Grafische Oberfläche die verständlich und leicht zu installieren ist
  • Unterstützung von Let’s Encrypt SSL-Zertifikaten für Webserver, Mailserver und FTP-Server
  • Automatisierung von Backups auf einen externen Server, wenn möglich Übertragung per SSH

Ich habe einiges ausprobiert und bin dann letztlich bei VirtualMin gelandet, einer Erweiterung zu Webmin. Meine Anforderungen erfüllt es gut und die Installation verlief dank der ausführlichen Anleitung auf der Webmin-Homepage recht gut. Es stellte sich heraus, das man VirtualMin am besten mit dem Installationsskript auf einem Server installiert, auf dem ein minimal konfiguriertes Linux, am besten ohne Apache und mySQL läuft. Während das Installationsskript läuft, werden alle Komponenten wie mySQL, Apache, Mail- und FTP-Server nachinstalliert.

Ausführliche Infos und die Installationsanleitung findet man auf der Webseite von VirtualMin.

Die Navigation der Anwendung sieht dann so aus:

Alles in allem funktioniert das ganze sehr problemlos und nach kurzer Eingewöhnungszeit kann ich mitlerweile damit alles tun, was ich in Plesk erledigt habe. Nur halt endlich in einer OpenSource-Software, die keine irren Beträge kostet und von einer willkürlichen Preispolitik eines Herstellers abhängig ist.

Ach ja: ein Update von Plesk auf VirtualMin geht nicht, genauso wenig wie das zu einem anderen Panel hin ginge. Die Software macht hierfür zu viele Änderungen im System und jedes Administrationspanel speichert seine Daten an unterschiedlichen Orten und hat auch so einige Besonderheiten, die einen einfachen Umstieg schwierig machen. Aber mit einer Parallelbereitstellung von 2 Servern und schrittweisen Umzug war das alles kein großes Problem.

Linux – Dateien anzeigen, die in den letzten X Tagen erstellt oder geändert wurden

Unter Linux ist es relativ leicht, alle Dateien rekursiv unterhalb des aktuellen Verzeichnisses anzeigen zu lassen, die in den letzten X Tagen geändert wurden:

find ./ -mtime -3

Dieser Befehl gibt alles Dateien aus, die in den letzten 3 Tagen geändert oder erstellt wurden.

Andersherum geht es natürlich auch – wenn man statt -3 z.B. +3 angibt, werden alle Dateien ausgegeben, die älter als 3 Tage sind.

Plesk Onyx Server – Upgrade von mySQL auf MariaDB 10.1

Nachdem ich einen neuen Server mit CentOS 7 aufgesetzt habe und darauf Plesk Onyx als Administrationsoberfläche installiert habe, musste ich feststellen, das darauf mySQL Server 5.5 lief. Da ich einige bestehende Datenbanken übernehmen musste, brauchte ich da was neueres.

Wie so oft im Internet fand ich viele falsche Anleitungen, wie man das macht. Hier nun die zusammengefasste und richtige Fassung:

Zunächst muss man die Version 10.1 von MariaDB installieren. 10.2 wird von Plesk noch nicht voll unterstützt. Was auch immer das bedeutet – ich wollte es nicht ausprobieren. Die Anleitung gibt es bei Plesk.

Theoretisch ist damit das Update auch schon erledigt. Aber ganz vollständig ist die Anleitung leider noch nicht, da die Datenbankstruktur selbst hiermit noch nicht upgedated wurde, was man an Einträgen im Log sieht.

Abschließend muss man noch mit dem Befehl

MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysql_upgrade -uadmin

die Datenbankstruktur aktualisieren – und schon funktioniert alles mit MariaDB 10.1.

Nachdem ich dann aber den Watchdog wieder aktiviert habe und den Server neu startete, stellte ich fest, das der Watchdog mit der MariaDB nicht umzugehen wusste. Ich habe da dann noch vom Watchdog eine Mail bekommen, das die Überwachung von MySQL deaktiviert wurde.

Die Lösung: in den Einstellungen vom MySQL-Dienst im Watchdog musste ich die Befehle für das Starten und Beenden des Services anpassen, wie im folgenden Screenshot. Und damit wurde dann auch MariaDB wieder überwacht.

Aus PO Dateien die MO-Dateien erstellen

Für ein WordPress-Projekt musste ich deutschsprachige Übersetzungsdateien herunterladen, die als PO-Dateien vom Hersteller geliefert wurden. Das entsprechende WordPress-Plugin benötigte an der Stelle aber eine PO-Datei.

Die Linux-Kommandozeile half hier mal wieder weiter – und zwar der Befehl

msgfmt -o de.mo de.po

Bei meinem Debian war der Befehl von Haus aus verfügbar, d.h. ich musste nichts nachinstallieren. Auf einem anderen Rechner fehlte es hingegen. Mit apt-get install gettext kann man das aber problemlos nachinstallieren.

Und mir blieb der Weg zu komischen Web-Translator-Diensten die auch PO in MO wandeln können sollen erspart.

Lubuntu & ownCloud – doppelte Passworteingabe verhindern

Unter Lubuntu habe ich den ownCloud-Client installiert. Leider fragt mich der Rechner nun nach jeder Anmeldung nach dem Passwort für den Schlüsselbund. Unter Ubuntu selbst hingegen kommt diese Abfrage nicht.

Das ganze kann man recht einfach abstellen. Zunächst installiert man mit  sudo apt-get install libpam-gnome-keyring  das passende Paket. Nach einer Ab- und Anmeldung sieht der Dialog von eben so aus:

Neu ist nun die Option „Diesen Schlüsselbund beim Anmelden automatisch entsperren“. Diese aktiviert man, und schon kommt diese Meldung nicht mehr!

Detailiert ist das ganze im Ubuntu-Wiki beschrieben.

 

TeamSpeak 3 Server auf Linux vServer installieren

Genau wie am Client ist auch am Server die Windows-Ära bei mir jetzt langsam komplett vorüber. Es gibt noch genau 2 Anwendungen, die bisher unter Windows liefen: Teamspeak Server und mein Jabber-Server. Beide werde ich nun auf meinen Linux vServer installieren. Den Anfang macht TeamSpeak, den ich im folgenden auf einem Linux-Server installiere.

Grundsätzlich sollte man für alle Dienste die man auf einem Linux-Server installiert aus sicherheitsgründen immer einen eigenen User nehmen. Auf gar keinen Fall darf man sowas als root installieren. Also legen wir einen Userverzeichnis und einen User an mit:

root@srv:~# mkdir /home/ts3
root@srv:~# useradd -g users ts3 -d /home/ts3/

Nun vergeben wir dem User noch ein Passwort:

root@srv:~# passwd ts3
 Enter new password:
 Retype new password:
 passwd: password updated successfully

Und zu guter letzt muss nun der Benutzer noch Eigentümer seines Home-Verzeichnisses werden.

root@srv:~# chown ts3 /home/ts3/

Nun loggen wir uns am besten per ssh mit den Benutzerdaten unseres ts3-Users auf dem Server ein. Auf der Seite http://www.teamspeak.com/en/downloads#server findet sich der Download-Link der aktuellen Server-Sersion. Mit dem Kopieren-Icon kann man sich den Link zur aktuellsten Version in die Zwischenablage kopieren. Am Server muss man dann nur noch wget <kopierte Adresse> einfügen.

Mit

tar xfvj teamspeak3-server....tar.bz2

wird dann das Archiv entpackt. Nun wechseln wir mit cd in das Verzeichnis, das gerade durch das Entpacken angelegt wurde und starten den Server mit ./ts3server_minimal_runscript.sh

Wenn alles richtig läuft, müsste nun sowas hier kommen:

------------------------------------------------------------------
 I M P O R T A N T
------------------------------------------------------------------
 Server Query Admin Account created
 loginname= "serveradmin", password= "XXXX"
------------------------------------------------------------------

 I M P O R T A N T
------------------------------------------------------------------
 ServerAdmin privilege key created, please use it to gain
 serveradmin rights for your virtualserver. please
 also check the doc/privilegekey_guide.txt for details.

token=XXXXX
------------------------------------------------------------------

Die angezeigten Informationen sollte man nun am besten in einer Datei abspeichern, da wir diese später nochmal brauchen. Das Minimal-Runscript ist nicht für den dauerhaften Betrieb geeignet! Es läuft nur so lange, wie die SSH-Sitzung aktiv ist. Wird diese geschlossen, wird auch der Server beendet. Das ist natürlich nicht sinnvoll. Mit Strg + C beenden wir nun erstmal den TS3-Server.

Nun starten wir den Server erstmal „normal“:

-bash-4.2$ ./ts3server_startscript.sh start
Starting the TeamSpeak 3 server
TeamSpeak 3 server started, for details please view the log file

Und jetzt ist es auch an der Zeit, das wir uns erstmal den für unser Betriebssystem passenden TeamSpeak-Client von der Seite herunterladen:

http://www.teamspeak.com/en/downloads

Im TeamSpeak-Client verbinden wir uns mit „Verbindungen / Verbinden“ mit unserem Server. Entweder direkt auf die IP-Adresse, oder über einen schon gesetzten DNS-Eintrag, wie in meinem Beispiel.

Der erste der sich am Server einloggt wird nun gleich nach dem Server-Token gefragt, um Admin-Rechte zu bekommen. Hier trägt man das Token aus der Textdatei ein.

Wenn nun alles geklappt hat, sollte das ganze so aussehen.

Jetzt läuft zwar der Server, aber wir haben ein Problem: nach einem Server-Boot startet er nicht automatisch. Dies müssen wir nun noch anpassen. Nun loggen wir uns wieder als root am Server per ssh ein. Mit nano /etc/init.d/teamspeak3  erstellen wir nun eine Datei mit folgendem Inhalt:

#!/bin/sh
### BEGIN INIT INFO
# Provides: teamspeak3
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Teamspeak 3 Server
### END INIT INFO


# INIT Script by www.SysADMINsLife.com
######################################
# Customize values for your needs: "User"; "DIR"

USER="ts3"
DIR="/home/ts3/teamspeak3-server_linux_amd64"
 
###### Teamspeak 3 server start/stop script ######
 
case "$1" in
start)
su $USER -c "${DIR}/ts3server_startscript.sh start"
;;
stop)
su $USER -c "${DIR}/ts3server_startscript.sh stop"
;;
restart)
su $USER -c "${DIR}/ts3server_startscript.sh restart"
;;
status)
su $USER -c "${DIR}/ts3server_startscript.sh status"
;;
*)
echo "Usage: {start|stop|restart|status}" >&2
exit 1
;;
esac
exit 0

Die beiden Variablen USER und DIR sind ggf. noch anzupassen. Und mit chmod 755 /etc/init.d/teamspeak3 machen wir das Startskript nun noch ausführbar.

Unter Debian & Co. aktiviert nun dieser Befehl den Autostart:

update-rc.d teamspeak3 defaults

Wenn man hingegen Redhat oder CentOS (wie ich hier) verwendet, dann hilft das hier weiter:

Dienst hinzufügen:

chkconfig --add teamspeak3

Anzeigen lassen:

chkconfig --list teamspeak3

Autostart aktivieren:

chkconfig teamspeak3 on

Nun ist es hilfreich, den Server mal zu booten, um zu testen ob das mit dem Autostart auch klappt.