GNU+Linux Für Fachinformatiker / Vorbereitung LPIC-1

Inhalt

Unterrichtsmaterialien

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

Zusatz

Lest den Artikel über "Brace-Expansion" in der Bash-Dokumentation um herauszufinden, wie sich die Befehle noch weiter abkürzen lassen.

Dateisysteme

Dateisysteme_1.svg

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

  1. ~128 MiB EFI System Partition
  2. ~16 GiB Ext4-Partition

    • Einhängepungkt: /
  3. Ext4-Partition

    • Einhängepunkt: /home
  4. ~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

  1. ~128 MiB EFI System Partition
  2. ~16 GiB /-Partition
  3. /home-Partition
  4. ~8GiB Swap-Partition

Schickt mir am Ende einen Screenshot des p-Kommandos von fdisk.

Screenshot fdisk

Hinweis

Die Dateisysteme werden nicht in dieser Übung angelegt.

Zusatz

  • probiert cfdisk aus
  • schaut in die man-Page von sfdisk

Netzwerkdiagnose

Von unten nach oben

  • ip link

    • "NO_CARRIER" ist verdächtig
  • ip address
  • ip route... was ist default-Gateway
  • ping GATEWAY-IP
  • ip 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 DOMAINNAME
  • dig @NAMESERVER DOMAINNAME (1.1.1.1, 8.8.8.8, 8.8.4.4)
  • ping REMOTEHOST
  • nmap -p PORT REMOTEHOST

    • oder ncat -v REMOTEHOST PORT

LVM - Logical Volume Manager

Dateisysteme_1.svg

Paketsysteme

apt-get

  • apt-get update
  • apt-get upgrade

    • Aktualisierung bestehender Pakete
  • apt-get dist-upgrade

    • ähnlich wie upgrade, kann aber zusätzliche Abhängigkeiten installieren, oder Konfliktpakete entfernen
  • 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 --autoremove
  • apt-get clean

    • Downloadcaches in /var/cache/apt/archives/ löschen

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

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, VirtualBox, Konsolenemulatoren

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.

Shellscripting

  • Beginnt mit Shebang / HashBang
    #!/bin/sh bzw.
    #!/bin/bash

  • Abfolge von Shellkommandos

  • Typische Script-Kommandos

    • read variable arivarble blarivare
    • if PROGRAMM; then ...

Webserver

web_01.sh

~$ 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 ein echo voran um zu sehen, wie die Variablen eingesetzt werden.
  • Lasse die Schleifenvariable mittels echo ausgeben bevor das convert ausgeführt wird

    • Die Hilfsausgaben lassen sich auf der Shell besser erkennen, wenn sie ein Paar =====-Zeichen o.Ä. enthalten.
  • In einem Texteditor hilft das Syntax-Highlighting dabei, einige Fehler zu vermeiden
  • Anders als in python müssen Steuerstrukturen in Shellscript immer abgeschlossen werden (done und fi)

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.

katzen_01.sh

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.

  1. Das Shellscript generiert eine Zufallszahl ($RANDOM)

  2. Der Benutzer gibt eine Zahl ein (read ...)

  3. Das Shellscript gibt aus

    • "Meine Zahl war Größer"
    • "Meine Zahl war kleiner"
    • "Das ist genau meine Zahl"

    (oder eine kreative Variante davon)

Hinweise

  • $RANDOM funktioniert nur in der Bash (Die #!-Zeile muss entsprechend lauten)
  • das test-Programm hilft Fälle zu unterscheiden (siehe man-Page)
  • man kann das test-Programm in if-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.

bottles.sh

case ... in ... esac

Beispiel → wochentag.sh

Übung

Passe wochentag.sh so an, dass es den aktuellen Wochentag benutzt, statt der Usereingabe.

Hinweise

  • das Programm date lä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:

  1. Wie legt man User-Accounts für Systemdienste an?
  2. Wo können die Dienste Daten speichern?
  3. 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.

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

  1. Es soll einen dedizierten Nextcloud-User geben

     ~# useradd  -rm -b /srv  nextcloud
  2. Die 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
     ...
  3. Wir haben am Mittwoch nachmittag bereits PHP installiert:

     ~# apt  install  libapache2-mod-php
  4. Der 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

nextcloud.conf

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

    1. Dokumente vom Dateisystem ausliefern
      (/var/www/html/index.html)

    2. Arbeitet als Reverse-Proxy für andere Webserver
      z.B. Forwarding an inetd (via TCP oder Unix-Socket)

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

SSL_Cert.svg

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.

  1. Jeder VHost braucht ein Site-Zertifikat

    • Alle Site-Zertifikate sind von unserer eigenen Root-CA signiert
  2. .crt- und .key-Files müssen von Apache lesbar sein. .key-Files sollen nur durch den Root-User lesbar sein.

  3. SSL-VHosts werden unabhängig von Plain-HTTP-VHosts konfiguriert.

  4. SSL im Apache word von einem eigenen Modul bereit gestellt

  5. 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.local und ping nextcloud.local bekommen eine Antwort von der selben IP-Adresse - von der VM
  • netstat -xl |grep srv zeigt die Sockets an, die von inetd unterhalb von /srv/ bereitgestellt werden
  • netstat -tln Zeigt 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.crt und RootCA.key
  • Es gibt Zertifikats- und Schlüsseldateien für die drei Domains. z.B.:

    • wiki.local.crt und wiki.local.key
    • poll.local.crt und poll.local.key
    • nextcloud.local.crt und nextcloud.local.key
  • netstat -tln zeigt den Apachen, der auch auf Port 443 lauscht
  • https://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-certificates kopieren
  • ~# 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 -c ausfü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 werden

  • Ggf. muss dehydrated -c regelmäß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

Email

Email.svg

Spielübung Email

  1. wir Brauchen einen lokalen DNS-Server, der MX-Records auflöst

    • in /etc/hosts:

      Netzwerk-IP für live.local, wiki.local, poll.local und nextcloud.local eintragen

      denn dnsmasq liest seine Infos aus dieser Datei

    • Im 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 dnsmasq

      gefolgt von

      ~# systemctl stop dnsmasq

      denn wir starten dnsmasq von Hand

    • dnsmasq starten:

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

  2. 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/eth0

      auto eth0
      iface eth0 inet static
        address  ADRESSE/MASKE  (wie vorher notiert)
        gateway  ADRESSE  (vom Gateway, wie vorher notiert)
    • echo nameserver ADRESSE >/etc/resolv.conf

      Mit 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 !)

  3. Zweitrechner am dnsmasq-Server eintragen

    • /etc/hosts:

      ADRESSE other.local

      Im dnsmasq-Terminal Strg+C, nochmal starten

    • Überprüfung, auf beiden Rechnern:

      ~$ dig MX other.local

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

  • sftp uns scp sind 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.
  • man smtpd.conf zeigt euch

    • die tls-Otionen, die an die listen-Zeile angehängt werden.
    • die pki-Zeilen die neu hinzukommen um die Zertifikate zu nutzen

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

  • 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!