Ubuntu Desktop 18.04 mit xRDP und Sound

In Ubuntu 18.04 ist die xRDP Version 0.9.5 enthalten. Mit dieser Version ist es möglich auch Sound per RDP zu übertragen.

Als Desktop wird bei mir Ubuntu Mate verwendet. Natürlich können Sie auch andere Manager verwenden, aber Wayland ist zur Zeit noch nicht möglich.

Die Installation von XRDP erfolgt mit APT.

sudo apt install xrdp xorgxrdp xrdp-pulseaudio-installer

Für die Wiedergabe des Sound wird Plusaudio verwendet. Leider muss man für XRDP zwei Module selbst compilieren. Dafür brauchen wir die Quellen von Pulseaudio aus dem Archiv.

cd /tmp
apt source pulseaudio
cd pulseaudio-11.1
./configure

Nach erfolgreichem Kompilieren von Pulseaudio, kann man die XRDP Module für Pulseaudio kompilieren und installieren. Das Ubuntu Paket xrdp-pulseaudio-installer enthält die Quellen von
Github.

cd /usr/src/xrdp-pulseaudio-installer/
sudo make PULSE_DIR="/tmp/pulseaudio-11.1"
sudo install -s -m 644 module-xrdp-sink.so /usr/lib/pulse-11.1/modules
sudo install -s -m 644 module-xrdp-source.so /usr/lib/pulse-11.1/modules

Ein wichtiger Hinweis befand sich auf Github. Scheinbar funktioniert die Soundausgabe nur, wenn das Host-System eine reale Soundkarte verbaut hat. Server oder virtuelle Umgebung haben eigentlich keine Soundkarte On-Board. Ohne Soundkarte scheitert aber die Wiedergabe mit Pulseaudio und damit auch die Weiterleitung zum Client per RDP Verbindung.

Weitere Anleitungen:
How to set up audio redirection
Audio Output Virtual Channel-support in XRDP

Microsoft SQL Server 2017 in Docker

In diesem Artikel geht es um den neuen Microsoft SQL Server 2017 Linux für Docker.

Natürlich kann man auch MS SQL 2017 direkt unter Ubuntu installieren. Microsoft stellt dafür die Pakete und Docker Images auf dem Docker HUB bereit.

Als minimale Vorraussetzung wird auf der Festplatten rund 4GB Speicherplatz und 4GB RAM benötigt. Eine laufende Docker Installation setzten wir vorraus.

In den allgemeinen Docker Image von Microsoft sind unterschiedliche SQL Editionen verein. Über einen Docker Parameter wird die jeweilige Edition gesetzt.

SQL Developer edition -> MSSQL_PID=Express
SQL Express edition -> MSSQL_PID=Developer

Mit „docker pull“ starten wir den Download von dem Microsoft SQL Server 2017 vom Docker Hub. Im Anschluss erzeugen wir mit „docker run“ eine laufende SQL Express Instanz am Netzwerkport 1433. Unsere Datenbank soll nicht im Docker Container gespeichert werden, sondern im Verzeichnis /my/data/. Das erleichter spätere Updates vom Container. Das Kennword für den Benutzer „SA“ kann natürlich individuell gestalltet werden.

sudo docker pull microsoft/mssql-server-linux
sudo docker run --name mssql1 -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=KennW@rt1' -e 'MSSQL_PID=Express' -p 1433:1433 -v /my/data:/var/opt/mssql/data -d microsoft/mssql-server-linux:2017-latest
sudo docker ps -a

Damit ist die Installation schon abgeschlossen. Jetzt können wir uns per Kommandozeile auf die Datenbank verbinden.

sudo docker exec -it mssql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'KennW@rt1'

Als Beispiel erzeugen wir die Datenbank „TestDB“ mit der Tabelle „Inventory“ und zwei Datensätzen. Per SQL Kommando kann man auch das Kennwort von Benutzer „SA“ ändern.

CREATE DATABASE TestDB
GO
USE TestDB
CREATE TABLE Inventory(ID INT, Name NVARCHAR(50), Quantity INT)
GO
INSERT INTO Inventory VALUES (1, 'banana', 25);
INSERT INTO Inventory VALUES (2, 'orange', 14);
SELECT * FROM Inventory WHERE quantity > 15;
GO
ALTER LOGIN SA WITH PASSWORD='Neues!Kennwort'
GO
QUIT

Microsoft stellt das SQL Server Management Studio Version 17 für Windows als grafisches Tool bereit. Die IDE ist sehr Umfangreich und setzt viele Resourcen vorraus.

Eine alternative IDE stellt HeidiSQL dar.

USB Festplatte in Standby versetzen

Aufgabe ist es die Lebenszeit einer externen Festplatte zu verlängern, indem wir Sie nach einiger Zeit runter fahren.

Dazu brauchen wir das HDParm Tool, mit dem wir die Werte in der Festplatte setzen können. Ist HDParm noch installiert, so machen wir jetzt.

sudo apt install hdparm

Jetzt können wir die Festplatte sofort in Standby setzt.

sudo hdparm -y /dev/sda

Soll die Festplatte automatisch nach 50 Sekunden runter fahren, können wir den Parameterwert -S 10 setzen (10 * 5 Sekunden = 50 Sekunden). Möglich Werte sind von 1 bis 240. Die Einstellung sind nicht statisch und müssen nach einem Neustart wieder gesetzt werden.

sudo hdparm -S 10 /dev/sda

Wir können den Status der Festplatte prüfen.

sudo hdparm -C /dev/sda

Mit einer UDev-Regel können wir die Werte für die USB Festplatte nach dem Anstecken automatisch setzen.

sudo vim /etc/udev/rules.d/50-hdparm.rules

ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", RUN+="/usr/bin/hdparm -B 127 -S 120 /dev/%k"

Der Parameter -B 127 aktiviert das Energiemanagement der Festplatte. Der Parameter -S setzt den Timeout-Wert von 10 Minuten (120*5 Sekunden).

Die UDev-Regeln müssen neu geladen werden.

sudo udevadm control --reload-rules
sudo udevadm trigger

Laufzeit von einem Zertifikat prüfen

Wer einen Server mit TLS/SSL Verschlüsslung betreibt, der muss dafür ein Zertifikat mit einer begrenzten Laufzeit erstellen. Das Zertifikat muss vor dem Ende der Laufzeit ersetzt werden, sonst gibt es Fehlermeldungen im Browser. Hier möchte ich einige Beispiel zeigen, wie man die Laufzeit überprüfen kann.

Hiermit können wir uns die Lautzeit ausgeben lassen.

echo Q | openssl s_client -connect www.google.com:443 2>/dev/null | openssl x509 -noout -dates

Hier geben wir uns nur das Laufzeitende vom Zertifikat aus.

date --date="$(echo Q | openssl s_client -connect www.google.com:443 2>/dev/null | openssl x509 -noout -enddate |cut -d= -f 2)" --iso-8601

Wir können auch alle Zertifikate speichern.

echo Q | openssl s_client -connect www.google.com:443 -showcerts > chain.pem

Auch hier kann man sich das Datum ausgeben lassen.

gawk 'BEGIN { pipe="openssl x509 -noout -subject -dates -serial "} \
  /^-+BEGIN CERT/,/^-+END CERT/ { print | pipe }
  /^-+END CERT/                 { close(pipe); printf("\n")}  ' chain.pem

Wir wollen jetzt nur das Server Zertifikat extrahieren und noch einmal prüfen, ob es wirklich zu der CA valide ist.

sed -n '/-BEGIN/,/-END/p;/-END/q' chain.pem > site.pem
openssl verify -verbose -CAfile chain.pem site.pem
cat site.pem |openssl x509 -noout -enddate

Befindet man sich hinter einem Proxy Server, braucht das Programm „proxytunnel“.

proxytunnel -p yourproxy:8080 -d www.google.com:443 -a 7000
openssl s_client -connect localhost:7000 -showcerts

WebDav mount im Dateisystem

Unter Linux kann man ein WebDav im Dateisystem einbinden und damit direkt Datei speichern. Einige Cloud Speicheranbieter bieten die Möglichkeit von WebDav an.

sudo apt install dav2fs

Nach der Installation sollten wir noch einige Parameter ändern. Zuerst die Mount Einstellungen.

sudo vim /etc/fstab

https://webdav.hidrive.strato.com/ /mnt/hidrive/ davfs noauto,user,rw 0 0
https://webdav.mediencenter.t-online.de/ /mnt/t-online/ davfs noauto,user,rw 0 0

Dann die Zugangsdaten für WebDav bei Beispeil von HiDrive und T-Online Mediencenter.

sudo vim /etc/davfs2/secrets

/mnt/hidrive/ benutzer passwort
/mnt/t-online/ benutzer@t-online.de passwort

Hier noch einige Einstellung für Dav2fs.

sudo vim /etc/davfs2/davfs2.conf

use_locks 0
cache_size 1
table_size 4096
gui_optimize 1
trust_server_cert /etc/davfs2/certs/hidrive.pem

Kommt es zu einem Fehler, so muss das Zertifikat hinterlegt werden.

/sbin/mount.davfs: wir trauen dem Zertifikat nicht
/sbin/mount.davfs: das Einhängen schlug fehl;
Server certificate verification failed: issuer is not trusted

echo|openssl s_client -connect webdav.hidrive.strato.com:443 |openssl x509 -out /etc/davfs2/certs/hidrive.pem

Swap Partition mit Kompression

Wird in Linux nicht ausreichend RAM bereit gestellt, so besteht die Möglichkeit diesen mit eine Swap Partion zu erweitern. Zusärtlich kann man die Daten in dem Swap komprimieren.

Dazu instellieren wir zRAM-config.

sudo apt-get install zram-config

Der Dienst braucht ein Kernelmodul „zram“ und „lz4_compress“

sudo modprobe zram

Jetzt sollte das Modul geladen sein.

lsmod |grep zram

zram                   28672  4
lz4_compress           16384  1 zram

Sollte es nicht geladen werden können, weil das Kernel Modul nicht installiert ist, dann müssen noch die Extras installiert werden.

sudo apt-get install linux-image-extra-`uname -r`

Nach einem Neustart sollte der Dienst ohne Fehler laufen.

sudo service zram-config status

Die Anzeige vom Swap sieht jetzt so aus.

sudo swapon --show

NAME       TYPE      SIZE USED PRIO
/dev/sda5  partition 510M   0B   -1
/dev/zram0 partition 124M 976K    5
/dev/zram1 partition 124M 972K    5
/dev/zram2 partition 124M 968K    5
/dev/zram3 partition 124M 972K    5

Entfernen aller Pakete, die von dpkg mit rc markiert sind

Es gibt einen signifikanten Unterschied zwischen Apt remove oder purge. Apt (dpkg) remove entfernt nur die Paket-Binärdateien. Die Konfigurationsdateien des Pakets werden nicht gelöscht. Solche Pakete haben normalerweise den Zustand rc.

Mit dpkg können Sie den Status aller Pakete anzeigen.

dpkg --list |grep "^rc"

Was bedeutet „rc“? Dieser Zustand bedeutet, dass die Konfigurationsdateien noch nicht entfernt wurden, sondern nur die Binärdateien.

Rc entspricht…

R: Die Binärdateien wurde zur Entfernung markiert.
C: Die Konfigurationsdateien sind weiterhin vorhanden.

Lassen Sie uns die Pakete extrahieren, welche mit „rc“ markiert sind.

dpkg --list |grep "^rc" | cut -d " " -f 3

Nun entfernen wir alle Pakete, die als rc markiert sind.

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs sudo dpkg --purge

Apache Load Balancing

Ziel ist die Installation einer redundanten Lastverteilung auf zwei Servern. Hierzu verwenden wir Apache Server und Keepalived.

Installation Apache

sudo apt-get install apache2

Apache Module aktivieren

Für die Verwendung von Apache Server als Load Balancer sind folgende Module notwendig.

Rewrite => Url Rewrite
Deflate => HTTP Kompression
Headers => Managing HTTP headers
Status => Status Informationen
Proxy => Proxy Module
Proxy_http => Proxy Module für HTTP and HTTPS Protokoll
Proxy_balancer => Clustering und load-balancing

sudo a2enmod rewrite deflate headers status
sudo a2enmod proxy proxy_http proxy_balancer
sudo service apache2 restart

sudo vim /etc/apache2/sites-available/proxy_balancer.conf

<VirtualHost *:80>
 ProxyRequests Off
 ProxyPreserveHost On
 ServerName localhost
 ServerAdmin webmaster@localhost
 DocumentRoot /var/www/html
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
 Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
 
 <Proxy balancer://cluster>
  # Define back-end servers:
  BalancerMember http://10.20.20.11:8001/ route=node1 retry=5 timeout=10
  BalancerMember http://10.20.20.12:8001/ route=node2 retry=5 timeout=10
  ProxySet stickysession=ROUTEID
  ProxySet lbmethod=byrequests
 </Proxy>
 
 <Location /balancer-manager>
  SetHandler balancer-manager
  Order deny,allow
  Deny from all
  Allow from 10.20.20.0/24
 </Location>
 
 ProxyPass /balancer-manager !
 ProxyPass / balancer://cluster
 ProxyPassReverse / balancer://cluster
 
</VirtualHost>

sudo a2ensite proxy_balancer
sudo service apache2 restart

Keepalived

Mit Hilfe von Keepalived wird ein Virtueller Linux Server erstellt, der aus einem Master- und Backup- Server besteht. Hierfür wird eine Virtuelle IP Adresse erstellt, die zwischen beiden Systemen hin und her wechseln kann. Primär liegt die Virtuelle IP Adresse auf dem Master-Server. Ist der Master nicht verfügbar, so wechselt die IP zum Backup. Ein Heartbeat geprüft die Verfügbarkeit der Server und führt bei einem Ausfall den Wechsel der IP zwischen den Servern durch.

Installation Keepalived

sudo apt-get install keepalived

sudo vim /etc/keepalived/keepalived.conf

vrrp_script chk_apache {
    script "/usr/bin/killall -0 httpd" # check the apache2 process
    interval 3 # every 3 seconds
}
 
vrrp_script chk_http_port {
        script "</dev/tcp/127.0.0.1/80" # connects and exits
        interval 5 # every 5 seconds
}
 
vrrp_instance VI_1 {
    state MASTER    interface eth0
    virtual_router_id 51
    priority 150    advert_int 1
    authentication {
        auth_type PASS
        auth_pass pw123!  # place secure password here
    }
    virtual_ipaddress {
        10.20.20.25
    }
    track_script {
        chk_apache
        chk_http_port
    }
}

sudo service keepalived restart

Keepalived Backup (Server #2)

Die Einstellungen auf dem Backup-Server sind analog zum Master-Server vor zu nehmen. Abweichungen in der Konfiguration sind „state BACKUP“ und „priority 100“.

sudo vim /etc/keepalived/keepalived.conf

vrrp_script chk_apache {
    script "killall -0 httpd" # check the apache2 process
    interval 3 # every 3 seconds
}
 
vrrp_script chk_http_port {
        script "</dev/tcp/127.0.0.1/80" # connects and exits
        interval 5 # every 5 seconds
}
 
vrrp_instance VI_1 {
    state BACKUP    interface eth0
    virtual_router_id 51
    priority 100    advert_int 1
    authentication {
        auth_type PASS
        auth_pass pw123!  # place secure password here
    }
    virtual_ipaddress {
        10.20.20.25
    }
    track_script {
        chk_apache
        chk_http_port
    }
}

Kernel Einstellungen (Sysctl)

Damit die Virtuelle IP im Server verwendet werden kann, muß eine Einstellung für den Kernel geändert werden

sudo vim /etc/sysctl.conf

net.ipv4.ip_nonlocal_bind = 1

Nach dem Speichern muß ein Neustart von dem Server durchgeführt werden.

Ob die Einstellung richtig vorgenommen wurde kann man prüfen mit.

sudo sysctl net.ipv4.ip_nonlocal_bind

Funktionstest

Durch An- und Ab-schalten von Keepalived und/oder Apache auf Master und Backup kann man nun die Funktion testen.

sudo service apache stop
sudo service keepalived stop

Die Virtuelle IP kann man sich anzeigen mit dem Kommando ip.

sudo ip addr

Links:
Apache Server Status
Apache Load Balancer Manager

Dateiübertragung zum WebDav mit Client Zertifikat und Authentifizierung

Um eine Datei auf einen WebDav zu übertragen kann man das Toole „curl“ verwenden.

Zuerst wird „curl“ auf Ubuntu installiert.

sudo apt install curl

Jetzt kann man dem Upload auf WebDav durchführen.

curl -T <filename> -u <username>:<password> <url>

Braucht man für die Verbindung zu dem WebDav Server ein Client Zertifikat, dann muss man Curl das Zertifikat mitteilen.

Liegt das Zertifikat im PKCS12 Format (Dateiendung .p12 oder .pfx) vor, muss es zuerst mit OpenSSL umgewandelt werden.

openssl pkcs12 -in cert.p12 -out cert.pem -clcerts  
Enter Import Password: ********
## enter the password used to protect the private key)  
MAC verified OK  
Enter PEM pass phrase: **********
## enter your pass phrase to protect the private key in the new cert.pem file
Verifying - Enter PEM pass phrase: **********

Das PEM Passwort für das Zertifikat sollte mindestens 6 Zeichen lang sein.

Die Prüfung der Zertifikatskette kann man mit dem –insecure Parameter abschalten.

/usr/bin/curl \
 --insecure --cert <certificate>:<password> \
 -u <username>:<password> \
 -T <filename> <url>

Beispiel:

/usr/bin/curl \
 --insecure --cert 'cert.pem:zpw123' \
 -u user:password \
 -T filename.txt http://server/

In dem Beispiel verwenden wird als Zertifikat Passwort zpw123. Nicht zu verwechseln mit dem Passwort für den WebDav Server.

Ubuntu IPv6 abschalten (Temporär)

Will man in Ubuntu das Protokoll IPv6 nur für eine kurze Zeit aus schalten, so ist das zur Laufzeit möglich.

Zeigt den aktuellen Status den Wert „0“ so ist IPv6 an.

cat /proc/sys/net/ipv6/conf/eth0/disable_ipv6

Zum Abschalten kann man den Wert auf „1“ ändern.

sudo sh -c 'echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6'