Archiv der Kategorie: DevOps Tutorials

Tutorials for DevOps & Scripting unblog technical contribution for professionals

SSL/TLS Verbindung überprüfung mit OpenSSL

HTTPS und IMAPS-Verbindungen Testen und Analysieren

OpenSSL kann vielseitig eingesetzt werden, so können nicht nur Schlüssel und Zertifikate für SSL/TLS Verschlüsselte Verbindungen generiert werden, auch sind deren Analysen und Tests möglich. Dieser Beitrag zeigt die Anwendung von OpenSSL zur überprüfung und Analyse, beim Zugriff mit HTTPS auf Webserver über TCP Port 443, und STARTTLS über TCP 587, oder IMAPS TCP 993 zu Mailserver, dazu OpenSSL auf dem Computer benötigt wird.

Bei SSLLabs können SSL/TLS Server Tests durchgeführt werden, es wird der Verbindungsaufbau mit vielen verschiedenen Browsern durchgeführt und angezeigt, und welche Verschlüsselung erreicht wurde. So wird in der Auswertung ersichtlich, welche Verschlüsselungsverfahren und Schlüsselaustauschverfahren eingesetzt wurden.

HTTPS-Verbindung Testen mit OpenSSL

Sollen nur einzelne und individuelle Tests durchgeführt werden, zeigen dies die folgenden Beispiele. Es wird eine verschlüsselte Verbindung zu unblog.ch aufgebaut und anschließend die Webseite abgerufen.

In einer Situation bei dieser anstelle des Standard Port 443 für HTTPS ein alternativer Port genutzt wird, beispielsweise 4443, ist die Anwendung dieselbe, mit :4443 wird die Portnummer angegeben.

Möchte man das Public Zertifikat einer Webseite im RAW Text abrufen, kann durch folgende Kommandozeile das Zertifikat ausgegeben werden.

Dieser Befehl wird in einem Linux Terminal, in macOS Terminal, in Git Bash, oder in einer WSL Session ausgeführt, die Ausgabe zwischen:
von —–BEGIN CERTIFICATE—–
bis —–END CERTIFICATE—–

Mit Copy Paste in Notepad, und im PEM / CER Format (mit Endung .cer) als Datei speichern.

Mit doppelklick auf das so gespeicherte öffentliche Zertifikat, öffnet sich dieses und zeigt sich unter Windows wie folgt.

SMTPS Verbindung Testen mit OpenSSL

Mit OpenSSL kann ermittelt werden, ob ein Mailserver (MTA) Verschlüsselte STARTTLS Verbindungen anbietet, mit folgender Kommandozeile.

Die Abfrage zeigt uns das öffentliche Zertifikat an, danach die Verschlüsselungsstärke, den Algorithmus (SHA256), die TLS Version (TLSv1.2), und Cipher (ECDHE-RSA-AES256-GCM-SHA384) und weitere Status Informationen.

IMAPS Verbindung mit OpenSSL Testen

IMAPs mit OpenSSL in der Kommandozeile Analysieren, mit dieser Kommandozeile lässt sich eine IMAPS (SSL/TLS) Verbindung über TCP Port 993 überprüfen.

Der Output dann wie hier mit CONNECT zu imap.gmail.com über den SSL Port 993 in etwa wie folgt in verkürzter Form.

Möchte man hier weitergehen, kann man versuchen sich am IMAP Server zu authentifizieren und nach neuen Mails abfragen.

Gmail Antwortet nun mit A NO [ALERT], die Sicherheitseinstellungen zur Authentifizierung erfordert ein Application Passwort, da die Multi-Faktor-Authentifizierung (MFA) aktiviert ist.

Es folgt ein * OK mit der Ausgabe der verfügbaren Funktionalitäten (CAPABILITY), der IMAP Prompt wartet nun auf Eingaben.

Bei unserem Dovecot IMAP Server können wir uns anmelden.

Der Login besteht normalerweise aus der Email Adresse (imap-user) und einem Passwort.

Nach erfolgreichem Login erscheint die Ausgabe ähnlich wie diese.

Jetzt welchseln zum IMAP Posteingang (INBOX).

Der Output von select INBOX in etwa wie folgt.

Es sind wie zu sehen 3 ungelesene Mails in der INBOX, von der ersten Mail öffnen wir den Header (beginnt mit . Punkt).

Der Output von . fetch 1 rfc822.header (die ersten 6 Zeilen).

Die erste ungelesene Mail öffnet sich mit . fetch 1 rfc822.text

Output von . fetch 1 dann in etwa wie hier bei meiner Mail.

Es handelt sich hier also um eine Mail mit PDF Anlage, diese base64 kodiert ist.

Mit Eingabe Q wird die Verschlüsselte IMAP Session beendet.

Python Loops mit Break- Continue- Pass

for- und while-Loops auf effiziente Weise für zyklische und automatisierte Aufgaben nutzen

 
Synopsis

Manchmal bestimmen externe Faktoren wie Schleifen in einem Programm durchlaufen werden. Wenn dies eintrifft, möchte man möglicherweise dass die Schleife in einer Routine vollständig beendet wird, oder einen Teil der Schleife überspringt, bevor sie fortfährt, oder es soll ein externer Faktor ignorieren werden. Diese Aktionen können mit der Anweisung breakcontinue und pass durchgeführt werden.

Anweisung break

In Python bietet die break Anweisung die Möglichkeit, eine Schleife zu verlassen, wenn eine externe Bedingung ausgelöst wird. Hierzu setzen wir die break Anweisung in den Codeblock unterhalb der Schleife, normalerweise nach einer bedingten if-Anweisung.

Schauen wir uns ein Beispiel an, das die break Anweisung in einer for-Schleife anwendet:

In diesem kleinen Programm wird die Variable zahl auf 0 initialisiert. Dann wird eine for-Anweisung in die Schleife gelegt, diese durchläuft solange die Variable zahl kleiner als 10 ist.

Innerhalb der for-Schleife erhöht sich die Zahl bei jedem Durchlauf bedingt um inkrementell 1 zahl = zahl + 1.

Dann bei der if-Anweisung die den Zustand zeigt, wenn die Variable zahl der ganzen Zahl 5 entspricht, wird die Schleife abgebrochen.

Innerhalb der Schleife befindet sich auch eine print() Anweisung, die bei jeder Iteration der for-Schleife ausgeführt wird, bis die Schleife bei der break Anweisung abbricht.

Um zu sehen, wann wir außerhalb der Schleife sind, haben wir eine abschließende print() Ausgabe außerhalb der for-Schleife eingefügt.

Wenn wir diesen Code ausführen, erscheint unsere Ausgabe wie folgt:

Es zeigt sich, sobald die Ganzzahl zahl als äquivalent zu 5 bewertet wurde, die Schleife abbricht, da das Programm dies durch die break-Anweisung tun soll.

Die break-Anweisung bewirkt also, dass ein Programm aus einer Schleife ausbricht.

Anweisung continue

Die continue-Anweisung gibt uns die Möglichkeit, den Teil einer Schleife zu überspringen, in diesem eine externe Bedingung ausgelöst wird, aber bis zum Rest der Schleife beendet wird. Das heißt, die aktuelle Iteration der Schleife wird unterbrochen, aber das Programm kehrt zum Anfang der Schleife zurück.

Die continue-Anweisung befindet sich innerhalb des Codeblocks unter der Schleifenanweisung, normalerweise nach einer bedingten if-Anweisung.

Wenn wir das selbe in einem for-Loop wie oben mit der Break-Anweisung anwenden, verwenden wir einfach eine continue-Anweisung anstelle der break-Anweisung:

Der Unterschied bei der Verwendung der continue-Anweisung anstelle einer break-Anweisung besteht darin, dass unser Code trotz der Störung weiter durchläuft, wenn die Variable zahl gleich 5 bewertet wird. Schauen wir uns unsere Ausgabe an:

Hier sehen wir, dass die Linie „Zahl ist 5“ nie in der Ausgabe erscheint, aber die Schleife fährt nach diesem Punkt fort, und die Zahlen 6-10 werden ausgegeben, bevor die Schleife verlassen wird.

Mit der continue-Anweisung können in tief verschachtelten Code Fehler vermeiden werden, auch könne hierdurch Loops optimiert werden, indem man häufig auftretende Fälle, die man ablehnen möchten, eliminiert.

Die continue-Anweisung bewirkt, dass ein Programm bestimmte Faktoren überspringt, die innerhalb einer Schleife auftreten, und dann den Rest der Schleife fortsetzt.

Anweisung pass

Wenn eine externe Bedingung ausgelöst wird, kann mit der pass-Anweisung die Bedingung verarbeitet werden, ohne dass die Schleife in irgendeiner Weise beeinträchtigt wird. Der gesamte Code wird weiterhin gelesen, sofern keine break oder eine andere Anweisung auftritt.

Wie bei den anderen Anweisungen befindet sich die pass-Anweisung innerhalb des Codeblocks unter der Schleifenanweisung, normalerweise nach einer bedingten if-Anweisung.

Verwenden wir den gleichen Codeblock wie oben, ersetzen jedoch die Anweisung break oder continue durch eine pass-Anweisung:

Die pass-Anweisung, die nach der if-bedingten Anweisung auftritt, teilt dem Programm mit, die Schleife weiterhin auszuführen und ignoriert die Tatsache, dass die Variable zahl während einer ihrer Iterationen als äquivalent zu 5 bewertet wird.

Wir werden das Programm ausführen und uns die Ausgabe ansehen:

Bei Verwendung der pass-Anweisung in diesem Programm stellen wir fest, dass das Programm genauso ausgeführt wird, als wenn es keine bedingte Anweisung im Programm gäbe. Die pass-Anweisung weist das Programm an, diese Bedingung zu ignorieren und das Programm wie gewohnt weiter auszuführen.

Die pass-Anweisung kann minimale Klassen erstellen oder als Platzhalter fungieren, wenn an neuem Code gearbeitet wird und auf einer algorithmischen Ebene gedacht wird, bevor Details herausgearbeitet werden.

Fazit

Durch die break, continue und pass-Aussagen in Python ermöglicht es uns, for– und while-Loops im Code effektiver anwenden zu können.

Docker DevOps Continuous Delivery

Docker im DevOps und Continuous Delivery Umfeld wird ein zunehmend wichtiger Bestandteil. Docker ist eine Virtualisierungslösung, die ohne Hypervisor auskommt, es wird Operating-system-level Virtualization mit Linux-Containern verwendet. Im Backend verlässt Docker sich ausschließlich auf LXC. Diese Container sind unabhängig voneinander, aber verwenden Teile des Linux-Kernels als Abstraktion gemeinsam. Dadurch ist die Effizienz wesentlich höher als bei anderen Virtualisierungslösungen.

Auf Operating-system-level Virtualization basierende Lösungen sind die bekanntesten Vertreter dieser Technik die Linux-Container. Dabei ist Docker weit verbreitet. Docker konkurriert mit dem auf App Container (appc) basierendem Rocket (rkt). Die Open Container Initiative (OCI) strebt eine Vereinheitlichung und gemeinsame Standards für Container-Formate und Container-Laufzeitumgebungen an.

Das Docker Prinzip

Nicht wie Hypervisoren zur Virtualisierung bietet Docker keine vollständige Virtualisierung von virtuellen Maschinen, vielmehr handelt es sich um Linux-Container (LXC oder Libcontainer, und chroot, Namespaces, Cgroups). Diese Container sind unabhängig voneinander, aber verwenden Teile des Linux-Kernels gemeinsam. Dadurch ist die Effizienz wesentlich höher als bei anderen Virtualisierungslösungen. Auf einer Hardware können wesentlich mehr Docker-Container betrieben werden als VMs.

Diagramm: Virtual Machines und Containers

Als Hypervisor basierte Lösung war Docker bis April 2016 auf Linux Host Systeme angewiesen. Auf Windows und Mac OS X konnte es nur mit einem zusätzlichen Linux-Layer installiert werden, beispielsweise über Docker Toolbox (beinhaltet Boot2Docker und Oracle VirtualBox). Ähnliches gilt für das Gast-Betriebssystem wo nur Linux möglich ist. Der Gast verwendet den Linux-Kernel des Host Systems.

Seit April 2016 gibt es Beta-Versionen von Docker for Mac and Docker for Windows, die als native Anwendungen laufen und ohne VirtualBox auskommen. Die Docker-Engine läuft unter einem Alpine-Linux auf einer virtuellen Maschine (Hyper-V bei Windows und xhyve in OS X).

Die Docker Machine

Die Boot2docker Machine unter Windows 10 wird als Virtuelle Linux Machine in VirtualBox ausgeführt. DevOps die beim deployen mit ESXi Hypervisoren arbeiten, benutzen oft die VMware Workstation, diese performanter ist als die VirtualBox, bevor die VMware Workstation aber genutzt werden kann, wird der Treiber von pecigonzalo benötigt, die Treiberdatei Docker Machine VMware Workstation Driver wird in das Programm Verzeichnis, Docker Toolbox kopiert.

  Docker Machine VMware Workstation Driver

Dieses Plugin für Docker Machine erstellt Docker-Hosts lokal auf einer VMware Workstation.

Abbildung: boot2docker shell


Docker – Up and Running: von Karl Matthias bei O’REILLY

Docker: Up & Running: Shipping Reliable Containers in Production