Linux für Fachinformatiker / LPIC-1 Vorbereitung / FI17-SI1
- Unterrichtsmaterialien
- Arbeitsumgebung
- Hyper-V Einrichten
- Aufgabe Dateipfade
- Thema Dateisysteme
- Aufgabe Ordnerbaum
- Aufgabe Reguläre Ausdrücke
- Aufgabe Pipeline
- LVM - Logical Volume Manager
- Paketsysteme
- Virtualisierung
- Aufgabe
vi - Aufgabe Berechtigungen
- Aufgabe SSH
- SSH / SFTP-Übersicht
- SSH-Dateien
- Domain Name System
- Aufgabe
for-Schleife - Aufgabe
if/test - Vertiefung Shellscripting / Programmierlogik
- Arbeitsstand: Webserver
- Installation Nextcloud
- Webapplikationen ↔ Webserver
- Variante f. Webapplikationen
- SSL
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
- Checkliste LPIC_Themen
- Katzenbilder
Folien
- Geschichte und Grundbegriffe
- Einführung in die Kommandozeile
- Syntax der Kommandozeile
- Datenträger und Dateisysteme
- Prozesse und Benutzer
- Softwareinstallation und Paketsysteme
- Thema Reguläre Ausdrücke: Handbuch, Kapitel 103.7, https://regexone.com/,
~$ man 7 regex - Thema Pipelining: Handbuch, Kapitel 103.2
- Netzwerke
- Mitschrift Manuelle Installation
- CPU-Architektur
Shell dumps
Arbeitsumgebung
Hyper-V mit Live DVD
- Externer Switch
- openssh-server u. authorized_keys
Hyper-V mit Manueller Installation
- Externer Switch
- →
/etc/network/interfaces:auto eth0u.iface eth0 inet dhcp - openssh-server u. authorized_keys
WSL mit Debian (
\> wsl --install debian)- WSL Settings
Netzwerk auf MirroredNAT reicht eigentlich - Private Key für Login auf Live u. Manual
- WSL Settings
Weiter bei: → Arbeitsstand Webserver
Hyper-V Einrichten
"Windows-Features aktivieren oder deaktivieren"
- Hyper-V
- Windows-Subsystem für Linux
Windows-Server
Neuer virtueller Computer
- Name: egal
- Generation 2 (wegen UEFI-Boot)
Arbeitsspeicher: 2048 MB, oder mehr
- Dynamischen Speicher deaktivieren
- Festplatte: egal, sollte aber vorhaden sein
- Installationsmedium: live-dvd.iso
- Netzwerk: default Switch oder externer Switch
Rechtsklick auf die Maschine → Einstellungen
- → Sicherheit → "Sicheren Start" ausschalten
- → Firmware → DVD-Laufwerk nach oben etzen
Aufgabe Dateipfade
Benutzt ls um folgende Ausgaben anzuzeigen:
-r--r--r-- 1 root root 12M 28. Sep 06:08 /boot/vmlinuz
-r--r--r-- 1 root root 12142528 28. Sep 06:08 vmlinuz
-r--r--r-- 1 root root 12M 28. Sep 06:08 ../boot/vmlinuz
-r--r--r-- 1 root root 12M 28. Sep 06:08 ../vmlinuz
^ Größenangabe ^ Pfad
Antwort als Screenshot im Privatchat via Teams.
Hinweis
Es braucht mehrere Aufrufe von ls um alle Zeilen zu erzeugen.
Zusatz
Erledigt die Aufrufe für alle Anzeigen in einer einzigen Zeile, so dass die Ausgaben direkt untereinander stehen.
Thema Dateisysteme
Siehe auch: Folien von Tag 2 + 3
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.
Aufgabe Reguläre Ausdrücke
Geht die Tutorials auf https://regexone.com/ bis zur "Lesson 15" durch. Schreibt mich in Teams an, wenn ihr dort angekommen seid.
Beachtet bei den Aufgaben "Match" und "Skip". Sinn von einem RegEx ist, dass er auf bestimmte Texte zutrifft, auf andere aber gerade nicht.
Hinweis
Die Tutorials lassen sich im Linux-Terminal nachbilden via:
~$ grep -P "…"
Hinweis
Bei einigen Lessons kann man mogeln. Achtet bitte darauf, welcher Lösungsweg im Text beschrieben wird. Versucht die Aufgabe so zu lösen wie jeweils beabsichtigt.
Zusatz
Auf der Seite gibt es auch noch "Practice Problems". (Aber pingt mich an, wenn ihr bei Lesson 15 seid).
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- und 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?
Wie viele Straßen (/Plätze/Wege/usw.) gibt es in Adlershof?
Welche Straßen erstrecken sich durch mehr als fünf Stadtteile
Hinweis
Straßennamen können Leerzeichen enthalten, Bezirke sind aber glücklicherweise durch Tabs vom Straßennamen abgesetzt.
LVM - Logical Volume Manager
Paketsysteme
| Offline Tools | dpkg | rpm | |
|---|---|---|---|
| Info Paketdatei | dpkg -I datei.deb | rpm -qip datei.rpm | |
| Info Paket | (nur deb-datei oder apt) | rpm -qi NAME | |
| Dateien in Paketdatei | dpkg -c datei.deb | rpm -qlp datei.rpm | |
| Dateien in Paket | dpkg -L NAME | rpm -ql NAME | |
| Liste install. Pakete | dpkg --get-selections | rpm -qa | |
| Installation Paketdatei | dpkg -i datei.deb | rpm -i datei.rpm | |
| Update aus Paketdatei | (wie Installation) | rpm -U datei.rpm | |
| Paket neu einrichten | dpkg-reconfigure NAME | ??? | |
| Deinstallation Paket | dpkg -r NAME | rpm -e NAME | |
dpkg -P NAME (purge) | |||
| Paketzugehörigk. Datei | dpkg-query -S /datei | rpm -qf /datei | |
| Online Tools | apt | yum / dnf | zypper |
| Stichwortsuche | apt-cache search REGEX | yum search REGEX | zypper se WORT |
dnf search REGEX | |||
| Paketinfo | apt-cache show NAME | yum info NAME | zypper info NAME |
dnf info NAME | |||
| Dateien in Paket | apt-file list NAME | dnf repoquery -l NAME | |
| Liste install. Pakete | (siehe dpkg) | dnf list --installed | zypper se -i |
| Abfrage Repository | apt-get update | (nur automatisch???) | zypper refresh |
| Online-Install | apt-get install NAME | yum install NAME | zypper in NAME |
yum update NAME | |||
dnf install NAME | |||
dnf upgrade NAME | |||
| Abhängigk. erfüllen | apt-get install -f | ??? | |
| Deinstallation | apt-get remove NAME | dnf remove NAME | zypper rm |
apt-get purge NAME | |||
| Softwareupgrade | apt-get upgrade | yum update | |
dnf upgrade | |||
| Paketzugehörigk. Datei | apt-file search /datei | yum whatprovides /datei | zypper se --provides /datei |
dnf provides /datei | |||
| Konfiguration | /etc/apt/sources.list | yum repolist all | zypper repos |
dnf repolist | |||
yum-config-manager --add-repo http://... | |||
dnf config-manager --add-repo http:// | |||
yum-config-manager --disable REPO | zypper modifyrepo -d REPO | ||
dnf config-manager disable REPO | |||
yum-config-manager --enable REPO | zypper modifyrepo -e REPO | ||
dnf config-manager enable REPO |
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, Konsolenemulatoren |
Aufgabe vi
Geht das Programm vimtutor bis zum Ende durch. Gebt anschließend in Teams Bescheid.
(vimtutor wird ggf. mit dem Paket "vim" installiert)
Hinweis (Für WSL-Nutzer)
Einige Tastenkombinationen funktionieren schlecht im Windows-Terminal.
Zusatz
- lade das Berliner Straßenverzeichnis zweimal herunter
- ändere ein paar Straßennamen in einer der Kopien
- öffne beide Dateien gleichzeitig mit
vimdiff datei1 datei2 - mit
Strg + W→Bewegungkann man zwischen den Panelen wechseln
Zusatz
Sucht online nach dem "besten", "ultimativen", "idealen" .vimrc-File. ;-)
Aufgabe Berechtigungen
Legt die vier Dateien A, B C, und D an, mit Berechtigungen wie folgt.
Nutzt beim setzen der Berechtigungen via chmod die numerischen angaben.
Schickt via Teams den Screenshot, in dem die Ziffernangaben erkennbar sind.
---------- A
-r---w---x B
--w-r-x-w- C
-rwx---rwx D
Aufgabe SSH
Benutzt SSH um euch auf dem Dozentenrechner einzuloggen:
~$ ssh user@10.0.7.67 Passwort: userHost-Fingerprint:
SHA256:rDNRk5wBCNLyU3vHrfMmz3yDXyyxdGxQ1uTTiHbSnV0Legt eine Datei mit eurem Namen auf dem Dozentenrechner an.
Installiert einen SSH-Server auf eurer Linux-VM und loggt euch vom (Windoze-)Hostsystem darauf ein.
Paket: openssh-server
IP herausfinden via:
~$ ip address listPasswort vom Live-User setzen:
~$ passwd(leere Passworte sind nicht gültig)Unter Windows:
\> ssh live@HOSTGeneriert ein SSH-Schlüsselpaar und installiert es auf dem Dozentenrechner
~$ ssh-keygen ... ... ... ~$ ssh-copy-id user@10.0.7.67 ~$ ssh user@10.0.7.67→ sollte keine Passwortabfrage mehr geben
SSH / SFTP-Übersicht
SFTP
(gibt es auch in Windows)
Das SFTP-Programm benutzt eine interaktive Subshell
\> sftp user@host
> cd remote_ordner
> pwd
> lcd lokaler_ordner
> lpwd
> ls
> lls
> get remote_file
> put local_file
SCP
(gibt es auch in Windows)
\> scp user@host:datei ./
\> scp datei user@host:
(Remote-Pfade müssen einen Doppelpunkt enthalten)
Allein via ssh
(braucht eine Unix-Shell)
~$ ssh user@host cat datei > lokale_datei
~$ cat lokale_datei |ssh user@host cat ">"datei
(Anführungszeichen beachten)
Tar-Streams durch remote STDIN/STDOUT
~$ ssh user@host tar -c ordner | tar -x
~$ tar -c ordner |ssh user@host tar -x
RSync
Bedienung ähnlich wie scp. Effizient bei mehrfacher Übertragung der gleichen Dateien. Braucht rsync auf der Remote-Seite.
\> rsync user@host:datei ./
\> rsync datei user@host:
SSH-Dateien
~/.ssh/known_hosts- Bekannt Rechner, deren Fingerprint mein Client kennengelernt hat
~/.ssh/id_*,~/.ssh/id_*.pub- identity-File, aka. Private- u. Public-Key für eine Person. Wird vom eigenen Client zur Authentifizierung an Remote-Rechnern verwendet.
~/.ssh/authorized_keys- Identities (d.h. Public-Keys) von Personen, die sich via SSH einloggen dürfen.
Domain Name System
Beispiel Domainname
www.plutz.net → eigentlich www.plutz.net. (mit abschließendem Punkt)
DNS-Namen werden von hinten nach vorne gelesen.
| Root-Zone | Top-Level-Domain (TLD) | 2nd-Level-Domain | Subdomain |
|---|---|---|---|
| . | net | plutz | www |
Beispiel rekursive Abfrage
Der DNS-Rekursor muss Kenntnis über die Root-Nameserver haben
dig @193.0.14.129 NS net.(Anfrage an europäischen RIPE-Nameserver)- → Zuständig für
net.-Zone: z.B.192.12.94.30(Verisign)
- → Zuständig für
dig @192.12.94.30 NS plutz.net.(Anfrage an Verisign)- → Zuständig für
plutz.net.: z.B.46.38.225.225(Netcup)
- → Zuständig für
dig @46.38.225.225 NS www.plutz.net.(Anfrage an Netcup)- → kein untergeordneter Nameserver
dig @46.38.225.225 A www.plutz.net(Anfrage weiterhin an Netcup)- →
46.38.234.157(der eigentliche Webserver!)
- →
→ Rekursive Abfragen werden idR. nicht direkt von Client-PCs aus gemacht. Ein lokaler Nameserver führt rekursive Abfragen durch und cached die Ergebnisse. Zusätzliche kann er lokale Hostnamen auflösen und ggf. öffentliche Einträge übersteuern (Jugendschutz-, Zensur-, u. Werbefilter).
Aufgabe for-Schleife
Nutzt convert (aus dem Paket imagemagick) um alle Katzenbilder von .jpg nach .avif zu konvertieren.
Schreibt mir die Kommandozeile, die dafür genutzt wurde via Teams.
Hinweis
Es ist OK, wenn die Ausgabedateien auf .jpg.avif enden.
Zusatz
Lasst alle .avif-Dateien in einem Ordner "bilder_avif" anlegen, der neben dem "Wikimedia_Katzenbilder"-Ordner liegt.
Zusatz
Recherchiert, wie man die doppelte Dateiendung loswerden kann, so dass die Namen einfach auf .avif (ohne .jpg) enden.
Aufgabe if / test
Schreibe ein Shellscript, das
- Einen Pfad von Stdin liest
Handelt es sich bei dem Pfad um ein Verzeichnis
- so wird mit
lsder Verzeichnisinhalt gelistet
- so wird mit
Handelt es sich um eine Datei
- wird mit
lessdie Datei angezeigt
- wird mit
andernfalls (ungültiger Pfad, Spezialdatei, etc.)
- wird eine Fehlermeldung ausgegeben
Hinweis
Das test-Programm unterstützt verschiedene Tests. Siehe man-Page.
Hinweis
if-Abfragen kann man verschachteln
if …; then
else
if …; then
fi
fi
oder elif benutzen (lesbarer)
if …; then
elif …; then
elif …; then
else
fi
Zusatz
Der Pfad soll nicht von stdin gelesen werden, sondern als Parameter an das Script übergeben werden. Aufrufparameter stehen in den Spezialvariablen ${0}, ${1}, ${2}, usw.
Vertiefung Shellscripting / Programmierlogik
Der Webserver (webserver.sh) soll nicht mehr pauschal den Response-Code 200 liefern. Der Response code soll jetzt auch abhängig vom ausgelesenen Pfad sein.
- ist der Pfad ein Verzeichnis, soll wie bisher ein Listing mit
lsausgegeben werden, Response code ist dann weiterhin "200 OK" - ist der Pfad eine Datei, soll sie mit
catausgegeben werden, Response code ist dann weiterhin "200 OK" - ist der Pfad gar nicht lesbar (siehe man-Page test-Programm) soll eine Fehlermeldung angezeigt werden, der Response-Code ist dann "403 Forbidden"
- existiert der Pfad nicht, soll eine Fehlermeldung angezeigt werden, der Response-Code ist dann "404 Not Found"
Hinweise
- Die Reihenfolge der Bedingungsprüfungen spielt ggf. eine Rolle.
- Auch ein Fehlerdokument hat einen Content-Type
Zusatz
Die Meldung "$pfad ist ein Datenträger" (z.B. bei /dev/sda) soll mit lesbarem Umlaut angezeigt werden.
Arbeitsstand: Webserver
Softwarepakete
- openbsd-inetd
- git
- busybox
- apache2
Useraccounts
~# useradd -rUm -b /srv -c "Shellscript Webserver" webserver
~# useradd -rUm -b /srv -c "Webpoll" webpoll
~# useradd -rUm -b /srv -c "Shellwiki" shellwiki
Applikationen in /opt
/opt/webserver.sh
- → Ausführungsrechte nicht vergessen
- /opt/shellwiki/ (
git clone http://git.plutz.net/git/shellwiki) - /opt/webpoll/ (
git clone http://git.plutz.net/git/webpoll)
Datei /etc/inetd.conf
/srv/webpoll.sock stream unix nowait webpoll /opt/webpoll/index.cgi /opt/webpoll/index.cgi --data=/srv/webpoll
/srv/shellwiki.sock stream unix nowait shellwiki /opt/shellwiki/index.cgi /opt/shellwiki/index.cgi --data=/srv/shellwiki
/srv/webserver.sock stream unix nowait webserver /opt/webserver.sh --
Nicht vergessen: ~$ systemctl reload inetd
Apache-Konfiguration
Inhalte für den Webserver
~$ wget -O- http://plutz.net/training/damago_2026_03/[attachment]/Wikimedia_Katzenbilder.tar |sudo tar -xC /var/www/html/
/etc/apache2/sites-available/000-default.conf:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/Wikimedia_Katzenbilder
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
/etc/apache2/sites-available/webpoll.conf:
<VirtualHost *:80>
ServerName pollwiesel
ServerAdmin webmaster@localhost
DocumentRoot /dev/null
RewriteEngine on
RewriteRule ^/(.*)$ unix:/srv/webpoll.sock|http://egal/$1 [P]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
/etc/apache2/sites-available/shellwiki.conf:
<VirtualHost *:80>
ServerName wikiwiesel
ServerAdmin webmaster@localhost
DocumentRoot /dev/null
RewriteEngine on
RewriteRule ^/(.*)$ unix:/srv/shellwiki.sock|http://egal/$1 [P]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
~# a2ensite 000-default webpoll shellwiki
~# systemctl reload apache2
~# a2enmod rewrite proxy proxy_http
~# systemctl restart apache2
Hostnamen eintragen
- Wir haben kein DNS, benutzen also die hosts-Datei.
- Alle Clientsysteme (webbrowser) brauchen entsprechende Einträge!
- Windows-Clients:
C:\Windows\System32\drivers\etc\hosts - Linux-Clients:
/etc/hosts
# Ip.vom.apache.server
23.42.47.11 wiesel pollwiesel wikiwiesel
Installation Nextcloud
Installiert eine Nextcloud in dem bestehenden Apache Webserver.
Beginnt mit dem Anlegen eines eigenen Service-Users
Nextcloud wird nicht über inetd ausgeführt
Nextcloud erlaubt keine Trennung zwischen Installations- und Datenverzeichnis
- Die Installation erfolgt nicht in /opt sondern direkt im Heimverzeichnis
Führt den Download und das Entpacken der Zip-Datei als unprivilegierter Nextcloud-user durch (
wget,unzip)Legt einen VHost an, der das entpackte Nextcloud-Verzeichnis als Document-Root verwendet
- Vergesst nicht den Namenseintrag in der
hosts-Datei (auf dem System mit dem Webbrowser) - Der Apache-VHost hat zunächst keine Zugriffsrechte auf das Document-Root
- Vergesst nicht den Namenseintrag in der
Das Modul
mpm-itkdes Apache Webserver ermöglicht das Ausführen einzelner VHosts in einem beschränkten User-Kontext.- Installiert und aktiviert mod-itk
- Setzt die Apache-Config-Directive "AssignUserID" in der VHost-Konfiguration, um den Apache das Service-Verzeichnis ausliefern zu lassen
- kommentiert auch den
<Directory /srv>-Absatz in "/etc/apache2/apache2.conf" ein, sonst bleiben die Service-Verzeichnisse im Apachen gesperrt. - Testet den Zugriff auf die Webseite
→ Zwischenstand:
Nextcloud funktioniert noch nicht, aber statische Dateien aus dem Verzeichnis sind schon zugreifbar. index.php wird noch als Text ausgeliefert.
Nextcloud benutzt PHP-Scripte um seinen HTML-Output zu generieren. Diese werden über den integrierten PHP-Interpreter des Apache-Servers ausgeführt.
- → Installiert und aktiviert die
mod-phpdes Apachen Nextcloud hat viele Abhängigkeiten von PHP-Bibliotheken
- nutzt die error-Log-Datei des Webservers, um herauszufinden, welche PHP-Libraries noch installiert werden müssen.
- Die Nextcloud-Installation selbst liefert auf ihrer defekten Startseite Hinweise auf fehlende Bibliotheken
- Verzichtet zunächst auf den MySQL/MariaDB-Server. Datenbankbackend soll sqlite sein.
Hinweis
Zusatz
Auf der Administrator-Seite der Nextcloud-Installation gibt es Hinweise zu Sicherheits- und Performance-Einstellungen. Versucht hier weiter die Warnungen zu reduzieren. Ausnahme sind HTTPs-Einstellungen, das machen wir später.
Webapplikationen ↔ Webserver
| Site | Script / Programm | inetd | Apache |
|---|---|---|---|
| webpoll | HTTP u. HTML via Stdin/Stdout | Weiterleitung an Socket | ReverseProxy HTTP → Socket, VHost |
| nextcloud | Generiert HTML auf Stdout | -- | PHP-Interpreter via mod-php, VHost |
VHost = Unterscheidung von Sites anhand des Host:-Feldes im HTTP-Header
Variante f. Webapplikationen
Statisch
- Webserver liefert nur HTML-Dateien aus
- keine dynamisch generierten Dokumente
- Vorteil: extrem performant
- z.B. Handgeschriebenes HTML
- z.B. "Hugo" static site generator
Direkt
Webapplikation spricht selbst HTTP
- via Unix-Socket
- oder TCP-Port auf Localhost
Geht theoretisch ohne Webserver
- Vorteil: ohne Webserver ausführbar (einfach zu testen)
- Nachteil: jede Applikation hat eigene Sicherheitslücken im HTTP-Handling
- Reverse-Proxy für Webserverfunktionalität (z.B. VHosting, Sicherheit)
- z.B. Solr-Suchmaschine, Elastic-Search
CGI
Webserver startet eine Datei als Programm
- anstelle von
index.htmltrittindex.cgi/index.php - kann in beliebiger Programmiersprache geschrieben sein
- CGI-Programm generiert nur HTML-Dokumente (u. ggf. einzelne HTTP-Header)
- anstelle von
Nachteil
- jeder Seitenaufruf startet das Programm neu (Interpreter u. Bibliotheken werden von Amfang an geladen)
- Session-Informationen müssen persistent gespeicher werden (SQL-Datenbank, Dateien)
- wird nicht (mehr) von allen Webservern unterstützt
- z.B. Mailman (Mailinglistensoftware)
mod-php in Apache
- Verhält sich ähnlich wie CGI
- PHP-Interpreter u. Bibliotheken bleiben dauerhaft geladen
- wird nicht von allen Webservern unterstützt
- Vorteil: effizienter als CGI
- Nachteil: nur für PHP
FastCGI
- Webapplikation startet selbstständig (ähnlich wie bei direkter Webapplikation)
- Nutzt idR. Unix-Socket f. Webserver-Anbindung
- Kommuniziert in binärem HTTP (inkompatibel mit Webbrowser)
- Webserver läuft als Reverse-Proxy HTTP ↔ Unix-Socket/FastCGI
WSGI, PHP-FPM, u.ä.
- ähnliches Konzept wie FastCGI
- WSGI: Unix-Socket-Protokoll für Python-Webapps
- PHP-FPM: Unix-Socket-Protokoll für PHP
Andere Webserver
NGINX hat keine Unterstützung für php/cgi, oder mod-php. Webapplikationen laufen immer via FastCGI oder PHP-FPM (o.ä).
häufiger Fehler:
- NGinx-VHosts laufen unter eingeschränkten User-Rechten
- aber Webapplikationen werden alle im selben php-fpm ausgeführt (nicht isoliert)
Lighttpd alternativer leichtgewichtiger Webserver, mit CGI- u. FastCGI-Unterstützung
SSL
CertificateAuthority
Am besten als dedizierter, unprivilegierter User-Account
~$ openssl genrsa >ca-root.key
~$ openssl req -x509 -key ca-root.key -days 14 -subj "/C=DE/ST=Berlin/
L=Berlin/O=damago/OU=fi17si1/CN=MeineKleineCA" >ca-root.cer
→ .cer-Datei aud dem Client einspielen
Site-Zertifikate
- Site-Betreiber erstellt Key
Site-Betreiber erstellt Signing-Request
- enthält Informationen, Domainnamen, etc. zur Zertifizierung
- enthält Public Key
- Wird an Certificate Authority (CA) gesendet
- CA zertifiziert den Request (mit eigenem Private Key)
→ Dabei entsteht Site-Zertifikat (
.cer-Datei) - Zertifikat wird an Site-Betreiber zurückgeschickt → enthält signierten ("zertifizierten") Public Key
~$ openssl genrsa >meine.domain.key
~$ openssl req -new -subj /CN=meine.domain --addext "subjectAltName = DNS:meine.domain,DNS:nochne.domain,DNS:weitere.domain" --key meine.domain.key >meine.domain.req
Zertifizierung durch CA:
openssl x509 -CA ca-root.cer -CAkey ca-root.key -req -in meine.domain.req -copy_extensions copy >meine.domain.cer
SSL-Webserver
Im Apachen werden TLS-VHosts analog zu HTTP-VHosts angelegt:
<VirtualHost *:443>
ServerName wikiwiesel
ServerAdmin webmaster@localhost
DocumentRoot /dev/null
RewriteEngine on
RewriteRule ^/(.*)$ unix:/srv/shellwiki.sock|http://egal/$1 [P]
SSLEngine on
SSLCertificateFile /etc/ssl/private/wikiwiesel.cer
SSLCertificateKeyFile /etc/ssl/private/wikiwiesel.key
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
SSL-Redirect
- Jeder VHost wird nur noch für SSL konfiguriert
- Es gibt einen einzigen HTTP-VHost auf port 80, der jeden Request auf https weiterleitet:
- (Hier werden zusätzlich ACME-Challenges via plain HTTP beantwortet)
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
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>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Automatische Zertifizierung via ACME
- https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment
- Der Client kann auch für andere CAs als Let's Encrypt konfiguriert werden
~# apt install dehydrated
~# dehydrated --register
/etc/dehydrated/domains.txt
→ Domainnamen für je ein Zertifikat pro Zeile, ggf mehrere Domainnamen pro Zertifikat
~# dehydrated -c (monatlich/täglich per cron ausführen)
SSL-Zertifikate installieren
Für Chromium (als Benutzer):
~$ certutil -d ~/.pki/nssdb/ -A -t -C,, -n "Freitextname" -i ca-root.cer
Firefox (systemweit):
/etc/firefox/policies/policies.json:
{ "policies": { "Certificates": { "Install": [ "/etc/ssl/...", "/usr/share/ca-certificates/..." ] } } }
Debian für alle anderen Porgramme (systemweit):
- Datei kopieren nach
/usr/share/ca-certificates - eintragen in
/etc/ca-certificates.conf ~# update-ca-certificates








