FTP Server auf Ubuntu 16.04.1 (vsftpd)

Installation

sudo apt install vsftpd

Das standard-Directory ist /srv/ftp, welches für den User ftp bei der Installation eingerichtet wird.

Konfiguration

In File /etc/vsftpd.conf folgendes Konfig anpassen (reboot nicht vergessen):

write_enable=YES
anonymous_enable=NO
ftpd_banner=Willkommen zu ftp.intelli.ch.
use_localtime=YES
chroot_local_user=YES
#Port nicht 21 sondern 345
listen_port=345

Grundsätzlich erlaubt vsftpd allen Systemusern den Zugriff über FTP. Nun soll aber nicht allen Systemusern der Zugriff erlaubt werden. Dafür modifizieren wird das file /etc/vsftpd.chroot_list. Die in diesem File enthaltenen User können  zugreifen:

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

User erstellen

Einen User erstellen, der auf FTP Zugriff erhalten soll

sudo adduser ftpuser

Verschlüsselung

Ich erstelle die Möglichkeit über FTPS zu kommunizieren. Dazu in /etc/vsftpd.conf folgende Zeilen erfassen:

ssl_enable=Yes
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

Mit Filezilla verbinden

Referenzen

Update ESXi Patch-Bundle

  1. ESXi 5.5 in Maintenance-Mode wechseln / alle VMs stoppen
  2. Upload ESXi Patch-File auf ESXi host (zip)
  3. Schauen, welche Profile im Zip-File vorhanden sind:
    esxcli software sources profile list -d /vmfs/volumes/53ce978d-fa434b02-5512-d43
    d7e942aae/ESXi550-201510001.zip

    Resultat

    Name                             Vendor        Acceptance Level
    -------------------------------  ------------  ----------------
    ESXi-5.5.0-20151004001-no-tools  VMware, Inc.  PartnerSupported
    ESXi-5.5.0-20151004001-standard  VMware, Inc.  PartnerSupported

    „no-tools“ ist das Profile ohne die VmWare-Tools, „standard“ ist das Update mit allem drum und dran. Es kann auch sein, dass ein Profilname mit „s“ endet (z.B. ESXi-5.5.0-20151004001s-standard). Dieser Patch würde dann nur die Security-Updates beinhalten.

  4. Jetzt kann das Upate durchgeführt werden
    esxcli software profile update --depot=/vmfs/volumes/53ce978d-fa434b02-5512-d43
    d7e942aae/ESXi550-201510001.zip -p ESXi-5.5.0-20151004001-standard
  5.  Jetzt den ESXi-Host durchstarten.
  6. Wichtig: Beim esxcli-Befehl die update Option, NICHT die install-Option verwenden. Die Update-Option esetzt die bereits vorhandenen Pakete auf dem ESXi-Host mit neuen Versionen aus dem Bundle. Vorhandene Pakete auf dem ESXi-Host, welche nicht im Bundle vorhanden sind werden nicht gelöscht.
    Die Install-Option würde Pakete, des ESXi-Hosts, welche nicht im Bundle vorhanden sind, löschen (komplette „reinstallation“).

Referenzen:

ESXi Embedded Host-Client

VmWare Host-Client, der den mittlerweile ziemlich veralteten vSphere Client ablösen soll:

https://labs.vmware.com/flings/esxi-embedded-host-client

Einmal auf dem ESXi-Host installiert kann man den HTML5 Host-Client über https://<host:port>/ui/ abrufen.

Einzelne VMs kann man z.B. über vmrc://192.168.2.30/?moid=41 aufrufen. Dazu muss natürlich auch erst „VmWare Remote Client“ vmrc auf den lokalen System installiert werden.

Leider funktioniert bei mir der Embedded Host-Client bzw. der HTML5-Client im zusammenspiel mit meinem ESXi 5.5 Host nicht wirklich. Der Host und die VMs können toll eingesehen werden. Aktionen wie Herunterfahren, etc. können aber nicht durchgeführt werden. Geschweige denn kann eine Konsole zu den VMs geöffnet werden.

Fazit: Aktuell bleibt einem ESXi (free) User immer noch nichts anderes übrig als den alten verstaubten vSphere Client zu benutzen.,..

 

Let’s encrypt

letsencrypt ist eine Zertifizierungsstelle, welche es erlaubt Zertifikate vollautomatisch und GRATIS zu generieren. Damit entfällt endlich die müsahme manuelle Erstellung von Zertifikaten. Und so geht es:

Ich installiere letsencrypt auf einem Ubuntu 16.04 System mit installiertem Apache:

    1. Letsencrypt installieren
      sudo apt install letsencrypt python-letsencrypt-apache
    2. Zertifikat generieren
      Bevors mit dem Zertifikate erstellen losgeht, muss ich zuerst den Apache-Dienst stoppen, weil letsencryp einen standalone Server auf port 80 verwendet:

      sudo service apache2 stop

      Nun generiere ich das Zertifikat mit „certonly“. Damit modifiziert mir letsencrypt nicht das Apache-Config File. Dieses möchte ich selber modifizieren… Für jede Domain kann dieser Befehl wiederholt werden:

      sudo letsencrypt certonly --agree-tos --email postmaster@yourdomain.ch -d www.yourdomain.ch

      Und voilà:

      IMPORTANT NOTES:
       - Congratulations! Your certificate and chain have been saved at
         /etc/letsencrypt/live/nextcloud.domain.ch/fullchain.pem. Your cert
         will expire on 2017-01-23. To obtain a new version of the
         certificate in the future, simply run Let's Encrypt again.
       - Some rewrite rules copied from /etc/apache2/conf-
         enabled/nextcloud.conf were disabled in the vhost for your HTTPS
         site located at /etc/apache2/conf-enabled/nextcloud-le-ssl.conf
         because they have the potential to create redirection loops.
      

      Nun den Apache wieder starten:

      sudo service apache2 start
    3. Das Script erstellt vollautomatisch die benötigten Zertifikate und legt diese ab unter
      /etc/letsencrypt/live/your.domain.zz/

      Das Zertifikat kann nun am conf-File des Apachen eingetragen werden

      SSLCertificateKeyFile /etc/letsencrypt/live/your.domain.zz/privkey.pem
      SSLCertificateFile /etc/letsencrypt/live/your.domain.zz/cert.pem
      SSLCertificateChainFile /etc/letsencrypt/live/your.domain.zz/chain.pem

    Renewal

    Letsencrypt stellt Zertifikate aus, welche 90 Tage gültig sind. Es wird empfohlen, dass alle 60 Tage ein renewal durchgeführt wird. Dies kann am einfachsten über einen cron-job erledigt werden, der monatlich ausgeführt wird:

    sudo vi /etc/cron.monthly/letsencrypt-renew
    #!/bin/bash
       echo "Stop Apache2 Service"
       service apache2 stop
       echo "Renew letsencrypt certificates"
       letsencrypt --standalone renew
       echo "Restart Apache2 Service"
       service apache2 start
    exit 0
    sudo chmod +x /etc/cron.monthly/letsencrypt-renew

     

Löschen

Mal erstellte Zertifikate, welche nicht mehr benötigt werden, können gelöscht werden:

sudo letsencrypt delete -d xx.domain.xx

 

Alfresco Upgrade Prozedur von Version 5.1 auf Version 5.2 (Alfresco Community Edition 201612 GA)

Dieses Howto beschreibt meine Schritte um eine Alfresco 5.1 Installation nach Alfresco 5.2 (Alfresco Community Edition 201612 GA) zu erhöhen.

Aktuelle Alfresco Installation

Mein Alfresco-System wird nicht im produktiven Umfeld sondern lediglich privat genutzt. Die Anforderungen an das System sind entsprechend niedgrig (keine Skalierung, geringe Performance).

Alfresco
2 Server 1 VM-Server für die Alfresco Installation, DB und Index (45 GB Festplatte)
1 VM-Server für Daten (350 GB Festplatte)
Alfresco Home /opt/alfresco-community
Installation Default installations-Routine
Postgres-SQL Ja, Installiert über die normale Installations-Routine von Alfresco
Index SOLR4
Alfresco Service Ja. Servicename „alfresco“, Installiert über die normale Installations-Routiene von Alfresco
alf_data Das alf_data Verzeichnis befindet sich ausgelagert auf einem NFS-Server (VM für Daten und Index). Das alf_data Verzeichnis wird dann auf dem Alfresco-Server nach /opt/alfresco/alf_data gemounted.
Ugrade Prozedur Die Upgrade Prozedur richtet sich grundsätzlich nach der Alfresco-Doku: Link

Neue VM erstellen

Bei einem Alfresco-Update (welches ja nicht so häufig vorkommt) erstelle ich meist eine neue VM mit aktuellstem Ubuntu-Betriebssystem (LTS):

  1.  Neue VM erstellen (ESXi 5.5, VM mit Ubuntu-Linux, 4 CPUs, 8GB RAM)
  2. Alfresco benötigt einige Libs als Voraussetzung. Die Installationsroutine meckert, wenn diese nicht vorhanden sind (siehe hier).
    Auf Ubuntu folgendes ausführen:

    sudo apt-get install libice6 libsm6 libxt6 libxrender1 libxext6 libfontconfig1 libcups2 libglu1-mesa libcairo2 libegl1-mesa libxinerama1

    Achtung: Die Installationsroutine zeigt nach der Installation aller notwendigen Libs immer noch an, dass diese Fehlen (Stand 3.1.2017, Ubuntu 16.04). Das scheint aber ein Bug der Installationsroutine von Alfresco zu sein.

  3. Alfresco auf der neuen VM installieren.
    1. Für die Installation verwende ich die default Installations-Routine von Alfresco.
    2. Die Ports Ändere ich auf 80 bzw. 443.
    3. Den Service installiere ich auch mit der Alfresco Installations-Routine.
  4. Memory anpassen: Link
  5. Max Open Files anpassen: Link
  6. Anschlissend überprüfen ob die neue Installation sauber funktioniert (z.B. LibreOffice).

Konfigurationen/Customizing der neuen Installation anwenden

Ich habe auf meinem Alfresco einige „customs“ eingebaut:

Custom Datalists

Custom Share Header

Custom Web-Extensions

  1. Zwei eigene Listen (Inventar und Bibliothek). Hier zeige ich nur die Bibliotheksliste. Das selbe auch für Inventar machen.
  2. Die neuen Datalists registrieren
    cp /opt/alfresco-alt//tomcat/shared/classes/alfresco/extension/customDatalist-model-context.xml /opt/alfresco-neu//tomcat/shared/classes/alfresco/extension/customDatalist-model-context.xml

    Datalist-Model erstellen/kopieren

    cp /opt/alfresco-alt/tomcat/shared/classes/alfresco/extension/bibliothekDatalistModel.xml /opt/alfresco-neu/tomcat/shared/classes/alfresco/extension/bibliothekDatalistModel.xml

    Das web-extensions File erweitern mit den Erweiterungen aus der alten Instanz

    /opt/alfresco-community/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml
  3. Download Buttons entfernen: Link
  4. Header-Icons ausblenden, welche nicht gebraucht werden: Link
  5. Download-Button nur wenn Schreibrecht vorhanden: Link

Alte Alfresco-Instanz backupen

  1. Alte Alfresco-Instanz stoppen
  2. Ganze DB backupen
    1. Postgres starten
      sudo /opt/alfresco-community/alfresco.sh start postgresql
    2. Die gesamte Alfresco-Datenbank dumpen
      cd /opt/alfresco-community/postgresql/bin/
      ./pg_dump -h localhost -U alfresco alfresco > /tmp/alfrescodbdump
    3. Postgres stoppen
      sudo /opt/alfresco-4.2.d/alfresco.sh stop postgresql
  3. alf_data Verzeichnis der alten Alfresco-Instanz backupen. => Darauf achten, dass der Alfresco-Service nicht läuft!
    Ich kopiere dazu einfach das gesamte alte alf_data Verzeichnis nach alf_data_alt.

Daten auf neuer Alfresco-DB Instanz restoren

  1. Die neue Alfresco-Instanz stoppen.
  2. Nun die Postgresql-Datenbank der NEUEN Installation starten:
    sudo /opt/alfresco-community/alfresco.sh start postgresql
  3. Die Datenbank „alfresco“ der neuen Installation löschen:
    cd /opt/alfresco-community/postgresql/bin/
    ./dropdb -U alfresco alfresco -h localhost -i
    Database "alfresco" will be permanently removed.
    Are you sure? (y/n) y
    Password:
    
  4. Die gelöschte Datenbank wieder erstellen
    $ sudo ./createdb -U postgres -T template0 alfresco -h localhost
    Password:
    
  5. Nun den Alfresco-Dump der alten Instanz auf der neuen einspielen:
    $ sudo ./psql -U alfresco alfresco -h localhost < /tmp/alfrescodbdump
    Password:
    (...)
    ALTER TABLE
    ALTER TABLE
    REVOKE
    REVOKE
    GRANT
    GRANT
    $ exit
  6. Die Postgres-DB der neuen Installation wieder stoppen.
    sudo /opt/alfresco-community/alfresco.sh stop postgresql

Content-Store und Idexe restoren

Content-Store und Index habe ich auf einem NFS-Server.

  1. Wichtig, nicht das postgres-Datenverzeichnis der neuen Installation löschen!!!!!! Das ganze alf_data Verzeichnis der neuen Alfresco-Instanz nach ~/alf_data_backup verschieben. Dies, weil sich auch das postgres-Datenverzeichnis hier befindet. Die DB mit den Daten wird wegkopiert.
    sudo mv /opt/alfresco/alf_data ~/alf_data
  2. Jetzt den mount-Punkt „alf_data“ des NFS-Servers auf die neue Alfresco-Instanz mounten.
  3. Nun die postgres Daten wieder zurück kopieren
    sudo rm -r
    sudo cp ~/alf_data/postgresql/* /opt/alfresco/alf_data/postgresql/
  4. Reindexierung von SOLR4:
    Ich initialisiere Solr4 nach jeder Installation neu gem. Alfresco-Dokumentation: Link

FTP-Scanning nach Nextcloud

Dieser Beitrag ist deprecated. Siehe hier für neue Lösung.

Ich habe zuhause einen schönen Drucker/Scanner stehen. Dieser Drucker/Scanner kann Dokumente einscannen und direkt an einen FTP-Server senden. Tolle Sache. Nun möchte ich aber, dass der Drucker direkt nach Owncloud scant. Owncloud selber hat keinen integrierten FTP-Server. Aber man kann in Owncloud einen FTP-Server als externen Speicher hinzufügen (siehe hier). Continue reading

JDBC-Verbindung über SSL auf Mysql-Server (Tomcat)

Hier wurde erklärt, wie man den MySQL-Server konfiguriert, so dass in MySQL-Client SSL Verbindungen zum Server aufbauen kann.

Nun möchte ich die SSL-Verbindung in einer Java-Applikation, welche in einem Tomcat läuft, verwenden. Dazu wird eine JDBC-Connection über SSL zum MySQL Server aufgebaut.

Die Server- und Client-Zertifikate wurden hier bereits erstellt.

Dieser Beitrag basiert auf Link

KeyStore

Tomcat-Applikationen müssen die Zertifikate in einem Keystore gespeichert halten.

Client Packet

Ein Paket mit client Zertifikat und client key erstellen

openssl pkcs12 -export -inkey client-key.pem -in client-cert.pem -out client.packet

MyKS.jks

Einen neuen KeyStore “MyKS.jks” erstellen, der das erstellte client paket und die CA Zertifikate enthält. Als Passwort wähle ich immer das gleiche.

sudo keytool -importkeystore -deststorepass password -destkeypass password -destkeystore myKS.jks -srckeystore client.packet -srcstoretype PKCS12 -srcstorepass password -alias tomcat
sudo keytool -importcert -alias mysqlCA -trustcacerts -file /root/ca-cert.pem -keystore myKS.jks

Nicht vergessen die Berechtigung adäquat anzupassen

chmod 440 myKS.jks

Tomcat konfigurieren

JAVA_OPTS

Keystore in Tomcat-Verzeichnis kopieren. SSL konfigurieren und den keystore anmelden. Hierzu ist auch die Angabe des oben genutzen Passwortes notwendig, so dass der Keystore gelesen werden kann. Diese Properties können z.B. in catalina.sh exportiert werden (export).

In Ubuntu 14.04 findet man das startup-File von Tomcat unter

/etc/default/tomcat7
export JAVA_OPTS="-Djavax.net.ssl.keyStore=/usr/local/etc/tomcat/certs/myKS.jks -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=/usr/local/etc/tomcat/certs/myKS.jks -Djavax.net.ssl.trustStorePassword=password"

oder als Java-Parameter:

-Djavax.net.ssl.keyStore=path_to_keystore_file
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=path_to_truststore_file
-Djavax.net.ssl.trustStorePassword=password

oder man könnte dies auch in der Tomcat-Applikation als System-Properties definieren:

System.setProperty("javax.net.ssl.keyStore","path_to_keystore_file");
System.setProperty("javax.net.ssl.keyStorePassword","password");
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
System.setProperty("javax.net.ssl.trustStorePassword","password");

JDBC URL

Dann muss noch die Connection so angepasst werden, dass SSL verwendet wird (useSSL). Dies kann über einen connection-parameter gemacht werden.

Das kann entweder über die URL mit useSSL=true oder aber über die java.util.Properties (propertyuseSSL to true) Instanz, welche dem DriverManager.getConnection() mitgegeben wird, gemacht werden.

jdbc:mysql://mysql.server.com/database?verifyServerCertificate=false&amp;useSSL=true&amp;requireSSL=true

CHECK

Überprüfen ob die Verbindung auch wirklich verschlüsselt daher kommt:

 sudo tcpdump -i any -vv -X src port 3306

Vorher

13:56:05.099198 IP (tos 0x8, ttl 64, id 6943, offset 0, flags [DF], proto TCP (6), length 63)
    localhost.mysql > localhost.50479: Flags [P.], cksum 0xfe33 (incorrect -> 0xab2d), seq 3174702966:3174702977, ack 903431479, win 800, options [nop,nop,TS val 2444442 ecr 2444442], length 11
        0x0000:  4508 003f 1b1f 4000 4006 2190 7f00 0001  E..?..@.@.!.....
        0x0010:  7f00 0001 0cea c52f bd3a 1f76 35d9 4537  ......./.:.v5.E7
        0x0020:  8018 0320 fe33 0000 0101 080a 0025 4c9a  .....3.......%L.
        0x0030:  0025 4c9a 0700 0001 0000 0000 0000 00    .%L............
13:56:05.100525 IP (tos 0x8, ttl 64, id 6944, offset 0, flags [DF], proto TCP (6), length 129)
    localhost.mysql > localhost.50479: Flags [P.], cksum 0xfe75 (incorrect -> 0xec2b), seq 11:88, ack 35, win 800, options [nop,nop,TS val 2444442 ecr 2444442], length 77
        0x0000:  4508 0081 1b20 4000 4006 214d 7f00 0001  E.....@.@.!M....
        0x0010:  7f00 0001 0cea c52f bd3a 1f81 35d9 4559  ......./.:..5.EY
        0x0020:  8018 0320 fe75 0000 0101 080a 0025 4c9a  .....u.......%L.
        0x0030:  0025 4c9a 0100 0001 012c 0000 0203 6465  .%L......,....de
        0x0040:  6600 0000 1640 4073 6573 7369 6f6e 2e74  f....@@session.t
        0x0050:  785f 7265 6164 5f6f 6e6c 7900 0c3f 0001  x_read_only..?..
        0x0060:  0000 0008 8000 0000 0005 0000 03fe 0000  ................
        0x0070:  0000 0200 0004 0130 0500 0005 fe00 0000  .......0........
        0x0080:  00                                       .
13:56:05.105052 IP (tos 0x8, ttl 64, id 6945, offset 0, flags [DF], proto TCP (6), length 1781)
    localhost.mysql > localhost.50479: Flags [P.], cksum 0x04ea (incorrect -> 0x7756), seq 88:1817, ack 143, win 800, options [nop,nop,TS val 2444443 ecr 2444442], length 1729
        0x0000:  4508 06f5 1b21 4000 4006 1ad8 7f00 0001  E....!@.@.......
        0x0010:  7f00 0001 0cea c52f bd3a 1fce 35d9 45c5  ......./.:..5.E.
        0x0020:  8018 0320 04ea 0000 0101 080a 0025 4c9b  .............%L.
        0x0030:  0025 4c9a 0100 0001 0638 0000 0203 6465  .%L......8....de
        0x0040:  6604 7076 7332 0d74 656d 705f 6361 7465  f.pvs2.temp_cate
        0x0050:  676f 7279 0d74 656d 705f 6361 7465 676f  gory.temp_catego
        0x0060:  7279 0269 6402 6964 0c3f 000b 0000 0003  ry.id.id.?......
        0x0070:  0000 0000 003c 0000 0303 6465 6604 7076  .....<....def.pv
        0x0080:  7332 0d74 656d 705f 6361 7465 676f 7279  s2.temp_category
        0x0090:  0d74 656d 705f 6361 7465 676f 7279 046e  .temp_category.n
        0x00a0:  616d 6504 6e61 6d65 0c3f 00ff ffff fffc  ame.name.?......
        0x00b0:  9000 0000 003c 0000 0403 6465 6604 7076  .....<....def.pv
        0x00c0:  7332 0d74 656d 705f 6361 7465 676f 7279  s2.temp_category

Nachher

13:59:58.645194 IP (tos 0x8, ttl 64, id 60639, offset 0, flags [DF], proto TCP (6), length 52)
    localhost.mysql > localhost.50483: Flags [.], cksum 0xfe28 (incorrect -> 0xf2c8), seq 2669811453, ack 3878597006, win 851, options [nop,nop,TS val 2502828 ecr 2502828], length 0
        0x0000:  4508 0034 ecdf 4000 4006 4fda 7f00 0001  E..4..@.@.O.....
        0x0010:  7f00 0001 0cea c533 9f22 16fd e72e b18e  .......3."......
        0x0020:  8010 0353 fe28 0000 0101 080a 0026 30ac  ...S.(.......&0.
        0x0030:  0026 30ac                                .&0.
13:59:58.645264 IP (tos 0x8, ttl 64, id 60640, offset 0, flags [DF], proto TCP (6), length 105)
    localhost.mysql > localhost.50483: Flags [P.], cksum 0xfe5d (incorrect -> 0xbe29), seq 0:53, ack 1, win 851, options [nop,nop,TS val 2502828 ecr 2502828], length 53
        0x0000:  4508 0069 ece0 4000 4006 4fa4 7f00 0001  E..i..@.@.O.....
        0x0010:  7f00 0001 0cea c533 9f22 16fd e72e b18e  .......3."......
        0x0020:  8018 0353 fe5d 0000 0101 080a 0026 30ac  ...S.].......&0.
        0x0030:  0026 30ac 1703 0100 300c 3524 6529 b225  .&0.....0.5$e).%
        0x0040:  01dd ed3f 7cb5 085f 3c80 4a51 c362 e980  ...?|.._<.JQ.b..
        0x0050:  1884 4e40 0d58 d0a3 69a1 b3c1 c979 b142  ..N@.X..i....y.B
        0x0060:  09b6 3603 b43c 8a22 9d                   ..6..<.".
13:59:58.646125 IP (tos 0x8, ttl 64, id 60641, offset 0, flags [DF], proto TCP (6), length 52)
    localhost.mysql > localhost.50483: Flags [.], cksum 0xfe28 (incorrect -> 0xf227), seq 53, ack 107, win 851, options [nop,nop,TS val 2502829 ecr 2502829], length 0
        0x0000:  4508 0034 ece1 4000 4006 4fd8 7f00 0001  E..4..@.@.O.....
        0x0010:  7f00 0001 0cea c533 9f22 1732 e72e b1f8  .......3.".2....
        0x0020:  8010 0353 fe28 0000 0101 080a 0026 30ad  ...S.(.......&0.
        0x0030:  0026 30ad                                .&0.
13:59:58.646188 IP (tos 0x8, ttl 64, id 60642, offset 0, flags [DF], proto TCP (6), length 169)
    localhost.mysql > localhost.50483: Flags [P.], cksum 0xfe9d (incorrect -> 0x6a73), seq 53:170, ack 107, win 851, options [nop,nop,TS val 2502829 ecr 2502829], length 117
        0x0000:  4508 00a9 ece2 4000 4006 4f62 7f00 0001  E.....@.@.Ob....
        0x0010:  7f00 0001 0cea c533 9f22 1732 e72e b1f8  .......3.".2....
        0x0020:  8018 0353 fe9d 0000 0101 080a 0026 30ad  ...S.........&0.
        0x0030:  0026 30ad 1703 0100 7074 359c b82a c838  .&0.....pt5..*.8
        0x0040:  3a69 85b9 b43f 7648 5fe0 88c6 972c 576a  :i...?vH_....,Wj
        0x0050:  84ac c7ac 58f0 ed0c a79c 0c12 1c51 9714  ....X........Q..
        0x0060:  45d3 80ac 1fb6 fbbb 7665 9782 a61f cf0a  E.......ve......
        0x0070:  0b19 1e4e a679 6d1d 3a7b db6d 02f7 2dba  ...N.ym.:{.m..-.
        0x0080:  4c0b 2cfb ad6f b516 2128 2596 9f5f 6ab2  L.,..o..!(%.._j.
        0x0090:  640b 1876 2d52 1d4b ffcf 6a25 08d6 b985  d..v-R.K..j%....
        0x00a0:  cdf0 cd62 cacc 84e1 9a                   ...b.....
13:59:58.646838 IP (tos 0x8, ttl 64, id 60643, offset 0, flags [DF], proto TCP (6), length 52)
    localhost.mysql > localhost.50483: Flags [.], cksum 0xfe28 (incorrect -> 0xf0f8), seq 170, ack 277, win 867, options [nop,nop,TS val 2502829 ecr 2502829], length 0
        0x0000:  4508 0034 ece3 4000 4006 4fd6 7f00 0001  E..4..@.@.O.....

 

MySQL Verbindungen mit SSL verschlüsseln – Ubuntu 14.04 / 18.04 / Mysql 5.6.28

Hier wird erklärt, wie ein MySQL Client eine verschlüsselte Verbindung zu einem MySQL Server, der mit Ubuntu 14.04 und Mysql-Server 5.6.28 betrieben wird, aufgebaut werden kann.

SSL Zertifikate erstellen

Es werden Zertifikate mit 2048 Bits und einer Gültigkeit von 3650 Tagen erstellt. Nach diesem Zeitraum müssen die Zertifikate verlängert oder neu erstellt werden.

Bitte nicht vergessen, dass der Common Name (CN) vom Client und Server Zertifikat unterschiedlich ist. z.B. servername.intelli.ch und client.intelli.ch

cd /etc/mysql/
# Generate a CA key and certificate with SHA1 digest 
openssl genrsa 2048 > ca-key.pem 
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem 

# Create server key and certficate with SHA1 digest, sign it and convert 
# the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format 
openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem > server-req.pem 
openssl x509 -sha1 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem 
openssl rsa -in server-key.pem -out server-key.pem 

# Create client key and certificate with SHA digest, sign it and convert 
# the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format 
openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem > client-req.pem 
openssl x509 -sha1 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem 
openssl rsa -in client-key.pem -out client-key.pem
chmod 400 /etc/mysql/*.pem
chown mysql /etc/mysql/*.pem

SSL Konfiguration aktivieren

In der MySQL Konfiguration (/etc/mysql/my.cnf) muss SSL mit den zugehörigen Zertifikaten aktiviert werden.

ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

Nun MySql-Server neu starten

sudo service mysql restart

Es kann auf der DB überprüft werden, ob die Konfiguration richtig übernommen wurde:

mysql > show variables like '%ssl%';

+---------------+----------------------------------+
| Variable_name | Value                            |
+---------------+----------------------------------+
| have_openssl  | YES                              |
| have_ssl      | YES                              |
| ssl_ca        | /etc/mysql/ca-cert.pem           |
| ssl_capath    |                                  |
| ssl_cert      | /etc/mysql/server-cert.pem       |
| ssl_cipher    |                                  |
| ssl_key       | /etc/mysql/server-key.pem        |
+---------------+----------------------------------+

SSL Verschlüsselung für MySQL User aktivieren

Es gibt folgende Möglichkeiten bei der Rechtevergabe für Benutzer in Bezug auf SSL:

  • REQUIRE X509: ein beliebiges gültiges SSL Client Zertifikat kann verwendet werden
  • REQUIRE ISSUER / REQUIRE SUBJECT: ein beliebiges gültiges SSL Client Zertifikat reicht nicht aus, es muss von einer mit ISSUER spezifizierten CA kommen und/oder ein bestimmtes SUBJECT enthalten.
  • REQUIRE SSL: die Verbindung muss über SSL verschlüsselt aufgebaut werden, die Authenfizierung kann sowohl via Passwort als auch über ein SSL Client Zertifikat erfolgen.

Im Folgenden Beispiel wird der User „ssluser“ erstellt der alle Rechte (ALL PRIVILEGES) auf alle Datenbanken (*.*) am „localhost“ hat und ein gültiges SSL Client Zertifikat vorweisen muss.

GRANT ALL PRIVILEGES ON *.* TO 'ssluser'@'localhost' IDENTIFIED BY 'topsecret' REQUIRE X509;

Client SSL erzwingen

grant all privileges on database.* to 'username'@'hostaddress' identified by 'password' require SSL;

oder 

GRANT USAGE ON *.* TO 'ralph'@'%' REQUIRE SSL;

Verschlüsselte MySQL Verbindung testen

cd /etc/mysql/
mysql -ussluser -p -h127.0.0.1 --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem

Hint: Auf Ubuntu 18.04 schlug dieser Befehl mit dem Feher „SSL connection error: SSL_CTX_set_default_verify_paths failed“ fehl. Das liegt daran, weil der lokale User mit dem dieser mysql-Befehl ausgeführt wird, keine Berechtigung auf die Zertifikate hat. Um den Test trotzdem machen zu können, kann der Befehl mit sudo ausgeführt werden.

Die SSL Keys müssen wenn der Zugriff von einem entfernten Host aus erfolgen soll natürlich vorher dorthin kopiert werden.

Mittels dem Befehl SHOW STATUS LIKE 'Ssl_cipher'; kann sich der Verschlüsselungsstatus des verbundenen MySQL Clients angezeigt werden lassen.

mysql > SHOW STATUS LIKE 'Ssl_cipher';

+---------------+--------------------+
| Variable_name | Value              |
+---------------+--------------------+
| Ssl_cipher    | DHE-RSA-AES256-SHA | 
+---------------+--------------------+
1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Ssl_version';

+---------------+---------+
| Variable_name | Value   |
+---------------+---------+
| Ssl_version   | TLSv1.1 |
+---------------+---------+
1 row in set (0.01 sec)

Überprüfe alle Server-Connections

Es kann auch überprüft werden ob ALLE Verbindungen zum Mysql-Server auch wirklich mit SSL Connecten.

Mit folgendem Befehl kann überprüft werden ob und welche User mit SSL mit dem Mysql-Server kommunizieren:

SELECT sbt.variable_value AS tls_version,  t2.variable_value AS cipher, processlist_user AS user, processlist_host AS host FROM performance_schema.status_by_thread AS sbt JOIN performance_schema.threads AS t ON t.thread_id = sbt.thread_id JOIN performance_schema.status_by_thread AS t2 ON t2.thread_id = t.thread_id WHERE sbt.variable_name = 'Ssl_version' and t2.variable_name = 'Ssl_cipher' ORDER BY tls_version;

Links