Linux für Fachinformatiker / LPIC-1 Vorbereitung / FI17-SI1

Unterrichtsmaterialien

Folien

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 eth0 u. iface eth0 inet dhcp
    • openssh-server u. authorized_keys
  • WSL mit Debian (\> wsl --install debian)

    • WSL Settings Netzwerk auf Mirrored NAT reicht eigentlich
    • Private Key für Login auf Live u. Manual

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

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 cd kann man Schreibarbeit sparen
  • Fehler lassen sich durch mv und rm/rmdir korrigieren

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:

  1. Wie viele Zeilen hat die Datei?

  2. 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
  3. Wie viele verschiedene Stadtteile gibt es laut Liste?

  4. Wie viele Straßen (/Plätze/Wege/usw.) gibt es in Adlershof?

  5. 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

LVM

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-Architektur
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

  1. lade das Berliner Straßenverzeichnis zweimal herunter
  2. ändere ein paar Straßennamen in einer der Kopien
  3. öffne beide Dateien gleichzeitig mit vimdiff datei1 datei2
  4. mit Strg + W → Bewegung kann 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

  1. Benutzt SSH um euch auf dem Dozentenrechner einzuloggen:

    ~$ ssh user@10.0.7.67
    Passwort: user

    Host-Fingerprint: SHA256:rDNRk5wBCNLyU3vHrfMmz3yDXyyxdGxQ1uTTiHbSnV0

    Legt eine Datei mit eurem Namen auf dem Dozentenrechner an.

  2. Installiert einen SSH-Server auf eurer Linux-VM und loggt euch vom (Windoze-)Hostsystem darauf ein.

    Paket: openssh-server

    IP herausfinden via: ~$ ip address list

    Passwort vom Live-User setzen: ~$ passwd (leere Passworte sind nicht gültig)

    Unter Windows:

    \> ssh live@HOST
  3. Generiert 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)
  • dig @192.12.94.30 NS plutz.net. (Anfrage an Verisign)

    • → Zuständig für plutz.net.: z.B. 46.38.225.225 (Netcup)
  • 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

  1. Einen Pfad von Stdin liest
  2. Handelt es sich bei dem Pfad um ein Verzeichnis

    • so wird mit ls der Verzeichnisinhalt gelistet
  3. Handelt es sich um eine Datei

    • wird mit less die Datei angezeigt
  4. 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.

  1. ist der Pfad ein Verzeichnis, soll wie bisher ein Listing mit ls ausgegeben werden, Response code ist dann weiterhin "200 OK"
  2. ist der Pfad eine Datei, soll sie mit cat ausgegeben werden, Response code ist dann weiterhin "200 OK"
  3. ist der Pfad gar nicht lesbar (siehe man-Page test-Programm) soll eine Fehlermeldung angezeigt werden, der Response-Code ist dann "403 Forbidden"
  4. 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.

  • https://de.wikipedia.org/wiki/Nextcloud

  • https://nextcloud.com/install/#download-server

  • 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
  • Das Modul mpm-itk des 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-php des 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.html tritt index.cgi / index.php
    • kann in beliebiger Programmiersprache geschrieben sein
    • CGI-Programm generiert nur HTML-Dokumente (u. ggf. einzelne HTTP-Header)
  • 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

  1. Site-Betreiber erstellt Key
  2. Site-Betreiber erstellt Signing-Request

    • enthält Informationen, Domainnamen, etc. zur Zertifizierung
    • enthält Public Key
    • Wird an Certificate Authority (CA) gesendet
  3. CA zertifiziert den Request (mit eigenem Private Key) → Dabei entsteht Site-Zertifikat (.cer-Datei)
  4. 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

~# 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