GNU+Linux Für Fachinformatiker / Vorbereitung LPIC-1
Inhalt
- Unterrichtsmaterialien
- Installation Hyper-V
- Aufgabe Dateipfade
- Aufgabe Ordnerbaum
- Dateisysteme
- Aufgabe man-Pages
- Debian-Installation
- Partitionierung mit fdisk
- Netzwerkdiagnose
- LVM - Logical Volume Manager
- Paketsysteme
- Virtualisierung
- Aufgabe Pipeline
- Aufgabe
vim - Aufgabe Berechtigungen
- Symlinks / Hardlinks
- Shellscripting
- Aufgabe Scripting
- Scripting 2
- Scripting: tests
- While-Schleife
case ... in ... esac- Aufgabe
inetd - Dienste-Konten
- Web-Service auf Unix-Socket
- Apache Service-User
- Nextcloud Aufsetzen
- Zusammenspiel Webserver / Applikationen / usw...
- SSH-Dateien
- Aufgabe SCP
- SSL
- Aufgabe SSL
- SSL-Zertifizierungsstellen installieren
- Manuelle Installation + Verschlüsselung
- Aufgabe Mailserver mit SSL
- Checkliste Mailserver
Unterrichtsmaterialien
- Live DVD
- https://learning.lpi.org/pdfstore/LPI-Learning-Material-101-500-de.pdf Andere Sprachen
- https://learning.lpi.org/pdfstore/LPI-Learning-Material-102-500-de.pdf Andere Sprachen
Online RegEx-Trainer: https://regexone.com
Installation Hyper-V
... und bei der Gelegenheit auch WSL.
Windows-Server
Aufgabe Dateipfade
Benutzt ls um folgende Ausgaben anzuzeigen:
-r--r--r-- 1 root root 12M 26. Nov 05:29 /boot/vmlinuz-r--r--r-- 1 root root 12M 26. Nov 05:29 vmlinuz-r--r--r-- 1 root root 12101568 26. Nov 05:29 ../boot/vmlinuz-r--r--r-- 1 root root 12M 26. Nov 05:29 ../vmlinuz^ ^ Größe Beachten Pfad Beachten
Antwort im Teams-Privatchat als Commandline oder Screenshot.
Hinweis
es werden mehrere Aufrufe von ls benötigt.
Hinweis
Einige Ausgabezeilen sind kniffeliger, sendet gerne schon Teillösungen
Zusatz
Lasst alle Ausgabezeilen ohne Zwischenraum direkt untereinander erzeugen
Aufgabe Ordnerbaum
Nutzt mkdir und touch um unten stehende Verzeichnisse und Dateien zu Erzeugen.
Mit tree lässt sich die Ausgabe überprüfen. Alle Bundesländer sind Ordner, die Namen der Bahnhöfe sind Dateien.
live@live:~$ tree -F DE
DE/
├── Brandenburg/
│ ├── Berlin/
│ │ ├── Berlin Hbf
│ │ ├── Berlin Jungfernheide
│ │ ├── Berlin-Spandau
│ │ ├── Berlin Südkreuz
│ │ └── Potsdamer Platz
│ ├── Blankenfelde (Teltow-Fläming)
│ ├── Doberlug-Kirchhain
│ ├── Elsterwerda
│ └── Golßen (Niederlausitz)
└── Sachsen/
├── Chemnitz Hbf
├── Erlau (Sachsen)
├── Limmritz (Sachsen)
├── Prösen
├── Prösen West
└── Riesa
4 directories, 15 files
Sendet mir als Antwort einen Screenshot via Teams (per Privatnachricht).
Hinweis
Beachtet insbesondere Leerzeichen, Bindestriche und Klammern, sowie Groß- und Kleinschreibung.
Hinweis
- Durch Nutzung von
cdkann man Schreibarbeit sparen - Fehler lassen sich durch
mvundrm/rmdirkorrigieren
Zusatz
Man kann den Gesamten Datei- und Ordnerbaum mit zwei Programmaufrufen erstellen. Postet die Kommandos in Teams.
Zusatz
Lest den Artikel über "Brace-Expansion" in der Bash-Dokumentation um herauszufinden, wie sich die Befehle noch weiter abkürzen lassen.
Dateisysteme
Aufgabe man-Pages
Mit dem Befehl (Programm) man kann man Handbuchseiten für die meisten Programme aufrufen.
Benutzt ls um die Dateien im Ordner /etc/ auszugeben.
- Die Dateien sollen nach Änderungsdatum sortiert sein.
- Die neuste Datei soll ganz unten in der Liste stehen.
- Das Datum soll auch mit angezeigt werden.
Schlagt dazu in der man-page die nötigen Bedienoptionen nach.
Schickt mir den ls-Aufruf als Screenshot.
Zusatz:
Wir haben einige male die Prozessliste ausgegeben mit:
~$ ps -eo pid,user,command
Wie kann man der Ausgabe eine Spalte für den Speicherverbrauch hinzufügen?
Debian-Installation
Installationsmedium: Download von http://debian.org/
Installer Starten...
Manuelle Partitionierung
- ~128 MiB EFI System Partition
~16 GiB Ext4-Partition
- Einhängepungkt: /
Ext4-Partition
- Einhängepunkt: /home
- ~8GiB Swap-Partition
Software
- "Debian Desktop"
- XFCE-Desktop
- SSH-Server
- Standard Systemwerkzeuge
XFCE-Desktop Konfigurieren
Empfehlungen: Whisker-Menü statt Standard-Anwendungsmenü, ansonsten nach Geschmack.
Andere Desktops installieren
Zunächst gibt es kein sudo...
~$ su -
~# adduser juhser sudo
Pakete Installieren:
~# apt install task-kde-desktop task-gnome-desktop task-german-kde-desktop
~# apt install marble htop
Displaymanager: egal, kann geändert werden mittels dpkg-reconfigure gdm3
Partitionierung mit fdisk
Legt eine Partitionstabelle für die Arch-Installation an. Die Partitionen sollen wie folgt aufgeteilt sein:
Typ: GPT
- ~128 MiB EFI System Partition
- ~16 GiB /-Partition
- /home-Partition
- ~8GiB Swap-Partition
Schickt mir am Ende einen Screenshot des p-Kommandos von fdisk.

Hinweis
Die Dateisysteme werden nicht in dieser Übung angelegt.
Zusatz
- probiert
cfdiskaus - schaut in die man-Page von
sfdisk
Netzwerkdiagnose
Von unten nach oben
ip link- "NO_CARRIER" ist verdächtig
ip addressip route... was ist default-Gatewayping GATEWAY-IPip neighbour(Löst MAC-Adresse auch ohne Ping-Antwort auf)ping INTERNET-IP(1.1.1.1, 8.8.8.8, 8.8.4.4)dig DOMAINNAMEdig @NAMESERVER DOMAINNAME(1.1.1.1, 8.8.8.8, 8.8.4.4)ping REMOTEHOSTnmap -p PORT REMOTEHOST- oder
ncat -v REMOTEHOST PORT
- oder
LVM - Logical Volume Manager
Paketsysteme
apt-get
apt-get updateapt-get upgrade- Aktualisierung bestehender Pakete
apt-get dist-upgrade- ähnlich wie
upgrade, kann aber zusätzliche Abhängigkeiten installieren, oder Konfliktpakete entfernen
- ähnlich wie
apt-get install ...apt-get --fix-broken install- kaputte Abhängigkeiten nachträglich auflösen
apt-get remove ...apt-get purge ...apt-get autoremove- liegengebliebene Abhängigkeiten entfernen
apt-get autoremove --purge,apt-get purge --autoremoveapt-get clean- Downloadcaches in
/var/cache/apt/archives/löschen
- Downloadcaches in
apt-cache
apt-cache search ...- sucht nach Stichworten in Beschreibungstexten
apt-cache show ...- Beschreibungstext zu Paketnamen zeigen
apt
Enthält Subkommandos von apt-get und apt-cache in einem Programm. Hinzu kommt eine bessere visuelle Darstellung (Statusbalken beim Download, etc.)
Virtualisierung
CPU-Architektur
Arten der Virtualisierung
| CPU | RAM | Files | User | Net | Hardw | CPU-Inst | Bemerkungen | |
|---|---|---|---|---|---|---|---|---|
| Multitasking | X | X | ||||||
| Chroot | X | X | X | |||||
| (Usermode Linux) | X | X | X | X | X | Braucht keinen HW-Support, Nur auf Linux, Veraltet | ||
| Container/Namespaces | X | X | (X) | (X) | (X) | PID/ UIDs werden zum Host-System gemapped, Docker, LXC | ||
| Paravirtualisierung | X | X | X | X | X | (X) | Hypervisor mit Effizienzfeatures, braucht Gastunterstützung, Xen | |
| Hypervisor | X | X | X | X | X | X | Braucht CPU-Support (MMU, Privilegientrennung), HyperV, KVM, VirtualBox, VMWare | |
| Emulation | X | X | X | X | X | X | X | "Interpreter" f. Instruktionscode, sehr langsam, qemu, |
Keine Virtualisierung
WSL-1 Benutzt keine Virtualisierung (jenseits von regulärem Multitasking)
- Stellt Linux-Betriebssystemcalls in Windows bereit
- → Linux-Programme können unter Windows ausgeführt werden, solange sie keine Betriebssystemfeatures verwenden die Linuxspezifisch sind
WINE Stellt Windows-Betriebssystemcalls unter Linux bereit (WINE Is Not an Emulator)
- → Windows-Programme können unter Linux ausgeführt werden, solange sie keine speziellen Windows-Features verwenden
Aufgabe Pipeline
überfliegt die man-pages zu den Mini-Pipeline-Programmen
wc, grep, sort, uniq, cut, tr
Nutzt diese Programme auf der Textdatei mit dem Berliner Straßenverzeichnis um folgende Fragen zu beantworten:
Wie viele Zeilen hat die Datei?
Wie viele verschiedene Straßen- u Platznamen gibt es in Berlin?
- Die Namen sollen nur einmal gezählt werden, auch wenn der Eintrag in mehreren Bezirken vorkommt
Wie viele verschiedene Stadtteile gibt es laut Liste?
Aufgabe vim
Das Programm vimtutor startet ein interaktives Tutorial zum Editor vim. Geht den vimtutor selbstständig durch.
Zusatz: Sucht online nach Beispielen für eine .vimrc-Datei (Aka. the best, bestest, ultimate, mega, professional .vimrc, usw. ;-)
Auch süß: https://www.vim-hero.com/
Aufgabe Berechtigungen
Legt folgende Dateien an und setzt die Berechtigungen mit chmod.
Nutzt die oktalen Berechtigungsangaben.
-----w---- 1 live live 0 Apr 30 05:33 Ahh
----r-x--- 1 live live 0 Apr 30 05:33 Beh
---x---r-- 1 live live 0 Apr 30 05:33 Ceh
--w-----w- 1 live live 0 Apr 30 05:33 Deh
-rw-r-x-wx 1 live live 0 Apr 30 05:33 Eeh
----rws--- 1 live live 0 Apr 30 05:33 Eff
----rwS--- 1 live live 0 Apr 30 05:33 Geh
---S-----t 1 live live 0 Apr 30 05:33 Hah
---s-----T 1 live live 0 Apr 30 05:33 Ihh
Schickt mir die chmod-Aufrufe per Teams-Message (Text oder Screenshot).
Beachtet: Die Berechtigungen von "Eff" und "Geh" sind verschieden. Ebenso die Berechtigungen von "Hah" und "Ihh".
Zusatz
Legt folgende Spezialdateien an. Hier geht es nicht um Berechtigungen. Es gibt verschiedene Wege die Dateien anzulegen, dazu ist Recherche nötig.
lrwxrwxrwx 1 live live 1 Apr 30 06:11 Jot -> /
prw-rw-r-- 1 live live 0 Apr 30 06:11 Kah
srwxrwxr-x 1 live live 0 Apr 30 06:12 Lel
Hinweis: Diese Dateien müssen auf einem Unix-Dateisystem liegen.
Bei der Nutzung von WSL sind Ordner unterhalb von /mnt/c/ also nicht geeignet.
Symlinks / Hardlinks
Normale Datei
Verzeichniseintrag (Dateiname) → Inode (Berechtigungen, Änderungsdatum, Metainformationen) → Datensektoren im Dateisystem
Symlink / Softlink / Symbolischer Link / Semantischer Link
Verzeichniseintrag → Inode (Spezialdatei) → Verzeichniseintrag
Hardlink
Verzeichniseintrag --------> Inode (genauso wie bei normaler Datei) -> Datensektoren
/
Weiterer Verzeichniseintrag - (verweist auf die selbe Inode)
Shellscripting
Beginnt mit Shebang / HashBang
#!/bin/shbzw.
#!/bin/bashAbfolge von Shellkommandos
Typische Script-Kommandos
read variable arivarble blarivareif PROGRAMM; then ...
Webserver
~$ ncat -klp 8000 -e ./web_01.sh
Aufgabe Scripting
In einem Ordner befinden sich Katzenbilder verschiedener Größe: Wikimedia_Katzenbilder.tar
Das kommando convert aus der ImageMagick-Suite kann Bildformate konvertieren und Bilder Skalieren.
(Debian-Paket "imagemagick")
~$ convert Bild.jpg -resize 120x80 Output.jpg
Benutzt eine for-Schleife um Thumbnails aller Katzenbilder in einem Unterordner namens "thumbs/" zu erstellen.
Hinweis: Beim Resize kann man das Seitenverhältnis eines Bildes beibehalten, indem man eine Dimension (X oder Y) als "-2" angibt.
Hinweis: for-examples.sh enthält die die Schleifen-Beispiele aus dem Unterricht.
Vorgehen
- Versuche zuerst von Hand einen einzelnen
convert-Aufruf korrekt zu schreiben. - stelle dem
convert-Aufruf testweise einechovoran um zu sehen, wie die Variablen eingesetzt werden. Lasse die Schleifenvariable mittels
echoausgeben bevor dasconvertausgeführt wird- Die Hilfsausgaben lassen sich auf der Shell besser erkennen, wenn sie ein Paar
=====-Zeichen o.Ä. enthalten.
- Die Hilfsausgaben lassen sich auf der Shell besser erkennen, wenn sie ein Paar
- In einem Texteditor hilft das Syntax-Highlighting dabei, einige Fehler zu vermeiden
- Anders als in python müssen Steuerstrukturen in Shellscript immer abgeschlossen werden (
doneundfi)
Zusatz
In verschiedenen thumb_* Unterordnern sollen zu jedem Bild Thumbnails mit den Auflösungen 480x*, 320x* und 240x* erstellt werden.
Hierzu sind mehrere Schleifen nötig. Versuche das Programm so zu schreiben, dass sich leicht eine Vielzahl weiterer Auflösungen hinzufügen lässt.
Scripting 2
Die Katzenbilder sollen ins PNG-Format konvertiert werden. Dazu reicht es aus, dass in convert die Ausgabedatei auf ".png" endet.
convert bild.jpg ausgabe.png
Aber die Ausgabedatei zu "bild.jpg" soll nicht "bild.jpg.png" heißen, sondern "bild.png".
Lest in der Manpage zur dash den Absatz über "Parameter Expansion" um zu verstehen, wie man die .jpg-Dateiendung weg kürzen kann.
Vorgehen
- schreibe erst eine funktionierende Schleife, bei der die Dateien "ausgabe.jpg.png" heißen. Damit werden alle Fehler ausgeschlossen, die mit dem eigentlichen Problem nichts zu tun haben.
Lösung
~$ for katze in *.jpg; do convert "$katze" "${katze%.jpg}.png"; done
Alternativ / Zusatz
Neben der Methode aus der Manpage gibt es auch die Möglichkeit den Dateinamen mittels sed umzuformen. Hierzu kann die "Command Substitution" dienen.
z.B.
ausgabe="$(BEFEHL "$eingabe")"
Lösung / Beispiel
output="$( echo "$input" | sed 's/.jpg/.png/' | sed 's/cat/dog/ig')"
Scripting: tests
Schreibe ein Schellscript zum Zahlenraten.
Das Shellscript generiert eine Zufallszahl ($RANDOM)
Der Benutzer gibt eine Zahl ein (
read ...)Das Shellscript gibt aus
- "Meine Zahl war Größer"
- "Meine Zahl war kleiner"
- "Das ist genau meine Zahl"
(oder eine kreative Variante davon)
Hinweise
$RANDOMfunktioniert nur in der Bash (Die#!-Zeile muss entsprechend lauten)- das
test-Programm hilft Fälle zu unterscheiden (sieheman-Page) - man kann das
test-Programm inif-Abfragen nutzen - Lasst euch zum Testen die Zufahlszahl mit ausgeben, so dass ihr seht, ob die Fallunterscheidung funktioniert (wenn das Script sagt: "Meine Zahl war kleiner", obwohl das nicht stimmt, müsst ihr das beim Test sehen)
- in web_01.sh gibt es ein Beispiel für die
if-Abfrage
While-Schleife
Das Amerikanische Sauflied "99 Bottles of Beer" geht so
99 bottles of beer on the wall.
99 bottles of beer.
Take one down, pass it around,
98 bottles of beer on the wall....
Schreibe eine Zählschleife mit while, test und arithmetischen Ausdrücken $(( n * 7 )) oder so, um den Text vollständig auszugeben.
Zusatz
Beachte das Plural-s ( Bottles ) in der letzten Strophe.
case ... in ... esac
Beispiel → wochentag.sh
Übung
Passe wochentag.sh so an, dass es den aktuellen Wochentag benutzt, statt der Usereingabe.
Hinweise
- das Programm
datelässt sich nutzen, um den aktuellen Wochentag zu ermitteln
Zusatz
Was passiert, wenn ich vor Ausführung des Scripts export LANG=C setze (bzw. die Standardsprache ändere)? Wie kann ich das Programm Sprachunabhängig machen (egal für welche Sprache)?
Aufgabe inetd
Bringe web_01.sh via inetd zum laufen (Debian-Paket "openbsd-inetd").
Script: web_01.sh
Nicht vergessen:
~$ chmod +x web_01.sh
/etc/inetd.conf:
80 stream tcp nowait USER /home/USER/web_01.sh /home/USER/web_01.sh
~# systemctl restart inetd
bzw.
~# /etc/init.d/openbsd-inetd restart
Debugging (in Systemd):
~# journalctl -fu inetd
Beweisfoto:
Von einem Browser auf einer anderen Maschine aus (vorzugsweise M$ Edge): http://ip-adresse/
Dienste-Konten
Mit dem Programm adduser haben wir bisher interaktiv neue Benutzerkonten angelegt.
Das Programm useradd legt Benutzerkonten nichtinteraktiv an. D.H. ohne Fragedialog.
Recherchiert in der man-Page:
- Wie legt man User-Accounts für Systemdienste an?
- Wo können die Dienste Daten speichern?
- Beachtet Gruppenzugehörigkeiten.
Wie kann man in einem Dienste-Konto Arbeiten ausführen?
Beispiel: webapps-1
~# git clone https://git.plutz.net/git/shellwiki /opt/shellwiki
~# git clone https://git.plutz.net/git/webpoll /opt/webpoll
~# useradd -rmb /srv wiki
~# useradd -rmb /srv poll
~# vi /etc/inetd.conf
81 stream tcp nowait wiki /opt/shellwiki/index.cgi /opt/shellwiki/index.cgi --data=/srv/wiki/data --debug=/srv/debug
82 stream tcp nowait poll /opt/webpoll/index.cgi /opt/webpoll/index.cgi --data=/srv/poll/data --debug=/dev/null
~# systemctl restart inetd
~# su - poll
p~$ mkdir data
p~$ exit
~#
Web-Service auf Unix-Socket
/etc/inetd.conf
Vorher TCP mit Hostname:Port → Nachher Unix-Sockets
/srv/live-dvd stream unix nowait web01 /opt/web_01.sh xxx
/srv/wiki/sock stream unix nowait wiki /opt/shellwiki/index.cgi /opt/shellwiki/index.cgi --data=/srv/wiki/data --debug=/dev/null
/srv/poll/sock stream unix nowait poll /opt/webpoll/index.cgi /opt/webpoll/index.cgi --data=/srv/poll/data --debug=/dev/null
/etc/apache2/sites-available/....conf
Rewrite-Rule .... Plain-HTTP → unix:...|http...
<VirtualHost *:80>
ServerName poll.local
RewriteEngine on
RewriteRule ^/(.*)$ unix:/srv/poll/sock|http://localhost/$1 [P]
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/poll.error.log
CustomLog ${APACHE_LOG_DIR}/poll.access.log combined
</VirtualHost>
Zugriffsrechte für Apache:
Der Webserver muss in den Socket-Verzeichnissen auf Sockets zugreifen können.
~# chgrp www-data /srv/wiki /srv/poll
~# chmod g+x /srv/wiki /srv/poll
Apache Service-User
Das Apache-Modul mpm-itk ermöglicht es, einen Apache-VHost in einem bestimmten Benutzerkontext laufen zu lassen.
- Nehmt dem www-data benutzer die Zugriffsrechte auf das Diensteverzeichnis wieer weg:
~# chgrp wiki /srv/wiki
Richtet den Wiki-Vhost so ein, dass er selbst mit den Rechten des Wiki-Users läuft.
- mpm-itk installieren
- mpm-itk aktivieren
- in der Vhost-Config-Datei Benutzerzuordnung festlegen (online recherchieren)
Nextcloud Aufsetzen
Wir wollen einen Apache-VHost zum Betrieb der Nextcloud aufsetzen.
Es soll einen dedizierten Nextcloud-User geben
~# useradd -rm -b /srv nextcloudDie Nextcloud-Software soll von Anfang an durch den unprivilegierten Benutzer runtergeladen und entpackt werden
~# su - nextcloud nc~$ wget https://download.nextcloud.com/server/releases/latest.zip nc~$ unzip latest.zip ...Wir haben am Mittwoch nachmittag bereits PHP installiert:
~# apt install libapache2-mod-phpDer Apache Webserver soll einen Vhost ausliefern
Adresse nextcloud.local (Namensauflösung beachten!)
Benutzerkontext begrenzen auf "nextcloud"
Document-root soll der Ordner aus dem entpackten zip-File sein.
Apache liefert in der Default-Config niemals Dateien außerhalb von "/var/www" aus. Deshalb ist es nötig, innerhalb der VHost-Konfiguration, das neue Document-Root mit einzutragen:
<Directory /EUER/NEXTCLOUD/VERZEICHNIS> Require all granted </Directory>
Ziel
Im Browser unter http://nextcloud.local soll eine weiße Seite angezeigt werden.
PHP ist noch nicht ausreichend eingerichtet um Nextcloud auszuführen. Ergebnis ist daher zunächst eine weiße Seite aber keine Fehlermeldung.
Zusatz
Nextcloud hängt von diversen PHP-Bibliotheken ab. Versucht bis zum Einrichtungsdialog der Nextcloud zu kommen.
Fertige Config
php-xml, php-mbstring, php-curl, php-gd, php-zip, php-sqlite3
Zusammenspiel Webserver / Applikationen / usw...
Webbrowser
- Macht DNS-Abfrage
- Öffnet TCP/IP-Kanal
- Spricht HTTP um Dokument anzufragen
- Stellt HTML-Dokumente grafisch dar (rendering)
poll.sh, wiki.sh, web_01.sh
- Sprechen HTTP (auf stdin, stdout)
- Liefern Dokumente (HTML, text, usw.)
- Keine Handhabung von Netzwerk-Kanälen TCP/IP
ncat, inetd
ncat: CLI-Programm
inetd: Hintergrunddienst mit /etc/inetd.conf als Config-Datei
- Sprechen TCP/IP
- Rufen ggf. Programme auf, die die TCP-Connection betreuen
- Kein HTTP (das machen ggf. aufgerufen Programme)
- Keine Dokumentenauslieferung
inetd + web_01.sh = TCP/IP + HTTP + Dokument
PHP-Applikationen (*.php-Scripte)
- Generieren Dokumete (idR. HTML)
- Kein TCP/IP
- Kein HTTP
- theoretisch können PHP-Scripte normale Anwendungsprogramme sein (wie Gimp, LibreOffice, usw...)
- in der Praxis praktisch immer zur Erstellung von Webapplikationen
Apache-Webserver
Verwaltet TCP/IP-Verbindungen
Spricht HTTP-Protokoll
Unterstützt völlig verschiedene Betriebsmodi
Dokumente vom Dateisystem ausliefern
(/var/www/html/index.html)Arbeitet als Reverse-Proxy für andere Webserver
z.B. Forwarding an inetd (via TCP oder Unix-Socket)PHP-Scripte ausführen
Script generiert dynamisch ein Dokument- Apache muss HTTP und Netzwerk-Teil übernehmen
- Setzt Umgebungsvariablen für ausgeführtes Script
Nginx-Webproxy
eigentlich kein Webserver!
- Ursprünglich als Proxy entworfen (vgl. Apache, Punkt 2)
- Kann zusätzlich Dokumente vom Dateisystem ausliefern (vg. Apache, Punkt 1)
- kann keine PHP / CGI / ... Scripte ausführen!
- kann als Proxy an php-fpm, fcgiwrap, usw. forwarden
PHP-FPM
Variante vom PHP-Interpreter
- führt PHP-Scripte aus, mit Umgebungsvariablen, usw. wie in einem Webserver
Spricht FastCGI-Protokoll auf einem Unix-Socket
- FastCGI ~= Binäres HTTP
SSH-Dateien
| CLIENT | SERVER |
|---|---|
| Kommando: ssh user@server | Kommando: sshd (als Service von init/systemd) |
| /etc/ssh/ssh_host_*key (server-priv-keys) | |
| ~/.ssh/known_hosts (server-pub-keys) | |
| ~/.ssh/id_* (identity private) | |
| ~/.ssh/id_*.pub (identity public) | ~/.ssh/authorized_keys (identity-pub, ...) |
client~$ ssh-copy-id user@server
kopiert client:~/ssh/id_*.pub -> server:~/.ssh/authorized_keys
Aufgabe
Erstellt unter Windoze einen ssh-key und installiert diesen auf der Linux-Maschine.
Ergebnis soll sein, dass ein ssh von Windoze zu Linux kein Passwort mehr abfragt.
Hinweis:
beachtet auf der Kursseite die Tabelle mit den SSH-Dateien
Hinweis:
Die Aufgabe ist einfacher, wenn schonmal ein known-hosts file von einem Linux ssh-copy-id angelegt wurde
Hinweis:
Der ssh-Server ist sehr pingelich bzgl. der Berechtigungen auf dem .ssh-Verzeichnis
Beweisfoto:
Ein Windows Terminal mit erfolgreichem SSH-Login ohne Passwortabfrage
Zusatz:
Der Schlüssel soll einen direkten root-Login auf der Linux-Maschine erlauben
Aufgabe SCP
Kopiert die Datei /etc/passwd vom Linux-Rechner ins Heimverzeichnis eures Windows-Rechners. Nutzt dazu den scp-Client im Windows-Terminal.
Zusatz:
Kopiert den ganzen /etc-Ordner auf den Windows-Rechner. (Die man-Page zu scp gibt es leider nur unter Linux)
SSL
Makefile
→ Makefile
~# make nextcloud.local.crt
Signing Authority
~$ openssl genrsa >RootCA.key
~$ openssl req -x509 -subj /CN="MeineKleineCA" -key RootCA.key -days ... >RootCA.crt
Site Certificate
~$ openssl genrsa >nextcloud.key
~$ openssl req -new -subj /CN=nextcloud.local -key nextcloud.key >rextcloud.req
Request signieren (von CA)
~$ printf '%s\n' '[SAN]' 'subjectAltName=DNS:nextcloud.local' >nextcloud.conf
~$ openssl x509 -req -in nextcloud.req -extensions SAN -extfile nextcloud.conf -CA RootCA.crt -CAkey RootCA.key -days ... >nextcloud.crt
Ausprobieren
~# ncat --ssl-cert nextcloud.crt --ssl-key nextcloud.key -klp 443 -e /opt/web_01.sh
→ Webbrowser: https://nextcloud.local
Aufgabe SSL
Im Apache sind mindestens 3 Vhosts konfiguriert: nextcloud, poll, wiki, evtl. web_01. Alle drei VHosts sollen über SSL abrufbar werden.
Jeder VHost braucht ein Site-Zertifikat
- Alle Site-Zertifikate sind von unserer eigenen Root-CA signiert
.crt- und.key-Files müssen von Apache lesbar sein..key-Files sollen nur durch den Root-User lesbar sein.SSL-VHosts werden unabhängig von Plain-HTTP-VHosts konfiguriert.
SSL im Apache word von einem eigenen Modul bereit gestellt
Das Zertifikat (nicht der Key!) für die Root-CA muss im Browser importiert werden.
Schickt mir am Ende Screenshots der poll, wiki und Nextcloud-Seiten mit https-Logo in der Adressleiste. Zeigt insbesondere die Übersichts-Seite in den Nextcloud-Einstellungen. Dort soll Die https-Warnung nicht mehr rot sein.
Zusatz:
Die VHosts sind nur noch für SSL konfiguriert. Und auf Port 80 wird immer auf den SSL-Port der jeweils aufgerufenen Domain umgeleitet.
Zwischenschritte und Tests:
ping wiki.local,ping poll.localundping nextcloud.localbekommen eine Antwort von der selben IP-Adresse - von der VMnetstat -xl |grep srvzeigt die Sockets an, die von inetd unterhalb von/srv/bereitgestellt werdennetstat -tlnZeigt den Apachen, der auf Port 80 lauscht- http://localhost im Webbrowser zeigt die Default-Seite von Apache
- http://wiki.local, http://poll.local und http://nextcloud.local zeigen im Webbrowser die jeweiligen Seiten
Es gibt eine Zertifikats- und Schlüsseldatei für das Stammzertifikat. z.B.:
RootCA.crtundRootCA.key
Es gibt Zertifikats- und Schlüsseldateien für die drei Domains. z.B.:
wiki.local.crtundwiki.local.keypoll.local.crtundpoll.local.keynextcloud.local.crtundnextcloud.local.key
netstat -tlnzeigt den Apachen, der auch auf Port 443 lauschthttps://wiki.local, https://poll.local und https://nextcloud.local zeigen im Webbrowser jeweils eine SSL-Warnung
- Akzeptiert man die Warnung, werden die Seiten angezeigt
- Die Seiten sind ohne Warnung abrufbar
- Zusatz: Die Seite http://wiki.local wird im Webbrowser unmittelbar auf https://wiki.local weitergeleitet
SSL-Zertifizierungsstellen installieren
Windows
\> certmgr.crt → rechtsklick → importieren → .pem-Datei (oder .crt, ...)
Einige Linux-Distros
.pem-Datei nach /etc/ssl/certs kopieren
Debian-Derivate
.crt-Datei nach/usr/share/ca-certificateskopieren~# dpkg-reconfigure ca-certificates
Firefox systemweit
/etc/firefox/policies/policies.json:
{ "policies": { "Certificates": { "Install": [ "/etc/ssl/...", "/usr/share/ca-certificates/..." ] } } }
Chromium automatisch
für jeden Useraccount einzeln
~$ certutil -d ~/.pki/nssdb/ -A -t -C,, -n "Freitextname" -i /etc/ssl/...
Apache SSL-Redirect und ACME
- Alle VHosts werden nur noch für SSL konfiguriert
- SSL-VHosts müssen deaktiviert sein, solange Zertifikate noch nicht vorhanden sind
- die Einzige nicht-SSL-Konfiguration beantwortet ACME-Challenges und löst für andere Anfragen einen HTTPS-Redirect aus:
<VirtualHost *:80>
Alias /.well-known/acme-challenge/ /var/lib/dehydrated/acme-challenges/
<Location /.well-known/acme-challenge>
Require all granted
</Location>
<LocationMatch "^/(?!\.well-known/acme-challenge)">
Redirect 301 https://%{HTTP_HOST}%{REQUEST_URI}
</LocationMatch>
</VirtualHost>
SSL-Zertifikate werden über ACME automatisch erstellt und signiert.
ACME-Client installieren (~# apt install dehydrated)
Automatisch, "anonym" Account erstellen (~# dehydrated --register --accept-terms)
Domainnamen konfigurieren (in
/etc/dehydrated/domains.txt)- Ein Zertifikat pro Zeile
- mehrere Domainnamen pro Zertifikat möglich
- mehrere Zertifikate möglich
- Datei enthält nur Domainnamen
dehydrated -causführen um Schlüssel zu generieren und Zertifikate anzufordern- Challenge-Dateien auf dem HTTP-Server beweisen der CA, dass wir eine Domain kontrollieren (siehe Config-Datei im obigen Stichpunkt)
Sobald die Zertifikate erstellt sind können die SSL-VHosts aktiviert werden (a2ensite)
SSL-Zertifikate können in der VHost-Konfiguration direkt aus
/var/lib/dehydrated/certs/...benutzt werdenGgf. muss
dehydrated -cregelmäßig ausgeführt werden um die Zertifikate aktuell zu halten (cron)- idR. täglich
Manuelle Installation + Verschlüsselung
~# fdisk /dev/sda
> o
> n
> p
> 4096
> (enter)
> w
Luks legt verschlüsselte Daten auf einem Block-Device (einem Datenträger) ab, und stellt seinerseits ein Virtuelles Block-Device zur Verfügung:
~# cryptsetup luksFormat /dev/sda1 -pbkdf PBKDF2
~# cryptsetup luksOpen /dev/sda1 crypto
Solange Luks aktiv ist bietet das Virtuelle Gerät eine unverschlüsselte Darstellung der Daten. Es kann mit einem normalen Dateisystem, wie ext4 formatiert und gemountet werden. Physisch werden die Daten nur in verschlüsselter Form auf /dev/sda1 abgelegt.
~# vgcreate lvm /dev/mapper/crypto
~# lvcreate --name root --size 8G lvm
~# mkfs.ext4 /dev/mapper/lvm-root
~# mount /dev/mapper/lvm-root /mnt
~# debootstrap --variant=minbase trixie /mnt
~# mount -o rbind /dev /mnt/dev
~# mount -o rbind /proc /mnt/proc
~# mount -o rbind /sys /mnt/sys
~# chroot /mnt
c~# apt install --no-install-recommends linux-image-amd64 init grub-pc cryptsetup-initramfs lvm2 e2fsprogs busybox-static net-tools ifupdown isc-dhcp-client vim less psutils
Editiere /etc/fstab:
/dev/mapper/lvm-root / ext4 rw 0 0
Editiere /etc/crypttab:
crypto /dev/sda1 none luks
Editiere /etc/default/grub, dazuschreiben:
GRUB_ENABLE_CRYPTODISK="y"
c~# grub-install /dev/sda
c~# update-grub
c~# update-initramfs -u
c~# passwd
~# shutdown -h now
→ Booteinstellungen der VM ändern
Spielübung Email
wir Brauchen einen lokalen DNS-Server, der MX-Records auflöst
in
/etc/hosts:Netzwerk-IP für
live.local,wiki.local,poll.localundnextcloud.localeintragendenn
dnsmasqliest seine Infos aus dieser DateiIm grafischen Network-Manager: "Verbindung Bearbeiten" → "Zusätzliche DNS-Server": "127.0.0.1", Neu Verbinden
denn der DHCP-Client überschreibt sonst regelmäßig DNS-Einstellungen
~# apt install dnsmasqgefolgt von
~# systemctl stop dnsmasqdenn wir starten
dnsmasqvon Handdnsmasqstarten:~# dnsmasq -dq --selfmx→ Service bleibt im Vordergrund und beantwortet simple MX-Queries
Überprüfung:
~$ dig MX nextcloud.local→ löst auf den Namen "nextcloud.local." auf~$ dig nextcloud.local→ löst auf die Netzwerk-IP auf (nicht 127.0.0.1 !)
Anderen Rechner konfigurieren (Idealerweise Minimal-Install):
Aktuelle DHCP-IP-Adresse aufschreiben
Zur Sicherheit (falls der Rechner als Live-DVD läuft):
~# systemctl stop NetworkManager~# ifdown eth0(falls nicht Live-DVD)/etc/network/interfaces.d/eth0auto eth0 iface eth0 inet static address ADRESSE/MASKE (wie vorher notiert) gateway ADRESSE (vom Gateway, wie vorher notiert)echo nameserver ADRESSE >/etc/resolv.confMit der Adresse des dnsmasq-Servers!
Überprüfung:
~$ dig MX nextcloud.local→ löst auf den Namen "nextcloud.local." auf~$ dig nextcloud.local→ löst auf die Netzwerk-IP auf (nicht 127.0.0.1 !)
Zweitrechner am dnsmasq-Server eintragen
/etc/hosts:ADRESSE other.localIm dnsmasq-Terminal
Strg+C, nochmal startenÜberprüfung, auf beiden Rechnern:
~$ dig MX other.local
OpenSMTPD installieren und konfigurieren
~# apt install opensmtpd ca-certificates/etc/smtpd.conf: smtpd.conf (auf die jeweiligen Domains achten)~# systemctl restart opensmtpdÜberprüfen:
~# netstat -tlnp→ Port 25 (Nicht nur auf localhost!)~# journalctl -fu opensmtpd~$ mail -s "Betreff" user@lokaledomain user@remotedomain(Mailbody eingeben, mit Ctrl+D abschließen)
Aufgabe Mailserver mit SSL
Richtet die TLS-Zertifikate für other.local und nextcloud.local ein. Beide Zertifikate sollen von der selben CA signiert sein. Der Root-Key der CA soll nur auf einem Rechner existieren.
sftpunsscpsind eure Freunde- ggf. muss auch die CA auf beiden Rechnern installiert sein (nicht die Root-Keys!), sonst werden die Dienste-Zertifikate nicht akzeptiert.
Das SSL-Makefile erlaubt das Generieren und Wiederaufnehmen aller Zwischenschritte
- erzeugt z.B. den Signing-Request auf
other.local - stellt das Zertifikat (auf Basis des Requests) auf dem Rechner mit der RootCA aus.
- erzeugt z.B. den Signing-Request auf
man smtpd.confzeigt euch- die tls-Otionen, die an die
listen-Zeile angehängt werden. - die
pki-Zeilen die neu hinzukommen um die Zertifikate zu nutzen
- die tls-Otionen, die an die
Ziel soll sein, dass Claws-Mail via Userename und Passwort den SMTP-Server des anderen Rechners zum Senden nutzen kann.
Zusatz:
Der Host für nextcloud.local, wiki.local, poll.local soll ein Zertifikat vorweisen, dass für alle drei Domains gilt. Hierzu müsst ihr vor dem Signierschritt die Zusätzlichen subjectAltNames in der .cfg-Datei für openssl eintragen.
Checkliste Mailserver
MX-Record im DNS
- zusätzlich SPF-Record https://en.wikipedia.org/wiki/Sender_Policy_Framework
dig MX domaindig TXT domain
Mailversand lokal
mail "username"mail "username@eigene.domaine"
Mailannahme von außerhalb
ncat -C mailserver 25→ SMTP Dialog wie in Wikipedia oder LPIC-Doku- Mail Senden von externem Mailaccount
Mailversand von localhost an andere Domains
mail name@externe.domain- eigentlich ohne Authentifizierung
Mailversand von Mailclient
- "claws-mail" auf anderem Rechner per SMTP
- Mail an eigene Domain
- Mail an externe Domain
Externer Mailclient darf nicht ohne Authentifizierung senden !!1!!11!Eins!Elf
- Authentifizierung in claws-mail abschalten
- Mail versenden
- → Darf nicht gehen!








