Linux Basis Know How fuer System Administratoren
Contents
- 1 Einleitung
- 2 Ziele
- 3 Voraussetzungen
- 4 OpenSource Überblick
- 5 Linux Derivate
- 6 Installation eines CentOS 8 Core als VM
- 7 Linux Überblick
- 8 Basis- Wissen und Basis- Konfiguration
- 9 Netzwerk Dienste
- 10 Security
- 11 CFG Management/Automation
- 12 Fehler Analyse
1 Einleitung
- Kurs Dauer: 3 Tage
- Publikum: System Administratoren
Ziel dieses Kurses ist es einen "Enterprise tauglichen" Einstieg in die OpenSource Welt zu finden.
Es werden alle wichtigen Faktoren besprochen um Entscheidungen für die Einführung von Systemen und Applikationen zu finden welche später nicht bitter und teuer bereut werden müssen.
Wir erlernen wir Basis Kenntnisse über Installation und Grund-Funktion des OpenSource Enterprise Betriebssystems CentOS 8 Core welches die freie Variante von "Red Hat Enterprise Linux" darstellt.
Des weiteren erarbeiten wir durch praxisnahe Beispiele einen Einstieg in die System Administration von CentOS.
2 Ziele
- Das Konzept von Linux und OpenSource verstehen
- Enterprise-relevante Kriterien von OpenSource Software analysieren
- Ein CentOS 8 mit dem GUI Installer aufsetzen
- Sich per SSH/Konsole auf einem Linux System anmelden
- Grundlegende BASH Konsolen Kenntnisse erlangen
- Das OS Derivat bestimmen
- Pakete hinzufügen/entfernen
- Config Files bearbeiten
- Einen Dienst in Betrieb nehmen
- Updates einspielen
- Oberflächlicher Health Check
- Log Files finden und lesen
- Prozesse und deren Ressourcen finden
- Dienste und deren Status prüfen
- Rudimentäre Admin Arbeiten ausführen
3 Voraussetzungen
Um in der geplanten Zeit die Ziele erreichen zu können, setzen wir ein paar Dinge voraus...
3.1 Vorkenntnisse
Es wird davon ausgegangen das die Teilnehmer über mehrjährige Erfahrung im System-Administrations-Bereich und Grundwissen Wissen in den Bereichen
- Hardware
- Software
- Betriebssysteme
- Consolen Grundkenntnisse (DOS, BASH, KSH)
- Netzwerk
verfügen.
Im Zweifelsfall ist vor der Durchführung mit dem Trainer Rücksprache zu halten.
3.2 Kurs Raum
Es wird ein Kurs Raum mit genügend Platz und den gängigen Mitteln benötigt:
- Genügend Platz für alle Teilnehmer (Corona)
- Beamer
- Flip Chart
- WLAN
- Genügend Steckdosen
- Getränke, Snaks
- Kantine/Restaurant für Mittags-Pause
3.3 Arbeitsmittel der Teilnehmer
Zugriff auf eine VMware Virtualisierung mit mindestens folgenden Ressourcen:
- 2 vCPU
- 2GB Memory
- 20 GB Disk
- Internet Access via LAN für die VM
Ein Notebook mit WLAN, VMware Workstation und genügend Ressourcen ist absolut ausreichend, soll aber vor dem Kurs Beginn installiert, konfiguriert und getestet sein. Wird ein Remote LAB verwendet, soll vor dem Kurs sichergestellt werden das dies im Kursraum genutzt werden kann. (Zugriff, File Transfer, Copy Paste vom Notebook, …)
4 OpenSource Überblick
4.1 Ursprung
- Angelehnt an MINIX welches als Anschauungs OS von Andrew S. Tannenbaum für den Unterricht entwickelt wurde
- Erster Kernel 1991 von Linus Torvalds (10 000 Zeilen)
- Aktueller Kernel 4.14.x LTS (25'071'693 Zeilen)
4.2 Einsatzgebiete
- Apliances: VCSA, vRA, vRO, vROPS, LI,..., OpenFiler, GreenBone Security Manager...
- Embedded Devices: WLAN AccessPoints, Raspberry Pi, Beagle Bone, many more...
- Super Computer
- Cloud Services: Google, AWS, RackSpace, ...
- Netzwerk Services (Apache,Nginx,Tomcat,Datenbanken,...)
- Mobile Devices
- IoT
- Medizin
- Automobil Industrie
- überall eigentlich ...
4.3 OpenSource verstehen
OpenSource ist nicht einfach eine Lizenz, es ist viel mehr die einzig bislang funktionierende Form von Kommunismus in der Geschichte.
Die Grundsätze von OpenSource sind am einfachsten im Essay von Eric S. Raymond in Die Kathedrale und der Basar beschrieben.
Viele Davon würde sich so mancher Mitarbeiter heute in seiner Firma wünschen
Folgendes sind die Grundsätze dieses Textes:
- Jede gute Software wird von einem Entwickler geschrieben, der ein persönliches Problem lösen will.
- Gute Programmierer wissen, was sie schreiben müssen. Brillante wissen, was sie neuschreiben müssen (und was sie wiederverwenden können).
- Plane, eine Version zu verwerfen; du wirst es sowieso tun.
- Wenn du die richtige Einstellung hast, werden dich interessante Probleme finden.
- Wenn du das Interesse an einem Programm verlierst, ist es deine Pflicht, dieses einem kompetenten Nachfolger zu übergeben.
- Wenn du deine Benutzer als Mitprogrammierer betrachtest, ist dies der einfachste Weg zu schneller Verbesserung und effizientem Debugging.
- Veröffentliche früh. Veröffentliche häufig. Und höre auf die Benutzer.
- Mit einer hinreichend großen Gruppe von Betatestern und Mitentwicklern wird fast jedes Problem schnell erkannt und die Lösung von jemandem gefunden.
- Schlaue Datenstrukturen und einfacher Code (im englischen Original: „dumb code“) funktionieren viel besser als andersherum.
- Wenn du deine Betatester wie deine wertvollste Ressource behandelst, werden sie dies auch werden.
- Fast so gut wie eigene gute Ideen zu haben, ist es, gute Ideen von den Benutzern zu erkennen. Manchmal ist letzteres besser.
- Meist entstehen die brillanten Lösungen aus der Erkenntnis, dass das Problem falsch verstanden wurde.
- Perfektion (im Design) ist nicht erreicht, wenn man nichts mehr hinzufügen kann, sondern wenn nichts mehr entfernt werden kann.
- Jedes Tool soll so funktionieren, wie erwartet. Aber ein wirklich gutes Tool ermöglicht Verwendungszwecke, an die du niemals gedacht hättest.
- Wenn du Schnittstellencode schreibst, verhindere um jeden Preis, den Datenstrom zu verändern – und verwirf nur etwas, wenn dies der Empfänger verlangt.
- Wenn deine Programmiersprache nicht ansatzweise Turing-vollständig ist, kann syntaktischer Zucker dein Freund sein.
- Ein Sicherheitssystem ist nur so sicher wie sein Geheimnis. Vermeide Pseudogeheimnisse.
- Um ein interessantes Problem zu lösen, suche eines.
- Mit ausreichend guter Kommunikation, wie über das Internet, und Führung ohne Zwang, sind viele Köpfe immer besser als einer.
Ein gutes Beispiel für...
- die Kathedrale ist Zimbra, Macintosh, Android, ChromeOS
- den Basar ist Fedora, Arch, Debian
4.3.1 Copy Left
Jeder kennt ein Copyright, das Markante an Linux ist aber die Copyleft Lizenz welche das Gegenteil ist.
Wer das Produkt erweitert verpflichtet sich die Erweiterung zur Verfügung zu stellen.
Die wohl bekannteste Lizenz ist die GPL.
4.3.2 Community
Mitglieder der Community zeichnen sich dadurch aus, sie andere Community Mitglieder und/oder deren Prdukte unterstützen.
Dies kann in ganz vielen Formen geschehen:
- Entwicklung
- QA Testing
- Dokumentation/HowTos/Übersetzungen
- Forums Betreuung/Beiträge
Distributionen wie Fedora, CentOS, Debian, Ubuntu, Arch, ... sind zwar oft exklusiv einer Firma zugeordnet.
Es ist aber nicht möglich Dienstleistungen via SLA darauf zu beziehen, da das fortführen der zum Erhalt notwenidgen Arbeiten durch die Comunity geleistet wird.
4.3.3 Free Beer vs. Free Speak
Mit Forderungen und Negativer Kritik in Foren auf zu treten ist ein effizienter Weg sich nachhaltig unbeliebt zu machen.
Denkt daran, das die meisten Produkte unentgeltlich gepflegt werden, da macht es sich unglaublich schlecht wenn im Forum Fragen stellt welche in der Doku behandelt wurden.
Behandelt die Community Mitglieder wie eure Wertvollsten Mitarbeiter, Sie haben Sich durch Ihr Engagement bereits bewiesen.
Taucht dennoch ein Problem mit einer "Community Supported Software" auf, könnte folgendes Verhalten helfen:
- Wertschätzung
- Erst mal bedanken ist immer eine gute Idee.
- Eine kleine Spende
- Wenn eine Lösung dringend ist hat das Produkt offenbar einen Wert?!
- Genaue Fehler Beschreibung
- So das jeder der das liest das Problem selbst herbeiführen kann
- Ein dediziertes System zur Analyse des Problems und externen Zugang bereit stellen
- Den Zugang bitte nicht in den Foren posten
- Workaround oder Lösung für andere Mitglieder aufbereiten
- Dokumentation, Zusammenfassung, HowTo, ...
Neulich konnte ich ein Problem mit Guacamole (HTML5-Gateway) innerhalb von 24h im Code lösen.
Selbst gute Enterprise Firmen brauchen oft länger um ein Problem zu analysieren, geschweige denn zu Lösen.
5 Linux Derivate
Linux zeichnet sich nicht automatisch damit aus, das es in einer strukturierten und gepflegten Form daher kommt.
Somit haben sich ganz unterschiedliche Formen von Distributionen (gepflegtes Betriebssystem) gebildet.
Jedes mit einem eigenen Fokus und einer eigenen Community.
5.1 Red Hat basierend
CentOS ist die freie Version des Red Hat Enterprise Linux.
In der aktuellen Version 8 ist CentOS in zwei Varianten erhältlich:
- CentOS 8 Stream
- Auf Basis von Fedora Linux (current)
- CentOS 8 (Core)
- Auf Basis von Red Hat Enterprise Linux (stable)
cat /etc/redhat-release
rpm -qa --last | tac
rpm -q --configfiles rsyslog rpm -ql rsyslog | grep systemd systemctl status rsyslog
5.2 Debian basierend
cat /etc/issue.net
apt list --upgradable apt list --installed
5.3 Einloggen und Derivat bestimmen
cat /etc/os-release
6 Installation eines CentOS 8 Core als VM
Die Installation eines CentOS ist sehr einfach, es sind keinerlei Linux Kenntnisse notwendig.
6.1 VM Hardware
Wir erstellen eine VM mit folgender Hardware.
- 2vCPU
- 2 GB Memory (wer hat, nimmt 4 GB)
- 20 GB Disk (wer hat, nimmt 40 GB)
- NIC mit NAT oder nach Bedarf
6.2 Installer Sprache
Dies bestimmt nur die Spache für den Setup Vorgang, dies ist nicht zwingend die System Sprache welche nach der Installation verwendet wird.
6.3 Tastatur Belegung
Die Belegung der Tastatur ist bei VMs etwas problematisch. Je nach Art des Zugriffs auf die Konsole wird das Layout falsch übersetzt.
Das Layout kann nachträglich temporär mit dem Befehl loadkeys umgestellt werden.
6.4 System Sprache
Alle Sprachen auswählen welche vom System zur Verfügung gestellt werden sollen.
Generell ist Englisch zu Empfehlen und ausreichend.
6.5 Netzwerk Konfiguration
- NIC Aktivieren
- Hostname als FQDN: hostname.domain.local
- Configure > TAB: General > [X] Connect automatically with priority
- Configure > TAB: IPv6 > Method: Ignore
- Configure > TAB: IPv4 > Method: Manual > feed settings
6.6 Zeit/Zone/NTP
- Zeitzone wählen: Entsprechend dem Standort der Systeme.
- NTP Schalter aktivieren: Network Time ist nur aktivierbar wenn eine gültige Netzwerk Konfiguration besteht
- NTP Schalter > Zahnrad > NTP Server
- Status Symbol beachten, es zeigt den Zustand des verwendeten NTP Servers
- Pool bedeutet, das der FQDN des NTP mehrere A-Records hat,
- dies ist nicht mit Round-Robin zu verwechseln welches die Multi-Records als einfache Form von Load Balancing verwendet.
- Ein Pool NTP fqdn löst zur Startzeit die dahinter liegenden IPs auf und kann somit aus einem einzigen FQDN eine vollständige Konfiguration ableiten
- Ein NTP Client hat optimalerweise drei oder mehr Zeitserver konfiguiert, dies ermöglicht den Sicheren Betrieb im Split-Brain Fall
root@install:~# host ch.pool.ntp.org ch.pool.ntp.org has address 217.147.223.78 ch.pool.ntp.org has address 46.165.252.57 ch.pool.ntp.org has address 217.147.208.1 ch.pool.ntp.org has address 162.159.200.1
6.7 Partitionierung
Je nach verwendungszweck wird ein Disk Layout gewählt.
Generell ist LVM (Logical Volume Management) mit xfs (Dateisystem Format) Partionen zu Empfehlen. Es bietet grösstmögliche Flexibilität.
Eine Verschlüsselung der Partitionen bedingt die eingabe eines Symetischen Schlüssels bei jedem Start Vorgang.
Es ist zu beachten, das die /boot Partition standardmässig immer noch mit ext4 formatiert wird.
6.7.1 Classic
- Select Harddisk
- Storage Configuration
- (o) Custom
- Done
- Partition Scheme: Standard Partition
- Click here to create them automatically
Es ist empfehlenswert Labels für die Partitionen zu setzen.
6.7.2 LVM
- Select Harddisk
- Storage Configuration
- (o) Custom
- Done
- Partition Scheme: LVM
- Click here to create them automatically
6.7.3 LVM Thin Provisioning
Dies ist für ein Server Betriebsystem nicht notwenig.
Thin Provisionierung wird verwendet um mehr Flexibilität im Storage Bereich zu erreichen.
So zum Beispiel für Filer oder De-Duplizierungs Apliances.
6.7.4 Software
6.7.5 KDUMP
Kdump dient dazu im Falle eines Crashes betriebs relevante Daten zu sammeln und abzuspeichern. Danach wird das System neu gebootet.
Dies ist nützlich, da ein gecrashtes System immer wieder online geht. Genauso ist es aber gefährlich, falls dieser Vorgang unbemerkt bleibt.
6.8 Root Password
Hier ist ein sicheres, Tastatur Layout unabhängiges Passwort zu wählen, das direkt nach der Installation via SSH geändert wird.
6.9 Admin User Erstellung
Die Erstellung eines Admin Users ist optional.
Der User kann Wahlweise als Mitglied der Gruppe Wheel (sudo berechtigt) erstellt werden.
Members der Gruppe wheel können mit dem Befehl sudo su - auf der Console zum root User wechseln.
7 Linux Überblick
Die Gemeinsamkeit aller Linux Distributionen ist der Kernel, und die damit verbundene Lizenz.
Niemand der eine Linux Distribution pflegt programmiert einen eigenen Kernel.
Bekannte Abspaltungen des Ursprünglichen Linux Ursprungs sind:
- Debian basierend (Ubuntu)
- Red Hat basierend (CentOS)
- Slackware basierend (SuSE)
- Gentoo (Chrome OS)
- Arch (System Rescue CD)
Distributionen können unter Distrwatch gefunden werden, es sind ganz schön viele.
Das markanteste an einer jeden Linux Distribution ist wohl der Paket Manager hier sind DPKG (Debian) und RPM (Red Hat) die am weitesten verbreiteten Formate.
7.1 Alles ist eine Datei
- Weitere Informationen:
lscpu cat /proc/cpuinfo lshw -class disk -class storage echo -e 'print devices\nquit\n' | parted
- Geräte: /dev/
- Prozesse: /proc/
- Memory: /dev/, /proc/
- Kernel Parameter: /proc/, /sys/
- Netzwerk Verbindungen: /proc/net/
- Dateisystem
Viele dieser Zugriffe werden über Tools und Bibliotheken abstrahiert: top, lscpu, dstat, ps, ...
7.2 Dateisystem Hierarchie
Unter Linux sind Disks, Partitionen, Prozesse, ... als Dateien abgebildet und werden darüber referenziert.
Anbei eine Übersicht der wichtigsten Verzeichnisse und deren Inhalt
- /
Das Verzeichnis / (auch "Wurzelverzeichnis" genannt) stellt den Basispfad des Systems dar.
- /bin
In diesem Verzeichnis ("binaries") befinden sich wichtige Programme für Anwender, die immer verfügbar sein müssen, beispielsweise die Shell bash oder das Programm ls zur Anzeige von Verzeichnis-Inhalten.
- /boot
In diesem Verzeichnis befinden sich die zum Hochfahren des Systems unbedingt erforderlichen Dateien. Am wichtigsten ist dabei der Kernel, üblicherweise eine Datei mit dem Namen vmlinuz-versionsname (andere Namen sind ebenfalls möglich).
- /dev
In diesem Verzeichnis ("devices") befinden sich ausschließlich Geräte-Dateien. Diese speziellen Dateien stellen eine einfach nutzbare Schnittstelle zur Hardware dar.
Für jede Festplatte und ihre Partitionen existiert im /dev/-Verzeichnis ein eigener Eintrag. Beispielsweise bezeichnet, sofern vorhanden, /dev/hda ist die erste IDE-Festplatte, /dev/sda die erste SCSI-Festplatte im System. Höhere Buchstaben (sdb, sdc) stellen weitere Festplatten oder externe Speichermedien dar, Zahlen am Ende (sda1, sda2) benennen die Partitionen der Festplatten.
- /etc
In diesem Verzeichnis ("etcetera") befinden sich zahlreiche Konfigurationsdateien, die Einstellungen zu den installierten Programmen sowie grundlegende Systeminformationen enthalten; viele dieser Dateien haben eigene Manpage, die in einer Shell mittels eines Aufrufs der Form man fstab aufgerufen werden kann.
- /home
In diesem Verzeichnis befinden sich die persönlichen Verzeichnisse der einzelnen Benutzer.
- /lib
In diesem Verzeichnis ("libraries") befinden sich die wichtigsten Funktionsbibliotheken des Systems; diese Dateien sollten nicht manuell verändert werden.
- /media
In diesem Verzeichnis werden externe Datenträger als Unterverzeichnisse eingebunden. Bei aktuellen Ubuntu- und LinuxMint-Versionen werden automatisch erkannte USB-Sticks, Speicherkarten, externe Festplatten usw. in ein Verzeichnis der Art /media/benutzername/name-des-datentraegers eingebunden.
- /proc
In diesem Verzeichnis ("processes") sind keine gewöhnlichen Dateien enthalten, sondern Schnittstellen zum Linux-Kernel. Jedes laufende Programm wird hier in einem Unterverzeichnis geführt, dessen Dateien viele Informationen beispielsweise über den aktuellen Programmstatus enthalten.
Zudem gibt es eine umfangreiche Verzeichnisstruktur mit Daten über den Kernel und die Hardware des Systems.
- /root
In diesem Verzeichnis befinden sich die (persönlichen) Dateien des Systemverwalters ("Root", "Superuser"). Das Verzeichnis liegt im Wurzelverzeichnis, damit der Systemverwalter auch dann auf seine (Konfigurations-)Dateien zugreifen kann, wenn durch einen Fehler der Zugriff auf andere Partitionen nicht mehr möglich ist.
- /sbin
In diesem Verzeichnis ("superuser-binaries") befinden sich ebenfalls ähnlich wie im /bin-Verzeichnis wichtige Programme, die allerdings für den Systemverwalter gedacht sind. Sie erfüllen Funktionen, auf die ein normaler Benutzer keinen Zugriff hat.
- /srv
In diesem Verzeichniss werden Daten abgelegt welche von Serverdiensten bereitgestellt werden.
- /tmp
Dieses Verzeichnis ("temporary") kann von jedem Benutzer und jedem Programm als temporäre Ablage für Dateien verwendet werden.
Damit sich Benutzer nicht gegenseitig ihre Dateien löschen, ist das sogenannte Sticky-Bit dieses Verzeichnisses gesetzt.
- /usr
In diesem Verzeichnis ("unix system ressources") befinden sich der größte Teil der installierten Software. Auf vielen Systemen befinden sich innerhalb von /usr mehr Daten als in allen anderen Dateien zusammen. Die ausführbaren Programmdateien sind meist in /usr/bin, Programmbibliotheken in /usr/lib abgelegt.
- /var
In diesem Verzeichnis ("variables") befinden sich hauptsächlich Dateien, die sich ständig verändern. Beispielsweise werden hier Log-Dateien gespeichert.
- /opt
In diesem Verzeichnis ("optional") werden bei Bedarf sehr große Programme gespeichert, die nicht unmittelbar zum System gehören. Bei knappem Festplattenspeicher kann dieses Verzeichnis wie das /home-Verzeichnis auf einer externen Festplatte oder einer anderen Partition abgelegt werden.
7.3 Welche Bedeutung hat Mail?
E-Mail wird in Linux seit jeher als Weg benutzt um den SystemAdministrator zu kontaktieren.
Linux Dienste und Server Hardware überwachen sich nach Möglichkeit selber und informieren den root User wenn handlungsbedarf besteht.
Deshalb soll ein produktives Linux System immer mit einer gültigen E-Mail Konfiguration betrieben werden.
Die Regeln sind relativ einfach:
- Jedes Linux System kann E-Mails versenden (interne Domain ist ausreichend)
curl -s https://raw.githubusercontent.com/ryran/xsos/master/xsos | bash -s -- -x -a | mail -s "System Report auf $HOSTNAME" root
- Die E-Mail des root users auf einem Linux System wird an das Unix Team weiter geleitet
grep ^root /etc/aliases
- Cron Jobs redirecten den stdout nach /dev/null und senden ihre Ausgaben an root
cat /etc/anacrontab
- Im Optimal Fall sendet ein Linux System keine eMails
- Wenn ein System täglich mailt, wird die eMail mit der Zeit nicht mehr beachtet. Monitoring oder Zentrales LogManagement sind hier angesagt.
Das Problem an dieser Sache ist gleich wie bei Backup und Monitoring.
Wird die Konfiguration nicht beim Setup geprüft, zeigen sich die Probleme erst im Nachhinein
7.4 Consolen
Eine Konsole ist ein lokales Terminal, welches sich physisch mit dem Computer verbindet (VGA, Serial, IPMI, ...)
- Standardmässig startet Linux 7 lokale Konsolen (/dev/ttyX)
- chvt X wechselt zwischen den consolen
- Aus X11 (TTY7) kann mit <CTRL>+<ALT>+<Fxx> zwischen den Consolen gewechselt werden
- Aus einer Text Console kann mit <ALT>+<Fxx> zwischen den Consolen gewechselt werden
Konsolen besitzen ein eigenes Tastatur Layout das von der Grafik (X11/Wayland) losgelöst ist.
Dies kann wie folgt umgestellt werden:
loadkeys us loadkeys sg loadkeys --help
7.4.1 Login
- Console: beim starten einer Console wird mittels helper ein login Prozess aufgerufen
- SSH: Stellt via Netzwerk ein SuperSet an Funktionalität der Console zur Verfügung, zB PortForwarding, DisplayForwarding, Language, FileTransfer, ...
- X11: Beim Start einer X11 Session wird ein Display Manager (GDM) aufgerufen, welcher einen Login Screen bereitstellt
- Eine Anmeldung wird in jedem Fall von PAM (Pluggeable Authentication Module) durchgeführt
- Jede User Transition wird von PAM Auditiert
- /etc/pam.d/ beinhaltet das Regelwerk für die Auditierung
- ACHTUNG: Aenderungen werden sofort aktiv, ein Config Fehler führt zur deaktivierung der Transtion (kein Login mehr möglich)
7.4.2 Shell
- Eine erfolgreiche Anmeldung an der Console startet einen Prozess der pro User zugeordnet wird
- getent passwd zeigt die Default Shell eines Users an
- Normalerweise wird hier eine Shell gestartet
- Bash ist die am weitesten verbreitete Shell und auf fast allen Systemen installiert
- Es kann jedoch auch ein Script oder eine API geladen werden (siehe VCSA, GSM)
7.5 Hilfe finden
7.5.1 man
man ist das System-Anzeigeprogramm für die Handbuchseiten. Jedes an man übergebene Argument Seite ist normalerweise der Name eines Programms oder einer Funktion.
rpm -qlf $(which man) | grep -e /etc/ -e systemd cat /usr/lib/systemd/system/man-db-cache-update.service mandb # updated die man Datenbank man -k Nice # durchsucht die man-db nach einem Thema man -K IOWeight # durchsucht die man-db nach Inhalt der Artikel man -Kw IOWeight #
man ist in Sektionen unterteilt, diese beinhalten bestimmte Aspekte eines Programms:
- Ausführbare Programme oder Shell-Befehle
- Systemaufrufe (Kernel-Funktionen)
- Bibliotheksaufrufe (Funktionen in Programmbibliotheken)
- Spezielle Dateien (gewöhnlich in /dev)
- Dateiformate und Konventionen, z. B. /etc/passwd
- Spiele
- Verschiedenes (einschließlich Makropaketen und Konventionen), z. B. man(7), groff(7)
- Befehle für die Systemverwaltung (in der Regel nur für root)
- Kernel-Routinen [nicht Standard]
Man Pages erklären die Benutzung eines Programms und zeigen dies oft anhand von Beispielen auf.
man -k passwd man 1 passwd man 5 passwd cat /etc/passwd
Der Update von manpages wird hier abgehandelt:
- Dieser Service wird beim booten aufgerufen
[root@saturn ~]# cat /usr/lib/systemd/system/man-db-cache-update.service [Unit] DefaultDependencies=no After=local-fs.target Before=reboot.target shutdown.target halt.target JobTimeoutSec=15min [Service] Type=oneshot TimeoutStartSec=infinity Environment=MAN_NO_LOCALE_WARNING=1 EnvironmentFile=/etc/sysconfig/man-db ExecStart=/bin/sh -c '[ "$SERVICE" != "no" ] && /usr/bin/mandb $OPTS || true' Nice=19 IOWeight=20
- ebenfalls überwacht rpm bei der installation von software ob neue man-pages dazu gekommen sind
[root@saturn ~]# rpm -q --filetriggers man-db transfiletriggerin scriptlet (using /bin/sh) -- /usr/share/man if [ -x /usr/bin/systemd-run -a -x /usr/bin/systemctl ]; then /usr/bin/systemd-run /usr/bin/systemctl start man-db-cache-update >/dev/null 2>&1 || : fi # update cache transfiletriggerpostun scriptlet (using /bin/sh) -- /usr/share/man if [ -x /usr/bin/systemd-run -a -x /usr/bin/systemctl ]; then /usr/bin/systemd-run /usr/bin/systemctl start man-db-cache-update >/dev/null 2>&1 || : fi
7.5.2 info
Info Seiten haben mehr Features als man pages, hauptsächlich aber, das diese untereinander verlinkt werden können. Die Navigation bei pinfo ist abweichend von man und info, siehe man pinfo
info # alter viewer welcher nur mit Tastatur über links springen kann pinfo # neuer viewer, der auch auf Maus Input reagiert
pinfo passwd
- Maintainer Dokumentationen
- Helper Scripts
- Beispiel Konfigurationen (Templates)
- Weiterführende Informationen
rpm -ql bash-com<tab> rpm -ql bash-completion | grep /doc/ less /usr/share/doc/bash-completion/README.md find /usr/share/doc/ | grep -i bash grep -Rl 'thin.*provis' /usr/share/doc/
7.5.4 bash auto completion
Autocomplet ist eine Ergänzung zu bestehenden shell Befhelen, diese werden in dein meisten Fällen nicht vom Entwickler der Programme selbst gepflegt.
rpm -q bash-completion || dnf -y install bash-completion rpm -ql bash-completion nmcli<tab><tab> nmcli c<tab>
Anbei ein kleines Bespiel wie die auto compleation für eigene Belange erweitert werden kann
ssh -<tab><tab> #alle optionen von ssh werden mit auto-complete angezeigt complete -p ssh # die complete konfiguration von ssh wird angezeigt complete -F _ssh -W 'jumphost web1 web2 nas1' ssh # eine neue option wird angezeigt (dies kann in .bashrc eingetragen werden) ssh -XYC -lchris web<tab><tab>
7.6 Dateien Editieren via VIM
- VI (VISUAL EDITOR) heist der seit Urzeiten unter Unix/Linux bestehende Datei Editor
- VIM (VI IMPROVED) heist der Nachfolger des VI welcher rückwärts kompatibel ist
vi schreckt neue Benutzer zunächst durch eine typische Eigenart der unix-basierten Editoren:
- Es können nach dem Start nicht intuitiv Zeichen eingegeben werden.
Dieser Umstand ist darin begründet, dass alle vi-basierenden Editoren mindestens zwei unterschiedliche Betriebsarten aufweisen, zwischen denen nach Bedarf umgeschaltet werden muss:
- Den Befehlsmodus (command mode):
In diesem Modus befindet man sich automatisch nach Start des Editors. Diese Betriebsart erlaubt die freie Bewegung im Text, Kopieren/Löschen/Umsetzen/Verschieben von Textteilen, Schreiben in andere Dateien oder Absetzen von Systembefehlen (ohne Beendigung des Editors).
Wenn man sich im Befehlsmodus befindet, dann springt der Cursor nach Eingabe von :, /, ? oder ! (das entspricht Einleitungen von bestimmten Befehlen) in die unterste Zeile des Bildschirms (die Editoren vi/vim wechseln dadurch in einen dritten Modus, den last line mode).
- Den Einfügemodus (insert mode):
Der Einfügemodus unterscheidet die Betriebsarten einfügen und überschreiben, zwischen denen mit "Umweg" über den Befehlsmodus nach Bedarf umzuschalten ist ([Esc] + [i, a oder R]).
Den Einfügemodus erreicht man aus dem Befehlsmodus heraus durch Eingabe von einem der Befehle a, A, i, I, c, C, o, O, R, s oder S.
Zum Verlassen des Einfügemodus muss Esc betätigt werden.
7.6.1 Übung
Um ein wenig Übung im Umgang mit dem Editor VIM zu bekommen benutzen wir das mitgelieferte Tutorial.
Dazu benötigst Du ca. 30 Minuten Zeit.
which vimtutor >/dev/null 2>&1 || dnf -y install vim-enhanced vimtutor
7.7 System Meldungen
Jede Software hat Meldungen welche relevante Vorgänge mitteilt.
Anbei die gängigsten Formate/Standards.
7.7.1 Log Files
Klassische Logfiles sind der unabhängigste und zugleich schlechteste Weg um Mitteilungen einer Applikation zu speichern.
Logfiles befinden sich meistens unter /var/log/
lsof | grep /var/log/
7.7.2 Syslog
rpm -q nmap-ncat || yum -y install nmap-ncat echo 'This is a test via /dev/log xxxxxx' | nc -u -U /dev/log logger --tag myapp --priority local3.alert test alert xxxxxx grep xxxxxx /var/log/messages
Syslog ist ein 1980 von Eric Alman entwickeltes System, welches zentral Meldungen von anderen Diensten und Daemonen des Systems einsammelt, und beispielsweise in Logdateien schreibt, zum Beispiel nach /var/log/messages oder über das Netzwerk auf einen zentralen Logserver schickt.
Syslog wird mit zwei Tags versehen welche jede Meldung begleiten. Diese werden im RFC 5424 beschrieben:
- Severity(Hierarchisch geordnetes Log Level)
- emerg
- alert
- crit
- err
- warning
- notice
- info
- debug
- Facility (Applikations Kategorie)
- authpriv
- cron
- daemon
- ftp
- kern
- lpr
- news
- syslog
- user
- uucp
- local0..7
- security
7.7.3 Journal
logger -p err help me now logger -p info can you please help me journalctl --priority info --catalog --boot --lines 10 journalctl --priority err --catalog --boot --follow
Mit RHEL7 wird rsyslogd mit journald erweitert welches die Logdaten in eine strukturierte, indizierte Binärdateien, die hilfreiche Metadaten enthalten und schneller und einfacher zu durchsuchen sind. Journaldateien werden standardmäßig nicht dauerhaft gespeichert.
7.8 Administration via SSH
SSH ist der Weg um Linux Consolen über das Netzwerk auf einem sicheren Weg zu benutzen.
Ein SSH Server ist Grund Bestandteil einer jeden Linux Distribution. Clients sind für jedes netzwerkfähige Betriebssystem vorhanden.
SSH bietet folgende Funktionalität:
- Consolen Access (Shell)
- File Transfer (scp,sftp,rsync,sshfs)
- Port Forwarding (forward, reverse)
- X11-Forwarding (Benötigt einen X11/Wayland Server)
Um ein System zu Administrieren sind einige Kenntnisse Notwendig.
Ein guter Start bieten diese Seiten:
- [https://www.ernstlx.com/linux90bash.html]
- [https://explainshell.com/]
- [https://www.bitbull.ch/wiki/index.php/Linux_Short_Reference]
- [https://www.commandlinefu.com/commands/browse]
7.8.1 tmux/screen virtual terminal
Wenn eine SSH Verbindung während einem System Upgrade abreisst, so stirbt die Session und all Ihre Prozesse beim Logout.
Hier zwei Beispiele welche die Problematik verdeutlichen sollten:
Ein alter Kollege von mir hat mal am beim Warten am Flughafen Terminal ein System de ETH upgraded.
Leider ist die Session abgebrochen als er den Notebook zum CheckIn schliessen musste.
Das System wurde in einem un-bootbaren Zustand hinterlassen.
Da es sich um ein Cloud-basierendes System mit File-Level Backup handelte hat die Wiederherstellung mehrere Tausend Franken gekostet.
Ein Datenbank Administrator hat via SSH eine DB-Migration angestossen und den Notebook über nacht laufen lassen.
Leider ist der Notebook über nacht in den Standby Modus gefallen und die SSH Verbindung hat abgerissen, ebenso die Migration
Die Datenbank musst am Morgen danach aus dem Backup wiederhergestellt werden
Um dies zu vermeiden kann auf dem Zielsystem ein Virtuelles Terminal geöffnet werden. Reisst die Verbindung ungewollt ab, bleibt das virtuelle Terminal erhalten.
Screen ist nur auf CentOS 7 verfügbar und wird nicht mehr aktiv weiter entwickelt.
TMUXist der Nachfolger von screen er bietet mehr Flexibilität, Sicherheit und Neuerungen.
Tmux ist für CentOS 7 und 8 via Basis-Repository installierbar.
Hier das Beispiel einer TMUX verbindung:
- Auf Ziel System (COS8) verbinden und TMUX Session erstellen
[ssh-client@lts1 ~]$ ssh -lroot nfs [root@nfs ~]# dnf -y install tmux
[root@nfs ~]# tmux new -s migration
Die Session bekommt nun ein grünes Banner auf der Unterseite
- Nun ein Komando starten welches lange läuft
[root@nfs ~]# for i in {1..999}; do echo this is important $i ; sleep 1;done this is important 1 this is important 2 this is important 3 ...
- Laufende Verbindung trennen
- Tippe: CTRL + b
- Tippe: d
Die Verbindung zum Terminal wurde gelöst, es kann ausgeloggt werden:
[detached (from session migration)] [root@nfs ~]# exit logout Connection to nfs closed. [ssh-client@lts1 ~]$
- Verbindung am Zielsystem wieder aufnehmen
[ssh-client@lts1 ~]$ ssh -lroot nfs [root@nfs ~]# tmux ls migration: 1 windows (created Tue Nov 3 15:51:56 2020) [118x26] [root@nfs ~]# tmux a -t migration
Eine TMUX Session kann auch von mehreren Benutzern gleichzeitig geöffnet werden.
Dies ermöglicht das teilen einer SSH Session mit einem Kollegen
7.8.2 Key Based Authentication
Um sich an zu melden kann ein SSH Key verwendet werden, der die Möglichkeit bietet den Zugriff mittels asymmetrisch verschlüsselter authentivizierung zu sichern.
Der Private Key wird idealerweise mit einer Passphrase geschützt welche jedoch optional ist.
- SSH Keypair auf Client System erstellen
- wird bei Passphrase 2x Enter eingegeben, so wird der private Key nicht verschlüsselt
[ssh-client@lts1 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ssh-client/.ssh/id_rsa):
Created directory '/home/ssh-client/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ssh-client/.ssh/id_rsa.
Your public key has been saved in /home/ssh-client/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:/+0YSOSl/TGx7Fp73hs8ZihPbKWli/cYL81G1JlwWG0 ssh-client@lts1
The key's randomart image is:
+---[RSA 3072]----+
| o..|
| o .E|
| . . +.+|
| o + . *.|
| S + . *o |
| o ..oB+ |
| o..OB* |
| .*OB==|
| .==B*+|
+----[SHA256]-----+
- Public Key auf das Zielsystem übertragen
[ssh-client@lts1 ~]$ ssh-copy-id root@nfs
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ssh-client/.ssh/id_rsa.pub"
The authenticity of host 'nfs (192.168.99.99)' can't be established.
ECDSA key fingerprint is SHA256:EIrh8QBEiY2x74f........57ritT3RbmDQvi5g.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@nfs's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@nfs'"
and check to make sure that only the key(s) you wanted were added.
- Key benutzen
[ssh-client@lts1 ~]$ ssh -lroot nfs Enter passphrase for key '/home/ssh-client/.ssh/id_rsa': Last login: Tue Nov 3 14:33:48 2020 from 192.168.223.59 [root@nfs ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 40G 0 disk ├─vda1 253:1 0 38G 0 part / └─vda2 253:2 0 2G 0 part [SWAP] vdb 253:16 0 1000G 0 disk /srv [root@nfs ~]# exit logout Connection to nfs closed.
7.8.3 Config Details
[ssh-client@lts1 ~]$ ls -l .ssh -d drwx------ 2 ssh-client ssh-client 57 Nov 3 14:30 .ssh
Das .ssh Verzeichnis beinhaltet die Benutzer spezifische Konfiguration und wird bei falsch gesetzter Berechtigung ignoriert.
[ssh-client@lts1 ~]$ ls -l .ssh
total 12
-rw------- 1 ssh-client ssh-client 2655 Nov 3 14:23 id_rsa
-rw-r--r-- 1 ssh-client ssh-client 569 Nov 3 14:23 id_rsa.pub
-rw-r--r-- 1 ssh-client ssh-client 180 Nov 3 14:30 known_hosts
id_rsa* beeinhaltet das asymmetrische Schlüsselpaar (public/private)
known_hosts speichert die Fingerprints der Zielsystem public Keys mit welchen bereits gearbeitet wurde.
Beim ersten Verbinden wird eine Bestätigung gefordert.
[ssh-client@lts1 ~]$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB...pkiA0a3Lyry3oTqLtVyNnM= ssh-client@lts1
Um den passwort losen Zugriff auf ein System ein zu richten wird der public-key des clients auf das Ziel System übertragen.
[ssh-client@lts1 ~]$ ssh -lroot nfs Enter passphrase for key '/home/ssh-client/.ssh/id_rsa': Last login: Tue Nov 3 14:38:06 2020 from 192.168.223.59
[root@nfs ~]# ls -l .ssh
total 24
-rw-------. 1 root root 1836 Nov 3 14:30 authorized_keys
-rw-r--r--. 1 root root 43 Feb 11 2018 config
-rw-------. 1 root root 1675 Dec 7 2015 id_rsa
-rw-r--r--. 1 root root 390 Dec 7 2015 id_rsa.pub
-rw-r--r--. 1 root root 6743 Oct 30 07:36 known_hosts
[root@nfs ~]# cat .ssh/authorized_keys from="192.168.99.43" ssh-rsa AAAAB3Nz...Vp8C3Lyry33613U8HZ root@ansible.office.bitbull.ch ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB...pkiA0a3Lyry3oTqLtVyNnM= ssh-client@lts1
Auf dem Ziel System des passwort losen Zugriffs wird der Schlüssel als Zeile in die Datei authorized_keys eingetragen
Es können weitere Optione verwendet werden um den Key-basierenden Zugriff weiter ein zu schränken.
Um die Passphrase eines verschlüsselten Public Keys für die bestehende Session zu speichern kann folgendes Komando verwendet werden
ssh-agent > /tmp/.k ; . /tmp/.k ; rm -f /tmp/.k ; ssh-add
7.8.4 File Transfer via SSH
File Transfer zwischen Linux Systemen werden im Normalfall NICHT mit Server Diensten wie NFS, CIFS, ... übertragen.
Mit SCP, SFTP, SSHFS und RSYNC werden standardmässig via ssh übertragen.
Der Linux Ansatz "Alles ist eine Datei" ermöglicht hier das übertragen von Dateisystemen, Paritionen, Tapes, Verzeichnissen, VMs, Listen Ports, IPs, ...
Hier einige Beispiele:
7.8.4.1 SCP
[ssh-client@lts1 ~]$ scp root@nfs:/etc/hostname /tmp/ hostname 100% 4 10.1KB/s 00:00 [ssh-client@lts1 ~]$ cat /tmp/hostname nfs [ssh-client@lts1 ~]$ rm -fv /tmp/hostname removed '/tmp/hostname'
7.8.4.2 SFTP
[ssh-client@lts1 ~]$ sftp root@nfs Connected to nfs. sftp> lcd /tmp sftp> get /etc/hostname Fetching /etc/hostname to hostname /etc/hostname 100% 4 0.2KB/s 00:00 sftp> exit [ssh-client@lts1 ~]$ cat /tmp/hostname nfs [ssh-client@lts1 ~]$ rm -fv /tmp/hostname removed '/tmp/hostname'
7.8.4.3 SSHFS
[root@lts1 ~]# dnf config-manager --enable PowerTools [root@lts1 ~]# yum -y install fuse-sshfs
[ssh-client@lts1 ~]$ mkdir -v $HOME/srv mkdir: created directory '/home/ssh-client/srv' [ssh-client@lts1 ~]$ sshfs -o cache=yes -o kernel_cache -o Ciphers=aes128-gcm@openssh.com -o Compression=no root@nfs:/srv $HOME/srv [ssh-client@lts1 ~]$ df $HOME/srv Filesystem 1K-blocks Used Available Use% Mounted on root@nfs:/srv 1031987352 821993948 209977020 80% /home/ssh-client/srv [ssh-client@lts1 ~]$ ll /home/ssh-client/srv/nfs/data/ total 28 drwx------ 1 root root 4096 Mar 23 2020 backup drwxr-x--- 1 chris family 4096 Jun 22 11:11 books drwxr-x--- 1 chris family 4096 Sep 29 20:08 movies drwxr-x--- 1 chris family 12288 Jan 26 2019 music
7.8.4.4 RSYNC
[ssh-client@lts1 ~]$ rsync -av root@nfs:/etc/hostname /tmp/ receiving incremental file list hostname sent 43 bytes received 98 bytes 282.00 bytes/sec total size is 4 speedup is 0.03 [ssh-client@lts1 ~]$ cat /tmp/hostname nfs [ssh-client@lts1 ~]$ rm -fv /tmp/hostname removed '/tmp/hostname'
7.9 Berechtigungen
Die Posix Datei Berechtigungen bestehen seit Anbeginn des Computer Zeitalters.
Weitere Berechtigungs Systeme wie ACL, NFS4x, ... werden als Superset hinzugefügt.
7.9.1 Posix
Eine gute Einleitung in die Unix Datei Rechte ist auf Wikipedia zu finden.
Bitte lese diese Einleitung und erkläre danach die folgende Übung
[root@nfs ~]# mkdir /srv/tmp [root@nfs ~]# cd /srv/tmp/ [root@nfs ~]# grep -i umask /etc/login.defs UMASK 077 [root@nfs tmp]# umask 0022 [root@nfs tmp]# touch 1 [root@nfs tmp]# umask 0077 [root@nfs tmp]# umask 0077 [root@nfs tmp]# touch 2 [root@nfs tmp]# ls -l 1 2 -rw-r--r--. 1 root root 0 Nov 3 16:41 1 -rw-------. 1 root root 0 Nov 3 16:41 2 [root@nfs tmp]# chown -v chris.family 1 changed ownership of '1' from root:root to chris:family [root@nfs tmp]# chmod -v o-rwx 1 mode of '1' changed from 0644 (rw-r--r--) to 0640 (rw-r-----) [root@nfs tmp]# ls -l 1 -rw-r-----. 1 chris family 0 Nov 3 16:41 1
7.9.2 ACLs
ACLs sind ein Superset der Standard Posix ACLs. Sie ermöglichen eine feinere Unterteilung der Rechte. Details dazu sind in der ACL RefCard beschrieben.
7.10 Kernel
- Linux Basiert auf einem Monolithischen Kernel
- Ein monolithischer Kernel ist ein Kernel, in dem nicht nur Funktionen zu Speicher- und Prozessverwaltung und zur Kommunikation zwischen den Prozessen, sondern auch Treiber für die Hardwarekomponenten und möglicherweise weitere Funktionen direkt eingebaut sind.
- Treiber und Kernel Funktionalität wird über Module bei Bedarf geladen (XFS, KVM, SCSI, NET, ...)
- Dies ermöglicht das auf einem AccessPoint und einem DB Server exakt der gleiche Kernel ausgeführt werden kann
- Schlechter Treiber Code kann jedoch ein ganzes OS mit sich reissen (Gefahr von "Vendor Closed Source Treibern")
- Bei einem Mikrokernel kann der defekte Bereich neu geladen werden, was aber auf Grund der abhängigkeiten (Appkikation, Netz, ...) in der Praxis keine besseren Resutlate bringt.
7.10.1 Treiber sind Kernel Module
Kern Funktionalität und Treiber sind in Kernel Modulen zusammengefasst.
Dies bedingt das die Quellen aller Treiber offen zur Verfügung stehen.
Ist dies nicht der Fall, werden die Module nicht in den Vanilla Kernel aufgenommen.
Aus diesem Vanilla Kernel werden die Kernel aller Linux Distributionen abgeleitet.
Hier entsteht aber genau das erste Problem für eine Enterprise Distribution.
Wer garantiert mir ob meine neuen teuren Server auch wirklich mit Linux performant laufen?
Closed Treiber sind in der Community offenkundig verhasst. Wie zum Beispiel dieses provokative Statement von Linus zeigt.
Diese werden auch von den wenigsten Enterprise Distros supported und wenn dann nur für sehr hohe Gebühren an die Hersteller.
Ein manuell kompiliert und ins System geladenes Kernel Modul wird nach einem Kernel-Update des Betriebs Systems nicht mehr funktionieren.
7.10.2 Mehrere Kernel
Linux unterstützt standardmässig das Auswählen eines Kernels oder dessen Optionen beim System Start.
Standardmässig wird immer der neuste Kernel gestartet.
- Dies ermöglicht im Problemfall das System im "alten Kernel" welcher vor dem Update verwendet wurde zu booten.
- Des weiteren können Optionen wie zum Beispiel ein "Rettungs Modus" gewählt werden.
- Darin kann eine Reparatur eines Systems vorgenommen werden
7.11 Boot Vorgang
- Vom Bootloader wird immer ein Kernel in eine RamDisk geladen, diese enthält zum Booten benötigte Konfigurationen und Programme
- Dem Kernel übergebene Start Parameter können unter /proc/cmdline geprüft werden
7.11.1 Grub
Dies ist der Bootloader welcher die Startoptionen zur Verfügung stellt.
Hier können Kernel und Boot Optionen gewählt werden.
- Auswahl der installierten Betriebsystem Kernel
- Boot Optionen wie Rescue-Mode
Der Bootloader kann mit einem Passwort vor ungewollter Modifikation geschützt werden.
7.11.2 SystemV
- Bis und mit RHEL6 wurde Linux nach dem SystemV Konzept gebootet.
- Dieser Standard kommt aus den frühen Unix Tagen und ermöglicht ein einfaches, sequentielles starten von Diensten und Funktionen.
- Um verschiedene Runlevels zu ermöglichen wurde jeweils ein Directory pro Runlevel benutzt
- Die zentrale Konfigurations Datei eines SystemV Systems ist /etc/inittab
- Die Start und Stop Scripte (/etc/rc.d/init.d/*) der Dienste wurden jeweils mit K (kill) oder S (start) in die Runlevel Directories gelinkt (/etc/rc.d/rcX.d)
- Folgende Standard Runlevel haben sich etabliert:
- 0 – halt
- 1 – Single user mode
- 2 – Multiuser, without NFS
- 3 – Full multiuser mode
- 4 – unused
- 5 – X11
- 6 – reboot
- Das Runlevel kann mit dem init Befehl gewechselt werden: init 6 -> reboot
7.11.3 SystemD
systemctl --all --state=failed systemctl --type service list-unit-files
echo xxxxxx >> /etc/chrony.conf systemctl restart chronyd sleep 1 systemctl --all --state=failed systemctl status chronyd
sed -i '/xxxxxx/d' /etc/chrony.conf systemctl restart chronyd sleep 1 systemctl --all --state=failed systemctl status chronyd
- Mit RHEL7 wurde SystemD eingeführt, welcher ein dynamisches laden von Diensten und deren Abhängikeiten ermöglicht.
- So kann zB Tomcat mit einer Abhängigkeit zum Netzwerk Dienst konfiguriert werden.
- Ein Restart des Netzwerks kann beispielsweise automatisch einen Restart des Tomcat auslösen
- Die Verwaltung von SystemD Diensten ist aufwändig, aber sehr mächtig
- ACHTUNG: Verändern Sie NIE SystemD Service Dienste! Kopieren Sie diese immer nach /etc/systemd/system/
8 Basis- Wissen und Basis- Konfiguration
8.1 Sprache
Falls bei der Installation eine falsche Sprache gewählt wurde oder für das System noch keine locale gesetzt wurden können wir das auch ganz leicht nachholen. Wir verwenden Englisch als Standard Sprache.
Das die Keyboard Einstellungen wirken sich nicht auf SSH Sessions aus, sie sind nur für Konsolen Logins relevant.
localectl env | grep en_US
localectl list-locales | grep ^de localectl set-locale LANG=de_DE.utf8
localectl list-keymaps | grep ^ch localectl set-keymap ch-legacy
dnf search langpack dnf search langpack-de dnf install glibc-langpack-de man --help LANG=de_DE.UTF-8 man --help
8.2 YUM/DNF Paket Manager
DNF (Dandified Yum) ist ein Paketmanagement-System, das für RPM]-basierte Linux-Systeme entwickelt wurde. Mit dem Kommandozeilenprogramm lassen sich RPM-Software-Pakete suchen, installieren und aktualisieren. DNF besitzt eine Plugin-Schnittstelle, um leicht Funktionalität hinzuzufügen. Über seine Modulschnittstelle kann es auch von anderen Python-Programmen genutzt werden.
8.2.1 Repositories
ls -l /etc/yum.repos.d/*.repo rpm -qf /etc/yum.repos.d/*.repo dnf search release
Unter Linux wird es nach Möglichkeit vermieden Software "von Hand" auf die Systeme zu tragen. Deshalb ist ein integriertes Software Management System fester Bestandteil.
Die Verschiedenen Kanäle, nachfolgend Repositories genannt sind in Form von Text Dateien (/etc/yum.repos.d/*.repo) auf dem System hinterlegt.
Diese Repositoriy Konfig Files werden optimalerweise ebenfalls über Pakete verwaltet, was eine manuelle Bearbeitung weitgehend vermeidet.
8.2.2 Geschichte
DNF entstand 2012 als Fork von YUM3.4 und ist seit Fedora 18 in den Repositories vorhanden. In Fedora 22 wurde der Standard-Paketmanager YUM durch DNF abgelöst.
8.2.3 Vorteile DNF zu YUM
- DNF arbeitet schneller und benötigt weniger RAM
- DNF läuft im Gegensatz zu YUM sowohl unter Python 2 als auch Python 3.
- Paketabhängigkeiten werden besser aufgelöst
8.2.4 Paket installieren
dnf install <Paket>
8.2.5 Paket suchen
dnf search <Suchbegriff>
8.2.6 Pakete aktualisieren
dnf update
8.2.7 Gesammtes System aktualisieren
Ist die gesammte Software eines Linux Systems über Repositories installiert worden kann ein Update mit dnf durchgeführt werden.
dnf makecache dnf list --upgrade dnf upgrade
8.2.8 Systeme automatisch aktualisieren
Für Systeme welche nicht zentral verwaltet werden empfieht es sich, diese automatisch mit Updates zu versorgen.
Dies wird wie folgt eingerichtet:
dnf install dnf-automatic grep apply /etc/dnf/automatic.conf apply_updates = no sed -i 's/^apply_updates.*/apply_updates = yes/' /etc/dnf/automatic.conf grep apply /etc/dnf/automatic.conf apply_updates = yes systemctl enable dnf-automatic.timer --now
8.2.9 Weblinks
8.3 Partitionen
lsblk # uebersicht der blockdevice konfiguration blkid # uebersicht der blockdevice bezeichnungen (labels)
Die Namen von Festplatten und Partitionen unter Linux sind teilweise unterschiedlich zu denen bei anderen Betriebssystemen. Sie müssen die Namen kennen, die Linux nutzt, wenn Sie Partitionen erstellen und ins Dateisystem einbinden. Hier ein Basis-Namensschema:
- Die erste SCSI-Festplatte (nach der SCSI-ID) heisst /dev/sda.
- Die zweite SCSI-Festplatte (nach der SCSI-ID) heisst /dev/sdb und so weiter.
- Das erste SCSI-CD-ROM-Laufwerk heisst /dev/scd0, auch als /dev/sr0 bekannt.
- Die Master-Festplatte am primären IDE-Controller heisst /dev/hda.
- Die Slave-Festplatte am primären IDE-Controller heisst /dev/hdb.
- Master- und Slave-Festplatte am sekundären IDE-Controller heissen dementsprechend /dev/hdc und /dev/hdd.
Die Partitionen auf den einzelnen Festplatten werden gekennzeichnet über eine dezimale Nummer, die zur Festplattenbezeichnung hinzugefügt wird: sda1 und sda2 stellen die erste und zweite Partition auf der ersten SCSI-Festplatte im System dar.
Hier ein Beispiel aus dem wahren Leben. Wir nehmen an, Sie hätten ein System mit zwei SCSI-Platten, eine auf SCSI-Adresse 2 und die andere auf 4. Die erste Festplatte (auf Adresse 2) heißt dann sda und die zweite sdb. Wenn die sda-Platte 3 Partitionen enthält, wären das sda1, sda2 und sda3. Das gleiche gilt für die Festplatte sdb und ihre Partitionen.
8.4 LVM
Der Logical Volume Manager (LVM) ermöglicht eine abstrahierte und flexible Verwaltung von Datenspeichern eines Computer-Systems. Gegenüber dem traditionellem Weg über Partitionen wird eine weitere, höhere Abstraktionsschicht eingeführt, die eine einfache und effiziente Verwaltung und Konfiguration der Datenträger ermöglichen soll. So können zum Beispiel mehrere Festplatten zu einem Logical Volume zusammengefasst und als ein gesamter Datenspeicher verwendet werden. Eine weitere Vereinfachung bietet die Möglichkeit der Gruppierung von Logical Volumes in Volume Groups, denen auch Bezeichnungen gegeben werden können. Durch diese Einordnungen und Namensgebungen ensteht für den Administrator auch ein logischer Bezug zu den sich in den Logical Volumes befindlichen Daten.
Dies ermöglicht eine einfachere Wartung des verwendeten Speichers und der darunterliegenden Disks
8.4.1 Grundbegriffe
- Physical Extent
Das Physical Extent (PE) ist die kleinste mögliche Speichergrösse in einem LVM. Das PE ist vergleichbar mit den Sektoren von normalen Festplatten bzw. Partitionen.
- Physical Volume
Ein Physical Volume (PV) ist der eigentliche Datenspeicher eines LVMs. Ein PV kann eine Partition oder ein ganzes Laufwerk sein. Es ist auch möglich, sogenannte "Loop-Dateien" zu verwenden.
- Volume Group
Eine Volume Group (VG) ist eine Art Container für mindestens ein PV.
- Logical Volume
Ein Logical Volume (LV oder auch Volume) ist im LVM Kontext für den Anwender eine Art Partition innerhalb einer Volume Group. Es ist nicht möglich Logical Volumes außerhalb einer VG zu erstellen. Das LV kann wie eine normale Partition verwendet werden, d.h. es können Dateisysteme darauf angelegt werden und es kann gemounted werden.
8.4.2 Vorteile
- Volumes können im laufenden Betrieb vergrößert, angelegt und verkleinert werden
- Probleme durch falsche Partitionierung können vermieden werden
- Höhere Flexibilität
- Die Kapazität mehrerer Festplatten kann zu einem Volume zusammengefasst werden
- Verschiedene Versionen von Daten sind durch sogenannte "Snapshots" möglich
- Die Datensicherung ("backup") wird durch diese "Snapshots" vereinfacht
- LVM hat einen hohen Datendurchsatz ("performance") und beeinträchtigt das System nur unwesentlich
- Austausch des unterliegenden Disk Systems im Betrieb (pvmove)
8.4.3 Nachteile
- Liegen die Logical Volumes auf mehreren Festplatten, so wird das Risiko des "Single-Point-of-Failure" grösser, da beim Ausfall einer Platte alle Daten verloren sind, ähnlich wie bei RAID0
- Zugriff auf LVM-Partitionen ist nur mit Linux möglich
- Um auf Logical Volumes zugreifen zu können, benötigen sog. Rescue CDs auch LVM-Unterstützung
8.4.4 Beispiel Setup
- PARTITION und PARTITION2 als Physical Volume initialisieren
pvcreate /dev/sdx /dev/sdy
- Erstellt Volume Group LV_GROUP_NAME, bestehend aus /dev/sdx und /dev/sdy
vgcreate LV_GROUP_NAME /dev/sdx /dev/sdy
- Erzeugt ein 2 GB grosses Logical Volume mit dem Namen VOL in der Volume Group LV_GROUP_NAME
lvcreate -L 2G -n VOL LV_GROUP_NAME
8.5 LVM Thin Provisioning
LVM weist normalerweise Blöcke zu, wenn Sie ein Volume erstellen. LVM Thin-Pools weisen stattdessen Blöcke zu, wenn sie geschrieben werden. Dieses Verhalten wird als Thin-Provisioning bezeichnet, da Volumes viel grösser sein können als der physikalisch verfügbare Platz.
Es können die normalen LVM-Kommandozeilenwerkzeuge verwenden, um LVM-Thin-Pools zu verwalten und zu erstellen (siehe man lvmthin).
Anbei ein Bespiel für die Erstellung einer Thin Volume Gruppe bei welcher die Logischen Volumes die Grösse des vorhandenen physischen Speichers überschreiten können. Der Tatsächliche Füllgrad der Logical Volumes darf die Grösse der Summe aller Physical Volumes in der Volume Gruppe nicht überschreiten.
8.5.1 Vorteile
- Nur der in den Thin Logical Volumes tatsächlich verbrauchte Platz wird alloziert
- Das Disk System kann bei Bedarf an die aktuellen Anforderungen angepasst werden
8.5.2 Nachteile
- Findet eine über Provisionierung (Summe aller LVs > Summe aller PVs) statt, veweigert LVM stoppt LVM den Dienst
- Dieser Füllgrad muss laufend überwacht werden
lvdisplay /dev/thin_vg/thin_pool | grep 'Allocated' Allocated pool data 0,00% Allocated metadata 0,88%
- Metadaten werden für die Verwaltung von LVs Snapshots verwendet
8.5.3 Beispiel Setup
- Benötigte Software installieren
which thin_check || yum install -y device-mapper-persistent-data
- PARTITION und PARTITION2 als Physical Volume initialisieren
pvcreate /dev/sdx /dev/sdy
- Erstellt Volume Group LV_GROUP_NAME, bestehend aus /dev/sdx und /dev/sdy
vgcreate LV_GROUP_NAME /dev/sdx /dev/sdy
- Erzeugt einen 500 GB grossen Thin Pool
lvcreate -L 500G --thinpool THIN_POOL LV_GROUP_NAME
- Erzeugt ein 1 TB grosses Thin Volume (über Provisionierung)
lvcreate -V 1T --thin -n THIN_VOLUME LV_GROUP_NAME/THIN_POOL Using default stripesize 64,00 KiB. WARNING: Sum of all thin volume sizes (600,00 MiB) exceeds the size of thin pool vms/tpool (500,00 MiB). WARNING: You have not turned on protection against thin pools running out of space. WARNING: Set activation/thin_pool_autoextend_threshold below 100 to trigger automatic extension of thin pools before they get full. Logical volume "THIN_VOLUME" created.
8.6 Netzwerk Konfiguration
Die Netzwerk Konfigurationen unter CentOS8 sind unter /etc/sysconfig/network-scripts/ifcfg-* abgespeichert.
Erfahrene System Administratoren können diese Files direkt bearbeiten und neu laden, dies bedarf jedoch einiger Erfahrung.
Es stehen standardmässig zwei konfigurations Werkzeuge zur verfügung:
- ein ncurses basierendes Text User Interface welches intutiv zu bedienen ist
nmtui
- ein cli basierendes programm welches sich gut zum skripten eignet
nmcli
Wird via nmtui gearbeitet, werden konfigurationen nicht automatisch ins laufende System übernommen.
Dies kann aber via nmcli im laufenden Betrieb übernommen werden:
nmcli connection reload nmcli device reapply <nic-name>
nmcli unterstützt die automatische komando ergänzung mit TAB
Dieses Tool existiert für CentOS7 und CentOS8
8.7 sudo Rechte
ls -l /etc/sudo* man sudoers visudo
sudo ist ein Befehl unter Linux, der dazu benutzt wird, Prozesse mit den Rechten eines anderen Benutzers (z.B. des Superusers root zu starten. Im Gegensatz zu dem nicht zu sudo gehörenden su ist einstellbar, welche Befehle ausgeführt werden dürfen. Der dauerhafte Wechsel der Identität ist ebenfalls möglich durch sudo -s und sudo -i.
Standardmässig sind die Benutzer der Gruppe wheel berechtigt mit sudo root rechte zu erlangen.
cat /etc/sudoers | grep wheel grep wheel: /etc/group | cut -d: -f4-
8.8 Cron Scheduling
man -k cron
Mit Hilfe von Cronjobs können auf Unix- und Linux-Systemen Vorgänge automatisert und zu einem bestimmten Zeitpunkt immer wiederkehrend ausgeführt werden. Diese Vorgänge können einzelne Befehle, Shell-Scripts, Programme, PHP- und sonstige Scriptsprachen-Scripts oder auch eine Anreihung von Linux-Befehlen sein. Beispielsweisse werden Backups, die wöchentlich, täglich oder stündlich geschehen sollen meist per Cronjob ausgeführt.
Cron besitzt eine eigene Syntax um Befehle Zeitgesteuert starten zu lassen
* * * * * auszuführender Befehl ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ │ │ │ │ └──── Wochentag (0-7, Sonntag ist 0 oder 7) │ │ │ └────── Monat (1-12) │ │ └──────── Tag (1-31) │ └────────── Stunde (0-23) └──────────── Minute (0-59)
Standardmässig verfügt jeder User über die Rechte cron zu nutzen und Zeitgesteuerte Befehle zu pflegen.
- Aktuelle Jobs für einen user anzeigen
crontab -l -u tim
- Crontab für einen User editieren
crontab -e -u tim
Wird ein Cronjob ausgeführt und macht eine Ausgabe, so wird diese per Mail an den Systemadministrator versendet.
Deshalb ist es ratsam den standard ausgabe kanal (1) zu unterdrücken. Scheitert dann eine Ausführung, so wird die Fehlermeldung an den root Account gemailt welcher optimalerweise an eine team mailbox weitergeleitet wird.
8.8.1 User Cron Beispiele
- Um zum Beispiel jede Nacht um 5 Uhr morgens das Backup auszuführen, würde man den Cronjob folgendermassen anlegen:
0 5 * * * /usr/local/sbin/backup.sh >/dev/null
- Eine Erinnerungsmail um 8 und um 17 Uhr zu verschicken geht z.B. so:
0 8,17 * * * /usr/local/bin/send_reminder_mail.sh >/dev/null
8.8.2 System Cron Tabellen
ls -l /etc/cron* cat /etc/crontab systemctl status crond
Folgende Verzeichnisse, Dateien sind relevant und werden beachtet wenn der crond Dienst gestartet wird:
- /etc/cron.allow + /etc/cron.deny
Das Ausführen von cron-jobs kann auf Benutzerebene erlaubt oder verboten werden. Dazu dienen die beiden oben genannten Dateien.
- /etc/cron.d + /etc/crontab
Dies ist die Systemweite Crontab Datei, sie verfügt über über eine leicht abweisende Syntax gegenüber den regulären crontabs, dies weil der Username zusätzlich festgelegt werden muss.
- /etc/cron.hourly
Skripte in diesem Ordner werden stündlich ausgeführt
- /etc/cron.daily
Skripte in diesem Ordner werden täglich ausgeführt
- /etc/cron.weekly
Skripte in diesem Ordner werden wöchentlich ausgeführt
- /etc/cron.monthly
Skripte in diesem Ordner werden monatlich ausgeführt
8.9 Systemd Scheduling
systemctl list-unit-files --type timer
Systemd ist die Dienste Verwaltung von CentOS7 und neuer. Sie verfügt über weit flexiblere Konfigurationsmöglichkeiten als SystemV.
Ebenfalls kann dieser Scheduled Jobs erkennen von welchen System Events, Zeit, anderen Diensten, Targets, ... er abhängig ist.
Ein einfaches Beispiel ist die aktualiserung der man Datenbank:
[root@saturn ~]# rpm -ql dnf | grep /systemd/ /usr/lib/systemd/system/dnf-makecache.service /usr/lib/systemd/system/dnf-makecache.timer [root@saturn ~]# cat /usr/lib/systemd/system/dnf-makecache.timer [Unit] Description=dnf makecache --timer ConditionKernelCommandLine=!rd.live.image # See comment in dnf-makecache.service ConditionPathExists=!/run/ostree-booted Wants=network-online.target [Timer] OnBootSec=10min OnUnitInactiveSec=1h Unit=dnf-makecache.service [Install] WantedBy=multi-user.target
Beachte, das die Files unter /usr/lib/systemd/system nicht angepasst werden dürfen, dazu muss eine Kopie unter /etc/systemd/system/ erstellt und bearbeitet werden. Danach kann die Konfiguration mit dem folgenden Kommando neu eingelesen werden:
systemctl daemon-reload systemctl restart man-db-cache-update
8.10 Cockpit Web Administration
dnf search cockpit dnf install cockpit cockpit-dashboard firewall-cmd --add-port=9090/tcp firewall-cmd --permanent --add-port=9090/tcp systemctl enable cockpit.socket --now firefox https://1.2.3.4:9090
Mit Cockpit steht ein Webinterface zum Verwalten von Linux-Systemen zur Verfügung. Auch Benutzer-Sessions lassen sich hiermit aufzeichnen und wieder abspielen. Selbst Container unterstützt Cockpit.
Auch eine Konsole steht unter dem Cockpit zur Verfügung.
Der Nachteil von Cockpit ist, wie bei allen GUIs, das die Veränderung nicht direkt abstrahiert werden kann und deshalb wird Cockpit eher von Einsteigern benutzt.
9 Netzwerk Dienste
Hier gehen wir kurz auf die wichtigsten Netzwerk Dienste ein welche zu einer minimalen Installation im Produktiven Betrieb gehören.
9.1 RSyslog
Wir verwalten diese Konfiguration über unsere Ansible OS Basis Rolle.
Anbei werfen wir einen Blick auf eine manuelle Konfiguration um besser verstehen zu können was konfiguriert wird.
- Installation der Software
dnf install util-linux rsyslog
- anzeigen der relevanten config files
rpm -q --configfiles rsyslog
- forwarding von Syslog Daten an eine Graylog Instanz (Zentraler Syslog Server)
man rsyslog.conf ... To forward messages to another host via UDP, prepend the hostname with the at sign ("@"). To forward it via plain tcp, prepend two at signs ("@@"). Example: *.* @192.168.0.1
- forwarding ALLER Syslog Daten an eine Graylog Instanz (Zentraler Syslog Server)
# forward all logs via UDP echo '*.* @graylog.mydomain.local:1514' > /etc/rsyslog.d/forward.conf
systemctl restart rsyslog systemctl enable rsyslog
logger -t test123 xxxyyyzzz # suche dieses pattern am ziel syslog server (graylog)
9.2 Snmpd
Wir verwalten diese Konfiguration über unsere Ansible OS Basis Rolle.
Anbei werfen wir einen Blick auf eine manuelle Konfiguration um besser verstehen zu können was konfiguriert wird.
- Installation der Software
dnf install net-snmp net-snmp-utils
- anzeigen der relevanten config files
rpm -q --configfiles net-snmp
- forwarding von Syslog Daten an eine Graylog Instanz (Zentraler Syslog Server)
- Anzeigen der Config File Hilfe
man snmpd.conf
- Schreiben einer Config mit RO Comunity (für Monitoring)
cp -av /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.orig echo '# manuelle snmp config syscontact team@mydomain.com rouser safereader auth rwuser safewriter priv rocommunity public 192.168.99.99 rocommunity public 127.0.0.1 ' > /etc/snmp/snmpd.conf
systemctl enable snmpd systemctl restart snmpd
- Testen der Konfiguration
snmpwalk -v2c -c public -On -t15 127.0.0.1:161 .1
snmpget -v2c -c public 127.0.0.1:161 .1.3.6 .1.3.6.1.2.1.1.4.0
9.3 Postfix Mail
Wir verwalten diese Konfiguration über unsere Ansible OS Basis Rolle.
Anbei werfen wir einen Blick auf eine manuelle Konfiguration um besser verstehen zu können was konfiguriert wird.
Wir behandeln hier die Konfiguration welches dem Linux System ermöglicht eMails zu versenden. Keine Mailserver Konfiguration.
- Installation der Software
dnf install mailx postfix
- anzeigen der relevanten config files
rpm -q --configfiles postfix
- forwarding von Syslog Daten an eine Graylog Instanz (Zentraler Syslog Server)
- Anzeigen der Config File Hilfe
man -k postfix man -k postfix | grep -i config man 5 postconf
- Schreiben einer Config mit Relay Host
cp -av /etc/postfix/main.cf /etc/postfix/main.cf.orig
DOMAIN=domain.ch RELAY=mail.$DOMAIN SENDER="$(hostname -s)@$DOMAIN" TEAM="support@$DOMAIN"
echo "=== TEST VARS === DOMAIN=$DOMAIN RELAY=$RELAY SENDER=$SENDER TEAM=$TEAM"
echo "# manuelle postfix client config relayhost = $RELAY mynetworks = 127.0.0.0/8 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = loopback-only inet_protocols = ipv4 sender_canonical_maps = hash:/etc/postfix/canonical " > /etc/postfix/main.cf
getent passwd root usermod -c "System Admin auf $HOSTNAME" root getent passwd root
cp -av /etc/postfix/canonical /etc/postfix/canonical.orig
echo root $SENDER > /etc/postfix/canonical postmap /etc/postfix/canonical
grep ^root /etc/aliases || echo root: $TEAM >> /etc/aliases grep ^root /etc/aliases newaliases
systemctl enable postfix systemctl restart postfix
- Testen der Konfiguration
dmidecode | mail -s report root mailq # zu versendende emails journalctl -u postfix.service # logs einsehen
9.4 NTP/Chrony
Chrony ist eine neu Entwicklung des alt bekannten ntpd welcher nicht mehr weiter entwickelt wird.
Anbei werfen wir einen Blick auf eine manuelle Konfiguration um besser verstehen zu können was konfiguriert wird.
- Installation der Software
dnf install chrony
- anzeigen der relevanten config files
rpm -q --configfiles chrony
- chrony konfigurations Syntax anzeigen
man chrony.conf
- manuelle konfiguration von chrony
cp -av /etc/chrony.conf /etc/chrony.conf.orig
echo '#manuelle chrony konfiguration # zeit sourcen pool ch.pool.ntp.org iburst # zeit server funktion aktivieren # allow 10.0.0.0/8 # allow 172.16.0.0/12 # allow 192.168.0.0/16 driftfile /var/lib/chrony/drift makestep 1.0 3 rtcsync keyfile /etc/chrony.keys leapsectz right/UTC logdir /var/log/chrony ' > /etc/chrony.conf
systemctl enable chronyd systemctl restart chronyd
- chrony status pruefen
chronyc clients chronyc serverstats chronyc sources
10 Security
10.1 Firewalling
Linux Verfügt standardmässig über ein oder mehrere Firewalling Subsysteme.
Um herauszufinden über welches firewalling system ein CentOS/RHEL verfügt kann folgendes Kommando verwendet werden:
systemctl list-unit-files | egrep 'firewall|tables'
10.1.1 Iptables
iptables-save # aktuell geladene Regeln anzeigen systemctl stop iptables cat /etc/sysconfig/iptables # persistente regeln anzeigen
Das älteste und bekannteste Firewall System welches bis heute in Linux existiert. Es ist einfach zu lesen und wird sequentiell abgearbeitet. Da es aber sehr alt ist, wurde es nach und nach erweitert, was dazu geführt hat, das neue Features parallel implementiert wurden:
- iptables
- ip6tables
- arptables
- ebtables
- xtables
Iptables ist immernoch weit verbreitet, soll aber in den kommenden Jahren durch nftables ersetzt werden welches zeitgemässer zu konfigurieren ist und mehr Features bietet.
IPTables Regeln können mit dem Tool iptables-translate in nft Regeln übersetzt werden. Dies macht Migrationen wesentlich angenehmer.
10.1.2 FirewallD
firewall-cmd --state firewall-cmd --get-services firewall-cmd --zone=public --add-port=12345/tcp --permanent firewall-cmd --zone=public --add-service=imaps --permanent firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=12345 --permanent firewall-cmd --reload firewall-cmd --list-all-zones
Ist eine Abstrahierung der Firewall regeln welche für "host based firewalls" und einfache Server Anwendungen gedacht ist.
Es führt komplexe Konfigurationen welche mehr Wissen und IPTables Regeln benötigen auf einfache Weise Durch.
Firewalld soll in absehbarer Zeit auch nft Regeln verwalten können.
10.1.3 NFTables
systemctl status nftables nft list ruleset
Für CentOS7 und CentOS8 ist NFT verfügbar, es bietet folgende Vorzüge gegenüber Iptables:
- Lookup tables anstelle von of linearer Abarbeitung
- Ein gemeinsames Framework für IPv4 und IPv6 Protokolle.
- Regeln werden angepasst und nicht komplett geladen (kein flush)
- nftrace ist ein debugging tool welches fix in nft integriert ist
- konsistente und kompakte syntax
- eine API welche die Erweiterung/Bedienung durch weitere Programme vereinfacht
Anbei die offizielle Red Hat Dokumentation
Und ein guter Blog Eintrag um mit nftables zu starten
10.2 SELinux
SELinux (Security-Enhanced Linux; engl. "sicherheitsverbessertes Linux") ist eine Erweiterung des Linux-Kernels, die den ersten Versuch darstellt, das FLASK-Konzept des US-amerikanischen Geheimdienstes NSA umzusetzen. Es implementiert die Zugriffskontrollen auf Ressourcen im Sinne von Mandatory Access Control. SELinux wird massgeblich von der NSA und von dem Linux-Distributor Red Hat entwickelt. Unternehmen wie Network Associates, Secure Computing Corporation, und Tresys sind bzw. waren ebenfalls an der Arbeit an SELinux beteiligt, besonders Tresys übernimmt vermehrt Aufgaben am Projekt.
Wer sich für SELinux interessiert findet in der Red Hat Dokumentation weitere informationen.
10.2.1 SELinux betriebs Arten
- Enforced
Eine Regelverletzung führt zur Verweigerung der Ziel Ressource
Die Regelverletzung wird protokolliert
- Permissive
Der Zugriff wird immer erlaubt
Die Regelverletzung wird protokolliert
- Disabled
SELinux ist inaktiv
Soll die Betriebsart von SELinux persistent geändert werden (reboot), so muss diese in /etc/selinux/config angepasst werden
10.2.2 einige nützliche Befehle
- Ist SELinux aktiviert
getenforce
- Umschalten von Permissive und Enforcing
setenforce 0 #permissive setenforce 1 #enforcing
- Anzeigen von SELinux Regel Verletzungen in lesbarer Form mit Erklärungen zum Hergang
sealert -a /var/log/audit/audit.log
10.2.3 Beispiel Anpassung für Apache Webserver
setenforce 0 # set permissive semanage fcontext -l | grep /var/www semanage fcontext -d -t httpd_sys_content_t "/data" semanage fcontext -a -t httpd_sys_content_t "/data" semanage fcontext -a -t httpd_sys_content_t "/data/www/([^/]*/)?www(/.*)?" semanage fcontext -a -t httpd_config_t "/data/www/([^/]*/)?conf(/.*)?" semanage fcontext -a -t httpd_log_t "/data/www/([^/]*/)?logs(/.*)?" restorecon -Fr /data ls -lZ /data for i in $(rpm -ql policycoreutils | grep bin/ ); do man -k $(basename $i); done semanage user -l httpd systemctl restart httpd sealert -a /var/log/secure # fix if error setenforce 1 sed -i 's/^SELINUX=.*/SELINUX=Enforcing/' /etc/selinux/config grep ^SELINUX= /etc/selinux/config getenforce
10.2.4 selinux mail alterting
SELinux schützt das System vor unerlaubten Zugriffen, Gesetzte machen aber wenig Sinn zuwiederhandlungen igoriert werden.
Natürlich wird das System eine Regelverletzung verweigern, es ist aber definitiv ein Anzeichen dafür das etwas schief gelaufen ist.
dnf -y install setroubleshoot-server setroubleshoot-plugins
vi /etc/setroubleshoot/setroubleshoot.conf
[email] recipients_filepath = /var/lib/setroubleshoot/email_alert_recipients smtp_port = 25 smtp_host = mail.domain.ch from_address = selinux@domain.ch subject = [DOMAIN] SELinux AVC Alert
vi /var/lib/setroubleshoot/email_alert_recipients
support@domain.ch
service messagebus restart
10.3 Hardening
Um die Sicherheit eines Systems zu erhoehen ist es ratsam die Berechtigungen auf ein benoetigtes minimum zu reduzieren.
Anbei befassen wir uns mit grundsaetzlichen Moeglichkeiten, sowie mit einigen Werkzeugen die uns dabei unterstuetzen.
10.3.1 Grub Passwort
Grub ist der Bootloader von Linux welcher den Kernel beim starten lädt.
Durch manuelles ändern von Kernel Optionen kann das root Passwort innerhalb von wenigen Minuten geändert und auf das System zugegriffen werden.
Das setzen dieses passwort verhindert das anpassen von Kernel optionen, der automatische Boot Vorgang wird dadurch nicht beeintraechtigt.
- Grub Passwort setzen
grub2-setpassword cat /etc/grub.d/01_users cat /boot/grub2/user.cfg
- Rebooten und Testen (Waehle e im Grub Kernel Menue)
reboot
10.3.2 Partitionen separieren
Unabhaengig von der Funktion des Servers bringt eine Aufteilung folgender Partitionen einen Gewinn in Sachen Sicherheit
Dadurch wird ein Ueberfuellen der root oder log Partition erschwert.
Folgende Paritionen sind ein guter Anfang:
- /(root)
- /boot
- /home
- /tmp
- /var
10.3.3 Mount Optionen
Pro Partition können Mount Optionen gesetzt werden welche eine massiv erhöhte Sicherheit bringen.
Folgende Optionen koennen fuer die Parition:
- /tmp
- /home
- /var
gesetzt werden:
- nosuid
- nodev
- noexec
Dies indem man in der Datei /etc/fstab die entsprechenden Partitionen mit den Optionen erweitert werden:
Zum Beispiel von:
UUID=0a1ff99a-b8b2-4b48-a941-7067d3cbb2ff /var xfs defaults 0 0
nach:
UUID=0a1ff99a-b8b2-4b48-a941-7067d3cbb2ff /var xfs defaults,nosuid,nodev,noexec 0 0
geändert wird, die Änderung wird nach einem Reboot oder Remount aktiv.
Mit dem Befehl mount koennen die Optionen der aktuellen Partitionen angezeigt werden.
10.3.4 Partitionen verschlüsseln
Vor allem bei mobilen Systemen bringt die Verschlüsselung von Partitionen eine erhöhte Sicherheit.
Die Verschluesselung von Partitionen kann waehrend der Installation eines Systems konfiguriert werden.
Das nachträgliche Verschlüsseln von neuen Partitionen ist ebenfalls moeglich, bedingt aber einiges an Erfahrung.
10.3.5 CTRL + ALT + DELETE deaktivieren
Dies ermöglicht das neu-starten eines Systems mit Hilfe der Console, was wiederum einen möglichen Einstiegspunkt ins System bringt.
Diese Option wird wie folgt deaktiviert:
systemctl mask ctrl-alt-del.target
10.3.6 Nicht benoetigte Software
Wird am besten gar nicht gestartet und wenn moeglich vom System entfernt.
- Installierte Software anzeigen
dnf list installed
- Listen Ports anzeigen
ss -tulpn
Es ist zu beachten, das die Prozess Namen der Listen Ports rechts aussen ersichtlich sind
- Anbei ein Beispiel fuer die deinistallation eines nicht benoetigten Dienstes
which snmpd rpm -qf /usr/sbin/snmpd dnf remove net-snmp
10.3.7 Software aktualisierung
Eine regelmaessige aktualisierung ist generell empfehlenswert.
Im Enterprise Bereich ist es empfehlenswert diese Updates (zeitlich & Umfang) von einer Zentralen Stelle zu koordinieren.
Der Red Hat Satellite (Spacewalk) oder Ansible Tower (AWX) sind zwei weit verbreitete Systeme um diese Aufgaben zu koordinieren.
Die Funktionsweise von DNF wurde im Kapitel YUM/DNF Paket Manager besprochen.
10.3.8 Firewalling
Ist empfehlenswert, um Dienste zusätzlich ab zu sichern und wurde im Kapitel Firewalling behandelt.
10.3.9 SELinux
Ist empfehlenswert, um Dienste zusätzlich ab zu sichern und wurde im Kapitel SELinux
10.3.10 Audit Software
Lynis ist ein guter Start um Moeglichkeiten fuer eine Sicherheits Optimierung heraus zu finden.
Dies liefert einen kompletten Report welcher in Handfeste Vorschlaege zur Verbesserung anbietet.
dnf install epel-release dnf install lynis lynis audit system
11 CFG Management/Automation
11.1 Ansible
Ansible ist ein Beschreibendes Konfigurations-Management welches aktuell grosse Verbreitung unter Linux bietet.
Es ermöglicht eine vom System abstrahierte, gut lesbare Beschreibung des Ziel Zustandes welche gleichzeitig als Dokumentation dient.
curl -L ansible.bitbull.ch | bash cd /etc/ansible/projects/uqcSetup/
cat README.md
cp roles/*/tests/vars/99_*.yml vars/
vi vars/99_uniqconsulting.os_basic.yml
--- os_update: true package_cleanup: true package_upgrade: all epel_repo: true setup_mail: true sysadmin_email: 'support@domain.ch' mail_relay_host: 'mail.domain.ch' mail_local_sender_domain: 'domain.ch' setup_syslog_forwarding: true syslog_remote_host: '@syslog.domain.local:514' setup_snmpd: true monitoring_host_ip: '192.168.1.10' snmp_community_name: 'MyCommunity' setup_selinux: true selinux_policy: enforcing setup_firewalld: false setup_iptables: true ...
vi vars/99_uniqconsulting.iptables.yml
--- iptables_open_ports: - port: 22 protocol: tcp - port: 161 protocol: udp ...
ansible-playbook install_1_os.yml
11.2 git
Git bezeichnet sich als "Source Code Management System", meist spricht man von Versionsverwaltung, und in der Praxis macht Git vor allem eines: Änderungen an Dateien so zu speichern und aufzuzeichnen, dass sie jederzeit nachvollziehbar sind. Sie fügen Dateien hinzu, machen Änderungen, speichern diese und sichern sie optional auf einem entfernten Server. Für jeden Speichervorgang wird ein Marker gesetzt, der später erneut aufgerufen werden kann.
Ein erster wichtiger Punkt für das Verständnis: Git speichert im Gegensatz zu Backup-Programmen oder den meisten sonstigen Versionsverwaltungen keine neuen Dateien. Weder Kopien veränderter Dateien, noch Dateien, die nur die Änderungen enthalten. Wenn Sie auf Dateisystemebene in Ihren Git-Ordner schauen, finden Sie dort immer nur die jeweils aktuellen Versionen der Dateien, die Sie selbst hinzugefügt haben.
Git sieht sich eher als Dateisystem und Speicherpunkte als Snapshots: Sobald Sie Änderungen an Dateien speichern, wird Git-intern ein Schnappschuss des aktuellen Status des Dateisystems/aller Dateien abgelegt. Und das gilt auch für das Löschen von Inhalten oder Dateien – Git fügt immer nur hinzu! Inhalte oder Dateien tatsächlich zu verlieren, ist bei Git eigentlich nur mutwillig zu schaffen.
Der zweite Punkt: Bei Git passiert alles lokal. Weder für Tools noch die historischen Daten benötigen Sie eine Verbindung zu einem Server. Wenn Sie im Team arbeiten, werden Sie lediglich Ihre Bearbeitungen hoch- und die der anderen Teammitglieder herunterladen.
Ebenfalls wichtig: Ein Git-Repository ist nur und ausschliesslich der eine Ordner, den Sie bei einem neuen Projekt festlegen. Darin befinden sich zum einen all Ihre Dateien und Ordner und zum anderen ein versteckter Ordner „.git”, der sämtliche Verwaltungsdaten und Snapshots enthält. Und somit ist Ihre komplette Git-Arbeitsumgebung portabel, den Ordner können Sie zum Beispiel auf einem USB-Datenträger immer dabeihaben.
12 Fehler Analyse
Im Fehlerfall ist nicht bekannt nach was gesucht wird, also ist der Vergleich das wichtigste. Dies kann Erfahrung sein, muss aber nicht. Ein Referenz System welches die selbe Arbeit fehlerfrei verrichtet tut es auch. Wichtig ist sich in der Fehlersuche nicht in Vermutungen zu verheddern sondern stumpf Fakten zu sammeln.
Ist dann bekannt was das Problem ist, gilt es dies nachhaltig zu lösen:
Wenn der Log Level eines Dienstes auf DEBUGGING gesetzt ist, so läuft die Disk alle par Wochen voll, Logs zu reduzieren ist hier vielleicht nicht der beste Ansatz
Auch ist es meiner Meinung nach unsinnig über ein kleines Problem das zwar interessant ist aber nicht nachvollziehbar ist stunden zu verbringen.
Folgende Fragen können bei der Analyse helfen:
- Verstehe ich was das Problem ist?
- Verstehe ich was das Problem verursacht hat?
- Kann ich die Fehlerquelle lokalisieren, reparieren und danach das Sytem bereinigen?
- NEIN: Schreibe ein genaues Trouble Ticket das den Fehler nachvollziehbar und mit allen Fakten beschreibt
- Suche Dir Hilfe eines erfahrenen Kollegen oder Support Teams
- Könnten weitere Systeme davon betroffen sein?
- JA: Dann plane diese Systeme ebenfalls ein
- Ist es wünschenswert diesen Fehler automatisch zu erkennen
- JA: Wenn immer möglich, verwende ein zentrales Monitoring
- An sonsten reichen ein par Zeilen Shell Skript via CronJob oft auch aus
12.1 Ereignisse
12.1.1 LogFiles Auswerten
Einige Dienste pflegen ihre eigenen LogFiles, so etwa: apache, nginx, tomcat, jboss, ...
Diese Files sind als Text Dateien gehalten, müssen aber zuerst einmal gefunden werden.
12.1.1.1 LogFiles: Übung
Anbei eine Herleitung wie Text Logfiles gefunden und ausgewertet werden können.
- Software installieren
which lsof || dnf -y install lsof
- alle offenen Dateien finden
man lsof lsof
- die Liste offener Dateien Filtern und deduplizieren
lsof -F lsof -F | sed '/^n\//!d' lsof -F | sed '/^n\//!d;s/^n//' lsof -F | sed '/^n\//!d;s/^n//;s/ .*//' lsof -F | sed '/^n\//!d;s/^n//;s/ .*//' | sort -u
- wir suchen nur Text Dateien (log files)
lsof -F | sed '/^n\//!d;s/^n//;s/ .*//' | sort -u | xargs file lsof -F | sed '/^n\//!d;s/^n//;s/ .*//' | sort -u | xargs file | grep ' text$'
- diese Text Dateien würden wir aber gerne in echtzeit anschauen
lsof -F | sed '/^n\//!d;s/^n//;s/ .*//' | sort -u | xargs file | grep ' text$' | cut -d: -f1 lsof -F | sed '/^n\//!d;s/^n//;s/ .*//' | sort -u | xargs file | grep ' text$' | cut -d: -f1 | xargs tail -fn0
12.1.2 Syslog Auswerten
- Syslog Status prüfen
systemctl status rsyslog
- Loggt ebenfalls in Text Files welche üblicherweise unterhalb von /var/log abgelegt werden.
- Diese können mit den Befehlen des vorangehenden Kapitels ausgewertet werden.
12.1.3 journalctl Logs auswerten
- alle boot Vorgänge des Journals anzeigen
journalctl --list-boots
- alle Fehlermeldung der Klasse error oder höher in Echtzeit anzeigen
journalctl --priority err --catalog --follow
- Alle Logs eines bestimmten Dienstes anzeigen
- Dienst finden
systemctl list-unit-files
- Meldungen des Dienstes anzeigen
journalctl -u dnf-makecache.timer
journalctl -u sshd.service
12.1.4 dmesg
dmesg dmesg -Tx dmesg -Txf
dmesg steht für display message und ist ein Programm, welches die Kernel-Meldungen (genau: die Meldungen des Kernel-Ringpuffers) ausgeben kann.
Das Programm wird im "normalen" Betrieb von Linux eher selten verwendet, ist aber immer dann nützlich, wenn Fehler im System gesucht werden, z.B. warum (neue) Hardware nicht korrekt erkannt oder eingebunden wird.
12.2 SOS Report
Der SOS-Report ist ein Diagnose Werkzeug welches hilft den aktuellen Zustand eines Systems für den Supportfall zu beschreiben.
Im Fehlerfall oder beim Auftreten eines Problems ist ein sosreport immer das erste was wir ausführen.
12.2.1 Übung: sosreport
- sosreport installieren
dnf -y install sos vim tar
- einen Report erstellen
sosreport
- den sosreport sicherstellen
cp -av /var/tmp/sosreport* /root/
- den sosreport manuell auswerten
vim /root/sosreport*.xz
- sosreport kurz auswertung
curl https://raw.githubusercontent.com/ryran/xsos/master/xsos > /usr/local/sbin/xsos chmod 700 /usr/local/sbin/xsos tar vxf /root/sosreport*.xz xsos -a sosreport-vmname-date-pattern rm -rf sosreport-vmname-date-pattern
12.3 Disk
Rund um Dateisysteme gibt es unendlich viele Tuning und Performance Optionen, wir schauen uns hier die Grundlagen an.
12.3.1 Block-Device
Besteht aus einer Disk oder einer Partition.
- Die Filesystem Tabelle des Systems anzeigen
cat /etc/fstab
- prüfen welche Dateisysteme gemountet sind
df -hP
- Eine übersicht über die verbauten Disk Systeme und deren Partitionen
lsblk
- IDs und Labels aller Dateisysteme anzeigen
blkid
12.3.2 Inode
Inodes sind Einträge welche pro Datei oder Verzeichniss erstellt werden.
Der Füllgrad darf 100% nicht überschreiten.
df -hP
12.3.3 File
df -hi
12.4 CPU
12.5 Prozesse
Jeder Listen Port ist an einen Prozess gebunden um einen überblick zu bekommen was im System läuft schauen wir uns zuerst die laufenden Prozesse genauer an.
12.5.1 ps
- Prozessbaum im Überblick
ps -f fax
- Prozess Details (Ressourcen, Argumente)
ps -eo ruser,pid,rss,vsz,pcpu,tty,args
- Prozesse pro User zählen
ps hax -o user | sort | uniq -c
12.5.2 load mit w
Load ist eine einfache Form von System Auslastung. Ein Anstieg der Load bedeutet das das System länger benötigt um die gestellten Anfragen zu verarbeiten.
Ein System mit 4 CPUs und einer Load von 4 besagt das es zu 100% Ausgelastet ist.
Ein Anstieg der Load hat aber nicht zwingend zu bedeuten das mehr Rechenlast vorhanden ist.
Zu wenig Bandbreite ist eine treffendere Bezeichnung und dies kann CPU, Disk IO, Netzwerk IO, BUS IO, ... sein.
Das Kommando w' gibt eine schnelle Übersicht über den Load Zustand des Systems:
[root@vm15 ~]# w 13:13:36 up 3 days, 21:39, 1 user, load average: 0.41, 0.30, 0.12 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.100.5 12:38 0.00s 0.11s 0.00s w
Die Load wird in 3 varianten angezeigt:
- Mittel über die letzte Minute
- Mittel über die letzten 5 Minuten
- Mittel über die letzten 15 Minuten
12.5.2.1 übung: Load Analyse
dd if=/dev/urandom of=/dev/null bs=1G count=1024 iflag=fullblock & for i in {1..3} ; do w ;echo; sleep 10 ; done kill -9 %1
12.5.3 Prozess Ressourcen mit top
Top ist ein einfaches Kommandozeilen Werkzeug um Prozesse nach deren Ressourcen Verbrauch zu beurteilen.
Mit den Tasten M und P kann die Tabelle nach Memory oder CPU Verbrauch sortiert werden.
- Bitte starte top auf der Konsole und versuche die Prozesse nach Memory und CPU zu sortieren.
12.6 Bandbreite
12.7 Connectivity
12.7.1 ping
12.7.2 curl
12.7.3 traceroute
12.7.4 telnet
12.7.5 netcat
12.7.6 wget
12.7.7 tcpdump
12.7.8 nmap
12.7.9 Listen Ports