Alle Unterlagen in einem PDF - Fakultät für Mathematik
Transcription
Alle Unterlagen in einem PDF - Fakultät für Mathematik
ICT-Infrastruktur für Bildungsaufgaben Thomas Leitner <[email protected]> Fakultät für Mathematik, Universität Wien Sommersemester 2016 Letzte Änderung: 2016-05-22 09:57 Foliensatz 0 Organisatorisches und Wiederholung Organisatorisches • Gemeinsam mit Übung anrechenbar als „VU Technische Praxis der Computersysteme 2“ • VO-Termine • • • Geblockt 8 Termine jeweils am Montag 13:15 bis 16:00 im SR 7, WS29 • 07.03.2016, 14.03.2016, 04.04.2016, 11.04.2016, 18.04.2016 25.04.2016, 09.05.2016, 23.05.2016 UE-Termine • Geblockt 6 Termine jeweils am Donnerstag 15:00 bis 19:00 im PC04, WS29 • 07.04.2016, 14.04.2016, 21.04.2016, 28.04.2016, 12.05.2016, 19.05.2016 Mündliche Prüfung mit einer Dauer von circa 20-30 Minuten; Anmeldung per E-Mail an [email protected] nach Ende der Vorlesung Vergangenes Semester • Im vergangenen Semester wurde Linux aus Anwendersicht betrachtet, d.h. es wurde behandelt, wie man ein Linuxsystem benutzt, aber nicht, wie man es administriert. • Themengebiete waren unter anderem: • Historische Hintergründe (Unix, Urheber- und Lizenzrecht) • Aufbau des Betriebsystems • Virtuelles Dateisystem, Berechtigungen, Links • Prozessmanagement • Shell und Shellprogrammierung • Kryptographisce Grundlagen und Anwendungen Inhalte der Vorlesung In dieser Vorlesung betrachten wir Linuxsysteme aus Administratorsicht: • Grundlagen • Systemstart und -services • Dateisystemverwaltung • Netzwerkgrundlagen und -konfiguration ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 2 von 139 • Software und Paketmanagement • Benutzerverwaltung inklusive LDAP und Kerberos • Paketfilter/Firewall • Netzwerkdateisysteme NFS/CIFS • Netzwerkdienste wie z.B. DNS-, Mail- und Webserver Ziel: Die Studierenden sind in der Lage, linuxbasierte Systeme zu installieren, zu administrieren, zu warten und fachgerecht einzusetzen. Wiederholung • Betriebssystem Linux • Bash • Dateisystem • Prozesse • Speicher • Reguläre Ausdrücke • Befehle Siehe http://www.mat.univie.ac.at/~praxis/wisem15/vorlesung.html Betriebssystem Linux • Kernel (u.a. Prozessverwaltung, virtuelles Dateisystem, Speicher, Netzwerk) • Shell (Bash) • Systemprogramme (z.B. GNU coreutils) • Multi-User (Benutzer, Gruppen, Rechte) und Multi-Tasking Bash – Allgemeines • Interaktiver Kommandozeileninterpreter • Text wird vom Benutzer eingegeben, von der Shell interpretiert, die dann einen oder mehrere Befehle ausführt • POSIX-kompatibel, einige nützliche Erweiterungen (z.B. [[ ... ]]) • Tips zur Bedienung: • Befehls-History: Pfeiltaste rauf & runter • History-Search: Strg-r sucht rückwärts in der History • Navigation in der Zeile: • • • Strg-Links / Alt-b → Cursor ein Wort nach links • Strg-Rechts / Alt-f → Cursor ein Wort nach rechts • Strg-a / Strg-e → Cursor zum Anfang/Ende der Zeile Tabulator-Taste zum Vervollständigen Hilfe zu Befehlen und Konfigurationsdateien in den Manpages! ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 3 von 139 • Umgebungsvariablen (PATH, HOME, USER, …) Bash – Konstrukte • Reihenfolge der Verarbeitung einer Eingabezeile • Auswertungsunterdrückung Anführungszeichen) • Pipes (befehl1 | befehl2) • Listen (befehl1; befehl2 && befehl3 || befehl4 &) • Verbundbefehle (Ausführung in Sub-Shell, arithmetischer/logischer Ausdruck) • Klammernexpansion (echo a{d,b,{1..3}}c) • Pfadexpansion (rm datei*.tx?) • Variablenexpansion (echo ${PATH/:/ - }) • Befehlssubstitution (VAR=$(cut -d: -f1 /etc/passwd)) • Bash-History-Expansion (echo !-1:$) • Eingabe-/Ausgabe-Umleitung (befehl1 <file.txt bzw. befehl_1 > file.txt) (Maskierungszeichen Backslash – \ – bzw. einfache/doppelte Bash Programmierung • Tests (test, [, [[ ... ]]) • Verzweigungen (if, case) • Schleifen (for, while) • Funktionen (function name () { do_something; }) • Stellungs- und spezielle Parameter ($1, $@, $#, $?) Dateisystem • Virtuelles Dateisystem VFS (Abstraktionsschicht im Kernel, Dateisysteme bzw. allgemeine Schnittstelle für Ein- und Ausgabe) eine • Dateiattribute (Änderungsdatum, Besitzer, Gruppe, Berechtigungen, …) • Berechtigungen (RWX, Besitzer/Gruppe/Rest, SUID, SGID, Sticky-Bit) • Harte und symbolische Links Sicht auf verschiedene Prozesse • Kernel kann ELF-Binärprogramme, Skripts (Shebang!) und andere Binärprogramme mittels binfmt_misc Kernelmodul direkt ausführen • Prozess = laufende Instanz eines Programmes (PID, PPID, UID, EUID, …) • fork-Modell: • Prozess A ruft fork() auf → Kindprozess B entsteht als Kopie des Prozesses A • (Optional) Im Kindprozess B mittels exec() anderen Programmcode ausführen • Prozess A warte auf Kindprozess B mittels wait() → Rückgabewert! – oder Kindprozess wird zu Zombie und vom init-Prozess entsorgt • Interrupts (von Hardware über CPU an Kernel oder weiter über Kernel an Prozess; Scheduling!) • Signale (von Prozess an anderen Prozess; HUP, INT, KILL, TERM, …) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 4 von 139 Speicher • Virtueller Speicher für Prozess (vom Kernel verwaltet, Prozess kennt den tatsächlichen Ort von Daten im RAM nicht; erhöht Sicherheit und Flexibilität) • Dynamisches Laden von Daten in den RAM mittels Page Fault Swap-Dateien bzw. • Swap-Partitionen Reguläre Ausdrücke • Zeichenklassen (\d, \w, [a-z0-9]) • Quantoren (*, +, ?, {n,m}) • Gruppen und Referenzen ((?:...), \1) • Alternativen (|) • Anker (^, $, \b) • Für Befehle wie sed und grep, Texteditoren, Programmiersprachen, … Befehle • whoami, who, w, last, id, script, less, which, locate, xargs • pwd, cd, ls, mkdir, rmdir, rm, mv, cp, find, touch, stat, file, chmod, chown, chgrp, umask, ln, readlink • ps, pstree, kill, pgrep, pkill, top, nice, renice, free, swapon, swapoff • cat, split, head, tail, sort, cut, paste, uniq, nl, wc, expand, unexpand, tee • echo, printf, read, alias, unalias, source, export, sleep, timeout, set, unset, shift, shopt, exec • mount, umount, df, du • su, sudo ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 5 von 139 Foliensatz 1 Grundlagen Inhalt • Aufgaben eines Systemadministrators • Arbeiten als root • Wichtige Verzeichnisse • procfs und sysfs • Geräte und das Gerätedateisystem • Kernelverwaltung • Hilfsmittel für Systemadministration • Puppet Typische Aufgaben eines Systemadministrators • Installation und Konfiguration von Servern und Arbeitsplatzcomputern (möglichst automatisiert, ev. über ein Netzwerk, wiederholbar) • Installation und Konfiguration von Software (System- bzw. Benutzerapplikationen, Konfiguration der automatischen Sicherheitsupdates, Erstellung systemweiter Standardkonfigurationen) • Benutzerverwaltung (Anlegen, modifizieren und löschen von Benutzern und Gruppen) • Behebung von Softwareproblemen • Backups (einrichten, kontrollieren, wiederherstellen) • Monitoring (überwachen von Serversoftware, Netzwerk, … auf Probleme bzw. Angriffe) • Erstellen einer Benutzungsordnung („Policy“, politischer Aspekt) • Tausch von fehlerhafter Hardware (einzelne Komponenten, ganzer Computer, Peripheriegeräte) Arbeiten als root • Systemadministration muss als Benutzer root durchgeführt werden, da nur dieser die nötigen Berechtigungen hat → birgt großes Gefahrenpotential! • Es ist empfehlenswert, nicht direkt als root einzuloggen, sondern über su oder sudo kurzfristig root zu werden (besser nachvollziehbar, wer wann etwas als root gemacht hat). • Die einzelnen Rechte von root können nicht (leicht) auf mehrere Benutzer aufgeteilt werden. Über den Befehl sudo kann man aber trotzdem relativ einfach andere Benutzer Systemadministrationsaufgaben durchführen lassen. • Unter Ubuntu hat der Benutzer root kein Passwort gesetzt, sondern es ist generell vorgesehen, mittels sudo Aufgaben als root auszuführen. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 6 von 139 sudo - Überblick sudo - Führt Befehle mit den Rechten eines anderen Benutzers aus. » Syntax: sudo [Optionen] [Befehl]. » Standardmäßig werden die Befehle als root ausgeführt. » Konfigurationsdatei ist /etc/sudoers (editieren mit visudo). » Man muss sein eigenes Passwort eingeben (nicht das des anderen Benutzers) und über die Konfigurationsdatei die Rechte zum Ausführen des Befehls haben. » Optionen: • -u Benutzername|UID → Befehl als dieser Benutzer ausführen • -i → Login-Shell ausführen • -l → Erlaubte Befehle anzeigen » $ sudo head -n 1 /etc/shadow root:*:15779:0:99999:7::: $ sudo -i [sudo] password for thomas: root@noweto:~# sudo - Konfigurationsdatei /etc/sudoers 1 • Über die Konfigurationsdatei /etc/sudoers wird spezifiziert, welcher Benutzer welche Befehle ausführen darf. Detaillierte Informationen zu der Datei findet man in der Manpage sudoers(5). • Die (vereinfachte) Syntax ist: wer wo = (als wer) was: • • „wer“: Man kann Benutzernamen („thomas“), UIDs („1000“) und auch zum Beispiel Gruppennamen („%gruppe“) verwenden. Der eingebaute Alias „ALL“ steht für alle Benutzer. • „wo“: Die Computer, auf denen die Befehle ausgeführt werden dürfen. Auch hier steht „ALL“ für alle Computer. • „als wer“: Angaben wie bei „wer“, aber bestimmt, als welcher Benutzer die Befehle ausgeführt werden dürfen. • „was“: Der Befehl und die Befehle, die ausgeführt werden dürfen. Wiederum steht „ALL“ für alle Befehle. Die Zeilen werden der Reihe nach abgearbeitet und die letzte, die zutrifft, wird verwendet. sudo - Konfigurationsdatei /etc/sudoers 2 Beispiele: • root,%sudo ALL=(ALL:ALL) ALL Der Benutzer „root“ und alle Benutzer der Gruppe „sudo“ dürfen auf allen Computern alle Befehle als jeder Benutzer und jede Gruppe (wegen „:ALL“) ausführen. • thomas praxis = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm Der Benutzer „thomas“ darf auf dem Computer „praxis“ den Befehl /bin/ls als „operator“ und /bin/kill sowie /usr/bin/lprm als „root“ ausführen. • thomas ALL = (root) /sbin/* ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 7 von 139 Der Benutzer „thomas“ darf auf allen Computern jeden Befehl im Verzeichnis /sbin/ als „root“ ausführen. sudo - Real Life Manche versuchen sudo auch im realen Leben (meist mit weniger Erfolg): XKCD Comic 149 Syntax von Konfigurationsdateien • Die Konfigurationsdateien unter Linux (Unix) sind (fast) alles Textdateien. Daher braucht man nur einen Texteditor (z.B. Vim), um sie zu bearbeiten. • Textdateien haben einige Vorteile: • • Wird die Datei korrupt, kann man den Großteil trotzdem richtig auslesen. • Man braucht nur einen Texteditor. • Man wird sie auf zukünftigen Computern ohne spezielle Hilfsmittel sicher lesen können. Ein großer Nachteil ist, dass es keinen Standard für die Syntax von Konfigurationsdateien gibt: • Tabellenstruktur (z.B. /etc/passwd) • Ausführbare Datei (z.B. /etc/bash.bashrc) • XML (z.B. /etc/fonts/fonts.conf) • Assoziation von Parametern /etc/systemd/system.conf) • Spezielles Format (/etc/sudoers) mit Werten, eventuell unterteil ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 in Sektionen (z.B. Seite 8 von 139 Wichtige Verzeichnisse 1 • Die Lage der Konfigurations-, Daten- und Systemdateien ist bei den meisten Linux-Distributionen FHS-konform. Ausnahmen sind z.B. NixOS und GoboLinux. • /boot/ → Wichtige Dateien für das Booten (z.B. Kernel und initiale RAM-Disk), Unterverzeichnis efi/ für den Zugriff auf die EFI-Partition • /dev/ → Gerätedateisystem für die benötigten Gerätedateien • /etc/ → Systemkonfigurationsdateien (werden an den entsprechenden Stellen genauer erklärt) • /lib/ → Systembibliotheken, u.a. auch für Kernel (modules/) und systemd (systemd/) • /proc/ → Datendateien des Kernels (auch Informationen zu Prozessen) Wichtige Verzeichnisse 2 • /run/ → Laufzeitdaten von Prozessen • /sys/ → Informationen über alle Geräte, die der Kernel kennt, und Möglichkeit, diese zu konfigurieren (Linux-spezifisch) • /tmp/ → Speicherort für temporäre Dateien aller Benutzer • /var/ → Veränderbare Datendateien: • /var/cache/ → Cachedaten von Applikationen (z.B. apt) • /var/log/ → Logdateien (bei Verwendung von klassischen Logging-Daemonen) • /var/run/ → Nur mehr Symlink auf /run/ • /var/spool/ → Spooling von Daten (Spool = Simultaneous Peripheral Operation On-Line, aufspulen/abspulen; Zwischenlagerung von Druckjobs, Mails, …) procfs • Das procfs (process filesystem) ist ein virtuelle Dateisystem, das auf vielen unixartigen Betriebssystemen eingesetzt wird und üblicherweise im Verzeichnis /proc eingehängt ist. • Es dient zur Anzeige und zur Änderung von Prozess- und Systeminformationen. Da die Informationen im Dateisystem dargestellt werden, können die Dateien darin mit den üblichen Befehlen bearbeitet werden (z.B. cat für das Anzeigen und echo zusammen mit der Ausgabeumleitung für das Ändern). • In der Kernel-Dokumentation des procfs findet sich eine genaue Auflistung der vom Kernel zur Verfügung gestellten Dateien und Verzeichnissen. Wir betrachten ein paar nützliche Teile davon. procfs - Allgemeine Informationen • /proc/cpuinfo → Informationen zu den vorhandenen CPUs • /proc/devices, /proc/bus/input/devices, vorhandenen Geräten • /proc/filesystems → Vom Kernel unterstützte Dateisysteme • /proc/loadavg → Informationen zur Systemauslastung • /proc/meminfo → Detailierte Speicherinformationen /proc/bus/pci/devices → ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Informationen zu Seite 9 von 139 • /proc/mounts → Liste der aktuell eingehängten Dateisysteme • /proc/net/ → Verzeichnis mit Netzwerkinformationen • /proc/stat → Allgemeine Statistiken • /proc/uptime → Betriebszeit des Systems • /proc/version → Kernelversion procfs - Prozessinformationen • Jedem Prozess ist über seine PID ein Verzeichnis unterhalb von /proc zugeordnet. Ein Prozess kann sich seine Informationen über den symbolischen Link /proc/self holen. • Einige nützlichen Dateien und Verzeichnisse in einem Prozessinformationsverzeichnis: • cmdline → Kommandozeilenargumente • cwd → Symbolischer Link zum aktuellen Arbeitsverzeichnis • environ → Umgebungsvariablen • status → Prozessstatus • fd → Verzeichnis mit Informationen zu Dateideskriptoren procfs - Kernelparameter 1 • Im Verzeichnis /proc/sys werden alle Kernelparameter aufgelistet. • Die Parameter können temporär durch direktes Schreiben in Verzeichnisses geändert werden oder mittels des Programms sysctl. • Um die Parameterwerte permanent zu speichern, können diese in der Konfigurationsdatei /etc/sysctl.conf (alte Variante) bzw. in *.conf-Dateien im Verzeichnis /etc/sysctl.d hinterlegt werden. • Die Einträge werden zeilenweise in diese Dateien geschrieben, Kommentare können mit # oder ; eingetragen werden: Dateien unterhalb dieses # Deaktivieren des Swapspeichers vm.swappiness = 0 • Beim Start des Systems werden die Parameterwerte aus diesen Dateien ausgelesen und in den Kernelspeicher geschrieben. Das wird bei systemd durch die Unit systemd-sysctl.service erledigt. procfs - Kernelparameter 2 • Einige interessante Parameter: • vm/swappiness → Beeinflusst die Benutzung des Swap-Speichers (auf 0 gesetzt, wird er nicht mehr benutzt) • kernel/sysrq → (De)aktivieren des magic SysRq key (erlaubt Tastenkombinationen, die der Kernel direkt verarbeitet, z.B. Neustart des Systems) • net/ipv4/tcp_syncookies → (De)aktivieren des SYN-Flood-Schutzes • net/ipv4/ip_forward Netzwerkschnittstellen → (De)aktivieren der Weiterleitung von ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Paketen zwischen Seite 10 von 139 • • net/ipv4/neigh/default/gc_thresh3 → Maximale Anzahl von Einträgen in der ARP-Tabelle Eine Dokumentation der Parameter findet sich in der Kernel sysctl-Dokumentation bzw. für Netzwerkparameter in IP-sysctl Dokumentation procfs - sysctl sysctl - Zeigt Kernelparameter an oder konfiguriert sie zur Laufzeit. » Optionen: • -a → alle Parameter anzeigen • -w → Parameter schreiben • -r REGEX → nur Parameter benutzen, auf die der reguläre Ausdruck zutrifft » $ sysctl vm.swappiness vm.swappiness = 0 $ sysctl -w vm.swappiness=50 vm.swappiness = 50 $ sysctl -a -r gc_thresh[123] net.ipv4.neigh.default.gc_thresh1 net.ipv4.neigh.default.gc_thresh2 net.ipv4.neigh.default.gc_thresh3 net.ipv6.neigh.default.gc_thresh1 net.ipv6.neigh.default.gc_thresh2 net.ipv6.neigh.default.gc_thresh3 = = = = = = 128 512 1024 128 512 1024 sysfs • Das sysfs ist ein virtuelles Dateisystem von Linux, welches Kernel-interne Informationen zu Geräten und Treibern darstellt bzw. sie auch verändern lässt. Es existiert seit der Kernelversion 2.5 und ist üblicherweise im Verzeichnis /sys eingehängt. • Durch die Einführung von sysfs wurden unter anderem Informationen, die früher verstreut im procfs zu finden waren, an einem Ort zusammengefasst. • Einige interessante Verzeichnisse/Dateien: • devices/ → Informationen zu allen Geräten (z.B. devices/system/cpu/cpu0/ für Informationen zur ersten CPU) • modules/ → Informationen zu Kernel-Modulen (z.B. modules/MODUL_NAME/parameters/* für Informationen zu den Parametern des Moduls MODUL_NAME) • power/ → Energiesteuerung Geräte und das Gerätedateisystem • Damit Applikationen auf Geräte zugreifen können, müssen diese Geräte über Dateien mit den Typen „block device“ oder „character device“ im Dateisystem abgebildet sein. Diese Gerätedateien liegen standardmäßig im Verzeichnis /dev. • Jedes Gerät wird über major und minor Zahlen eindeutig identifiziert. Die major Zahl gibt üblicherweise den Treiber, die minor Zahl das Gerät an. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 11 von 139 • Früher wurden die Gerätedateien bei der Installation einmal statisch mittels mknod angelegt. Der Nachteil dieser Vorgehensweise war, dass man alle möglichen Gerätedateien im Vorhinein anlegen musste. Das machte das /dev-Verzeichnis sehr unübersichtlich und schwerer benutzbar. • Daher wurden Lösungen gesucht, um das Anlegen der benötigten Gerätedateien zu automatisieren. Eine der ersten Lösungen war das devfs-Dateisystem, welches aber einige Nachteile hatte. • Derzeit wird das devtmpfs-Dateisystem für diesen Zweck verwendet. Es legt nur für die Geräte die benötigten Gerätedateien an, die bei der Ausführung aktuell im Kernel vorhanden sind. Weiters kann es alleine oder in Kombination mit udev verwendet werden. Geräte und das Gerätedateisystem - lsusb, lspci lsusb - Zeigt vorhandene USB-Geräte an. » Optionen: -t → physische USB-Gerätehierachie anzeigen, -v → Details anzeigen » $ lsusb | head -n 3 Bus 004 Device 039: ID 045e:07a5 Microsoft Corp. Bus 004 Device 037: ID 17ef:100a Lenovo ThinkPad Mini Dock Plus Series 3 Bus 004 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub $ lsusb -t | head -n 4 /: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M |__ Port 8: Dev 37, If 0, Class=Hub, Driver=hub/6p, 480M |__ Port 4: Dev 39, If 0, Class=Human Interface Device, Driver=usbhid, 12M lspci - Zeigt vorhanden PCI-Geräte an. » Optionen: -v → Details anzeigen, -k → Treiber für das Gerät anzeigen » $ lspci | head -n 3 00:00.0 Host bridge: Intel Corporation 3rd Gen Core processor DRAM Controller (rev 09) 00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09) 00:14.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller (rev 04) $ lspci -k -s 14.0 00:14.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller (rev 04) Subsystem: Lenovo Device 21fa Kernel driver in use: xhci_hcd Geräte und das Gerätedateisystem - lshw lshw - Zeigt detaillierte Hardwareinformationen an. » Es gibt auch eine GUI-Version lshw-gtk. » Die Ausgabe kann sowohl im Textformat als auch in HTML, XML oder JSON erfolgen. » Optionen: -short → Überblick über Gerätebaum ausgeben; -businfo → wie -short, aber mit BusInformation, -class → nur Geräte einer bestimmten Klasse anzeigen » $ lshw -short | head -n 6 H/W path Device Class Description ========================================================= system Computer /0 bus Motherboard /0/0 memory 15GiB System memory ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 12 von 139 /0/1 processor Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz $ sudo lshw -class processor | head -n 7 *-cpu product: Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz vendor: Intel Corp. physical id: 1 bus info: cpu@0 size: 1399MHz capacity: 3300MHz Geräte und das Gerätedateisystem - udev • Durch das devtmpfs-Dateisystem werden die Gerätedateien in /dev automatisch erstellt. Allerdings werden dadurch keine (Userspace-)Ereignisse ausgelöst, Berechtigungen richtig gesetzt oder sinnvolle, permanente Namen für Geräte vergeben. Diese Aufgaben übernimmt udev. • udev wird über Dateien in den Verzeichnissen /lib/udev/rules.d, /run/udev/rules.d und /etc/udev/rules.d konfiguriert. Die in diesen Verzeichnissen liegenden *.rules Dateien enthalten die Regeln, wie der udev-Daemon auf die Kernelereignisse reagieren sollen. • Die Syntax dieser Konfigurationsdateien ist in udev(7) genau beschrieben. • Hier z.B. eine Regel, die einer bestimmten Netzwerkkarte immer den selben Namen zuweist: # PCI device 0x8086:/sys/devices/pci0000:00/0000:00:19.0 (e1000e) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="3c:97:0e:79:b8:0a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" • Mittels des Befehls udevadm können die Informationen von udev abgefragt werden, was aber im Normalbetrieb meist nicht nötig ist. Kernel - Allgemeines • Früher hat man den Linux-Kernel oft selbst kompiliert, um ihn auf die benutzte Hardware abzustimmen. Das richtige Konfigurieren und Kompilieren eines Linux-Kernels ist aber nicht einfach und es können leicht Fehler passieren. • Heutzutage wird üblicherweise der Kernel verwendet, den die Distribution liefert. Dieser ist getestet, beinhaltet die wichtigsten Komponenten und stellt alle sonstigen Komponenten als KernelModule zur Verfügung. Das ist dann ein generischer Kernel, der nicht speziell auf die persönliche Hardware zugeschnitten wurde, sondern auf unterschiedlichster Hardware läuft. • Wichtig: Alle Treiber, die der Kernel beim Booten benötigt, müssen entweder fix in den Kernel eingebunden oder in einer sogenannten Initial Ramdisk (wird als Root-Dateisystem benutzt bis das echte Root-Dateisystem geladen werden kann) vorhanden sein. • Der Kernel selbst und die zusätzlich benötigten Dateien (wie z.B. eine initiale RAM-Disk) liegen im Verzeichnis /boot. Üblicherweise heißt die Datei für den Kernel vmlinuz-RELEASE (wobei RELEASE die Kernel-Release ist). ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 13 von 139 Kernel-Module • Kernel-Module erlauben es dem Kernel, im Nachhinein zusätzliche Funktionalitäten wie z.B. neue Treiber oder neue Dateisysteme zu verwenden. Üblicherweise werden z.B. die Treiber für die Soundkarte oder die Netzwerkkarte als Kernel-Module zur Verfügung gestellt. • Kann der Kernel mit einem Gerät nicht umgehen/kommunizieren, so wird automatisch versucht, den richtigen Treiber (i.e. das richtige Kernel-Modul) für das Gerät zu laden. Das funktioniert mittlerweile sehr gut, d.h. nur in Ausnahmefällen muss man das richtige Kernel-Modul händisch laden. • Die Kernel-Module liegen unterhalb des Verzeichnisses /lib/modules/RELEASE. • Über die Konfigurationsdatei /etc/modules bzw. Dateien mit der Endung .conf im Verzeichnis /etc/modules-load.d/ kann man festlegen, welche Kernel-Module beim Start geladen werden sollen. Kernel - Sonstiges • Unter Ubuntu findet man den Standardkernel im Paket linux-image-generic und die zugehörigen Header-Dateien im Paket linux-headers-generic. • Weiters werden die initiale RAM-Disks über die initramfs-tools verwaltet, mehr Informationen dazu unter initramfs-tools(8). Dynamic Kernel Module Support (DKMS) • Früher hat es immer das Problem gegeben, dass man Kernel-Module, die nicht mit dem Kernel selbst mitinstalliert wurden, bei einem Kernelupdate selbst neu kompilieren musste. • Das Dynamic Kernel Module Support-System (DKMS) wurde aus diesem Grund 2003 bei Dell entwickelt. Es erlaubt unter anderem das automatische Kompilieren von Kernel-Modulen nach Installation eines neuen Kernels bzw. bei Installation eines Kernel-Moduls. • Damit das DKMS funktionieren kann, braucht man natürlich die Header-Dateien des verwendeten Kernels sowie die benötigten Programme zur Kompilation der Kernel-Module. • Unter Ubuntu wird das DKMS mit Hilfe des Pakets dkms installiert. Pakete, die Kernel-Module enthalten, die über DKMS verwaltet werden, haben üblicherweise das Suffix „-dkms“ im Paketnamen. Befehle zur Kernelverwaltung - uname, dmesg uname - Zeigt Systeminformationen an. » Nützliche Optionen: -a → alle Informationen anzeigen, -r → Kernel-Release anzeigen. » $ uname -a Linux noweto 4.2.0-27-generic #32-Ubuntu SMP Fri Jan 22 04:49:08 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux $ ls -l /lib/modules/`uname -r` | head -4 total 4380 lrwxrwxrwx 1 root root 39 Jän 22 08:14 build -> /usr/src/linux-headers-4.2.027-generic drwxr-xr-x 2 root root 4096 Jän 22 08:06 initrd ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 14 von 139 drwxr-xr-x 12 root root 4096 Jän 25 09:03 kernel dmesg - Zeigt den Kernel-Buffer an. » Ist zum Beispiel nützlich um zu sehen, ob beim Laden oder Entfernen eines Kernel-Moduls ein Problem aufgetreten ist. » Optionen: -e → lesbare Zeitstempel verwenden » $ dmesg -e | head [Feb16 19:32] usb [ +0,094753] usb [ +0,000007] usb [ +0,000004] usb -n 4 3-1.2: 3-1.2: 3-1.2: 3-1.2: new high-speed USB device number 6 using ehci-pci New USB device found, idVendor=0781, idProduct=5580 New USB device strings: Mfr=1, Product=2, SerialNumber=3 Product: Extreme Befehle für Kernel und Kernel-Module - lsmod, insmod lsmod - Zeigt die Liste der geladenen Kernel-Module an. » $ lsmod | head -5 Module Size Used by uvcvideo 80847 0 videobuf2_vmalloc 13056 1 uvcvideo videobuf2_memops 13202 1 videobuf2_vmalloc videobuf2_core 40513 1 uvcvideo insmod - Lädt ein Kernel-Modul. » Beachtet keine Abhängigkeiten, sondern versucht einfach, das gegebene Kernel-Modul zu in den Kernel zu laden. Besser ist modprobe. » Syntax: insmod Modulpfad [Optionen] Befehle für Kernel und Kernel-Module - rmmod, modinfo rmmod - Entfernt ein Kernel-Modul aus dem Kernel. » Sehr einfaches Programm; besser ist modprobe. » Syntax: rmmod Modulname modinfo - Zeigt Informationen zu einem Kernel-Modul an. » Syntax: modinfo Modulname » $ modinfo snd filename: alias: license: description: author: srcversion: depends: intree: vermagic: signer: sig_key: sig_hashalgo: parm: parm: parm: /lib/modules/4.2.0-27-generic/kernel/sound/core/snd.ko char-major-116-* GPL Advanced Linux Sound Architecture driver for soundcards. Jaroslav Kysela <[email protected]> FBB791631E8C58B815FCEAD soundcore Y 4.2.0-27-generic SMP mod_unload modversions Build time autogenerated kernel key 94:21:CE:78:F7:DD:69:32:D7:A7:1D:3B:AB:89:BB:03:6A:FA:29:EB sha512 slots:Module names assigned to the slots. (array of charp) major:Major # for sound driver. (int) cards_limit:Count of auto-loadable soundcards. (int) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 15 von 139 Befehle für Kernel und Kernel-Module - modprobe modprobe - Lädt oder entfernt ein Kernel-Modul. » Löst automatisch die Abhängigkeiten zwischen Kernel-Modulen auf (dazu wird eine von depmod generierte Datei verwendet), d.h. benötigte Kernel-Module werden automatisch geladen bzw. nicht mehr gebrauchte automatisch entfernt. » Es muss nicht der Pfad zu einem Modul angegeben werden, sondern nur der Modulname. » Modul-Parameter können als Argumente übergeben werden. Es werden dabei aber auch die Konfigurationsdateien im Verzeichnis /etc/modprobe.d/ beachtet (siehe man modprobe.d). » Optionen: -r → Entfernen eines Kernel-Moduls. » Syntax: modprobe [-r] Modulname [Optionen] » $ modprobe iwlwifi 11n_disable=2 Hilfsmittel für Systemadministration 1 • Es gibt einige Programme, über die zentral ein Linuxsystem administriert werden kann (z.B. Webmin). • Die Benutzung von Webmin (oder anderer solcher Programme) hat Vor- aber auch Nachteile: • Pro: Man muss die unterschiedlichen Konfigurationsdateien und deren Syntax nicht kennen, um Änderungen vorzunehmen. • Pro: Einheitliche Oberfläche, gut aufbereitet, leicht verständlich. • Contra: Die Version des Admin-Programms muss zu den Versionen der Programme passen, die man konfigurieren will. Ist ein Programm neuer und hat es Änderungen in der Syntax oder der Konfigurationsparameter gegeben, muss man warten, bis das Admin-Programm nachzieht. • Contra: Automatisches Ändern von Konfigurationsdateien über Tools kann gefährlich sein. • Contra: Man wird eventuell „abhängig“ von dem Admin-Programm. Hilfsmittel für Systemadministration 2 • Besser sind Konfigurationsmanagementprogramme (z.B. Puppet oder Chef), die meist aus einer Server- und einer Client-Komponente bestehen (siehe Vergleich von mehreren dieser Programme auf Wikipedia). • Diese erlauben es, einen Computer reproduzierbar in einen bestimmten Zustand zu versetzen. Dazu wird der gewünschte Zustand mittels Konfigurationsdateien definiert und das Programm weiß, was es ändern muss, um diesen Zustand zu erreichen. • Sobald man mehrere Server/Arbeitsplatzcomputer verwalten muss, sollte man sich überlegen, ob man nicht so ein Programm einsetzen sollte. • Einige der Programme (z.B. Puppet und Chef) erlauben auch die Ausführung ohne Serverdienst. Das ist z.B. sehr nützlich, um nach einer Neuinstallation des eigenen Computers schnell wieder alles richtig konfiguriert zu haben. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 16 von 139 Puppet • Bei Puppet wird der gewünschte Zustand, in dem sich das System befinden soll, mit Hilfe einer deklarativen Sprache in Dateien mit der Endung .pp (sogenannten Manifesten) definiert. Die Sprache erlaubt unter anderem die Definition von Ressourcen, die auf dem System (nicht) vorhanden sein sollen, wobei konditionelle Ausdrücke verwendet werden können. • Die Client-Software von Puppet interpretiert das Manifest und erstellt daraus einen Katalog, der spezifisch für das System ist. Der Inhalt des Katalog wird dann mit dem aktuellen Zustand des Systems abgeglichen und nötige Änderungen werden durchgeführt. • Die Dokumentation zu Puppet ist sehr ausführlich, beginnen sollte man mit Introduction to Puppet oder mit der Learning VM. Puppet - Nutzungsvarianten • Puppet kann sowohl mit als auch ohne Server betrieben werden. Beide Varianten haben Vor- und Nachteile. Werden viele System mit Puppet verwaltet, sollte man die Server-Variante verwenden. • Zum Betrieb ohne Server braucht man nur das Paket puppet-common installieren. Diese Variante ist zum Beispiel ideal für die Konfiguration eines oder weniger Systeme (z.B. zur Konfiguration des eigenen Computers). • Für den Server-Betrieb benötigt man das Paket puppetmaster für den Server und das Paket puppet für die Clients. Nach der Installation läuft der Server mit einer Standardkonfiguration. • Das globale Konfigurationsverzeichnis /etc/puppet enthält folgende Dateien: • • auth.conf → Allgemeine Zugriffssteuerung für die Serverkomponente • fileserver.conf → Zugriffssteuerung für die Dateiserverkomponente • puppet.conf → Konfigurationsdatei Die Konfigurationsdatei enthält Blöcke für die verschiedenen Komponenten (agent, master, …), in denen die Konfigurationsoptionen gesetzt werden können. Puppet - Facter • Puppet benutzt das Programm Facter, um Informationen über ein System herauszufinden. Wie Puppet ist auch Facter in Ruby implementiert und kann um zusätzliche Informationsmodule erweitert werden. • Die durch Facter gewonnen Informationen können in Manifesten als Variablen und somit auch in Bedingungen benutzt werden. • Beispielausgabe: $ facter | head -n 5 architecture => amd64 augeasversion => 0.10.0 boardmanufacturer => Oracle Corporation boardproductname => VirtualBox boardserialnumber => 0 ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 17 von 139 Puppet - Module und Umgebungen • Neben der Definition von Ressourcen in Manifesten können auch Dateien und Templates zur Verwendung hinterlegt werden. • Um die Wiederverwendbarkeit zu erhöhen, können zusammengehörige Manifeste, Dateien und Templates in Module verpackt werden. • In der aktuellen Version von Puppet können einzelne Manifeste und „lose“ Dateien und Templates weiterhin verwendet werden, allerdings ist das gesamte System nun primär auf Module ausgelegt. • Es gibt mittlerweile schon sehr viele vorgefertigte Module, die man einbinden kann. Die Webseite Puppet Forge wird von den Entwicklern von Puppet betreut und enthält eine Vielzahl an Modulen. • Weiters unterstützt Puppet Umgebungen (Environments), wobei jede Umgebung unterschiedliche Module verwenden kann. Damit ist es z.B. leicht, eine Testumgebung für nur ein paar Computer aufzusetzen. Puppet - Ressourcen • Ressourcen definieren über Attribute, wie das System auszusehen hat. Es müssen dabei nicht alle Attribute angegeben werden. Falls benötigte Attribute fehlen, benutzt Puppet, wenn möglich, die systemabhängigen Standardwerte dafür. Ansonsten wird eine Fehlermeldung produziert. • Wichtig: Nur wirklich in einer Ressource definierte Attribute werden über Puppet verwaltet, alle anderen Attribute bleiben unverändert! • In Puppet sind schon die wichtigsten Ressourcetypen inkludiert, z.B. zur Paketverwaltung (package), Benutzer- und Gruppenverwaltung (user und group) und Dateiverwaltung (file). • Für jede Plattform gibt es unterschiedliche Provider für einen Ressourcetyp. Puppet erkennt üblicherweise automatisch den zu benutzenden Provider, man kann aber auch einen spezifizieren. Diese Provider sind unterschiedlich gut, d.h. manche unterstützen mehr Operationen als andere. Puppet - Ressourcendeklarationen • Jede Ressource besitzt immer einen Typ, einen Titel und optional ressourcespezifische Attribute. • Zusätzlich besitzt jeder Ressourcetyp ein spezielles namevar Attribut, um eine Ressource eindeutig identifizieren zu können. Wird dieses namevar Attribute nicht gesetzt, so wird standardmäßig der Wert des Titels dafür genommen. Über die Kombination Ressourcetyp/namevar kann die Ressource später eindeutig referenziert werden. • Die Syntax für eine Ressourcendeklaration sieht so aus: type {'title': attribute => value, } • Zusätzlich kann man bei jedem Ressourcetyp sogenannte Metaparameter (wie Attribute) verwenden, die es z.B. erlauben, Abhängigen zwischen Ressourcen zu definieren. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 18 von 139 Puppet - Beispielmanifest case $operatingsystem { centos, redhat: { $service_name = 'ntpd' } debian, ubuntu: { $service_name = 'ntp' } } package { 'ntp': ensure => installed } service { 'ntp': name => $service_name, ensure => running, enable => true, subscribe => File['ntp.conf'], } file { 'ntp.conf': path => '/etc/ntp.conf', ensure => file, require => Package['ntp'], source => "puppet:///files/ntp.conf", } Um dieses Manifest anzuwenden, muss noch die Datei ntp.conf im aktuellen Vereichnis angelegt und folgenden Befehl ausgeführt werden: $ puppet apply --fileserverconfig=<(echo -e "[files]\npath `pwd`\nallow *") manifest.pp Puppet - ohne Server • Einzelne Änderungen an Ressourcen können über puppet resource gemacht werden bzw. kann über diesen Befehl der Zustand einer Ressource als Puppet-Manifest ausgegeben werden. $ puppet resource user root shell=/bin/sh notice: /User[root]/shell: shell changed '/bin/bash' to '/bin/sh' user { 'root': ensure => 'present', shell => '/bin/sh', } • Der Befehl puppet apply wird benutzt, um ein ganzes Manifest auf ein System anzuwenden. Dazu wird nicht unbedingt ein Server benötigt, man kann auch eine Manifestdatei angeben: $ puppet apply manifest.pp • Wenn man seine Manifeste in Module gegliedert hat, muss man über die Option --modulepath diesen Pfad angeben, damit Puppet sie findet. • Zum Testen sind die Optionen --test (mehr anzeigen) und --noop (nichts wirklich ändern) nützlich. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 19 von 139 Puppet - mit Server • Die Standardserverkonfiguration nach der Installation des Pakets reicht für wenige Clients aus (bei vielen Clients sollte man einen anderen als den eingebauten Webserver Webrick verwenden). • Damit ein Client weiß, wie der zu nutzende Server heißt, muss man in der Hauptkonfigurationsdatei im Block agent die Variable server auf die IP-Adresse (oder den DNS-Namen) des Servers setzen. • Die Kommunikation zwischen Client und Server wird über SSL verschlüsselt und jeder Client braucht ein gültiges, vom Server signiertes Zertifikat, um einen Katalog zu bekommen. Daher wird beim erstmaligen Aufruf von puppet agent ein Zertifikatsfehler ausgegebgen. • Um diesen Fehler zu beheben, muss am Server die Zertifikatsanfrage bestätigt und das ClientZertifikat mittels puppet cert sign HOSTNAME signiert werden. Danach sollte der Client ohne Problem auf den Server zugreifen können. • Bei einer Anfrage des Clients interpretiert der Server die in /etc/puppet/environments/production/manifests/ definierten Manifeste und erstellt daraus einen Katalog, der an den Client zurückgesandt und auf das System angewandt wird. Dateiverwaltung mit Puppet • Dateien werden in Puppet über die Ressource file verwaltet. • Unter Ubuntu wird standardmäßig der Provider posix verwendet. • Wichtige Attribute: • path: Der absolute Pfad der Datei (falls nicht angegeben, wird der Titel verwendet). • ensure: Der gewünschte Zustand (present, absent, file, directory oder link) • backup: Spezifiziert, ob und wie ein Backup gemacht werden soll (false, Zeichenkette beginnend mit Punkt oder sonstige Zeichenkette) • content: Der Inhalt der Datei (nicht gleichzeitig mit source verwendbar). • source: Eine URI, deren Inhalt verwendet werden soll (lokale Datei oder vom Puppetserver). • target: Linkziel. • owner: Der Besitzer der Datei. • group: Der Gruppenbesitzer der Datei. • mode: Die Rechte der Datei. Dateiverwaltung mit Puppet - Beispiele • Anlegen eines Verzeichnisses: file {'/var/local': ensure => directory} • Erstellen eines symbolischen Links: file {'/var/local/test': ensure => link, target => '/etc/modules' } • Erstellen einer Datei mit einem bestimmten Inhalt: file {'/etc/my.secret': ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 20 von 139 owner => root, group => root, mode => 600, content => 'My secret secret' } • Kopieren einer Datei von der Dateisektion ‚common‘ vom Puppetserver: file {'/etc/ssh/sshd_config': ensure => present, owner => root, group => root, mode => 644, source => ["puppet:///common/sshd_config.$fqdn", 'puppet:///common/sshd_config'] } Puppet - Weitere Beispiele Es werden in dieser Lehrveranstaltung immer wieder Beispielmanifeste verwendet, um zu zeigen, wie man mit Puppet Aufgabenstellung lösen könnte. Zum Beispiel: • Anlegen eines lokalen Benutzers und einer lokalen Gruppe (Ressourcen user und group) • Installation von Paketen, die verschiedene Namen unter verschiedenen Distributionen haben (Ressource package) • Verwenden eines Moduls zur Einrichtung eines OpenSSH-Servers • Ändern von Dateien mit Hilfe von Augeas ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 21 von 139 Foliensatz 2 Systemstart und -services Inhalt • Bootloader (GRUB 2) • init-Programme (SysVinit, systemd) • Logging • Systemzeit, Zeitzonen, Zeitserver • Locale • Automatisierung (cron, at) • OpenSSH-Server Start des Betriebssystems • Das BIOS (Basic Input Output System) bzw. das UEFI (Unified Extensible Firmware Interface) – gespeichert auf einem Chip direkt am Motherboard – initialiert die Hardware und läd den Bootloader von einer Partition einer Festplatte, von einem USB Gerätes, von einer CD, … • Der Bootloader (unter Linux meist GRUB 2) übergibt die Kontrolle an ein Betriebssystem, in unserem Fall dem Linux-Kernel. • Der Linux-Kernel bereitet die Hardware vor und übergibt dann an den init-Prozess, welcher das System konfiguriert. • Sobald die initiale Konfiguration des Systems abgeschlossen ist, werden die Login-Programme gestartet und der Benutzer kann sich einloggen. Bootloader GRUB 2 • Ubuntu verwendet den Bootloader GRUB 2, wie die meisten anderen Distributionen. • Einige Features von GRUB: • Über ein Bootmenü kann ausgewählt werden, welches Betriebssystem gestartet werden soll bzw. kann ein Eintrag auch bearbeitet und dann ausgeführt werden. • Bootmenüeinträge können durch Passwörter geschützt werden. • Nicht nur der Linux-Kernel, sondern auch andere Betriebssysteme wie z.B. DOS, Windows oder BSD-Varianten können gestartet werden. Links: GRUB Manual, Ubuntu GRUB Dokumentation, GRUB 2 auf ubuntuusers.de, ArchLinux GRUB Dokumentation ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 22 von 139 GRUB 2 - Konfiguration 1 • Die fertige Konfiguration sowie benötigte Dateien von GRUB befindet sich im Verzeichnis /boot/grub. Die Konfigurationsdatei ist /boot/grub/grub.cfg, welche eine ähnliche Syntax wie Bash-Skripte besitzt. Allerdings sollten Änderung nicht direkt vorgenommen werden, weil sie bei Updates überschrieben werden. • Damit GRUB die Konfigurationsdateien lesen kann, müssen sie auf einem unterstützten Dateisystem liegen. Deswegen ist unter /boot/ oft eine eigene Partition einghängt. • Zum Konfigurieren werden die Datei /etc/default/grub sowie Shell-Skripte in /etc/grub.d/ benutzt. Nach Änderungen muss der Befehl update-grub ausgeführt werden, damit die Änderungen nach /boot/grub/ geschrieben werden. • In /etc/default/grub sind Shell-Variablen definiert, über welche einfache Änderungen an der Konfiguration gemacht werden können, wie z.B. ändern des Timeouts für das Bootmenü oder deaktivieren des graphischen Terminals. GRUB 2 - Konfiguration 2 • Die Skripte in /etc/grub.d/ werden unter Berücksichtigung der Shell-Variablen von /etc/default/grub der Reihe nach ausgeführt und deren Ausgabe erzeugt die Datei /boot/grub/grub.cfg. • Dabei werden automatisch die installierten Kernel erkannt und Menüeinträge für sie erzeugt. • Genauso wird nach anderen Betriebssystemen auf alle Festplatten und Partitionen gesucht und Menüeinträge für die gefundenen Betriebssystem erstellt. • Werden spezielle Menüeinträge zusätzlich gebraucht, so können diese in der Datei 40_custom definiert werden. GRUB 2 - Utilities • Mit Hilfe von grub-set-default kann der Standardmenüeintrag festgelegt werden, der automatisch nach einem Timeout verwendet wird, wenn nichts anderes ausgewählt wird. Damit das funktioniert, muss zusätzlich GRUB_DEFAULT=saved in /etc/default/grub gesetzt werden. • Soll nur einmalig beim nächsten Boot ein anderer Menüeintrag als Voreinstellung verwendet werden, so kann das mit grub-reboot festgelegt werden. • Beide obigen Befehle setzen Umgebungsvariablen für GRUB in der Datei /boot/grub/grubenv. Zum Auslesen und Editieren dieser Datei kann der Befehl grub-editenv verwendet werden. GRUB 2 - Sonstiges • Bei der Installation der Linux-Distribution wird GRUB automatisch auf der Festplatte installiert. Dazu wird der Befehl grub-install verwendet. • Bei Systemen mit einem BIOS wird GRUB entweder in den MBR (Master Boot Record) oder bei Verwendung von GPT in eine eigene Partition geschrieben. • Bei UEFI-Systemen wird GRUB auf die ESP (EFI System Partition) geschrieben. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 23 von 139 Meist braucht man grub-install selbst nicht ausführen. Es kann aber trotzdem nützlich sein, z.B. wenn bei Nicht-UEFI-Systemen Windows nach Linux installiert worden ist und Windows daher den MBR überschrieben hat. • Andere Bootloader: • Neben GRUB wird auch noch LILO als Bootloader verwendet, allerdings wird LILO derzeit nicht weiterentwickelt. • Für das Booten über PXE gibt es einen eigenen Bootloader namens PXELINUX. Systemstart • Beim Systemstart werden durch den init-Prozess mit der PID 1 die nötigen Systemservices bzw. Daemonen (Disk and execution monitor) gestartet. • Welche Programme beim Systemstart automatisch gestartet werden, wird durch das init-Programm und dessen Konfiguration vorgegeben. • Es gibt mehrere verschiedene init-Programme, früher war SysVinit mit den init-Skripten (ShellSkripte) der Standard. Um den Start zu optimieren, verwenden moderne Distributionen aber andere init-Programme, die meisten davon systemd (Ausnahme z.B. Gentoo mit OpenRC). • Daemonen laufen im Hintergrund und führen wichtige Systemaufgaben aus (z.B. udevd oder dbus) oder stellen bestimmte Services bereit (z.B. sshd oder atd). • Im Verzeichnis /etc/default/ finden sich zu vielen Systemservices und Daemonen zusätzliche Konfigurationsdateien (Shell-Skripte, welche Variablen definieren), z.B. /etc/default/dbus. • Kommuniziert wird mit Daemonen meist über Signale (z.B. wird HUP oft verwendet, um die Konfiguration neu zu laden), in den letzten Jahren wird verstärkt auch D-Bus für die Kommunikation verwendet. SysVinit • Ursprünglich für das Unix-Betriebssystem System V geschrieben, war SysVinit aber bis vor einigen Jahren auch der Standard bei den meisten Linux-Distributionen. • Bei SysVinit wird ein kleines init-Programm vom Kernel als erster Prozess mit PID 1 gestartet und dieser Prozess startet dann, je nach Runlevel, die Systemservices. • Für jedes Service gibt es im Verzeichnis /etc/init.d/ ein Shell-Skript, welches als Argument zumindest start, stop und status erlaubt (meist auch noch restart und reload). D.h. um ein bestimmtes Service zu starten, braucht man nur /etc/init.d/SERVICE start aufrufen. • In den meisten init-Skripten ist zu Beginn ein sogenannter LSB-Block (Linux Standards Base) eingebaut, damit das Skript von unterschiedlichen init-Programmen richtig verwaltet werden kann. Siehe auch LSBInitScripts im Debian Wiki. Links: SysVinit im Debian Manual, SysVinit auf ubuntuusers.de, ArchLinux SysVinit Dokumentation ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 24 von 139 SysVinit - Runlevels • Es gibt 8 sogenannte Runlevels, Zustände, in denen sich ein System befinden kann. • Runlevel 0 wird benutzt um das System herunterzufahren, • Runlevel 6 für einen Reboot und • Runlevel 1 für den Einzelnutzer-Modus (danach befindet sich das System im Runlevel S). Die Runlevel 2, 3, 4 und 5 haben distributionsabhängige Bedeutung. • Zu jedem Runlevel gibt es ein entsprechendes Verzeichnis /etc/rc{0..6,S}.d/, in welchem symbolische Links der Form „S<NUMMER><NAME>“ bzw. „K<NUMMER><NAME>“ liegen, die auf die Skripte in /etc/init.d/ verweisen. Wird in ein bestimmtes Runlevel gewechselt, so werden die Skripte mit dem Prefix „S“ der Reihe nach ausgeführt, beim Verlassen des Runlevels jene mit dem Prefix „K“. • Was in welchem Runlevel gemacht wird, wird zentral durch die Konfigurationsdatei /etc/inittab festgelegt. Dort ist z.B. definiert, dass die Skripte der Runlevels wie oben beschrieben ausgeführt werden. SysVinit - Programme 1 runlevel - Zeit das vorherige und aktuelle Runlevel an. » „N“ bedeutet, dass das Runlevel seit dem Start nicht geändert worden ist. » $ runlevel N 5 telinit - Ändert das Runlevel. » $ telinit 6 # Neustart update-rc.d - Installiert und entfernt Links auf SysVinit-Skripte. » Wird benutzt, um die symbolischen Links in /etc/rc{0..6,S}.d zu verwalten. » $ update-rc.d ntp defaults # init-Skript-Links für ntp installieren $ update-rc.d ntp disable # Deaktivieren von ntp insserv: warning: current start runlevel(s) (empty) of script `ntp' overrides LSB defaults (2 3 4 5). insserv: warning: current stop runlevel(s) (1 2 3 4 5) of script `ntp' overrides LSB defaults (1). $ update-rc.d ntp enable # Reaktivieren von ntp SysVinit - Programme 2 shutdown - Hält den Computer an oder startet ihn neu. » Man kann zwar mit telinit das Runlevel ändern und den Computer neustarten, allerdings ist das nicht sehr gut, wenn Benutzer eingeloggt sind, da diese nichts mehr speichern können etc. » shutdown sendet zuerst eine Warnung an die Terminals aller eingeloggten Benutzer und nach einer definierten Zeit wird der Runlevel geändert. » Optionen: -r → Neustart, -H → Anhalten, -P → Herunterfahren (default), -c → Abschaltung widerrufen » $ shutdown -r +10 "Das System wird in 10 Minuten neugestartet." Shutdown scheduled for Wed 2016-03-02 18:54:31 CET, use 'shutdown -c' to cancel. Und in einem anderen Terminal erscheint die Nachricht: ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 25 von 139 Broadcast message from root@noweto on pts/3 (Wed 2016-03-02 18:44:31 CET): Das System wird in 10 Minuten neugestartet. The system is going down for reboot at Wed 2016-03-02 18:54:31 CET! systemd • Das init-Programm systemd hat in der jüngeren Vergangenheit an Popularität gewonnen. Es wurde schon länger z.B. in Fedora benutzt und ist nun auch das Standard-init-Programm in Debian und Ubuntu. • systemd hat einige Vorteile, bringt aber auch tiefgreifende Änderungen mit sich: • Der Start des Systems ist sehr schnell, er dauert meist nur wenige Sekunden. • Abhängigkeiten zwischen Services werden (meist) automatisch aufgelöst. • Viele Services werden nicht automatisch, sondern on-demand gestartet (z.B. via D-BusAktivierung oder Socket-Aktivierung). • systemd ist kompatibel zu SysVinit, d.h. alte init-Skripte funktionieren weiterhin (siehe man systemd-sysv-generator). • Logging funktioniert bei systemd über journald, welches ein Binärformat zur Speicherung der Logdaten benutzt. • systemd ist nicht mehr portabel, da es viele Linux-spezifische Funktionalitäten braucht. Links: systemd Homepage, Ubuntu Wiki-Eintrag zu systemd, Debatte über Systemd bei Debian systemd - Allgemeines • Im Gegensatz zu anderen init-Programmen ist systemd ein sehr großes Programm, was auch an der Fülle an Funktionalitäten liegt (das hört man oft als Kritik an systemd). • Zudem besitzt systemd eine Reihe an optionalen Komponenten/Programmen, die Programme wie z.B. ntpd (durch systemd-timesyncd) oder NetworkManager (durch systemd-networkd) ersetzen können. • Daneben übernehmen Hilfsprogramme von systemd auch Aufgaben wie das Setzen der Systemzeit (timedatectl, systemd-timedated) oder des Hostnamens (hostnamectl, systemd-hostnamed). • Das alles macht es nicht einfach, bei systemd den Überblick zu bewahren, was wann wie verwendet. • In der Datei /etc/systemd/system.conf können allgemeine, systemd-betreffende Einstellungen verändert werden, wie z.B. das Logging-Level. systemd - Units 1 • Die Konfiguration bei systemd besteht aus Unit-Dateien mit 12 unterschiedliche Typen. Die für uns wichtigsten sind: • Service Units Diese dienen dem Starten und Kontrollieren von Systemservices und entsprechen, mehr oder weniger, den Shell-Skripten bei SysVinit. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 26 von 139 • Target Units Diese fassen mehrere Units zusammen und entsprechen, mehr oder weniger, den Runlevels bei SysVinit. Das Standard-Target ist default.target. • Daneben gibt es noch Units, die Sockets, Mountpoints oder auch Geräte beschreiben, um on-demand Aktivierung zu ermöglichen. • Zudem werden Units dynamisch von systemd zur Laufzeit erzeugt, z.B. Device Units, die via udev mit einem speziellen Tag versehen sind. • Die Unit-Dateien liegen in /{etc,run,lib}/systemd/system/ (die Reihenfolge der Ordner bestimmt, von wo eine Unit-Datei geladen wird, falls es mehrere mit dem gleichen Namen gibt). systemd - Units 2 Beispielkonfiguratsdatei für cron: [Unit] Description=Regular background program processing daemon Documentation=man:cron(8) [Service] EnvironmentFile=-/etc/default/cron ExecStart=/usr/sbin/cron -f $EXTRA_OPTS IgnoreSIGPIPE=false [Install] WantedBy=multi-user.target • Unter „[Service]“ ist definiert, wie der cron-Daemon gestartet werden soll. Man sieht, dass Umgebungsvariablen aus /etc/default/cron verwendet werden. • Unter „[Install]“ ist definiert, dass beim Aktivieren dieses Services eine Abhängigkeit zu multiuser.target aufgebaut wird, damit das cron-Service automatisch mitgestartet wird. systemd - systemctl 1 systemctl - Steuert systemd. » Bei systemd benutzt man dieses Programm, um alle Funktionen, die früher auf verschiedene Programme aufgeteilt waren, durchzuführen. Daher besitzt es eine Fülle an möglichen Befehlen. » Anzeige des Statuses des Systems: $ systemctl status | head -n 15 ● noweto State: running Jobs: 0 queued Failed: 0 units Since: Son 2016-02-14 15:49:45 CET; 2 weeks 3 days ago CGroup: / ├─ 1 /lib/systemd/systemd --system --deserialize 18 ├─1439 /sbin/cgmanager -m name=systemd ├─1440 /usr/bin/lxcfs /var/lib/lxcfs/ ├─system.slice │ ├─avahi-daemon.service ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 27 von 139 │ │ ├─1442 avahi-daemon: running [noweto.local │ │ └─1447 avahi-daemon: chroot helpe │ ├─mdadm.service │ │ └─1407 /sbin/mdadm --monitor --pid-file --daemonise --scan --syslog /run/mdadm/monitor.pid systemd - systemctl 2 systemctl Fortsetzung » Befehle für einzelne Units (mit cron.service als Beispielunit): $ systemctl start cron.service # Unit starten $ systemctl stop cron.service # Unit stoppen $ systemctl restart cron.service # Unit stoppen und starten $ systemctl is-enabled cron.service # Wird die Unit beim Systemstart gestartet enabled $ systemctl disable cron.service &>/dev/null # Aktivieren der Unit $ systemctl enable cron.service &>/dev/null # Deaktivieren der Unit $ systemctl help cron.service # Hilfe zur Unit anzeigen (z.B. Manpage) $ systemctl status cron.service ● cron.service - Regular background program processing daemon Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled) Active: active (running) since Don 2016-03-03 12:41:46 CET; 19h ago Docs: man:cron(8) Main PID: 12085 (cron) CGroup: /system.slice/cron.service └─12085 /usr/sbin/cron -f Mär 03 12:41:46 noweto systemd[1]: Started Regular background program processing daemon. Mär 03 12:41:46 noweto cron[12085]: (CRON) INFO (pidfile fd = 3) Mär 03 12:41:46 noweto cron[12085]: (CRON) INFO (Skipping @reboot jobs -- not system startup) systemd - systemctl 3 systemctl Fortsetzung » Befehle für die Energieverwaltung: $ systemctl reboot # System neustarten, wie shutdown -r $ systemctl poweroff # System abschalten, wie shutdown -P $ systemctl suspend # System in den Schlafmodus versetzen » Andere nützliche Befehle: $ systemctl cat cron.service # Zeigt die zugehörige Unit-Datei an # /lib/systemd/system/cron.service [Unit] Description=Regular background program processing daemon Documentation=man:cron(8) $ systemctl list-units --type=target | head -n 3 # Alle Units eines Typs anzeigen UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System bluetooth.target loaded active active Bluetooth $ systemctl isolate rescue.target # Den Einzelnutzer-Modus aktivieren ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 28 von 139 Einschub: D-Bus • D-Bus dient zur Interprozesskommunikation. Es stellt eine genormte Schnittstelle zur Verfügung, über die sich Prozesse gegenseitig Nachrichten schicken können. • Aber D-Bus bietet noch einiges mehr: • Ein Prozess kann sich für eine bestimmte Nachricht registrieren und wird automatisch benachrichtigt, sobald eine solche Nachricht geschickt wird (z.B. Netzwerkverbindung hergestellt/getrennt). • D-Bus-Services können on-demand gestartet werden, d.h. erst, sobald ein Prozess auf das Service zugreift. • Es kann festgelegt, welche Nutzer auf welche Services zugreifen dürfen. • Ein D-Bus-Service wird für das System selbst gestartet und eines für jeden eingeloggten Benutzer. • systemd verwendet D-Bus, um Daemonen und Services bei Bedarf zu aktivieren und danach wieder zu deaktivieren (z.B. für systemd-timedated). • Auch Desktopumgebungen wie Gnome und KDE verwenden mittlerweile D-Bus anstatt CORBA bzw. DCOP. Logging 1 • Unter Linux können alle Programme auf eine zentrale Logging-Infrastruktur namens Syslog zugreifen. • Um Einträge im Syslog zu erzeugen, kann entweder die syslog-Funktion der C-Bibliothek (siehe man 3 syslog bzw. syslog im Glibc-Manual) oder der Socket /dev/log benutzt werden. • Der Kernel selbst verwendet nicht das Syslog, sondern den Kernel-Buffer, um Nachrichten zu loggen (siehe man 2 syslog). Dieser Buffer kann mittels dmesg angezeigt werden. • Syslog-Einträge bestehen aus der Nachricht selbst, einem Tag (normalerweise der Programmname), einer Facility (welche Art von Programm die Nachricht geschickt hat) und einem Log-Level (der Wichtigkiet) - für Details siehe man 3 syslog. Logging 2 • Das Syslog sowie meist auch der Kernel-Buffer werden von einem Logging-Daemon ausgelesen und verarbeitet. Man hat dabei (wie üblich) die Wahl zwischen mehreren Logging-Daemonen, z.B. rsyslog (Standard in Ubuntu) und syslog-ng. Bei systemd ist systemd-journald inkludiert, welcher nicht deaktiviert, aber gleichzeitig mit einem klassischen Logging-Daemon verwendet werden kann. • Daneben erstellen Programme auch selbst Log-Dateien in /var/log/, z.B. der Apache HTTP Server im Unterverzeichnis apache2. Links: Glibc Syslog Overview, Logdateien auf ubuntuusers.de ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 29 von 139 Logging - rsyslog • rsyslog ist der Standard-Logging-Daemon, der bei Ubuntu neben dem systemd Journal verwendet wird. • Er unterscheidet sich von anderen Logging-Daemonen nur geringfügig in der Funktionalität. Alle solche Daemonen sind standardmäßig in der Art konfiguriert, dass sie die Nachrichten des Syslogs und Kernel-Buffers entgegen nehmen und in Logdateien unter den gleichen, üblichen Pfaden in /var/log speichern. • Wichtige Logdateien: • • /var/log/auth.log → Authentifizierungsnachrichten (z.B. erfolglose/-reiche Logins) • /var/log/syslog → Alle Informationen • /var/log/kern.log → Kernel-Nachrichten Falls an den Einstellungen von rsyslog selbst etwas geändert werden soll, wird die Datei /etc/rsyslog.conf benutzt. Die Regeln, die angeben, welche Nachrichten wo gespeichert werden, werden über Dateien in /etc/rsyslog.d festgelegt (siehe man rsyslog.conf). Logging - systemd Journal • systemd kommt mit einem eigenen Logging-Daemon namens journald, wodurch ein separater Logging-Daemon nicht mehr unbedingt notwendig ist. • Im Gegensatz zu den klassischen Logging-Daemonen speichert journald standardmäßig die Daten in einem Binärformat unter /var/log/journal, falls dieses Verzeichnis existiert, ansonsten unter /run/log/journal (hier keine permanente Speicherung!). • Die Konfiguration des Journals wird über /etc/systemd/journal.conf gesteuert. Dort können Einstellungen wie die maximale Größe des Journals, optionale Kompression, etc. eingestellt werden. Zudem kann festgelegt werden, ob die Log-Einträge an einen klassischen Logging-Daemon weitergeleitet werden sollen. • Da die Daten im Binärformat vorliegen, muss der Befehl journalctl zum Anzeigen und Verarbeiten des Logs herangezogen werden. Logging - journalctl journalctl - Zeigt das systemd Journal an. » Der Befehl erlaubt das Anzeigen und Filtern der Einträge nach vielen Kriterien (siehe man systemd.journal-fields), z.B.: _PID (Prozessid), _UID (Benutzer), _EXE (ausführbare Datei) oder SYSLOG_FACILITY (Nummerischer Wert einer Syslog Facility, siehe Syslog Parameters). » Einige nützliche Optionen: • -b → Einträge seit dem letzten Start • -e → zum Ende des Journals springen • --since → Einträge seit eines bestimmten Zeitpunkts • -u → Einträge einer bestimmten Unit • -f → neue Zeilen ausgeben, sobald sie erscheinen. • -k → Kernel-Nachrichten des aktuellen Systemstarts (ähnlich wie dmesg) » $ # Ausgaben nicht dargestellt! ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 30 von 139 $ journalctl --since today # Alles von heute $ journalctl _PID=1 # Alles vom Prozess mit der PID=1 $ journalctl -u cron.service # Alles von der Unit cron.service Logging - logger logger - Nachrichten in das Syslog eintragen. » Dieser Befehl erlaubt es, beliebige Nachrichten in das Syslog einzutragen, was vor allem für ShellSkripte sehr nützlich ist. » Optionen: • -i → PID mitloggen • -p → Priorität festlegen (eine Kombination aus Facility und Log-Level, z.B. auth.warn) • -t → Tag für die Nachricht festlegen » $ logger -i -p user.info -t ict-test Ein neuer Eintrag von der Shell... $ journalctl -n 1 -q Mär 05 21:11:06 noweto ict-test[20888]: Ein neuer Eintrag von der Shell... Logging - logrotate • Das Programm logrotate wurde entwickelt, um die Administration von Logdateien zu vereinfachen (trifft natürlich nicht mehr auf das systemd Journal zu). • Es wird einmal täglich als Cronjob aufgerufen und kann Logdateien in bestimmten Abständen (täglich, wöchentlich, monatlich) rotieren, eine bestimmte Anzahl an Logdateien vorhalten, sie komprimieren und einiges mehr. • Die Konfiguration erfolgt über die Datei /etc/logrotate.conf und Dateien im Verzeichnis /etc/logrotate.d/ (siehe man logrotate). Beispiel: /var/log/syslog { rotate 7 daily missingok notifempty delaycompress compress postrotate service rsyslog rotate >/dev/null 2>&1 || true endscript } Systemzeit • Die Systemzeit unter Linux wird durch die Systemuhr angegeben. Daneben gibt es auch noch die Hardwareuhr, die durch eine Batterie betrieben wird und daher sogar dann richtig läuft, wenn der Computer ausgeschalten ist. • Beim Starten wird die Systemzeit von der Hardwareuhr gelesen und durch die Systemuhr während des Betriebs richtig gehalten. Umgekehrt wird beim Beenden die aktuelle Systemzeit in die Hardwareuhr geschrieben. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 31 von 139 • Die Hardwareuhr kennt keine Zeitzone, daher muss darauf geachtet werden, dass alle installierten Betriebssysteme die in der Hardwareuhr gespeicherte Zeit richtig interpretieren. Mac OS X und Linux benutzen UTC, Windows aber die lokale Zeit! • Damit die Systemuhr die richtige Zeit anzeigt, muss zusätzlich die Zeitzone, in der sich der Computer befindet, eingestellt werden. • Deshalb wird schon bei der Installation nach der richtigen Zeitzone und Uhrzeit gefragt. Links: UbuntuTime, Kapitel im System Administrator‘s Guide, Uhr Mini-Howto, ArchLinux Zeit Dokumentation, Gentoo Zeit Dokumentation Systemzeit - Zeitzone • Die Zeitzone wird durch die Datei /etc/localtime bestimmt. Das ist ein symbolischer Link auf eine/eine Kopie einer der vordefinierten Dateien unter /usr/share/zoneinfo. • Weiters gibt es die Datei /etc/timezone, in der der Name der verwendeten Zeitzone gespeichert wird, z.B. Europe/Vienna. • Um die Zeitzone einzustellen, gibt es folgende Möglichkeiten (Änderungen werden sofort wirksam): • • Beim Ausführen von dpkg-reconfigure tzdata wird interaktiv die gewünschte Zeitzone über ein Menü abgefragt. • Bei Systemen mit systemd kann der Befehl timedatectl zum Ändern verwendet werden. • Manuell durch Ändern der zwei oben genannten Dateien. In der Datei /etc/default/rcS ist zudem festgelegt, ob die Hardwareuhr UTC verwendet oder nicht. Systemzeit - date date - Zeigt die Uhrzeit an oder setzt sie. » Nicht verwechseln mit dem Befehl time, welcher die Ausführungszeit eines Prozess misst! » Die Anzeige kann durch Formatsequenzen angepasst werden. Wichtige Formatsequenzen sind %H (Stunde 00..23), %M (Minute 00..59), %S (Sekunde 00..59), %d (Tag 01..31), %m (Monat 01..12) und %Y (Jahr). » Mit der Option -d kann ein beliebiges Datum, nicht nur das aktuelle, formatiert werden. » $ date Son Mär 6 08:40:39 CET 2016 $ date +"%Y-%m-%d foo %H:%M:%S" 2016-03-06 foo 08:40:47 $ date -d "9:13 next friday" +"%Y-%m-%d foo %H:%M:%S" 2016-03-11 foo 09:13:00 $ date -s "2016-03-06 11:11:11" Son Mär 6 11:11:11 CET 2016 Systemzeit - hwclock hwclock - Liest oder setzt die Hardwareuhr (RTC). » Nur der Administrator darf dieses Programm verwenden. » Optionen: • --get → die Hardwareuhrzeit anzeigen (angepasst an die lokale Zeitzone) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 32 von 139 • --set --date=ZEITSTEMPEL → setzt die Hardwareuhr auf den angegebenen Zeitstempel • --systohc → die Hardwareuhr an die Systemuhr anpassen • --hctosys → die Systemuhr an die Hardwareuhr anpassen » $ hwclock --get Fre 11 Mär 2016 19:34:18 CET .515231 seconds Systemzeit - timedatectl timedatectl - Verwaltet die Systemzeit. » Teil von systemd, verwendet das Service systemd-timedated.service. » Kann sowohl die Systemuhrzeit anzeigen/setzen als auch die Zeitzone und die Hardwareuhrzeit. » $ timedatectl Local time: Son 2016-03-06 11:16:11 CET Universal time: Son 2016-03-06 10:16:11 UTC RTC time: Son 2016-03-06 10:16:11 Time zone: Europe/Vienna (CET, +0100) Network time on: yes NTP synchronized: yes RTC in local TZ: no $ timedatectl set-timezone America/Los_Angeles $ timedatectl | head -n 1 Local time: Son 2016-03-06 02:18:29 PST $ timedatectl set-timezone Europe/Vienna $ timedatectl set-time 08:53 Systemzeit - Zeitserver • Da die Systemzeit über Interrupts aktualisiert wird, weicht sie von der echten Uhrzeit mit der Zeit ab. • Damit die Systemzeit trotzdem immer stimmt (für einige Anwendungen wie z.B. Kerberos sehr wichig), werden Zeitserver und NTP (Network Time Protocol - siehe RFC5905 und ntp.org) benutzt. • Zeitserver erlauben es, die lokale Systemuhr über das Internet an die Uhr des Zeitservers anzupassen. Sprünge in der Zeit werden dabei, wenn möglich, vermieden. • Unter Linux wird meist das Programm ntpd zur Synchronisation eingesetzt, bei Verwendung von systemd aber auch systemd-timesyncd (ist nicht so genau wie ntpd, aber für die meisten Zwecke ausreichend). Systemzeit - ntpd, systemd-timesyncd • Der Daemon ntpd wird durch die Datei /etc/ntp.conf konfiguriert (siehe man ntp.conf). Die wichtigste Einstellung ist die Angabe der Zeitserver, die verwendet werden sollen. Falls keine speziellen Server verwendet werden sollen, muss nichts geändert werden. ntpd ändert die Zeit nicht abrupt, sondern nur in sehr kleinen Schritten. Damit werden Probleme mit Programme vermieden, die auf eine sehr genaue Uhrzeit angewiesen sind. Möchte man ntpd mit Puppet verwalten, so bietet sich das puppetlabs/ntp Modul an. • Der Daemon systemd-timesyncd wird durch die Datei /etc/systemd/timesyncd.conf konfiguriert (siehe man timesyncd.conf). Dabei kann nur die Liste der Zeitserver geändert werden. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 33 von 139 systemd-timesyncd wird automatisch deaktiviert, sobald ein anderer Zeit-Daemon wie ntpd installiert wird. Locale • Unter Internationalisierung bzw. i18n versteht man das Gestalten von Software in der Art, dass ohne Quelltextänderungen eine Vielzahl an Sprachen und Kulturen unterstützt werden können. • Linux implementiert i18n unter anderem mit Hilfe von Locales. Eine Locale-Bezeichnung besteht dabei aus • einem Sprachecode (z.B. „de“ für Deutsch, „en“ für Englisch) und optional • aus einem Ländercode (z.B. „DE“ für Deutschland, „AT“ für Österreich) und • einer Kodierung (z.B. „UTF-8“ oder „ISO-8859-1“). Die drei Teile werde folgendermaßen miteinander verbunden: „de_AT.UTF-8“. Links: Debian Introduction ubuntuusers.de to i18n, Ubuntu Locale Dokumentation, Spracheinstellungen auf Locale - Umgebungsvariablen • Die Locale-Implementierung in der C-Bibliothek benutzt die Umgebungsvariablen LANG bzw. LC_*, welche eine Locale-Bezeichnung beinhalten müssen, um die Lokalisierung durchzuführen. Dabei bestimmen die verschiedenen Umgebungsvariablen die verschiedene Aspekte der Lokalisierung, z.B.: • LANG → Standardwert für alle Variablen, die nicht explizit gesetzt wurden • LC_NAME → wie werden Namen repräsentiert • LC_NUMERIC → wie Nummer formatiert werden sollen • LC_TIME → wie Uhrzeit und Datum formatiert werden sollen Siehe man 7 locale für die gesamte Liste der möglichen LC_* Kategorien. • Wird die Variable LC_ALL gesetzt, so haben die einzelnen LC_* Variablen keine Wirkung! Locale - Konfiguration • Bei Ubuntu wird das System-Locale in der Datei /etc/default/locale gesetzt. Darin weist man den Umgebungsvariablen die gewünschten Werte zu. Benutzer können ihr Locale in der Datei $HOME/.pam_environment • Bei Verwendung von systemd kann das System-Local auch mittels localectl geändert werden. • Damit ein Locale funktioniert, müssen die nötigen Dateien dafür vorhanden sein. Bei Installation eines „language-pack-??“ Pakets (Unterstützung einer bestimmten Sprache, z.B. „language-pack-de“) wird auch das entsprechende Locale installiert. Ein Locale kann aber auch durch locale-gen generiert werden, z.B. locale-gen de_AT.UTF-8. • Die derzeit aktiven Locale-Werte können mittels des Befehls locale abgefragt werden. Zusätzlich können damit auch einzelnen Einstellungen oder alle Einstellungen einer Kategorie angezeigt werden (siehe man 5 locale), z.B.: ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 34 von 139 $ locale -k decimal_point decimal_point="," Locale - Tastatureinstellungen • Durch das Locale bekommt man die richtige Ausgabe, aber auch die Eingabe muss an das Land angepasst werden. • In der Datei /etc/default/keyboard werden die systemweiten Einstellungen für die Tastatur definiert, sowohl für die virtuellen Konsolen als auch für die GUI (i.e. X11): • XKBMODEL → das Tastaturmodell (z.B. „pc105“, „apple“) • XKBLAYOUT → das Tastaturlayout (z.B. „us“, „at“) • XKBVARIANT → die Layoutvariante (z.B. „altgr-intl“) • XKBOPTIONS → zusätzliche Optionen (z.B. „caps:escape“) Für Informationen zu den Werten siehe man xkeyboard-config. Wie schon das Locale selbst können auch die Tastatureinstellungen über localectl gesetzt werden. • Um geänderten Einstellungen auf einer virtuellen Konsole (tty{1..6}) verwenden zu können, muss entweder neugestartet oder der Befehl setupcon ausgeführt werden. Dieser aktiviert die Schriftund Tastatureinstellungen (siehe auch man console-setup). Automatisierung • Es ist oft notwendig, Befehle zu einem bestimmten Zeitpunkt in der Zukunft auszuführen (z.B. Server wegen Wartungsarbeiten in einem bestimmten Zustand versetzen) bzw. regelmäßig auszuführen (z.B. alte Logdateien löschen). • Linux bietet für beide Aufgaben die nötigen Werkzeuge: • Regelmäßig auszuführende Jobs werden Cronjobs genannt, nach dem Befehl, der sie ausführt. Auch hierfür wird ein beim Systemstart ausgeführter Daemon benutzt. Es gibt mehrere Implementierungen, unter Ubuntu wird zumeist Vixie-cron verwendet (Paket cron). Zusätzlich gibt es das Programm anacron, welches speziell für Computer, die nicht 24/7 laufen, gedacht ist und verpasste Jobs beim Booten ausführt. • Mit Hilfe von at kann unter Linux ein Job (Sammlung von Befehlen) einmalig zu einem bestimmten Zeitpunkt ausgeführt werden. Dazu wird beim Systemstart der Dämon atd gestartet, der diese Aufgabe übernimmt. • Sowohl Cronjobs als auch at-Jobs können von normalen (ie. nicht-root) Benutzern genutzt werden. Links: Cron Howto, Cron auf ubuntuusers.de, crontab.guru, at auf ubuntuusers.de Automatisierung - Cron 1 • Die Konfigurationsdateien für Cron befinden sich in • /etc/crontab → globale Konfigurationsdatei • /etc/cron.d/ → weitere crontab-Konfigurationsdateien • /etc/cron.{hourly,daily,weekly,monthly} → Jobs, die in bestimmten Intervallen ausgeführt ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 35 von 139 werden sollen • /var/spool/cron/crontabs/ → Konfigurationsdateien für Benutzer • Editieren kann man die eigene Konfigurationsdateien mittels crontab -e. Die Anzeige der eigenen Konfigurationsdatei erfolgt mittels crontab -l. • Durch Eintragen von Benutzern in /etc/cron.allow bzw. /etc/cron.deny kann die Verwendung von Cron Benutzern explizit erlaubt bzw. verweigert werden (siehe man 1 crontab). • Beispiele für crontab-Einträge: # 5 # 0 Befehl zur Minute 5 jeder Stunde ausführen * * * * /bin/bash /path/to/some/script.sh Befehl um 17 Uhr an jedem Wochentag (Mo-Fr) ausführen 17 * * 1-5 mail -s "Go home!" [email protected] Automatisierung - cron 2 • Format für crontab-Dateien (siehe auch man 5 crontab): * * * * * auszuführender Befehl | | | | | | | | | +----- Tag der Woche (0 - 6) (Sonntag ist 0) | | | +------- Monat (1 - 12) | | +--------- Tag des Monats (1 - 31) | +----------- Stunde (0 - 23) +------------- Minute (0 - 59) Die Zeitangaben können einzelne Zahlen (12), Bereiche mit optionalen Schrittweiten (1-5/2) oder Listen (1,3-5,7) sein. Die Angabe von * ist gleichbedeutend mit Anfang-Ende (also der Bereich, der alles abdeckt). In der globalen Konfigurationsdatei kommt vor dem Befehl noch der Benutzername, mit dem der Befehl ausgeführt werden soll. Automatisierung - at at - Erlaubt das Ausführen von Jobs zu einem bestimmten Zeitpunkt. » Syntax: at [Optionen] Zeitangabe » Die Befehle eines Jobs werden entweder von der Standardeingabe (mit EOF – CTRL+d – beenden) oder von einer Datei gelesen; und später mittels /bin/sh ausgeführt. » Die Zeitangabe ist sehr flexibel (z.B. 13:15 tomorrow, 10am Jul 31 2013, now + 1min). » Optionen: -f Datei → Datei mit Befehlen, -l → anhängende Jobs auflisten, -r Job → Job mittels Jobnummer löschen, -c Job → Befehls des Jobs ausgeben » $ at now + 1min warning: commands will be executed using /bin/sh at> echo "created file" > created at> <EOT> job 3 at Tue Nov 20 12:01:00 2012 $ at -l 3 Tue Nov 20 12:01:00 2012 a thomas $ ls -l created; sleep 1m; ls -l created ls: cannot access created: No such file or directory -rw-rw-r-- 1 thomas thomas 13 Nov 20 12:01 created ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 36 von 139 OpenSSH • Um sich auf einem anderen Computer einzuloggen, wurde früher telnet verwendet und ab circa 1983 vermehrt rlogin bzw. rsh. Beide Programm haben aber Sicherheitsprobleme und sollten daher nicht mehr benutzt werden! • Im Jahr 1995 wurde die Secure Shell (SSH) entwickelt, um ein sicheres Einloggen auf anderen Computern zu gewährleisten. Zunächst war das Programm frei, später aber proprietäre Software. • Daher wurde ab 1999 ausgehend von einer freien Version des ursprünglichen Programms die Software OpenSSH entwickelt, die mittlerweile Standard auf Linux- und BSD-Systemen geworden ist. • SSH benutzt ein asymmetrisches Kryptosystem zum Authentifizieren des Servers. Weiters wird der Datenverkehr zwischen Client und Server symmetrisch verschlüsselt, wobei der Schlüssel über den Diffie-Hellman-Schlüsseltausch erzeugt wird, und Benutzer können sich entweder mittels Benutzername und Passwort oder mit Hilfe von Public-Key-Authentifizierung anmelden. • OpenSSH aus Clientsicht wurde bereits in der VO „Technische Praxis der Computersysteme 1“ im Wintersemester behandelt. OpenSSH - Konfiguration • Unter Ubuntu gibt es zwei Pakete: openssh-server (die Serversoftware) und openssh-client (die Software zum Zugriff auf einen Server). • Bei der Installation von openssh-server werden automatisch die benötigten Host-Schlüssel erstellt und der Server gestartet. Die Default-Konfiguration reicht für Desktopsysteme, bei Servern sollte man sie eventuell noch ein wenig modifizieren, um optimale Sicherheit gewährleisten zu können (z.B. Authentifizierung mittels Passwort deaktivieren). • Zusätzlich sollte man die automatisch generierten Host-Schlüssel verwerfen, wenn es für den Host schon Schlüssel gibt, weil sonst bei den Clients eine Meldung über nicht übereinstimmende Schlüssel auftaucht. • Das Konfigurationsverzeichnis für OpenSSH ist /etc/ssh. Darin befindet sich die Konfigurationsdatei sshd_config für das Serverprogramm und die globale Konfigurationsdatei ssh_config für das Clientprogramm (siehe man sshd_config und man ssh_config). OpenSSH - Konfiguration mit Puppet • Um OpenSSH (Client und Server) mit Puppet zu verwalten, installiert man das saz/ssh Modul. Hier betrachten wir nur die Serverkonfiguration. • Anschließend kann man den OpenSSH-Server konfigurieren: class {'ssh::server': options => { 'PasswordAuthentication' => 'yes', 'PermitRootLogin' => 'no', 'Port' => ['22', '10022'], } } Alle gültigen OpenSSH-Serveroptionen können dabei angegeben werden. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 37 von 139 • Weiters können auch die Host-Schlüssel verwaltet werden: ssh::server::host_key {'ssh_host_rsa_key': private_key_content => 'PRIVATER SCHLÜSSEL', # oder private_key_source => 'puppet:///MODUL_NAME/ssh_host_rsa_key', public_key_content => 'ÖFFENTLICHER SCHLÜSSEL', # oder public_key_source => 'puppet:///MODUL_NAME/ssh_host_rsa_key'.pub, } ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 38 von 139 Foliensatz 3 Datenverwaltung Inhalt • Speichermedien und Partitionen • Dateisysteme erstellen und verwalten • Verschlüsselung (cryptsetup, LUKS) • Logical Volume Manager (LVM) • RAID Speichermedien und Partitionen • Jedes Medium (USB-Stick, Festplatte, DVD) ist im Prinzip eine Folge von Bits, die ausgelesen bzw. geschrieben werden. • Um den Zugriff darauf zu vereinfachen und dadurch die Datenübertragung zu beschleunigen, wird das gesamte Medium meist in Blöcke mit einer fixen Anzahl an Bytes unterteilt. Die Blockgröße ist bei Festplatten üblicherweise 512 Bytes, seit einigen Jahren auch 4096 Bytes. • Ein Medium kann mit einem einzigen Dateisystem versehen sein oder mehrere Teile, Partitionen, besitzen, mit eventuell unterschiedlichen Dateisystemen. Das ist z.B. für das Aufteilen eines Systems in eine Betriebssystem-Partition und eine Daten-Partition nützlich. Es hat zudem den Vorteil, dass beim Einhängen verschiedene Optionen verwendet werden können. • Es gibt unterschiedliche Varianten, Partitionen auf einem physischen Medium zu kennzeichnen. Früher wurde auf x86-Rechnern ein MBR (Master Boot Record) und die darin enthaltene Partitionstabelle verwendet, der Nachfolger nennt sich GPT (GUID Partition Table). Links: Master Boot Record, GUID Partition Table Master Boot Record (MBR) • Der MBR wurde 1983 für IBM-PC XT und DOS 2.0 eingeführt, hat sich allerdings schnell als Industriestandard etabliert. • Die Informationen zum MBR sind innerhalb der ersten 512 Bytes (erster Block) einer Festplatte gespeichert. • Auf Grund von historischen Begebenheiten ist der erste für Partitionen nutzbare Block der Block 63. Wegen der Erhöhung der Blockgröße auf 4096 Bytes wird derzeit auch oft Block 2048 als Start für die erste Partition genommen. Der Platz zwischen dem MBR und der ersten Partition wird häufig von Bootloadern zum Ablegen von Programmcode verwendet (z.B. von GRUB). • Die Partitionierung gemäß MBR erlaubt es vier primäre Partitionen anzulegen. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 39 von 139 • Werden mehr gebraucht, so kann eine primäre Partition als erweiterte Partition markiert werden. Innerhalb der erweiterten Partition können beliebig viele logische Partitionen angelegt werden. • Zusätzlich zur der Partitionstabelle ist auch ein Bootloader (bzw. zumindest ein Teil davon) direkt im MBR gespeichert (z.B. die Stage 1 von GRUB 2). MBR - fdisk fdisk - Manipuliert Partitionstabellen. » Ursprünglich für MBR-Partitionierung gedacht, unterstützt es mittlerweile auch andere Format, wie GPT. » Wird keine Option angegeben, startet fdisk in den Befehlsmodus, mit dem die Partitionstabelle manipuliert werden kann. Um die Partitionstabelle nur anzuzeigen, wird die Option -l verwendet. » Ausgabe von fdisk für eine MBR-partitionierte Festplatte: $ fdisk -l /dev/sda Disk /dev/sda: 160.0 GB, 160041885696 bytes 255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000b57a2 Device Boot /dev/sda1 * /dev/sda2 /dev/sda3 /dev/sda5 Start 16065 34668270 43070326 43070328 End 34668269 43054199 312576704 312576704 Blocks 17326102+ 4192965 134753189+ 134753188+ Id 83 82 f 83 System Linux Linux swap / Solaris W95 Ext'd (LBA) Linux GUID Partition Table (GPT) 1 • Um die Einschränkungen des MBRs loszuwerden, wurde von Intel im Rahmen der Entwicklung von UEFI auch die GPT entwickelt. • Die Vorteile von der GPT gegenüber dem MBR sind: • • Unterstützung von beliebig vielen primären Partitionen (mindestens 128) • Unterstützung für Festplatten mit mehr als 2TB Speicher • Partitions-ID sind GUIDs (Globally Unique IDentifiers) • Bootloader kann bei einer OS-Neuinstallation nicht überschrieben werden, da es direkt im GPT keinen gibt • Redundanz der GPT-Daten durch zwei getrennte GPTs Das GPT-Schema verwendet LBA (Logical Block Addresses), um Beginn und Ende einer Partition anzuzeigen. Wie erwähnt, ist ein Block üblicherweise 512 Bytes groß. Hinweis: Die Grafik zum GPT-Schema stammt von Kbolino und ist CC BY-SA 2.5. GUID Partition Table (GPT) 2 ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 40 von 139 • Um den Übergang von MBR auf GPT zu vereinfachen, wird in LBA 0 der sogenannte Protective MBR gespeichert. Damit sehen Betriebssysteme, die GPT nicht unterstützen, eine einzige, große Partition von unbekanntem Typ und verhindern meist die versehentlich Änderung. • Die primäre GPT ist ab LBA 1 abgelegt und verwendet mindestens 33 LBAs. Im LBA 1 ist der GPTHeader gespeichert, LBA 2 enthält die Informationen für die ersten vier Partitionen, LBA 3 die Information für die nächsten vier und so weiter. • Am Ende der Festplatte ist die sekundäre GPT gespeichert, die herangezogen wird, falls die primäre GPT beschädigt ist. • Jeder Partitionseintrag ist (üblicherweise) 128 Bytes lang und enthält den Partitionstyp (eine GUID), eine eindeutige Partitions-GUID, Anfangs- und End-LBA, Attribute und den Partitionsnamen. GPT - gdisk gdisk - Manipuliert GUID-Partitionstabellen. » Wird wie fdisk benutzt und hat eine sehr ähnliche Benutzerschnittstelle. » Das Programm erlaubt die Konvertierung von MBR in GPT und vice versa. » Ausgabe von gdisk: $ gdisk -l /dev/sda | tail -n +9 Found valid GPT with protective MBR; using GPT. Disk /dev/sda: 1000215216 sectors, 476.9 GiB Logical sector size: 512 bytes Disk identifier (GUID): 7DC1C01A-22A6-4216-AA7A-68CE77861CA4 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 1000215182 Partitions will be aligned on 8-sector boundaries Total free space is 5357 sectors (2.6 MiB) Number 1 2 3 4 5 Start (sector) 2048 411648 283414528 102813696 200469946 End (sector) 411647 102811647 1000214527 200469945 283413887 Size 200.0 MiB 48.8 GiB 341.8 GiB 46.6 GiB 39.5 GiB Code EF00 0700 0700 0700 0700 Name EFI System Partition Ein anderes CLI-Programm für die Bearbeitung von Partitionen wäre parted bzw. die GUI-Variante gparted. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 41 von 139 Dateisysteme • Ein Dateisystem kontrolliert, wie Daten auf einem Speichermedium angeordnet werden, damit diese Daten später wieder gefunden und gelesen werden können. Wichtige Dateisysteme: • Windows: FAT, NTFS • Linux/Unix: ext2-4, ReiserFS, XFS, JFS, ZFS, btrfs • Netzwerk: NFS, SMB/CIFS (vorrangig Windows), Lustre (Supercomputing) • Das gängiste Dateisystem unter Linux ist ext4, welches performant ist und riesige, bis zu 1 EiB große Partitionen. • ZFS, ursprünglich von Sun Microsystems für Solaris entworfen, besitzt wohl von den genannten Dateisystemen die meisten Funktionalitäten, ist stabil und performant, braucht aber sehr viel RAM und ist lizenztechnisch nicht mit dem Linux-Kernel kompatibel. • Die Zukunft unter Linux wird sehr wahrscheinlich bei btrfs (B-tree FS) liegen, da es ähnliche Funktionalitäten wie ZFS unterstützt. Dateisysteme erstellen • Für jeden Typ von Dateisystem werden Befehle zum Erstellen bzw. Bearbeiten zur Verfügung gestellt: • Zum Erstellen wird die Familie von mkfs.* Befehlen benutzt. • Zum Überprüfen eines Dateisystems wird der entsprechende fsck.* Befehl. • Die Namen der zusätzlichen Befehle variieren: Für ext2/3/4 gibt es noch debugfs, dumpe2fs, tune2fs, resize2fs und ein paar mehr, bei btrfs wird nahezu alles mit dem Befehl btrfs erledigt. • Die Optionen der Programme für das Erstellen bzw. Überprüfen unterscheiden sich natürlich, da die Dateisysteme unterschiedliche Funktionalitäten besitzen. • Für die Erstellung von Swap-Partitionen wird mkswap, da diese kein eigentliches Dateisystem darstellen. Dateisysteme erstellen - Beispiel ext4 $ dd if=/dev/null of=dateisystem bs=1M seek=100 $ mkfs.ext4 -L "Mein EXT4-FS" dateisystem mke2fs 1.42.12 (29-Aug-2014) Discarding device blocks: done Creating filesystem with 102400 1k blocks and 25688 inodes Filesystem UUID: 67787682-7606-44be-ad92-6df6ef4d0aed Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): done ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 42 von 139 Writing superblocks and filesystem accounting information: done $ file dateisystem dateisystem: Linux rev 1.0 ext4 filesystem data, UUID=67787682-7606-44be-ad926df6ef4d0aed, volume name "Mein EXT4-FS" (extents) (huge files) $ fsck.ext4 -f dateisystem e2fsck 1.42.12 (29-Aug-2014) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information dateisystem: 11/25688 files (0.0% non-contiguous), 8896/102400 blocks Dateisysteme erstellen - Beispiel vfat $ dd if=/dev/null of=dateisystem bs=1M seek=100 $ mkfs.vfat -n "MEIN USB" dateisystem mkfs.fat 3.0.28 (2015-05-16 $ file dateisystem dateisystem: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 4, root entries 512, Media descriptor 0xf8, sectors/FAT 200, sectors/track 32, heads 64, sectors 204800 (volumes > 32 MB) , serial number 0x9c3ad795, label: "MEIN USB ", FAT (16 bit) $ fsck.vfat dateisystem fsck.fat 3.0.28 (2015-05-16) dateisystem: 1 files, 0/51091 clusters Dateisysteme einhängen • Die Dateien eines Dateisystems können erst verwendet werden, wenn das Dateisystem in das VFS eingehängt wurde. • Um ein Dateisystem einzuhängen, wird das Gerät, auf dem es liegt (z.B. das DVD-Gerät oder eine Festplattenpartition) und ein Verzeichnis, in dem die Dateien aufscheinen sollen, benötigt. Falls der Typ des Dateisystems nicht automatisch erkannt wird, muss auch dieser zusätzlich angeben werden. • Bei Linux-Desktopsystemen werden Wechselmedien wie USB-Sticks und -Festplatten sowie DVDs automatisch erkannt und, falls möglich, unter /media/ eingehängt. • Es kann auch ein sogenannter bind-Mount durchgeführt werden. Dabei wird ein Teil der Verzeichnishierarchie (oder auch nur eine einzige Datei) an einer anderen Stelle zusätzlich zur Verfügung gestellt. Das wird z.B. für Chroot-Umgebungen oder bei NFSv4 benutzt. Dateisysteme einhängen - mount, umount mount - Hängt Dateisysteme in das VFS ein und listet sie auf. » Ohne Parameter werden die eingebundenen Dateisysteme aufgelistet. » Optionen: -t → Dateisystemtyp, -o → Mount-Optionen, --bind → einen bind-Mount durchführen » $ mount | head -n 5 sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 43 von 139 udev on /dev type devtmpfs (rw,nosuid,relatime,size=105312k,nr_inodes=26328,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=24256k,mode=755) /dev/mapper/ict-root on / type ext4 (rw,relatime,errors=remount-ro,data=ordered) $ mkdir /mnt/data $ mount -o ro,noexec /dev/sdb1 /mnt/data $ mkdir -p /mnt/chroot/proc $ mount --bind /proc /mnt/chroot/proc umount - Hängt Dateisysteme aus dem VFS aus. » Als Parameter sind ein oder mehrere Mountpoints anzugeben. » Wenn das Dateisystem noch in Verwendung ist, kann es nicht ausgehängt werden! Um festzustellen, welcher Prozess darauf zugreift, eignet sich lsof. » $ umount /mnt/data $ umount /mnt/chroot/proc Dateisysteme einhängen - /etc/fstab • Dateisysteme, die automatisch beim Start eingehängt werden sollen, werden in der Datei /etc/fstab (siehe man fstab) definiert. • Jede nicht kommentierte Zeile besteht aus sechs Feldern und beschreibt, wie und wo ein Dateisystem mit welchen Optionen eingehängt werden soll: 1. Dateisystem (Pfad zu einer Gerätedatei oder Angabe eines Geräts über eine UUID – UUID=Gesamte_UUID – oder eine Bezeichnung – LABEL=Dateisystembezeichnung). 2. Mount-Point 3. Dateisystemtyp 4. Einhängeoptionen (siehe man 8 mount) 5. Dump (der dump-Befehl sichert das Dateisystem, wenn der Wert 1 ist) 6. fsck-Durchgangsnummer (Reihenfolge, in der die Dateisysteme beim Starten geprüft werden sollen; 0 bedeutet „nicht überprüfen“) • Beispiel: /dev/mapper/data UUID=1499-33B6 /home /home /boot/efi /srv/nfs/home ext4 vfat none defaults,discard defaults bind 0 0 1 1 Dateien als Blockgeräte - Loop-Geräte • Mit Hilfe eines sogenannten Loop-Gerätes (loop device) ist es möglich, eine normale Datei als Blockgerätedatei darzustellen. • Damit können Dateisysteme, die als Dateien vorliegen, ganz einfach mit mount eingehängt werden (z.B. ISO-Dateien). Weiters ist diese Funktionalität praktisch zum Testen von Befehlen, die ein oder mehrere Blockgeräte brauchen. • Der Befehl mount kann mittels der Option -o loop direkt normale Dateien einhängen: ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 44 von 139 $ mount -o loop ubuntu-15.10.iso /mnt/cdrom Dabei wird im Hintergrund automatisch ein Loop-Gerät erstellt und benutzt. Dateien als Blockgeräte - losetup losetup - Verwaltet Loop-Geräte. » Optionen: -f → nächstes freies Loop-Gerät anzeigen, -l → alle Loop-Geräte anzeigen, -d LOOP_DEV → Loop-Gerät entfernen, -D → alle Loop-Geräte entfernen » Zum Anlegen eines Loop-Geräts: losetup -f [--show] PFAD oder losetup /dev/LOOP_DEV PFAD » $ dd if=/dev/null of=fakefs bs=1M seek=10 &>/dev/null $ ls -ls fakefs 0 -rw-r--r-- 1 root root 10485760 Mär 13 13:46 fakefs $ losetup -f --show fakefs /dev/loop0 $ mkfs.ext4 -q /dev/loop0 && mount /dev/loop0 /mnt $ ls -ls fakefs 1156 -rw-r--r-- 1 root root 10485760 Mär 13 13:46 fakefs $ dd if=/dev/zero of=/mnt/file bs=1M count=2 &>/dev/null $ umount /mnt; losetup -D; ls -ls fakefs 3212 -rw-r--r-- 1 root root 10485760 Mär 13 13:54 fakefs Dateisysteme verschlüsseln • Um vor allem bei mobilen Geräten, wie Laptops, Android-basierten Mobiltelefonen und Tablets, Daten zu schützen, können ganze Dateisysteme verschlüsselt werden. Ubuntu bietet diese Funktionalität direkt bei der Installation an. • Für die Verschlüsselung von Dateisystemen wird das Kernel-Modul dm-crypt und das Programm cryptsetup verwendet. Das Programm erlaubt auch die Verwendung von LUKS (Linux Unified Key Setup, ein Standard für Festplattenverschlüsselung). • Das Kernel-Modul dm-crypt ist Teil der Device Mapper Infrastruktur des Kernels, die es erlaubt, ein Blockgerät auf ein anderes Blockgerät abzubilden. Diese Infrastruktur wird nicht nur für die Verschlüsselung, sondern auch zum Beispiel für LVM (Logical Volume Manager) genutzt. • In der Datei /etc/crypttab kann man die Daten der verschlüsselten Dateisysteme eintragen, damit die entschlüsselten Dateisysteme beim Starten des Systems zur Verfügung gestellt werden können. Dazu wird, falls nötig, das Passwort auf der (graphischen) Konsole abgefragt. Links: cryptsetup Homepage, dm-crypt im ArchLinux Wiki, dm-crypt auf Wikipedia Dateisysteme verschlüsseln - Beispiel • Beispiel für die Erstellung eines verschlüsselten ext4-Dateisystems: $ dd if=/dev/zero of=filesystem count=10000 2>/dev/null $ cryptsetup luksFormat filesystem WARNING! ======== This will overwrite data on filesystem irrevocably. Are you sure? (Type uppercase yes): YES Enter LUKS passphrase: ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 45 von 139 Verify passphrase: $ cryptsetup luksOpen filesystem encfs Enter passphrase for /tmp/filesystem: $ mkfs.ext4 /dev/mapper/encfs &> /dev/null Logical Volume Manager • Der Logical Volume Manager (LVM) erlaubt das Zusammenfassen von mehreren physischen Festplatten oder Partitionen (physical volumes, PV) zu einem logischen Gesamten (volume group, VG), welches dann beliebig in logische Partitionen (logical volumes, LV) unterteilt werden kann. • Das hat mehrere Vorteile: • LVs können größer als ein einzelnes PV sein. • Hinzufügen und Entfernen von PVs zu/von einer VG ist möglich. • LVs können im Nachhinein leicht vergrößert werden. • Es können Snapshots von LVs angelegt werden. • Ubuntu erlaubt bei der Installation die Benutzung von LVM, damit man sich z.B. nicht von Anfang an für bestimmte Partitionsgrößen entscheiden muss. • LVM benutzt im Hintergrund die Device Mapper Infrastruktur des Kernels. • Zur Verwendung von LVM muss das Paket lvm2 installiert werden. Links: LVM2 Ressource Page, LVM HOWTO, A Beginner‘s Guide to LVM, LVM auf Wikipedia Logical Volume Manager - PV • Physical Volumes (PV) bieten den eigentlichen Speicherplatz für LVM. PVs können Blockgeräte wie ganze Festplatten und einzelne Partitionen sein oder aber auch Geräte, die wie Blockgeräte agieren (z.B. ein Loop-Gerät). • Damit ein Blockgerät für LVM verwendet werden kann, muss es initialisiert werden. Dazu wird der Befehl pvcreate verwendet. • Der Befehl pvscan durchsucht alle Blockgeräte nach bereits initialisierten PVs und mit pvdisplay kann man sich Informationen über ein PV anzeigen lassen. • Beispiel (erstellt 5 „Festplatten“ mit 10MiB, initialisiert sie als PVs und zeigt die Informationen darüber an): $ > > $ for I in loop{1..5}; do dd if=/dev/zero of=$I bs=1M count=10; losetup /dev/$I $I; pvcreate /dev/$I done &>/dev/null pvdisplay # Ausgabe nicht dargestellt! Logical Volume Manager - VG • Eine Volume Group (VG) fasst mehrere PVs zu einer großen Einheit zusammen, die als eine Festplatte betrachtet werden kann. • Beim Erstellen einer VG mittels des Befehls vgcreate kann auch die Größe eines pyhsical extent (PE) über die Option -s angeben. PEs sind die kleinsten Einheiten einer PV, die von einer VG ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 46 von 139 verwaltet werden. • VGs können im Nachhinein verändert werden, d.h. man kann später PVs hinzufügen (vgextend) oder entfernen (vgreduce; natürlich nur, wenn sie nicht benutzt werden). Auch kann man PEs einer PV auf andere PVs verschieben (pvmove). • Beispiel (erstellt die VG „bigdisk“ und zeigt Informationen für sie an; beachte, dass nur 40MiB benutzbar sind, obwohl alle PVs zusammen circa 48,8MiB zur Verfügung stellen): $ vgcreate bigdisk /dev/loop{1..5} Volume group "bigdisk" successfully created $ vgdisplay bigdisk # Ausgabe nicht dargestellt! Logical Volume Manager - LV • Ein Logical Volume (LV) ist ein Teil einer VG und entspricht einer Partition, d.h. auf einem LV kann ein Dateisystem angelegt werden. • LVs werden mit dem Befehl lvcreate erstellt und beim Erstellen sollte man mittels der Option -n Name einen sinnvollen Namen angeben. Die Option -L Größe erlaubt das Festlegen der Größe der LV. • LVs können auch im Nachhinein verändert werden, d.h. man kann sie vergrößern (lvextend), aber auch verkleinern (lvreduce). Wichtig: Das zu Grunde liegende Dateisystem muss auch dementsprechend vergrößert oder verkleinert werden! Der Befehl lvresize kann sowohl vergrößern als auch verkleinern und gleichzeitig das zu Grunde liegende Dateisystem verändern. • Beispiel (erstellt zwei LVs und erzeugt ext4-Dateisysteme darauf): $ lvcreate -n root -L 10M bigdisk Rounding up size to full physical extent 12,00 MiB Logical volume "root" created $ lvcreate -n data -L 16M bigdisk Logical volume "data" created $ mkfs.ext4 /dev/bigdisk/root; mkfs.ext4 /dev/bigdisk/data RAID • Bei einem RAID (Redundant Array of Independent Disks) werden zwei oder mehr Festplatten zu einem Verbund zusammengefasst, um den Datendurchsatz und/oder die Ausfallssicherheit zu erhöhen. • Es wichtigsten RAID-Level sind: • • RAID 0 (Striping): Die Daten werden auf zwei oder mehr Festplatten aufgeteilt. • RAID 1 (Mirroring): Die Daten werden gespiegelt auf zwei oder mehr Festplatten gespeichert. • RAID 5: Die Daten und eine Prüfsumme werden auf drei oder mehr Festplatten aufgeteilt. Oft werden auch noch folgende RAID-Level benutzt: • RAID 6: Wie RAID 5, aber mit zwei Prüfsummen statt einer und verträgt daher den Ausfall von zwei Festplatten. • RAID 10: Eine Kombination von mehreren RAID 1 mit übergeordnetem RAID 0. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 47 von 139 Links: RAID auf Wikipedia, Linux RAID Wiki Hinweis: Die RAID-Grafiken stammen von Colin M.L. Burnett und sind CC BY-SA 3.0. RAID 0 • Bei RAID 0 werden die Daten verteilt auf mindestens zwei Festplatten geschrieben. • Die volle Kapazität aller Festplatten kann genutzt werden. • Es gibt keine Datensicherheit, fällt auch nur eine Festplatte aus, so sind die Daten verloren. • Sowohl das Lesen als auch das Schreiben ist performant, weil alle Festplatten gleichzeitig genutzt werden können. RAID 1 • Bei RAID 1 werden die Daten gespiegelt auf mindestens zwei Festplatten geschrieben. • Die Nutzkapazität des RAIDs ist die Kapazität der kleinsten Festplatte im Verbund. • Es können alle bis auf eine Festplatte ausfallen, diese Variante bietet daher hohe Ausfallssicherheit. • Die Leseperformanz ist hoch, weil von allen Festplatten gleichzeitig verschiedene Teile gelesen ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 48 von 139 werden können. Allerdings wird das Schreiben nicht schneller, weil alle Daten auf alle Festplatten geschrieben werden müssen. RAID 5 • Ein RAID 5 braucht mindestens drei Festplatten. Die Daten werden auf n - 1 Festplatten verteilt geschrieben, auf der übrigen werden Paritätsinformationen gespeichert. • Die Nutzkapazität eines RAID 5 mit n gleichen Festplatten beträgt n - 1. • Eine Festplatte kann ausfallen, da auf Grund der Paritätsinformationen die Daten einer beliebigen Festplatte wiederhergestellt werden können. • Die Leseperformanz ist hoch, da von allen Festplatten gleichzeitig gelesen werden kann. Allerdings ist die Schreibperformanz, je nach Implementierung, meist nicht so hoch, weil die Paritätsinformationen berechnet werden müssen. Multiple Device Administration • Der Kernel bietet Unterstützung für Software RAIDs in Form des MD (Multiple Devices) Kerneltreibers. • Das Programm mdadm (Multiple Device Administration) ist das zugehörige Programm zum Verwalten dieser Software RAIDs. • mdadm erlaubt das Erstellen von RAID-Geräten in mehreren Konfigurationen (z.B. RAID 0, RAID 1 oder RAID 5) und das Verwalten dieser Geräte (z.B. das Entfernen fehlerhafter Festplatten oder das Hinzufügen von Reservefestplatten). • Die Datei /proc/mdstat enthält Informationen zum aktuellen Status: Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid5 loop5[5](S) loop4[4](S) loop3[3] loop2[1] loop1[0] 18432 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU] unused devices: <none> Die erste Zeile gibt Auskunft über die unterstützten Konfigurationen. Danach finden sich Informationen zum Gerät md0 (aktiv/nicht aktiv, RAID-Level, genutzte Blockgeräte, …). ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 49 von 139 mdadm mdadm - Verwaltet MD Geräte, i.e. Softare RAIDs. » Besitzt mehrer Ausführungsmodi, z.B. zum Erstellen oder zum Verwalten eines RAIDs. » Die Manpage zu mdadm gibt detaillierte Auskunft zu den Modi und den vielen Optionen. » Mit --create kann ein RAID erzeugt werden, --level LEVEL gibt das RAID-Level an und --raid -devices=N die Anzahl der Geräte. $ # Erstellung von 5 Blockgeräten zur Nutzung im RAID $ for I in loop{1..5}; do dd if=/dev/zero of=$I bs=1M count=10; losetup /dev/$I $I > done &>/dev/null $ mdadm --create /dev/md0 --level raid5 --raid-devices=3 /dev/loop{1..3} mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. » Nachdem das RAID-Gerät erstellt worden ist, kann es wie jedes andere Blockgerät genutzt werden. Es scheint dann auch unter /proc/mdstat auf: Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid10] md0 : active raid5 loop5[5](S) loop4[4](S) loop3[3] loop2[1] loop1[0] 18432 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU] [raid4] unused devices: <none> mdadm - Fortsetzung mdadm - Fortsetzung » Zusätzliche Blockgeräte kann man mit --add hinzufügen. Diese werden dann als Ersatz für ausfallende Blockgeräte genutzt (Hot Spares): $ mdadm /dev/md0 --add /dev/loop{4..5} mdadm: added /dev/loop4 mdadm: added /dev/loop5 $ mdadm /dev/md0 /dev/md0: 18.00MiB raid5 3 devices, 2 spares. Use mdadm --detail for more detail. » Mit --stop kann das RAID-Gerät gestoppt werden: $ mdadm --stop /dev/md0 mdadm: stopped /dev/md0 » Ein zuvor erzeugtes, aber derzeit nicht aktives RAID-Gerät kann über --assemble wieder aktiviert werden (z.B. nach einem Neustart). Dabei müssen entweder alle Geräte wie beim Erzeugen angegeben werden oder zusätzlich die Option --scan: $ mdadm --assemble --scan mdadm: /dev/md/0 has been started with 3 drives and 2 spares. $ # oder: mdadm --assemble /dev/md0 /dev/loop{1..5} mdadm - Fortsetzung mdadm - Fortsetzung » Um die RAID-Konfiguration zu speichern, damit sie automatisch beim Booten verwendet werden kann, wird --detail --scan verwendet, eventuell noch um --verbose erweitert. Die Ausgabe eignet sich für die Inkludierung in die Konfigurationsdatei /etc/mdadm/mdadm.conf (siehe man mdadm.conf): ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 50 von 139 $ mdadm --detail --scan --verbose ARRAY /dev/md/0 level=raid5 num-devices=3 metadata=1.2 spares=2 name=noweto:0 UUID=6066dedf:b06a575f:00ec3792:4ac37fa4 devices=/dev/loop1,/dev/loop2,/dev/loop3,/dev/loop4,/dev/loop5 $ mdadm --detail --scan --verbose >> /etc/mdadm/mdadm.conf » Einzelne Blockgeräte können aus dem RAID mit --remove entfernt werden, wenn sie entweder Ersatzgeräte oder fehlerhaft sind. Um ein Gerät als fehlerhaft zu markieren, verwendet man --fail: $ mdadm /dev/md0 --fail /dev/loop1 mdadm: set /dev/loop1 faulty in /dev/md0 $ mdadm /dev/md0 --remove /dev/loop1 mdadm: hot removed /dev/loop1 from /dev/md0 $ mdadm /dev/md0 /dev/md0: 18.00MiB raid5 3 devices, 1 spare. Use mdadm --detail for more detail. mdadm - Fortsetzung mdadm - Fortsetzung » Mit Hilfe von --grow kann die Anzahl der benutzten Blockgeräte im RAID erhöht werden: $ mdadm /dev/md0 --grow --raid-devices=4 mdadm: Need to backup 3072K of critical section.. » Zur Anzeige von detaillierten Informationen verwendet man --detail: $ mdadm --detail /dev/md0 | head -n 9 /dev/md0: Version : 1.2 Creation Time : Sat Apr 2 10:28:26 2016 Raid Level : raid5 Array Size : 27648 (27.00 MiB 28.31 MB) Used Dev Size : 9216 (9.00 MiB 9.44 MB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent $ mdadm --detail /dev/md0 | tail -n 5 Number Major Minor RaidDevice State 4 7 4 0 active 1 7 2 1 active 3 7 3 2 active 5 7 5 3 active sync sync sync sync /dev/loop4 /dev/loop2 /dev/loop3 /dev/loop5 Kombinieren von RAID und LVM • Es ist natürlich möglich, die Funktionalitäten von RAID via mdadm und LVM zu kombinieren: 1. Zusammenfassen mehrerer Festplatten zu einem RAID mittels mdadm 2. Das erstellte MD-Gerät /dev/mdX als PV initialisieren. 3. Eine VG auf dem PV anlegen. 4. In der VG ein oder mehrere LVs anlegen. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 51 von 139 Foliensatz 4 Software und Paketverwaltung Inhalt • Software unter Linux • Pakete verwalten mit dpkg • Pakete und Repositories verwalten mit apt • Paketverwaltung mit Puppet Software - Geschichtliches • Fast alle Softwarepakete, die für Linux verfügbar sind, können gratis benutzt werden (z.B. jede GNU Software). Alleine bei einer Basisinstallation werden hunderte wichtige Pakete installiert. Ohne diesen Grundgedanken der freien Software wäre Linux nicht das, was es jetzt ist! • Als der Linux Kernel noch sehr jung war (Anfang der 90er Jahre), haben die Softwareentwickler in der Linux-Community rasch festgestellt, dass es zwar gut ist, frei verfügbare Software zu haben, aber dass man es den meisten Benutzern nicht zumuten kann, diese selbst zu kompilieren. Neben dem Kernel braucht man ja noch jede Menge anderer Software (Shell, C-Bibliothek, …), um ein funktionierendes System zu erhalten. • Das Ergebnis war, dass man den Linux-Kernel und die nötige Software im Binärformat in Softwarepaketen in einer sogenannten Distribution zur Verfügung stellte. Gab es ganz am Anfang nur sehr primitive Mittel, um den Linux-Kernel und die Software mittels so einer Distributionen zu installieren, ging die Entwicklung rasch voran und schon 1993 gab es die ersten Distributionen auf Basis von dpkg (Debian) und rpm (Red Hat). Software - Aufteilung der Dateien Unter Linux gibt es eine andere Herangehensweise an Software als unter Microsoft Windows oder Apple Mac OS X (zumindest bei den meisten Distributionen, eine Ausnahme ist z.B. GoboLinux). Während in den letzteren zwei Betriebssystem die Dateien einer Applikation zumeist in einem einzigen Verzeichnis zu finden sind, sind die Dateien einer Applikation unter Linux auf mehrere Verzeichnisse aufgeteilt: • /bin/ → Hier liegen die ausführbaren Dateien, wenn sie für den Systembetrieb wichtig sind. • /lib/ → Hier liegen die Systembibliotheken. • /usr/bin/ → Hier liegen alle sonstigen ausführbaren Dateien. • /usr/lib/ → Hier liegen die benötigten Bibliotheken. • /usr/share/APP_NAME/ → Hier liegen Datendateien (z.B. Bilder). • /usr/share/doc/PAKET_NAME → Hier findet man die Dokumentation zum Paket. • /usr/share/man/ → In diesem Verzeichnisbaum werden die Manpages abgelegt. • /sbin/ und /usr/sbin/ → Ausführbare Dateien für den Administrator ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 52 von 139 Software - Vergleich mit Windows • Unter Windows installieren alle Applikationen alle benötigten Bibliotheken, die nicht auf dem System installiert sind, entweder in das System- oder das Applikationsverzeichnis. • Im Gegensatz dazu wird unter Linux eine Bibliothek nur einmal separat von den Applikationen installiert (in /usr/lib/) und alle Applikationen können darauf zugreifen. Durch die standardisierten Bibliotheksnamen und die Verwendung symbolischer Links ist es auch möglich, mehrere Versionen ein und derselben Bibliothek auf einem System installiert zu haben. • Das System von Linux hat mehrere Vorteile: • • Es ist bekannt, wo sich alle Bibliotheken befinden und welche installiert sind. • Weniger Speicherplatz wird gebraucht. • Bei Sicherheitsproblemen muss man die Bibliothek nur an einer Stelle austauschen. Das hat aber auch zur Folge, dass man sicherstellen muss, dass alle benötigten Komponenten für eine Applikation installiert sind. Hier kommt die Softwarepaketverwaltung von Linux ins Spiel. Softwareverzeichnisse • Die meisten Open Source Projekte können nicht wie Firmen durch Marketing auf sich aufmerksam machen, da das Geld dafür meist nicht vorhanden ist. Viele Entwickler haben nicht einmal selbst einen Webserver, um die Software zu publizieren. • Dadurch gab es schon sehr früh Dienste, die es Entwicklern ermöglichte, Softwareprojekte einfach durchzuführen. Dazu stellen diese Dienste Webspace, Issue Tracker, Versionskontrollsysteme und einiges mehr bereit. • Das hat nicht nur für die Entwickler Vorteile, sondern auch Anwender haben eine (oder mehrere) Anlaufstellen, wo sie nach Software suchen können. • Einer der ältesten solcher Dienste ist SourceForge. Die Software dahinter kann man selbst kostenlos verwenden und es gibt einige Webseiten im Stil von Source Forge, die sich auf spezielle Software beschränken. • Andere Dienste sind Github (derzeit der populärste) und Microsoft CodePlex. Software - Installation ohne Paketmanager 1 • Nachdem die meiste Software für Linux als Open Source vertrieben wird, kann man üblicherweise von der Projekthomepage ein gepacktes Archiv herunterladen, das den Quellcode enthält. • In diesem Archiv befindet sich oft eine README-Datei mit grundlegenden Informationen zur Software sowie eine INSTALL-Datei mit einer Installationsanleitung. • Muss die Software kompiliert werden, so erfolgt dies meist unter Verwendung des GNU Build Systems und der GNU Toolchain (i.e. GNU Make, GNU Compiler Collection, Autotools, …). Unter Ubuntu reicht die Installation des build-essential Pakets, um die benötigte Software zu installieren. • Die Vorgehsweise zum Kompilieren und Installieren ist dabei (nahezu) immer die gleiche: $ configure $ make $ make install ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 53 von 139 Software - Installation ohne Paketmanager 2 • Das configure-Skript erfüllt dabei folgende Aufgaben: • Überprüfen, auf welchem System das Skript ausgeführt wird und setzen der entsprechenden Variablen • Überprüfen, ob die benötigten Headerdateien und Bibliotheken installiert sind • Aktivieren oder deaktivieren von optionalen Komponenten • Definieren der Installationsverzeichnisse • Um die möglichen Parameter für das configure-Skript anzuzeigen, ruft man es mit der Option --help auf. • Möchte man die Software nicht systemweit installieren (weil man dafür z.B. nicht die benötigten Rechte besitzt), benutzt man die Option --prefix=PREFIX (z.B. configure --prefix=$HOME/usr). • Das Ergebnis des configure-Skripts Konfigurationsdateien. • Die Makefiles enthalten unter anderem Anweisungen, wie die Software kompiliert bzw. installiert werden soll. sind die Makefiles und eventuell noch andere Softwarepaketverwaltung - Allgemeines • Einer der wichtigsten Unterschiede zwischen den verschiedenen Linux-Distribution ist diese Softwarepaketverwaltung. • Die Paketverwaltung erlaubt die einfache Installation, Deinstallation und Wartung von Softwarepaketen, durch z.B. das automatische Auflösen von Abhängigkeiten oder das Verwenden von Binärpaketen. • Die zwei verbreitetsten Paketformate sind deb („Debian package“; von Debian, Ubuntu und anderen Debian-Derivaten verwendet) und rpm („RPM Package Manager“; z.B. von Red Hat und openSUSE verwendet). In der Vorlesung werden wir Ubuntu und das deb-Format betrachten und rpm nur streifen. • Die Softwarepakete werden über ein sogenanntes Repository zur Verfügung gestellt, welches spezifisch für jede Distribution ist. Es umfasst jeden Typ von Software (Kernel, Administration, Anwendung) und zusätzlich auch Dokumentation sowie Default-Konfigurationen. • Das Ubuntu Package Repository bietet einen Überblick über alle Pakete, die man in Ubuntu direkt über die eingebaute Paketverwaltung installieren kann. Softwarepaketverwaltung - Pakete • Die Softwarepakete unter Ubuntu beinhalten unter anderem folgende Komponenten (genaue Informationen dazu sind im Debian FAQ zu finden): • Programmdateien, Konfigurationsdateien, sonstige Daten • Skripte, die bei der (De)Installation benötigt werden • Meta-Information (Name, Version, Beschreibung, Abhängigkeiten, …) • Signatur (zur Sicherstellung, dass niemand das Paket verändert hat) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 54 von 139 • Die Pakete enthalten dabei nicht mehr den Quellcode der Software und alles, was zum Kompilieren benötigt wird, sondern nur mehr die Dateien, die für die Ausführung benötigt werden (es gibt auch Paketmanager, die am Rechner selbst die Pakete kompilieren, z.B. Portage bei Gentoo). • Ein ganz wichtiger Punkt ist, dass zwischen diesen Paketen Abhängigkeiten definiert sind. Das heißt in der Praxis, dass ein Paket zusätzlich die Anwesenheit von weiteren Paketen benötigen kann. So wird zum Beispiel sichergestellt, dass bei der Installation eines Audio-Players die nötigen AudioCodecs installiert werden. Softwarepaketverwaltung - Paketabhängigkeiten Das Programm apt-rdepends erleichtert die Analyse von Paketabhängigkeiten, z.B. durch das Erstellen solcher Grafiken. apt-rdepends -d coreutils | dot -Tpng >coreutils.png Softwarepaketverwaltung - dpkg vs apt • • Unter Ubuntu gibt es zwei primäre Werkzeuge, die für die Verwaltung von Paketen und Repositories verwendet werden: • dpkg → Dieses Werkzeug arbeitet auf der untersten Ebene, also direkt mit den Paketen. Es wird benutzt um einzelne Pakete zu installieren, zu entfernen bzw. um allgemein lokale Pakete zu verwalten. • apt → Die Abkürzung für Advanced Packaging Tool bezeichnet eine Familie von Programmen, die auf dpkg aufbauen und für die eigentliche Paketverwaltung benutzt werden. Es besitzt unter anderem eingebaute Funktionalitäten zum Verwalten von Repositories, Herunterladen von Paketen und zum automatischen Installieren von Abhängigkeiten. Die entsprechenden Pendants bei RedHat Linux wären rpm (zu dpkg) und yum (zu apt). ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 55 von 139 Softwarepaketverwaltung - Aufgaben von dpkg • • Auf den ersten Blick scheint die Installation eines Softwarepakets selbst nicht aufwändig zu sein. Es müssen ja nur Dateien in bestimmte Verzeichnisse kopiert werden. Allerdings reicht das nicht immer aus: • Vor der Installation muss geprüft werden, ob das zu installierende Paket nicht bestehende Dateien eines anderen Pakets überschreibt. • Das Paket darf auch erst dann installiert werden, wenn benötigte, andere Pakete installiert worden sind. • Bei einigen Paketen müssen Aufgaben vor oder nach der Installation durchgeführt werden (z.B. Starten eines Services oder Anlegen eines Benutzers) • Konfigurationsdateien eines Pakets, die seit der Installation geändert worden sind, dürfen bei einer Aktualisierung des Pakets nicht einfach überschrieben werden. Weiters muss eine Liste der installierten Pakete geführt werden sowie pro Paket eine Liste der installierten Dateien (inkl. Berechtigungen und Prüfsummen). Softwarepaketverwaltung - dpkg dpkg - Verwaltet deb-Softwarepakete » Optionen: • -i Package.deb → Installiert ein Paket • -r Paketname → Entfernt ein Paket, aber nicht dessen Konfigurationsdateien • -P Paketname → Entfernt ein Paket inkl. der Konfigurationsdateien • -L Paketname → Listet die Dateien des Pakets auf • -l → Listet alle installierten Pakete auf • -S Pfad → Sucht das Paket, in dem der Pfad vorkommt » $ dpkg -l | grep dpkg ii dpkg 1.16.7ubuntu6 ii dpkg-dev 1.16.7ubuntu6 ii libdpkg-perl 1.16.7ubuntu6 $ dpkg -S /usr/bin/dpkg dpkg: /usr/bin/dpkg amd64 all all Debian package management system Debian package development tools Dpkg perl modules Bei rpm wären die entsprechenden Befehle rpm -i Package.rpm (Paket installieren), rpm -e Paket (Paket entfernen), rpm -qa (alle Pakete auflisten), rpm -ql (Dateien des Pakets auflisten) und rpm -qf Pfad (Paket zu Pfad finden). Softwarepaketverwaltung - Paketintegrität prüfen Für jede Datei in einem Paket wird ein kryptographischer Hashwert erstellt (ein MD5-Hashwert). Dadurch kann man später überprüfen, ob eine Datei seit der Installation verändert worden ist. Falls man ein verändertes Paket findet, kann man dieses mit apt-get install --reinstall Paket neu installieren. debsums - Überprüft MD5-Werte von installierten Paketen » Optionen: -s → Nur Fehler ausgeben, -c → Veränderte Dateien ausgeben. » $ debsums -s curl ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 56 von 139 $ echo test > /usr/bin/curl $ debsums curl /usr/bin/curl /usr/share/doc/curl/MANUAL.gz /usr/share/doc/curl/TheArtOfHttpScripting.gz /usr/share/doc/curl/copyright /usr/share/man/man1/curl.1.gz $ apt-get install --reinstall curl ... $ debsums -s curl $ FAILED OK OK OK OK Softwarepaketverwaltung - Aufgaben von apt • dpkg kann Pakete installieren, die schon heruntergeladen worden sind, bzw. die bereits installierten Pakete verwalten. Es bietet aber keine darüber hinausgehenden Möglichkeiten, z.B. Pakete aus dem Internet für die Installation herunterladen. • Hier kommt apt ins Spiel. Während dpkg auf der unteren Ebene arbeitet, ist apt darüber angesiedelt und bietet Funktionalitäten, die das Arbeiten mit Paketen noch vereinfachen: • Automatisches Auflösen von Paketabhängigkeiten und Installation der Pakete in der richtigen Reihenfolge • Installation/Aktualisierung/Deinstallation von Paketen mit Hilfe von Paketnamen (und nicht direkt über Paketdateien) • Verifizieren der Signaturen von Paketen • Einfaches Verwalten von mehreren Software-Repositories und der zugeordneter GPG-Schlüssel • Automatische Sicherheits-Updates von Paketen Softwarepaketverwaltung - Repositories • Repositories werden über die APT-Familie von Werkzeugen verwaltet. Die Konfigurationsdateien liegen in /etc/apt/: • sources.list → Definiert die Hauptrepositories, die das System verwenden soll (man sources.list) • sources.list.d/*.list → Zusätzliche Repositories • apt.conf.d/* → Konfigurationsdateien • trusted.gpg → GnuPG Schlüsseldatei • Repositories sind über HTTP oder FTP freigegeben Verzeichnisse, die einer bestimmten Struktur folgen. In dieser Struktur gibt es neben den eigentlichen Paketdateien (mit der Endung .deb) auch Dateien mit Informationen über alle verfügbaren Pakete des Repositories. • Die Liste der Paketdaten eines Repositories wird (ähnlich wie Pakete) mit Hilfe einer Signatur vor Fälschung geschützt. Die dafür benötigten Schlüssel werden in der oben angegeben Datei verwaltet. • Bei yum sind Repositories entweder in /etc/yum.conf oder in Dateien unter /etc/yum.repos.d definiert. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 57 von 139 Softwarepaketverwaltung - apt-key apt-key - Verwaltet Repository-Schlüssel » Verwendet GPG im Hintergrund. » Befehle: list → Auflisten aller Schlüssel, add Datei → Hinzufügen eines Schlüssel aus einer Datei, del KeyID → Löschen eines Schlüssels. » $ apt-key list | head -n 11 /etc/apt/trusted.gpg -------------------pub 1024D/437D05B5 2004-09-12 uid Ubuntu Archive Automatic Signing Key <[email protected]> sub 2048g/79164387 2004-09-12 pub uid 1024D/FBB75451 2004-12-30 Ubuntu CD Image Automatic Signing Key <[email protected]> pub 1024D/3E5C1192 2010-09-20 uid <[email protected]> Ubuntu Extras Archive Automatic Signing Key Bei rpm/yum werden die GPG-Schlüssel mit rpm verwaltet, z.B. kann man mit rpm --import einen Schlüssel importieren. Softwarepaketverwaltung - apt-get apt-get - APT Paketverwaltungstool » Bietet extrem viele Unterbefehle und Optionen (und hat sogar Super-Kuh-Fähigkeiten…). » Die wichtigsten Befehle: • update → Paketquellen von Repositories herunterladen und überprüfen, ob Updates vorhanden sind • upgrade → Alle Pakete auf den neuesten Stand bringen (zuvor ein update machen) • install Paket... → Installiert die Pakete und eventuell benötigte Abhängigkeiten • remove Paket/purge Paket → Entfernen das Paket (und im zweiten Fall auch die Konfigurationsdateien) • autoremove → Alle nicht mehr benötigten Pakete entfernen Bei yum wären die entsprechenden Befehle yum install (Paket installieren), yum remove (Paket entfernen) und yum update (alles aktualisieren). Softwarepaketverwaltung - apt-cache apt-cache - Durchsucht den APT-Cache » Nach einem apt-get update liegen die aktuellen Paketindexdateien lokal am Rechner und können mit Hilfe dieses Programms durchsucht werden. » Befehle: show → Informationen zu einem Paket anzeigen, search → Mit Hilfe eines Regexps die Paketquellen durchsuchen » Bei yum wären die entsprechenden Befehle yum (Paketinformationen anzeigen). search (Paket suchen) bzw. yum info » $ apt-cache search kramdown ruby-kramdown - Fast, pure-Ruby Markdown-superset converter ruby-kramdown-rfc2629 - generate XML2RFC XML from Markdown $ apt-cache show ruby-kramdown | head -n 11 ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 58 von 139 Package: ruby-kramdown Priority: optional Section: universe/ruby Installed-Size: 1889 Maintainer: Ubuntu Developers <[email protected]> Original-Maintainer: Debian Ruby Extras Maintainers <[email protected]> Architecture: all Version: 1.8.0-1 Depends: ruby | ruby-interpreter, ruby-prawn, ruby-prawn-table, ruby-coderay, rubyrouge (>= 1.8~), ruby-stringex, libjs-jquery Suggests: libjs-mathjax Filename: pool/universe/r/ruby-kramdown/ruby-kramdown_1.8.0-1_all.deb Softwarepaketverwaltung - aptitude aptitude - APT Paketverwaltungstool » Vereint unter anderem die Funktionalitäten von apt-cache und apt-get. » Hat ein paar Vorteile gegenüber apt-get, z.B. werden nicht mehr benötigte Pakete beim Entfernen eines Pakets automatisch mitentfernt. » Wird aptitude ohne Parameter aufgerufen, startet eine interaktive Konsolenapplikation zum Verwalten von Paketen. » apt-get update aptitude update apt-get upgrade aptitude safe-ugprade apt-get install aptitude install apt-get install –reinstall aptitude reinstall apt-get remove aptitude remove apt-get purge aptitude purge apt-cache search aptitude search apt-cache show aptitude show Softwarepaketverwaltung - Präferenzsystem • Es kann vorkommen, dass bei einem Systemupdate ein Paket aktualisiert werden soll und man das vermeiden möchte (z.B. weil etwas nur mit der alten Version funktioniert). Oder dass man Pakete eines Repositories gegenüber den Paketen eines anderen bevorzugen will. • Mit Hilfe des Präferenzsystems von apt kann man solche Aufgabenstellung lösen - siehe man apt_preferences. • Die Präferenzen können in Dateien im Verzeichnis /etc/apt/preferences.d/ festgelegt werden. • Um zum Beispiel die aktuellesten Pakete zu installieren, auch wenn sie gerade noch getestet werden oder instabil sind, kann man folgende Datei verwenden (die Standardpriorität ist 500): Package: * Pin: release a=testing Pin-Priority: 900 ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 59 von 139 Package: * Pin: release a=unstable Pin-Priority: 800 Softwarepaketverwaltung - Automatische Updates • Um Sicherheitsupdates automatisch einspielen zu lassen, gibt es mehrere Möglichkeiten (z.B. cronapt und unattended-upgrades). • Für die Verwendung von unattended-upgrades das gleichnamige Paket installieren und die Konfiguration anpassen: • Das Programm durch Setzen der folgenden Optionen in /etc/apt/apt.conf.d/10periodic aktiveren: APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1"; Die erste Option stellt sicher, dass die Repository-Daten aktuell sind und die zweite aktiviert die automatischen Updates mittels unattended-upgrades. • In der Datei /etc/apt/apt.conf.d/50unattended-upgrades sollte man zusätzlich zumindest noch einstellen, welche Repositories für Updates herangezogen werden sollen, wenn man mit den Standardeinstellungen nicht zufrieden ist (Option Unattended-Upgrade::Allowed-Origins). • Das Programm wird dann regelmäßig durch den Cronjob /etc/cron.daily/apt ausgeführt. Paketverwaltung mit Puppet • Pakete werden in Puppet über die Ressource package verwaltet. • Unter Ubuntu wird standardmäßig der Provider apt verwendet, alternativ dazu gäbe es noch aptitude und dpkg. • Wichtige Attribute: • name: Der Name des Pakets (falls nicht angegeben, wird der Titel verwendet). • ensure: Der gewünschte Zustand (present oder installed, absent, purged, held, latest oder eine Versionsnummer; falls nicht angegeben wird der Wert installed genommen). • responsefile: Eine Datei mit den benötigten Antworten, die von dem Paket abgefragt werden (zum Beispiel zum Akzeptieren einer Lizenz oder zum Vorkonfigurieren) Paketverwaltung mit Puppet - Beispiele • Installation von OpenSSH-Server und -Client: package {'openssh-client': ensure => latest } package {'openssh-server': } • Sicherstellen, dass das Paket ntp nicht installiert ist: ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 60 von 139 package {'ntp': ensure => purged } Verwaltung von APT mit Puppet 1 • Zur Verwaltung von Quellen, Schlüsseln und Konfigurationsoptionen für APT mit Puppet eignet sich das puppetlabs/apt Modul. • Die Klasse apt muss inkludiert werden, damit die nötigen Ressourcen definiert werden (z.B. für das Ausführen von apt-get update). • Schlüssel verwalten: apt::key { "CC key": id => '9E2E7FFB465D2C010F6834FE1985A9276BB7CA7A', source => "http://cc.mat.univie.ac.at/ubuntu/pub.key", } • Paketquellen verwalten: apt::source { "cc-mat": comment => 'CC Repo', location => "http://cc.mat.univie.ac.at/ubuntu", release => trusty, repos => 'contrib', } Verwaltung von APT mit Puppet 2 • Konfigurationsoptionen setzen (entweder direkt mittels content den gesamten Inhalt der Datei oder über source eine Datei spezifizieren): apt::conf { 'unattended-upgrade' content => "APT::Periodic::Unattended-Upgrade \"1\";\n" priority => 99 } • Präferenzen für Pakete festsetzen: apt::pin { 'testing': packages => '*', release => 'testing', priority => 900; 'unstable': packages => '*', release => 'unstable', priority => 800; } ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 61 von 139 Foliensatz 5 Benutzer- und Gruppenverwaltung Inhalt • Benutzer und Gruppen • Name Service Switch (NSS) • Lokal definierte Benutzer und Gruppen • Pluggable Authentication Modules (PAM) • Benutzer- und Gruppenverwaltung mit Puppet Benutzer und Gruppen • • • Unter Linux gibt es ein einfaches Benutzer(konto)- bzw. Berechtigungskonzept: • Es gibt einen speziellen Benutzer, üblicherweise root genannt, der alles darf. • Daneben gibt es noch viele „normale“ Benutzer, die grundsätzlich die gleichen Rechte haben. • Ein Benutzer ist immer einer oder mehreren Gruppen zugeordnet, die bestimmte Rechte haben. Allerdings gibt es eine Vielzahl an Möglichkeiten, wie man bestimmten Benutzern mehr erlauben kann: • durch Zuordnung zu bestimmten Gruppen • über den sudo-Befehl • durch Zuordnung sogenannter Fähigkeiten (Capabilities; seit Linux 2.2) Wichtig ist auch immer der Unterschied Authentifikation (Bin ich wirklich der, der ich vorgebe zu sein?) und Autorisation (Was darf ich?)! Benutzer/Gruppen - Namen und Nummern • Sowohl Benutzer als auch Gruppen werden üblicherweise über einen Namen referenziert. • Nachdem aber Computer mit Zahlen besser umgehen können als mit Namen (und Zahlen auch weniger Speicherplatz brauchen), verwendet der Kernel intern zum Referenzieren von Benutzern und Gruppen Nummern, die sogenannten UIDs (User IDs) und GIDs (Group IDs). • Die Zuordnung von UID zu Benutzer bzw. GID zu Gruppe muss nicht eindeutig sein, sollte es aber. Ein Grund, warum eine UID mit mehreren Benutzernamen assoziiert wird, ist z.B., um verschiedene Passwörter verwenden zu können. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 62 von 139 Benutzer/Gruppen - Automatisierierung Wie generell bei der Systemadministration ist es auch bei der Benutzerverwaltung wichtig, möglichst alles zu automatisieren: • Anlegen von Benutzern (kann in manchen Umgebungen aus vielen Schritten bestehen, z.B. Anlegen eines Benutzerkontos in einem LDAP-Verzeichnis, Erstellen des Home-Verzeichnisses und eines Windows-Profil-Verzeichnisses auf einem Dateiserver, Eintragen des Benutzers in Mailing-Listen, …) • Löschen von Benutzern (Benutzerkonto und sämtliche Daten löschen; zur Sicherheit ein Backup der Daten machen) • Regelmäßiges Entfernen von „Karteileichen“ aus dem System Damit können Fehler vermieden und alle Schritte auch ohne Zusatzaufwand dokumentiert werden. Benutzer - Merkmale Jedes Benutzerkonto besitzt die folgenden Merkmale: • Name: Ein eindeutiger Loginname für den Benutzer. • UID (User ID): Eine eindeutige Nummer für den Benutzer (>=0). • GID (Group ID): Die Nummer der primären Gruppe des Benutzers. • GECOS-Feld: Enthält den realen Namen sowie eventuell zusätzliche Informationen über den Benutzer (z.B. Raumnummer und Telefonnummer). Der Name stammt von frühen Unix-Maschinen mit dem Namen GECOS (General Comprehensive Operating System), die dieses Feld für zusätzliche Informationen nutzten. • Home-Verzeichnis: Das Verzeichnis, in dem der Benutzer alle seine Daten abspeichern kann bzw. in dem seine Konfigurationsdateien liegen (üblicherweise /home/BENUTZER_NAME). • Login-Shell: Der Pfad des Programms, das beim Einloggen des Benutzers ausgeführt werden soll. Benutzer - Details zu den Merkmalen • Der Loginname sollte nur aus Kleinbuchstaben, Ziffern und dem Unterstrich bestehen und mit einem Buchstaben beginnen (siehe CAVEATS in useradd(8)). • Die Loginnamen dienen lediglich der Darstellung gegenüber Benutzern des Systems, intern (z.B. auf Prozess- und Dateisystemebene) werden immer die numerischen Werte (UID, GID) verwendet. • Die Anzahl der möglichen UIDs/GIDs seit Linux 2.6 ist 4294967296 (i.e. 2^32). • Der spezielle Benutzer root hat immer die UID 0. • Das Home-Verzeichnis eines Benutzers muss nicht unbedingt existieren. Als Ersatz wird dann das Root-Verzeichnis (/) verwendet. Da ein normaler Benutzer nicht die Berechtigung hat, im RootVerzeichnis Dateien anzulegen/zu verändern, funktionieren dann aber einige Anwendungen nicht richtig (z.B. funktioniert das Einloggen auf der graphischen Oberfläche meist nicht). • Die Informationen im GECOS-Feld werden von einigen Applikationen ausgewertet (z.B. vom Programm finger), sind aber nicht direkt für das System wichtig. • Ist keine Login-Shell gesetzt, so wird als Login-Shell /bin/sh verwendet. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 63 von 139 Benutzer - Passwortmerkmale Zusätzlich zu den allgemeinen Merkmalen kann jedes Benutzerkonto auch Passwortmerkmale enthalten: • Passwort in verschlüsselter Form • Datum der letzten Passwortänderung • Minimales Passwortalter in Tagen • Maximales Passwortalter in Tagen • Warnzeitraum vor Passwortablauf in Tagen • Passwortänderungszeitraum nach Passwortablauf in Tagen • Ablaufdatum des Kontos Benutzer - Details zu den Passwortmerkmalen • Die Datumsangaben erfolgen immer als Anzahl der Tage seit 1. Jänner 1970. • Keine Angaben zum Datum der letzten Passwortänderung, dem minimalen oder maximalen Passwortalter, dem Warnzeitraum oder dem Passwortänderungszeitraum bedeuten, dass diese Funktionalität deaktiviert ist. • Das verschlüsselte Passwort kann folgende Werte enthalten: • Kein Wert: Der Benutzer kann sich ohne Passwort einloggen. Allerdings kann es sein, dass manche Applikationen dann den Zugriff vollständig verbieten. D.h. man sollte hier immer etwas eintragen! • Verschlüsseltes Passwort: Erkennt man daran, dass der Wert mit $ID$ anfängt (ID gibt den Verschlüsselungsalgorithmus an, siehe man 3 crypt). • !...: Fängt das Passwort-Feld mit einem Rufzeichen an, so ist das Konto für die Authentifizierung über das Passwort gesperrt. Andere Authentifizierungsmethoden sind aber noch erlaubt. • Andere Werte (z.B. *) zeigen ein ungültiges Passwort an; der Benutzer kann also nicht mit einem Passwort einloggen (aber eventuell mit anderen Methoden). Gruppen • Wie Benutzer haben auch Gruppen bestimmte Merkmale: • Name: Ein eindeutiger Gruppenname. • GID: Eine eindeutige Nummer für die Gruppe. • Gruppenmitglieder: Eine Liste der Benutzer, die in dieser Gruppe Mitglied sein sollen. • Jeder Benutzer hat eine primäre Gruppe, welche direkt bei den Merkmalen des Benutzers über die GID angegeben ist. • Die primäre Gruppe wird z.B. beim Anlegen von neuen Dateien oder beim Starten von Prozessen verwendet (jeder Datei/jedem Prozess ist ja sowohl eine UID als auch eine GID zugeordnet, um Berechtigungen zu prüfen). • Zusätzlich kann ein Benutzer Mitglied in beliebig vielen anderen Gruppen sein, das sind dann die sekundären Gruppen des Benutzers. Temporär kann ein Benutzer mittels des Befehls newgrp seine primäre Gruppe ändern. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 64 von 139 Allgemeine Befehle - id, groups id - Zeigt Benutzer- und Gruppeninformationen an. » Verwendet den aktuellen Benutzer oder den via Parameter angegebenen. » $ id uid=1000(praxis) gid=1000(praxis) Gruppen=1000(praxis),4(adm),24(cdrom),27(sudo), 30(dip),46(plugdev),111(lpadmin),112(sambashare) $ id root uid=0(root) gid=0(root) Gruppen=0(root) groups - Zeigt die Gruppen eines Benutzers an. » Verwendet den aktuellen Benutzer oder die via Parameter angegebenen. » $ groups praxis adm cdrom sudo dip plugdev lpadmin sambashare $ groups root praxis root : root praxis : praxis adm cdrom sudo dip plugdev lpadmin sambashare Name Service Switch (NSS) • Der Name Service Switch (NSS) dient dazu, verschiedene Quellen für Namensdatenbanken zu konfigurieren. Darunter fallen zum Beispiel Datenbanken für Benutzerdaten, Passwortdaten, Gruppendaten und Host-Namen. • Dabei gibt es zwar eine fix definierte Liste an Namensdatenbanken, aber über Bibliotheken können die Mechanismen zum Abfragen der Daten erweitert werden. • Standardmäßig werden als Quellen Dateien im Verzeichnis /etc/ benutzt (über die „files“ bzw. „compat“ Bibliotheken) bzw. für die Host-Namen auch DNS (über die „dns“ Bibliothek), aber die Informationen könnten auch aus NIS, LDAP oder einem ActiveDirectory kommen. • Eine Auflistung aller möglichen Bibliotheken bekommt man über aptitude search libnss, die installierten Bibliotheken findet man als Dateien der Form /lib/libnss_NAME.so.X. NSS - Konfiguration • • Konfiguriert wird der NSS über die Datei /etc/nsswitch.conf. Die Standardkonfiguration auf einem Ubuntu-Server sieht folgermaßen aus: passwd: group: shadow: compat compat compat hosts: networks: files dns files protocols: services: ethers: rpc: db db db db netgroup: nis files files files files Die Syntax ist sehr einfach: Pro Zeile wird eine Namensdatenbank konfiguriert, deren Name am ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 65 von 139 Anfang steht. Danach kommen die Quellen, aus denen die Daten der Reihe nach gelesen werden sollen, bis ein Ergebnis gefunden wird. Zusätzlich könnte man über die Angabe von [STATUS=AKTION] nach einer Quelle die Standardaktion beeinflussen, also was im Falle des Erfolgs oder eines Fehlers gemacht wird (siehe man nsswitch.conf). NSS - getent getent - Zeigt Datensätze aus einer NSS-Datenbank an. » Alle über NSS konfigurierbaren Datenbanken können ausgelesen werden, z.B. passwd, group, hosts, services, protocols und networks. » Der Befehl ist besonders nützlich, wenn nicht nur lokale (d.h. am System definierte) Daten vorhanden sind, sondern auch externe Daten (z.B. aus einem LDAP-Verzeichnis). » $ getent passwd | head -n 3 root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh $ getent group root root:x:0: $ getent hosts 127.0.0.1 localhost 127.0.1.1 praxis 127.0.0.1 ip6-localhost ip6-loopback Lokale Benutzer - /etc/passwd • Lokale Benutzer werden mittels der Dateien /etc/passwd und /etc/shadow definiert. Diese Dateien sollten mit vipw editiert werden, um Datenkorruption vorzubeugen. • In der Passwortdatei /etc/passwd sind die Merkmale der Benutzerkonten gespeichert. Diese Datei muss von allen Benutzern gelesen werden können. Im Gegensatz zu ihrem Namen sollte das Passwort in der Passwortdatei nicht gespeichert werden! • Jede Zeile in der Datei beschreibt einen Benutzeraccount, die einzelnen Werte sind mit Doppelpunkten von einander getrennt. • Eine typische Zeile sieht zum Beispiel so aus (man 5 passwd): root:x:0:0:root:/root:/bin/bash / | \ \ \ \ \ Benutzername | \ GID GECOS \ Login-Shell Passwort UID Home-Verzeichnis Lokale Benutzer - Details • Alle erwähnten Merkmale eines Benutzerkontos können in /etc/passwd definiert werden. • Zusätzlich gibt es auch noch ein Passwort-Feld, welches folgende Werte besitzen darf: • Kein Wert: Der gleiche Effekt, wie bei den Details zu den Passwortmerkmalen erwähnt. • x: Steht im Passwort-Feld ein kleines „x“, dann bedeutet das, dass das verschlüsselte Passwort in der Datei /etc/shadow zu finden ist. In diesem Fall muss es eine entsprechende Zeile in dieser ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 66 von 139 Datei geben! • Jeder andere Wert wird als verschlüsseltes Passwort interpretiert (siehe Details zu den Passwortmerkmalen). Lokale Passwörter und Passwortmerkmale - /etc/shadow • Da die Passwortdatei /etc/passwd von allen Benutzer gelesen werden können soll, ist es nicht ratsam, darin die Passwörter zu speichern. Daher gibt es die Möglichkeit, beim Passwort-Feld ein „x“ einzugeben, was für das System bedeutet, dass das eigentlich Passwort in der Shadowdatei /etc/shadow gespeichert ist. • Diese Datei hat die gleiche Syntax wie /etc/passwd, die Felder entsprechen den Passwortmerkmalen eines Benutzers. Hier wieder eine typische Zeile (siehe auch man 5 shadow): root:*:15779:0:99999:7: : : | | | | | | | | \ | | | | | | | \ Reserviertes Feld | | | | | | \ Ablaufdatum des Kontos | | | | | \ Passwortänderungszeitraum nach Passwortablauf (Tage) | | | | \ Warnzeitraum vor Passwortablauf (Tage) | | | \ Maximales Passwortalter (Tage) | | \ Minimales Passwortalter (Tage) | \ Datum der letzten Passwortänderung \ verschlüsseltes Passwort Benutzername Benutzerverwaltung - useradd useradd - Legt ein neues Benutzerkonto an. » Standardwerte für einige Optionen sind in /etc/default/useradd und /etc/login.defs hinterlegt. » Man könnte auch direkt ein verschlüsseltes Passwort angeben (erzeugt z.B. mit mkpasswd), was aber vermieden werden sollte, weil dieses dann in der Prozessliste aufscheint. » Optionen: • -d Home-Verzeichnis → Home-Verzeichnis • -m → Home-Verzeichnis anlegen, Daten von Skeleton-Verzeichnis kopieren • -k Verzeichnis → Verzeichnis als Skeleton-Verzeichnis verwenden • -g GID → primäre Gruppe (GID oder Name) • -G Gruppe[,Gruppe...] → sekundäre Gruppen • -e Ablaufdatum → Ablaufdatum des Kontos • -s Shell → Login-Shell » $ useradd -d /home/leitnert -k /etc/skel_lehrer -m -g lehrer leitnert $ getent passwd leitnert leitnert:x:1001:1002::/home/leitnert:/bin/sh ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 67 von 139 Benutzerverwaltung - usermod usermod - Modifiziert ein Benutzerkonto. » Optionen: • -L → Benutzerpasswort sperren • -U → Benutzerpasswort entsperren • -g GID → primäre Gruppe ändern • -G Gruppe[,Gruppe...] → sekundäre Gruppen setzen • -l NeuerName → Benutzernamen ändern • -u UID → UID ändern (Dateien im Home-Verzeichnis bekommen die neue UID automatisch gesetzt) • -s Shell → Login-Shell ändern. » Aufpassen beim Ändern des Namens und der UID: Der Benutzer sollte nicht eingeloggt sein! » $ getent passwd leitnert leitnert:x:1001:1002::/home/leitnert:/bin/sh $ usermod -s /bin/bash -g adm leitnert $ getent passwd leitnert leitnert:x:1001:4::/home/leitnert:/bin/bash Benutzerverwaltung - userdel userdel - Löscht ein Benutzerkonto. » Optionen: -r → lösche das Home-Verzeichnis des Benutzers. » $ find /home/leitnert /home/leitnert $ userdel -r leitnert $ getent passwd leitnert $ find /home/leitnert find: "/home/leitnert": Datei oder Verzeichnis nicht gefunden Benutzerverwaltung - adduser adduser - Legt ein neues Benutzerkonto an (benutzerfreundlicher). » Dieser Befehl funktioniert wie useradd, benutzt aber die Vorgaben in /etc/adduser.conf und ist auf Konformität mit den Debian-Richtlinien ausgelegt. der Datei » Über die Optionen --shell, --home, --uid, --gecos und --gid können die entsprechenden Merkmale gesetzt werden. » $ adduser --shell /bin/zsh thomas Adding user `thomas' ... Adding new group `thomas' (1001) ... Adding new user `thomas' (1001) with group `thomas' ... Creating home directory `/home/thomas' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for thomas Enter the new value, or press ENTER for the default Full Name []: Room Number []: ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 68 von 139 Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y Benutzerverwaltung - deluser deluser - Löscht ein Benutzerkonto. » Analog zum Befehl adduser funktioniert dieser Befehl wie userdel, benutzt aber die Vorgaben in der Datei /etc/deluser.conf. » Die Option --remove-home entfernt das Home-Verzeichnis, --remove-all-files entfernt alle Dateien des Benutzers vom System. Mittels --backup kann ein Backup der gelöschten Daten angelegt werden. » $ deluser --backup --remove-all-files thomas Looking for files to backup/remove ... /usr/sbin/deluser: Cannot handle special file /dev/parport0 [...] /usr/sbin/deluser: Cannot handle special file /lib/systemd/system/mountnfs.service Backing up files to be removed to . ... backup_name = ./thomas.tar /bin/tar: Removing leading `/' from member names Removing files ... Removing user `thomas' ... Warning: group `thomas' has no more members. Done. $ tar tvf thomas.tar.bz2 -rw-r--r-- thomas/thomas 220 2016-04-08 20:33 home/thomas/.bash_logout -rw-r--r-- thomas/thomas 675 2016-04-08 20:33 home/thomas/.profile -rw-r--r-- thomas/thomas 3771 2016-04-08 20:33 home/thomas/.bashrc -rw------- thomas/thomas 56 2016-04-08 20:43 home/thomas/.bash_history -rw-rw-r-- thomas/thomas 5 2016-04-08 20:43 home/thomas/test -rw-rw-r-- thomas/thomas 5 2016-04-08 20:43 tmp/data Benutzerverwaltung - chsh, chfn chsh - Ändert die Login-Shell. » Kann ein Benutzer selbst ausführen. » Die Datei /etc/shells wird konsultiert und nur die darin aufgelisteten Programme kann ein Benutzer als Login-Shell setzen. » Vor dem Ändern muss man sich authentifizieren. chfn - Ändert die Informationen im GECOS-Feld. » Kann ein Benutzer selbst ausführen. » Vor dem Ändern muss man sich authentifizieren. » Was genau der Benutzer ändern darf, ist über den Schlüssel CHFN_RESTRICT in der Datei /etc/login.defs festgelegt. Benutzerverwaltung - chage chage - Ändert Passwortablaufinformation oder zeigt sie an. » Alle in der Shadowdatei gespeicherter Passwortmerkmale können geändert werden. » Optionen (Auszug): • -d Datum → Ändert das Datum der letzten Passwortänderung • -E Datum → Ändert das Ablaufdatum ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 69 von 139 • -l → Zeigt die Passwortablaufinformationen an » Nur der Administrator kann Änderungen durchführen, unpriviligierte Benutzer können nur die Option -l verwenden. » $ chage -l praxis Last password change Password expires Password inactive Account expires Minimum number of days between password change Maximum number of days between password change Number of days of warning before password expires $ chage -d 2013-03-01 praxis $ chage -l praxis | head -n 1 Last password change : : : : : : : Mär 17, 2013 never never Mär 20, 2013 0 99999 7 : Mär 01, 2013 Befehle für Benutzerverwaltung - passwd passwd - Ändert das Passwort eines Benutzers. » Der Administrator kann ohne Wissen des Passworts das Passwort eines Benutzers ändern (sofern es lokal gespeichert ist). Er muss sich auch nicht an die Passwortrichtlinien halten. » Ein unpriviligierter Benutzer kann nur sein eigenes Passwort ändern. » Ähnlich zu chage können auch Passwortablaufinformationen geändert werden. » $ passwd praxis Ändern des Passworts für praxis. (aktuelles) UNIX-Passwort: -->Aktuelles Passwort eingeben<-Geben Sie ein neues UNIX-Passwort ein: -->Kurzes Passwort eingeben<-Geben Sie das neue UNIX-Passwort erneut ein: -->Kurzes Passwort eingeben<-Sie müssen ein längeres Passwort auswählen. Geben Sie ein neues UNIX-Passwort ein: -->Langes Passwort eingeben<-Geben Sie das neue UNIX-Passwort erneut ein: -->Langes Passwort eingeben<-passwd: password updated successfully $ passwd -l praxis passwd: password expiry information changed. $ passwd -S praxis praxis L 03/01/2013 0 99999 7 -1 $ passwd -u praxis passwd: password expiry information changed. $ passwd -S praxis praxis P 03/01/2013 0 99999 7 -1 Lokale Gruppen - /etc/group • Lokale Gruppen werden mittels der Dateien /etc/group und /etc/gshadow definiert. Diese Dateien sollten mit vigr editiert werden, um Datenkorruption vorzubeugen. • In der Datei /etc/group sind die Gruppen mit ihren Merkmalen gespeichert. Wie in /etc/passwd wird pro Zeile eine Gruppe definiert. • Eine typische Zeile sieht so aus: adm:x:4:thomas,admin / | | \ Gruppenname / \ Liste von Gruppenmitgliedern ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 70 von 139 Passwort • GID In der Datei /etc/gshadow könnten verschlüsselte Passwörter für Gruppen gesetzt werden. Es ist allerdings sehr unüblich, Passwörter für Gruppen zu vergeben. Gruppenverwaltung - groupadd, groupmod, groupdel groupadd - Legt eine neue Gruppe an. » Optionen: -g GID → die GID der Gruppe. » $ groupadd lehrer $ getent group lehrer lehrer:x:1002: groupmod - Ändert Gruppeninformationen. » Optionen: -g GID → ändert die GID, -n Name → ändert den Gruppennamen. » $ groupmod -g 1515 -n teachers lehrer $ getent group teachers teachers:x:1515: groupdel - Löscht eine Gruppe. » $ groupdel teachers $ groupdel praxis groupdel: cannot remove the primary group of user 'praxis' Analog zu den Befehlen für die Benutzerverwaltung gibt es auch addgroup und delgroup (sind eigentlich nur Ausführungsvarianten von adduser und deluser). Authentifikation/Autorisation mit PAM • Die Authentifikation (und ein Teil der Autorisation) erfolgt (fast) immer über PAM (Pluggable Authentication Modules for Linux, siehe auch man 7 pam). • Es gibt vier unterschiedliche Bereiche innerhalb vom PAM: • account: Methoden zur Überprüfung des Kontos (Ist das Passwort abgelaufen? Darf der Benutzer auf das Service zugreifen?) • auth: Methoden zur Authentifizierung des Benutzer (z.B. über ein Passwort, eine ID-Karte oder einen Fingerabdruckscanner) • password: Methoden zur Änderung der Authentifikation (z.B. ändern des Passworts) • session: Methoden, die es erlauben, vor und nach Erteilung des Zugriffs bestimmte Dinge zu tun (z.B. Loggen, wenn sich ein Benutzer an- bzw. abmeldet) PAM - Konfiguration • Die Konfiguration erfolgt durch Dateien im Verzeichnis /etc/pam.d/. Unter Ubuntu sind die allgemeinen Einstellungen in den Dateien common-account, common-auth, common-password und common-session zu finden. • Der Name einer Konfigurationsdatei gibt das Service an, von welchem dieses benutzt wird (z.B. wird /etc/pam.d/sshd vom OpenSSH-Server benutzt). • In einer Konfigurationsdatei sind zeilenweise Einträge folgender Form (siehe man pam.conf): ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 71 von 139 Bereich Kontrollanweisung Modulpfad Moduloptionen • Bereich ist einer der vier genannten Bereiche. • Die Kontrollanweisung bestimmt, was bei Erfolg/Fehler gemacht werden soll. • Modulpfad ist der Pfad zu dem zu verwendenen Modul, relativ zu /lib/security (z.B. pam_unix.so). • Moduloptionen sind Optionen, die an das Modul übergeben werden. Zum Beispiel: auth auth [success=1 default=ignore] requisite pam_unix.so nullok_secure pam_deny.so PAM - Module • Eine Liste aller möglichen Module bekommt man über aptitude search libpam. Bei der Installation von PAM-Authentifizierungs-Modulen werden diese üblicherweise auch automatisch aktiviert. • Mit Hilfe von pam-auth-update können aus den installierten Authentifizierungs-Modulen die zu benutzenden im Nachhinein auch ausgewählt werden. • Das Paket libpam-modules stellt viele Standardmodule zur Verfügung, von denen einige über Dateien im Verzeichnis /etc/security konfiguriert werden. Die folgenden Module werden häufig benutzt: • pam_permit: Erlaubt immer den Zugriff. • pam_deny: Verweigert immer den Zugriff. • pam_unix: Das Standard-Unix-Modul für die Authentifikation und Autorisation über die Passwort- und über die Shadowdatei. • pam_access: Definiert, welcher Benutzer sich von wo aus einloggen darf (verwendet /etc/security/access.conf). PAM - Module - Fortsetzung • Fortsetzung: • pam_lastlog: Zeigt Informationen zum letzten /var/log/lastlog (siehe auch Befehl lastlog). • pam_env: Setzt oder löscht Umgebungsvariablen, die in /etc/security/pam_env.conf definiert sind, bzw. kann auch Dateien mit NAME=Wert-Paaren auslesen. • pam_group: Weist Benutzern dynamisch Gruppen zu (z.B. nützlich für nicht lokal definiert Benutzer; verwendet /etc/security/group.conf). • pam_limits: Aktiviert Beschränkungen verwendet /etc/security/limits.conf). • pam_time: Definiert, welcher Benutzer sich zu welchen Zeiten anmelden darf (verwendet /etc/security/time.conf). • pam_nologin: Erlaubt nur dem Administrator, sich einzuloggen, wenn die Datei /etc/nologin in Bezug Login auf an und verwaltet Systemressourcen ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 (z.B. die Datei CPU-Zeit; Seite 72 von 139 oder /var/run/nologin existiert. • pam_motd: Zeigt eine „Nachricht des Tages“ beim Einloggen an. Benutzerverwaltung mit Puppet • Benutzer werden in Puppet über die Ressource user verwaltet. • Unter Ubuntu wird standardmäßig der Provider useradd verwendet. • Wichtige Attribute: • name: Der Name des Benutzers (falls nicht angegeben, wird der Titel verwendet). • ensure: Der gewünschte Zustand (present, absent, role) • allowdupe: Spezifiziert, ob doppelte UIDs erlaubt sind. • comment: Beschreibung des Benutzers (i.e. GECOS-Informationen). • expiry: Ablaufdatum (absent oder ein Datum im Format YYYY-mm-dd) • gid: Die primäre Gruppe (mittels Zahl oder Name). • groups: Sekundäre Gruppen (als Namen). • home: Das Home-Verzeichnis. • password: Das verschlüsselte (!) Passwort. • shell: Die Login-Shell. • uid: Die UID. Benutzerverwaltung mit Puppet - Beispiele • Anlegen oder Modifizieren eines Benutzers: user {'test': ensure => present, uid => 1234, gid => 100, groups => ['adm', 'sudo'], home => '/home/praxis', shell => '/bin/bash', password => '$1$lj/Uyf9q$omFP02phveFcFZ63UF4jt/' # test } • Löschen eines Benutzer: user {'test': ensure => absent} Gruppenverwaltung mit Puppet • Gruppen werden in Puppet über die Ressource group verwaltet. • Unter Ubuntu wird standardmäßig der Provider groupadd verwendet. • Wichtige Attribute: • name: Der Name der Gruppe (falls nicht angegeben, wird der Titel verwendet). • ensure: Der gewünschte Zustand (present oder absent) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 73 von 139 • allowdupe: Spezifiziert, ob doppelte GIDs erlaubt sind. • gid: Die primäre Gruppe (mittels Zahl oder Name). Gruppenverwaltung mit Puppet - Beispiele • Anlegen oder Modifizieren einer Gruppe: group {'test': ensure => present, gid => 1515 } • Löschen einer Gruppe: group {'test': ensure => absent} ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 74 von 139 Foliensatz 6 Netzwerkgrundlagen und -konfiguration Inhalt • Netzwerke • TCP/IP-Schichtenmodell • Netzwerkkonfiguration • DNS und DHCP • Netzwerkkonfiguration mit Puppet Hinweis: Die Grafiken „Ethernetkabel mit RJ45-Stecker“ sowie Ethernetframe stehen unter der CC BYSA 3.0 Lizenz. Netzwerke • Computernetzwerke dienen dem Austausch von Daten zwischen Computern. Die Daten können dabei über Kabel, Glasfaser, durch elektromagnetische Strahlung, … übertragen werden (es gibt auch etwas unüblichere Übertragungsmedien - siehe RFC 1149). • Eines der ersten großen Netzwerke war das ARPANET, der Vorläufer des heutigen Internets. Die USRegierung (genauer, DARPA) wollte ein dezentrales und fehlertolerantes Netzwerk für die militärische Forschung schaffen. • Anfang der 1970er Jahre wurde von Vint Cerf und Robert Kahn schließlich die Grundlage für das heutige Internet geschaffen, nämlich die Protokolle TCP und IP, und Anfang der 1980er Jahre löste dann das neue Internet das alte ARPANET ab. Links: Wired - Vint Cerf: We Knew What We Were Unleashing on the World, Internet Hall of Fame Netzwerke - Abkürzungen • Wichtige Abkürzungen: • Request For Comments (RFC) Öffentliche Dokumente, die Internetstandards und -protokolle beschreiben. Einmal veröffentlicht, werden sie nicht mehr verändert (siehe auch Ubuntu-Pakete doc-rfc*). Auf http://tools.ietf.org/rfc/index findet sich die Lister aller RFCs. • Internet Engineering Task Force (IETF) Organisation, die sich mit der technische Weiterentwicklung des Internet befasst. Gibt die RFCs heraus. • Internet Corporation for Assigned Names and Numbers (ICANN) Zuständig z.B. für die Vergabe von Namen (z.B. DNS-Namen) und Adressen (z.B. IP-Adressen). ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 75 von 139 Derzeit noch unter US-Kontrolle, es gibt aber ein Vorhaben, die zentralen Internetservices unter internationale Aufsicht zu stellen. • Internet Assigned Numbers Authority (IANA) Abteilung von ICANN, die die Vergabe von Nummern (z.B. Protokollnummern oder PortNummern) und Namen übernimmt. Logische Karte von ARPANET, März 1977 Netzwerkmodelle • Damit Computer über ein Netzwerk kommunizieren können, müssen sie sich auf eine gemeinsame Sprache einigen, d.h. es müssen Protokolle definiert sein, an die sich alle Beteiligten halten. • Das OSI-Modell (Open Systems Interconnection Model) ist ein Referenzmodell für Netzwerkprotokolle. Es umfasst sieben Schichten und beschreibt, wie Geräte miteinandern kommunizieren können. Jede dieser Schichten erfüllt eine andere Aufgabe. • Im OSI-Modell kommunizieren immer die Instanzen der selben Schicht über ein Protokoll miteinander, z.B. Schicht 3 auf dem ersten Gerät mit Schicht 3 auf dem zweiten Gerät. • Die Daten werden von der obersten Schicht bis zur untersten Schicht auf dem sendenden Gerät durchgereicht (und ev. mit Meta-Informationen versehen), übertragen und auf der Empfangsseite von der untersten Schicht bis zur obersten Schicht durchgereicht (wobei die Meta-Informationen ausgelesen und entfernt werden). ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 76 von 139 TCP/IP-Modell • Für das Internet wird ein einfacheres Netzwerkmodell verwendet, nämlich das vier Schichten umfassende TCP/IP-Modell (beschrieben im RFC 1122): • Netzzugangsschicht: Beschreibt die physische Kommunikation von Geräten (z.B. über Kabel, Glasfaser oder Funk) • Internetschicht: Beschreibt Netzwerkgrenzen hinweg. • Transportschicht: Beschreibt Ende-zu-Ende-Verbindungen, miteinander kommunizieren können. • Anwendungsschicht: Umfasst alle Protokolle, die Anwendungen für die Kommunikation miteinander verwenden. die Übermittlung von Datenpaketen also wie über zwei mehrere Applikationen In jeder Schicht können verschiedene Protokolle benutzt werden. • Wir betrachten nun das TCP/IP-Modell, da andere Netzwerkmodelle auf Basis des OSI-Modells für unsere Zwecke nicht relevant sind. Bei den einzelnen Schichten werden wird dann auch die Implementierung und Verwendung unter Linux betrachten. Datenverschachtelung bei TCP/IP • Wie auch beim OSI-Modell, werden beim TCP/IP-Modell beim Verschicken von Daten diese in ein Paket verpackt, in der nächsten Schicht wird das gesamte Paket in ein anderes Paket verpackt und so weiter bis hinunter zur Netzzugangsschicht. Am Zielgerät wird in umgekehrter Reihenfolge wieder ausgepackt. • Beispiel für die Datenverschachtelung: Netzzugangsschicht (Link Layer) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 77 von 139 • Die Netzzugangsschicht ist die unterste Schicht im TCP/IP-Modell und für die physische Übertragung der Daten zuständig. Sie entspricht den Schichten 1 und 2 im OSI-Modell. • Die zuständige Hardware in einem Computer ist z.B. die Netzwerkkarte für kabelgebundene Verbindungen oder die WLAN-Karte für Funkverbindungen. • Standardprotokoll für kabelgebundene Datenübertragung ist Ethernet (weitgehend ident zur IEEE 802.3 Norm). Für die Verbindung von Geräten werden bestimmte Kabel (CAT-5/CAT-6) und Stecker benutzt. Für die Übertragung von Daten via Funk über ein WLAN wird meist ein Standard aus der IEEE 802.11-Familie benutzt. Netzzugangsschicht - MAC-Addresse • Jedem Netzwerkgerät ist eine eindeutige Nummer zur Identifikation, die MAC-Adresse (Media Access Control Address), fix zugeordnet. Diese sollte weltweit eindeutig sein, aber es reicht, wenn sie lokal eindeutig ist. • Eine MAC-Adresse besteht aus sechs Bytes, die hexadezimal und mit Doppelpunkten getrennt geschrieben werden (z.B. 3C:97:0E:79:B8:0A). • Die spezielle MAC-Adresse FF:FF:FF:FF:FF:FF heißt Broadcastadresse, Pakete an diese Adresse werden von allen Geräten im Netzwerk verarbeitet. • Ethernet und WLAN unterstützen auch Multicastadressen. Dabei muss das niedrigste Bit des ersten Bytes der MAC-Addresse 1 sein (z.B. 01:00:5E:XX:XX:XX für IPv4 Multicast). Pakete an solche Adressen werden nicht von allen, sondern nur von dafür registrierten Geräten verarbeitet. • MAC-Adressen können nicht beliebig von Herstellern vergeben werden. Jeder Hersteller bekommt einen oder mehrere 3-Byte-Prefixe zugeordnet (siehe OUI-Liste der IEEE, z.B. 52:54:00:XX:XX:XX für QEMU), die restliche drei Bytes kann der Hersteller dann beliebig vergeben. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 78 von 139 • Ethernet und WLAN verwenden die gleiche Art von MAC-Adressen. Netzzugangsschicht - Ethernet-Frame • Die zu sendenden Daten werden gemeinsam mit den nötigen Informationen (unter anderem die Quell- und Ziel-MAC-Adresse) in ein Paket (genannt Ethernet-Frame) verpackt und dann über die physische Verbindung verschickt. • Müssen mehr Daten verschickt werden, als in ein Paket passen (bei Ethernet z.B. 1500 Byte), so müssen mehrere Pakete verschickt werden. • Die Technologie VLAN (Virtual Local Area Network) ermöglicht es, mehrere logische Netze über ein physisches Netz zu betreiben, ohne dass die logischen Netze sich stören. Siehe auch Ethernet Theory of Operation. Netzwerkgeräte unter Linux • Jedem Netzwerkgerät (auch Netzwerkschnittstelle genannt) unter Linux wird ein Name zugeordnet. In älteren Linuxsystem werden z.B. die Namen ethX und wlanX benutzt (dabei steht X für eine Nummer). Dabei gibt es aber das Problem, dass beim Starten die Reihenfolge der Erkennung der Netzwerkgeräte durch den Kernel die Benennung beeinflusst. • Dies wurde später umgangen, indem mittels udev in /etc/udev/rules.d/70-persistent-net.rules ein fixer Name für ein Gerät basierend auf der MAC eingetragen wurde. Diese Lösung hatte aber ihre eigenen Probleme, z.B. beim Kopieren von VM-Images. • Um eine konsistente Namensgebung zu erreichen, wird daher mittlerweile von udev die Benennung nach einem vordefinierten Schema organisiert. Ethernetgeräte haben z.B. den Prefix „en“ und WLAN-Geräte den Prefix „wl“. Danach folgt z.B. „o<index>“, falls es ein On-Board-Gerät ist, wobei der Index der eindeutige Geräteindex ist. Netzwerkgeräte unter Linux - Fortsetzung • Unabhängig von den physischen Netzwerkgeräten gibt es immer ein sogenanntes Loopback-Gerät mit dem Namen „lo“. Damit lässt sich ein Netzwerk auch ohne physisches Netzwerkgerät simulieren, z.B. um lokal Serveranwendungen zu testen. Dieses Gerät sollte nie deaktiviert werden, weil viele Anwendung von dessen Funktionieren ausgehen! • Mit Hilfe sogenannter TUN- bzw. TAP-Geräte können auch virtuelle Netzwerkgeräte simuliert werden. Dabei simuliert ein TUN-Gerät ein Point-to-Point-Netzwerkgerät und TAP ein Ethernetgerät. TUN- bzw. TAP-Geräte werden oft für VPNs (z.B. beim Uni-VPN) oder für Netzwerke virtueller ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 79 von 139 Maschinen verwendet. • Die Datei /proc/net/dev listet alle verfügbaren Kernel-Netzwerkgeräte auf, inklusive einiger Statistiken. Und in /proc/net/dev_mcast findet man für jedes Netzwerkgerät die registrierten Multicastadressen. Internetschicht (Internet Layer) • Die Internetschicht erlaubt den Transport von Paketen über mehrere physischen Netze und unterschiedliche Netzzugangsschichtprotokolle (z.B. Ethernet und WLAN) hinweg. • Es werden dabei keine Garantien abgegeben, ob die Pakete in der richtigen Reihenfolge bzw. überhaupt am Zielgerät ankommen. D.h. das System arbeitet verbindungslos und versucht nur, die Pakete von einem Rechner bestmöglich zum anderen Rechner zu transportieren. • Ein Gerät, das in zwei oder mehr logischen Netzen hängt, heißt Router. Dieses leitet Pakete von einem Netz in ein anderes weiter. • Das Hauptprotokoll in dieser Schicht ist IP (Internet Protokoll, definiert in RFC 791). Dieses braucht, so wie das Ethernet-Protokoll, wieder Adressen, die sogenannten IP-Adressen. Jedes Gerät, das über das Internet mit anderen Geräten kommunizieren will, braucht eine eindeutige IP-Adressen (Notiz am Rande: Es gibt auch Möglichkeiten, das zu umgehen, z.B. durch NAT bei IPv4). Internetschicht - IP • Es gibt zwei Arten des IP-Protokolls: IPv4 und IPv6. Einer der wichtigsten Unterschiede zwischen diesen beiden Protokollen ist die Größe des Adressraumes: • Bei IPv4 gibt es 2^32 IP-Adressen, also 4.294.967.296! • Bei IPv6 gibt es 2^128 340.282.366.920.938.463.463.374.607.431.768.211.456! IP-Adressen, also • IPv4-Adressen werden üblicherweise dezimal in vier Blöcken zu einem Byte geschrieben, z.B. 131.130.16.250. IPv6-Adressen werden hexadezimal in acht Blöcken zu zwei Bytes geschrieben, z.B. 2001:62a:4:2f00::22:250 (genau eine durchgehende Reihe von Blöcken mit Nullen kann durch zwei Doppelpunkte ersetzt werden). • Derzeit wird fast ausschließlich IPv4 verwendet, aber IPv6 nimmt stetig an Bedeutung zu, da immer mehr Geräte eine IP-Adresse brauchen. Von Vorteil dabei ist, dass IPv6 gleichzeitig zu IPv4 betrieben werden kann. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 80 von 139 Internetschicht - IPv4 • In dem Header eines IP-Pakets sind neben Quell- und Zieladresse auch verschiedene andere Felder vorhanden, z.B. das TTL-Feld (time to live), das angibt, wie viele Zwischenstationen das Paket passieren darf; oder das Protokoll-Feld, das angibt, welches Protokoll im Datenteil verwendet wird (siehe auch /etc/protocols für eine Lister der möglichen Protokollnummern). Internetschicht - IPv4-Netze • Früher wurden IPv4-Adressen in Netzklassen (z.B. Klassen A, B und C) eingeteilt. Da diese Einteilung aber sehr unflexibel ist, kommt heutzutage fast ausschließlich das Classless Inter-Domain Routing-Verfahren (CIDR, definiert in RFC 1518 und RFC 4632) zum Einsatz. • Beim CIDR wird durch die Angabe einer Netzwerkmaske die IP-Adresse in einen Netzwerk- und einen Hostteil aufgeteilt. Die Netzwerkmaske gibt an, wie viele Bits vom Anfang der IP-Adresse den Netzpräfix ausmachen. Beispiel: IP-Adresse 131.130.16.33 und Netzwerkmaske 255.255.252.0 (entspricht 22 Bits), d.h. das Netzwerk hat die IP-Adressen von 131.130.16.0 bis 131.130.19.255. • Diese künstliche Aufteilung der IP-Adresse in einen Netzwerk- und einen Hostteil erlaubt das einfache Routing von IP-Paketen. Wie man am IP-Header sieht, muss diese Information den beteiligten Geräten bekannt sein, weil es dafür kein Feld gibt. Internetschicht - IPv4-Netze - Fortsetzung • Jedes IP-Netzwerk hat zwei spezielle Adressen: die Netzwerkadresse (die erste Adresse; im Beispiel 131.130.16.0) und die Broadcastadresse (die letzte Adresse, im Beispiel 131.130.19.255). Die Netzwerkadresse zusammen mit der Netzwerkmaske bestimmt ein IP-Netzwerk eindeutig. Die Broadcastadresse kann benutzt werden, um Daten an alle Geräte des Netzes zu schicken. • • Damit ein Gerät Datenpakete an den richtigen Empfänger schicken kann, gibt es sogenannten Routing-Tabellen: • Pakete für das selbe logische Netz werden direkt an den Empfänger zugestellt • Pakete für andere Netze werden an einen Router geschickt, der sie weiterleitet Zusammen bedeutet das, dass man die IP-Adresse, die Netzwerkmaske als auch den Standardrouter ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 81 von 139 (Default-Gateway) wissen muss, damit ein Gerät in einem IP-Netzwerk richtig funktioniert. Internetschicht - IPv4-Netze - Fortsetzung • Jede IP-Adresse aus dem Bereich 127.0.0.0/8 kann als Adresse für das Loopback-Gerät verwendet werden. Üblicherweise verwendet man aber nur 127.0.0.1. • Die Netze 10.0.0.0/8, 172.16.0.0/12 und 192.168.0.0/16 sind private Netze. IPs aus diesen Bereichen werden von Routern nicht in das globale Internet weitergeleitet. Private Netzwerkadressen werden oft zuhause für WLAN-Netzwerke verwendet bzw. bei NAT. • So wie auf der Netzzugangsschicht gibt es auch auf der Internetschicht Multicastadressen. Alle IPAdressen im Bereich 224.0.0.0/4 sind Multicastadressen. Unter anderem gibt es fixe Multicast-IP-Adressen zum Ansprechenr aller Geräte (224.0.0.1), zum Ansprechen alle Router (224.0.0.2), für Multicast DNS (mDNS; 224.0.0.251) und für NTP (224.0.1.1). Netzzugangs-/Internetschicht - ARP • Damit man Geräten im selben logischen Netz IP-Pakete schicken kann, muss deren MAC-Adresse bekannt sein, da diese ja für die Ethernet-Frames auf der Netzzugangsschicht gebraucht werden. • Zum Zuordnen von IP- zu MAC-Adressen wird das Address Resolution Protocol (ARP, definiert in RFC 826) benutzt. Das Protokoll gehört technisch gesehen zur Netzzugangsschicht. IPv6 verwendet nicht ARP, sondern das Neighbor Discovery Protocol (NDP). • Ist für eine bestimmte IP-Adresse im gleichen Netz die MAC-Adresse noch nicht bekannt, so wird ein ARP-Request mit der Bitte um Bekanntgabe der zur IP-Adresse gehörigen MAC-Adresse an die Broadcastadresse der Netzzugangsschicht gesendet. Das Gerät mit der zugehörigen IP-Adresse antwortet mit einem ARP-Reply, der die Zuordnung MAC-Adresse zu IP-Adresse enthält, direkt an die MAC-Adresse des ersten Geräts. • Diese Zuordnungen von IP- zu MAC-Adressen werden üblicherweise lokal in einem ARP- bzw. Neighborhood-Cache gespeichert. Der ARP-Cache kann über die Datei /proc/net/arp angezeigt werden. Internetschicht - ICMP • Das Internet Control Message Protocol (ICMP, definiert in RFC 792) dient zum Austausch von Informationen und Fehlermeldungen. Es gehört zur Internetschicht und ist Bestandteil von IPv4, benutzt aber IP zur Datenübertragung (d.h. es repräsentiert sich selbst als Protokoll einer höheren Schicht). • Eine typische Verwendung von ICMP ist das Pingen von Geräten um herauszufinden, ob ein bestimmtes Gerät verfügbar ist und wie groß die Paketumlaufzeit (round trip time, RTT) ist. Dazu werden ICMP-Pakete vom Typ Echo Request bzw. Echo Reply und das TTL-Feld des IP-Headers benutzt. • Eine weitere, für Benutzer nützliche Anwendung von ICMP ist Traceroute, mit der man den Weg eines Pakets durch das Internet nachvollziehen kann. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 82 von 139 Netzwerkkonfiguration • Bei einem Ubuntu-Desktop-System wird für die Konfiguration der Netzwerkgeräte das Programm NetworkManager verwendet. Dieses erlaubt eine einfache Konfiguration über die CLI oder GUI und ist mittlerweile schon tief in verschiedene Desktop-Umgebungen wie Gnome oder KDE eingebunden. Für die CLI gibt es z.B. den Befehl nmcli (zur Kontrolle des NetworkManager-Daemons). • Auf jedem Ubuntu-System kann die Netzwerkkonfiguration auch über die Datei /etc/network/interfaces vorgenommen. Aus mehreren Gründen (z.B. Sicherheit, statische Konfiguraion) wird der NetworkManager z.B. auf Servern nicht verwendet. • Wir betrachten nur die manuelle Konfiguration bzw. die Konfiguration über die Konfigurationsdatei. Konfiguration - Manuell via ip • Der Befehl ip kann nicht nur Netzwerkschnittstellen konfigurieren, sondern auch die Routing- sowie die ARP-Tabellen manipulieren und noch einiges mehr. • Wir werden die folgenden Unterbefehle genauer betrachten und wie man damit eine Schnittstelle von Hand konfiguriert: • • ip link konfiguriert die Schnittstellen selbst. • ip address konfiguriert IP-Adressen für Schnittstellen. • ip route manipuliert die Routing-Tabellen. • ip neighbour verwaltet den ARP (und für IPv6 den Neighbourhood)-Cache. Hinweise: • Viele Unterbefehl können abgekürzt werden, z.B. reicht ip l statt ip link. • Die globale Option -c aktiviert die Farbausgabe. • Einige Unterbefehle zeigen unterschiedliche Informationen Protokollfamilie mit der Option -f FAMILIE gewählt wurde. an, je nachdem, welche Links: Vergleich von ifconfig und ip, iproute2 auf Wikipedia, IPRoute Howto, Linux Advanced Routing & Traffic Control HOWTO, Deprecated Linux networking commands and their replacements. Konfiguration - ip link ip link - Konfiguriert Netzwerkschnittstellen. » Dieser Befehl kann virtuelle Schnittstellen anlegen und bestehende konfigurieren. » Mit Hilfe des Unterbefehls set dev GERÄT [up|down] kann eine Schnittstelle (de)aktiviert werden. Nur über eine aktivierte Schnittstelle können Paket verschickt bzw. empfangen werden. » Der Unterbefehl show zeigt die Schnittstellen inklusive zusätzlicher Informationen (z.B. der MACAdresse) an. » $ ip link set dev eth0 up $ ip link # Äquivalent zu: ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 83 von 139 DEFAULT group default qlen 1000 link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff Konfiguration - ip address ip address - Konfiguriert IP-Addressen einer Schnittstelle. » Der Unterbefehl add ADRESSE/PRÄFIX dev GERÄT fügt eine IP-Adresse in CIDR-Notation zur Schnittstelle hinzu. Zusätzlich wird eine Route generiert, die angibt, dass IP-Adressen aus dem angegebenen IP-Netzwerk direkt über das angegebene Gerät erreichbar sind. Verwendet man „del“ statt „add“ wird die entsprechende IP-Adresse und Route gelöscht. » Der Unterbefehl show zeigt alle Schnittstellen inklusive ihrer Adressen an. » $ ip address add 10.10.10.101/24 dev eth0 $ ip address # Äquivalent zu: ip address show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff inet 10.10.10.101/24 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe12:3456/64 scope link valid_lft forever preferred_lft forever Konfiguration - ip route ip route - Manipuliert die Routing-Tabellen » Der Unterbefehl add [ADRESSE/PRÄFIX | default] [via ADRESSE] [dev GERÄT] fügt eine neue Route hinzu. Man gibt entweder die Adresse in CIDR-Notation an oder benutzt „default“ für die Standardroute. Sollen Pakete über einen Router geleitet werden, wird die „via“ Anweisung verwendet. Verwendet man „del“ statt „add“ wird die entsprechende Route gelöscht. » Der Unterbefehl show zeigt die Einträge der Routing-Tabellen an. » $ ip route add default via 10.10.10.1 $ ip route # Äquivalent zu: ip route show default via 10.10.10.1 dev eth0 10.10.10.0/24 dev eth0 proto kernel scope link src 10.10.10.101 Konfiguration - ip neighbour ip neighbour - Verwaltet den ARP (und für IPv6 den Neighbourhood)-Cache. » Der Unterbefehl add ADRESSE lladdr LLADRESSE dev GERÄT fügt einen neuen IP-zu-MAC-Eintrag in den Cache ein. » Der Unterbefehl del ADRESSE löscht einen Eintrag aus dem Cache. » Der Unterbefehl show zeigt alle Einträge des Caches an. » $ ip neighbour # Äquivalent zu: ip neighbour show $ ping -c 1 10.10.10.1 &>/dev/null ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 84 von 139 $ ip neighbour 10.10.10.1 dev eth0 lladdr 46:2e:38:61:0f:35 REACHABLE Konfiguration - ifconfig ifconfig - Konfiguriert eine Netzwerkschnittstelle. » Wird benutzt, um Netzwerkschnittstellen zu (de)aktivieren und IP-Address-Konfigurationen zuzuweisen bzw. um die aktuelle Konfiguration anzuzeigen. » Option -a zeigt alle Schnittstellen (auch deaktivierte) an. » $ ifconfig eth0 up 10.10.10.101/24 $ ifconfig eth0 eth0 Link encap:Ethernet HWaddr 52:54:00:12:34:56 inet addr:10.10.10.101 Bcast:10.10.10.255 Mask:255.255.255.0 inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:34680 errors:0 dropped:0 overruns:0 frame:0 TX packets:24889 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:19349325 (19.3 MB) TX bytes:3917637 (3.9 MB) Konfiguration - route route - Zeigt/Ändert die Routing-Tabelle. » Wird üblicherweise nach ifconfig benutzt, um eine statische Route für einen Host/ein Netzwerk anzulegen (z.B. um das Default-Gateway einzutragen). » Optionen: -n → keine Namensauflösung von IP-Adressen, -net → Route für ein Netzwerk statt einem Host anlegen. » Für das Löschen einer Route del statt add verwenden. » $ # Anlegen einer Netzwerk-Route $ route add -net 10.10.10.0 netmask 255.255.255.0 dev $ # Anlegen der Route für das Default-Gateway $ route add default gw 10.10.10.1 $ route Kernel IP routing table Destination Gateway Genmask Flags default 10.10.10.1 0.0.0.0 UG 10.10.10.0 * 255.255.255.0 U eth0 Metric Ref 0 0 0 0 Use Iface 0 eth0 0 eth0 Konfiguration - arp arp - Manipuliert den ARP-Cache. » Wird hauptsächlich für die Anzeige des ARP-Caches benutzt, man kann aber auch gespeicherte Zuordnungen löschen bzw. neue hinzufügen. » $ arp -i eth0 -s 10.10.10.1 46:2e:38:61:0f:35 # Hinzufügen eines Eintrags $ arp Address HWtype HWaddress Flags Mask 10.10.10.1 ether 46:2e:38:61:0f:35 CM $ arp -i eth0 -d 10.10.10.1 # Entfernen eines Eintrags $ arp Address HWtype HWaddress Flags Mask 10.10.10.1 (incomplete) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Iface eth0 Iface eth0 Seite 85 von 139 Konfiguration - /etc/network/interfaces • Man kann über die Datei /etc/network/interfaces die vorhandenen Netzwerkschnittstellen entweder statisch oder über DHCP konfigurieren und auch festlegen, ob Schnittstellen automatisch beim Booten aktiviert werden sollen. • Weiters können auch virtuelle Geräte (z.B. TAP-Geräte) damit erstellt und konfiguriert werden und zusätzliche Informationen, wie z.B. die zu nutzenden DNS-Server, hinterlegt werden. • Die Befehle ifup und ifdown nutzen die Information aus der Datei, um Netzwerkschnittstellen zu aktivieren und konfigurieren oder um sie zu deaktivieren. Weiters können mit ifquery die Informationen zu einer oder mehreren konfigurierten Schnittstellen ausgegeben werden. • Ausführliche Informationen zur Syntax und zu den möglichen Anweisungen findet man in man 5 interfaces. Konfiguration - /etc/network/interfaces Beispiel source /etc/network/interfaces.d/* auto lo iface lo inet loopback auto eno1 iface eno1 inet static address 131.130.61.5 netmask 255.255.255.240 network 131.130.61.0 broadcast 131.130.61.15 gateway 131.130.61.1 • Die Anweisung „source“ erlaubt das Einbinden anderer Schnittstellendateien. • Die Anweisung „auto“ gefolgt von Schnittstellennamen bewirkt, dass diese Geräte in der angegebenen Reihenfolge automatisch beim Starten aktiviert werden. • Die Konfiguration einer Schnittstelle erfolgt mittels der „iface“ Anweisung, gefolgt vom Schnittstellennamen und „inet“ für IPv4 (bzw. „inet6“ für IPv6). Danach steht die Art der Konfiguration: „loopback“ für das Loopback-Gerät, „static“ für eine statische Konfiguration, „dhcp“ für eine Konfiguration via DHCP bzw. „manual“ für eine manuelle Konfiguration. Konfiguration - ifup/ifdown/ifquery ifup/ifdown/ifquery - Verwalte eine konfigurierte Netzwerkschnittstelle. » Es ist nur ein Programm mit drei Aufrufvarianten: • Als ifup werden Netzwerkschnittstellen aktiviert. • Als ifdown werden Netzwerkschnittstellen deaktiviert. • Als ifquery werden die Informationen aus den Konfigurationsdatein ausgelesen. » In der Datei /run/network/ifstate ist der aktuelle Zustand gespeichert. » Optionen: -a → alle als „auto“ markierte Schnittstellen verwenden, --force → Durchführung erzwingen, -v → Befehle anzeigen, die ausgeführt werden, --list → bei ifquery alle Schnittstellen auflisten, --state → bei ifquery den Status der Schnittstellen anzeigen. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 86 von 139 » $ ifup -a # alle Netzwerkschnittstellen aktivieren $ ifquery --state lo=lo eth0=eth0 $ ifquery eth0 address: 10.10.10.101 netmask: 255.255.255.0 gateway: 10.10.10.1 broadcast: 10.10.10.255 Konfiguration - Zusammenfassung • Um eine Netzwerkschnittstelle manuell zu konfigurieren müssen also folgende Schritte durchgeführt werden: • Aktivieren der Schnittstelle (mit ip link oder ifconfig) • Hinzufügen der IP-Adresse (mit ip address oder ifconfig) • Eventuell Hinzufügen eines Default-Gateways (mit ip route oder route) • Oder man fügt die entsprechenden Werte in /etc/network/interfaces ein und benutzt ifup. • Oder man benutzt ein Hilfsprogramm wie NetworkManager und dessen CLI- oder GUISchnittstellen. • Hinweis: Bei manchen Schnittstellen müssen noch zusätzliche Schritte durchgeführt werden, z.B. Verbinden mit dem WLAN-Netzwerk bei einer WLAN-Schnittstelle. Internetschicht - Befehle: arping arping - Schickt ARP-Requests an einen Host. » Nützlich, um die MAC-Adresse für eine bestimmte IP-Adresse herauszufinden. » $ arping -c 1 10.10.10.1 ARPING 10.10.10.1 from 10.10.10.101 eth0 Unicast reply from 10.10.10.1 [46:2E:38:61:0F:35] Sent 1 probes (1 broadcast(s)) Received 1 response(s) 0.615ms Internetschicht - Befehle: ping ping - Schickt einen Ping (ICMP-Echo-Request) an einen Host. » Zum Testen, ob ein bestimmter Host erreichbar ist. Achtung: Manche Hosts sind aus Sicherheitsgründen so konfiguriert, dass sie nicht antworten! » Optionen: -c ANZAHL → Anzahl der zu sendenden Pakete, -b → Ping an Broadcastadresse erlauben, -I SCHNITTSTELLE → Netzwerkschnittstelle auswählen, -s GRÖSSE → Paketgröße festlegen, -M do → Fragmentierung verbieten » $ ping -c 1 www.orf.at PING www.orf.at (194.232.104.139) 56(84) bytes of data. 64 bytes from orf.at (194.232.104.139): icmp_req=1 ttl=56 time=1.19 ms --- www.orf.at ping statistics --1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 1.195/1.195/1.195/0.000 ms $ ping -c 1 -M do -s 1800 orf.at ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 87 von 139 PING orf.at (194.232.104.141) 1800(1828) bytes of data. ping: local error: Message too long, mtu=1500 --- orf.at ping statistics --1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms Internetschicht - Befehle: traceroute traceroute - Zeigt die Route eines Pakets zu einem Host an. » Kann neben ICMP-Echo-Requests auch andere Methoden verwenden (z.B. TCP und UDP). » Optionen: -I → ICMP-Methode, -T → TCP-Method, -U → UDP-Methode. » $ traceroute www.google.com traceroute to www.google.com (173.194.44.244), 30 hops max, 60 byte packets 1 selene.cc.univie.ac.at (131.130.254.145) 1.499 ms 1.522 ms 1.480 ms 2 hekate.cc.univie.ac.at (131.130.254.37) 1.486 ms 1.459 ms 1.724 ms 3 ares.cc.univie.ac.at (131.130.253.113) 1.434 ms 1.399 ms 1.707 ms 4 vlan1501.wien1.aco.net (193.171.13.1) 1.365 ms * 1.659 ms 5 * * * 6 * * * 7 * * * 8 nixcz.net.google.com (91.210.16.211) 7.347 ms 7.313 ms 7.309 ms 9 209.85.241.79 (209.85.241.79) 7.607 ms 7.863 ms 7.520 ms 10 173.194.44.244 (173.194.44.244) 7.086 ms 7.106 ms 7.097 ms $ traceroute6 www.google.com 2>/dev/null | tail -n 1 15 bk-in-x93.1e100.net (2a00:1450:4008:c01::93) 29.472 ms 29.337 ms 29.492 ms Internetschicht - Befehle: mtr mtr - Kombiniert die Funktionalität von ping und traceroute. » Im Standardmodus zeigt mtr die Route zum Ziel an und aktualisiert laufend die Einträge. » Optionen: -c ANZAHL → Anzahl der zu sendenden Pakete, -r → Reportmodus, -n → keine Namensauflösung, -u → UDP-Methode, -T → TCP-Methode » $ mtr -r orf.at Start: Sun Apr 10 12:55:19 2016 HOST: ict 1.|-- minerva.cc.univie.ac.at 2.|-- vlan742.wien21.aco.net 3.|-- vlan71.wien1.aco.net 4.|-- 2001:628:1100:4::2 5.|-- 2001:628:1100:1015::2 6.|-- rou-vie-pe-101.apa.net 7.|-- c65-rz1-1.apa.net 8.|-- 2a01:468:1000:9::150 Loss% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% Snt 10 10 10 10 10 10 10 10 Last 4.1 0.9 20.4 1.2 1.7 141.8 1.2 1.2 Avg 2.0 1.5 9.4 10.9 2.0 15.3 2.2 15.3 Best Wrst StDev 1.3 4.1 0.7 0.9 6.1 1.6 1.1 64.0 20.1 1.2 98.2 30.7 1.7 4.1 0.7 1.2 141.8 44.4 1.2 10.9 3.0 1.1 143.1 44.9 Transportschicht (Transport Layer) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 88 von 139 • Die Transportschicht ist für die Ende-zu-Ende-Übertragung von Daten von einem zu einem anderen Gerät zuständig, unabhängig von der Art der Daten und von der Art und Weise, wie sie übermittelt werden. • Die Anwendungen, die die Daten schicken bzw. empfangen, werden über sogenannte Portnummern eindeutig identifiziert. Bevor Daten ausgetauscht werden können, muss eine Anwendung eine Portnummer reservieren. Damit wird sichergestellt, dass Daten immer zu richtigen Anwendung weitergeleitet werden. Portnummern unter 1024 können nur vom Benutzer root reserviert werden. Eine Liste von bekannten Portnummern findet man in der Datei /etc/services. • Zwei Protokolle werden hauptsächlich in dieser Schicht verwendet: das Transmission Control Protocol (TCP, definiert in RFC 793) und das User Datagram Protocol (UDP, definiert in RFC 768). TCP ist ein verbindungsorientiertes, zuverlässiges Protokoll. UDP hingegen stellt nur sicher, dass die Pakete an die richtige Anwendung geschickt werden. Transportschicht - TCP • TCP ist neben IP der Namensgeber für das gesamte Modell (TCP/IP-Modell), weil es das am häufigsten verwendete Protokoll in der Transportschicht ist. • Das Protokoll erlaubt den zuverlässigen Austausch von Daten. Es kümmert sich darum, dass die Pakete in der richtigen Reihenfolge an die Anwendung weitergegeben werden und dass verlorene oder fehlerhafte Pakete nochmal gesendet werden. • Der TCP-Header wird an die Daten vorne angefügt. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 89 von 139 Transportschicht - TCP-Verbindungen • Damit zwei Anwendungen miteinander kommunizieren können, müssen zuerst sogenannte Sockets (Paare aus IP-Adresse und Portnummern) erzeugt werden. Durch ein Paar aus Server- und Client-Socket kann eine TCP-Verbindung eindeutig identifiziert werden. • Bevor nun Daten ausgetauscht werden können, muss die Verbindung mittels des TCP-Handshakes aufgebaut werden: • Der Client schickt ein SYN-Paket an den Server. • Der Server antwortet mit einem SYN/ACK-Paket an den Client. • Der Client schließt den Verbindungsaufbau mit einem ACK-Paket an den Server ab. • Nach dem TCP-Handshake können Daten ausgetauscht werden. Die Verbindung bleibt auch dann bestehen, wenn keine Daten ausgetauscht werden. Erst der geordnete Verbindungsabbau (ähnlich zum Verbindungsaufbau) beendet eine Verbindung. • Folgene Anwendungen verwenden beispielsweise TCP: HTTP, FTP, SSH Transportschicht - UDP • Im Gegensatz zu TCP ist UDP ein verbindungsloses Protokoll, d.h. es wird keine Verbindung aufgebaut, sondern es werden einfach nur Daten verschickt. • Wie bei TCP bezeichnet man ein Paar aus IP-Adresse und UDP-Portnummer mit Socket. • Es werden auch keinerlei sonstige Garantien gemacht, d.h. man hat hier die gleichen Probleme wie bei IP-Datagrammen: • Die Reihenfolge der ankommenden Pakete kann sich ändern. • Es können Pakete mehrfach oder gar nicht ankommen. • Anwendungen, die UDP benutzen, müssen also robust gegenüber solchen Problem sein, haben aber den Vorteil, dass Daten schneller verschickt werden können (der Verbindungsaufbau fällt ja komplett weg). • Folgende Anwendungen verwenden beispielsweise UDP: DNS, DHCP, SNMP Transportschicht - Befehle: ss ss - Zeigt Socket-Statistiken an. » Gehört zu dem selben Paket wie ip. » Optionen: -l → nur Sockets im Status LISTEN anzeigen, -a → alle Sockets anzeigen, -r → Adressen und Ports zu Namen auflösen, -n → keine Namensauflösung, -p → Prozess anzeigen, -t → TCP-Sockets anzeigen, -u → UDP-Sockets anzeigen, -x → Unix-Sockets anzeigen. » $ ss -t -n -a State Recv-Q Send-Q LISTEN 0 128 LISTEN 0 128 LISTEN 0 128 LISTEN 0 128 ESTAB 0 0 Local Address:Port *:22 :::22 127.0.0.1:6010 ::1:6010 192.168.56.101:22 Peer Address:Port *:* :::* *:* :::* 192.168.56.1:54330 ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 90 von 139 Transportschicht - Befehle: netstat netstat - Zeigt Netzwerkinformationen an. » Sehr vielseitiges Programm mit vielen Optionen zur Anzeige von Routing-Tabellen, offenen Verbindungen, Statistiken, … » Anzeigen von: keine Angabe → offene Sockets, -r → Routing-Tabellen, Netzwerkschnittstellen, -s → Statistiken, -g → registrierte Multicast-Gruppen. -i → » Optionen: -n → keine Namensauflösung, -l → nur Sockets im Status LISTEN anzeigen, -a → alle Sockets anzeigen, -t → TCP-Sockets anzeigen, -u → UDP-Sockets anzeigen, -p → Prozess anzeigen. » $ netstat -t -n -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address tcp 0 0 0.0.0.0:22 0.0.0.0:* tcp 0 0 10.10.10.101:22 10.10.10.1:44240 tcp6 0 0 :::22 :::* $ netstat -g -n IPv6/IPv4 Group Memberships Interface RefCnt Group --------------- ------ --------------------lo 1 224.0.0.1 eth0 1 224.0.0.1 lo 1 ff02::1 lo 1 ff01::1 eth0 1 ff02::1:ff12:3456 eth0 1 ff02::1 eth0 1 ff01::1 State LISTEN ESTABLISHED LISTEN Anwendungsschicht • Die Anwendungsschicht umfasst alle Protokolle, die Anwendungen für die Kommunikation miteinander verwenden. • Dazu gehören standardisierte Protokolle wie HTTP, FTP oder SSH, aber auch alle anderen, nichtstandardisierten Protokolle, die beliebige Anwendungen verwenden. • Wir betrachten im Folgenden zwei Protokolle, nämlich DHCP und DNS, da diese wichtige Aufgaben bei der Netzwerkkonfiguration haben. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 91 von 139 DNS (Domain Name System) • Das Domain Name System (DNS, definiert in RFC 1034 und RFC 1035) erlaubt die Verbindung eines Namens mit einer IP-Adresse. Erst dadurch konnte das Internet so richtig erfolgreich werden, da sich Namen viel leichter merken lassen, als die IP-Adressen dahinter. • Die einzelnen Teile eines Domainnamens werden mit Punkten voneinander getrennt geschrieben, z.B. mathematik.univie.ac.at. • Das DNS ist hierarchisch aufgebaut. Es gibt nicht ein paar DNS-Server, die alles wissen, sondern viele, die Teile wissen und wissen, wo sie nachschauen können. Ganz oben in dieser Hierarchie stehen die Root-Server, die die DNS-Server der Top Level Domains (TLDs, im Domainnamen ganz rechts zu finden) kennen. • Soll ein Domainname zu einer IP-Adresse aufgelöst werden, wird dieser (im schlimmsten Fall) an einen Root-Server geschickt. Dieser antwortet mit der IP-Adresse des DNS-Servers, der die TLD des Domainnamens verwaltet. Dann wird dieser DNS-Server gefragt, der dann den nächsten Teil des Domainnamens (von rechts nach links) auflöst und so weiter (iterative Auflösung). Namensauflösung unter Linux • Jedes Linuxsystem hat einen Hostnamen, auch wenn der Computer keine Netzwerkschnittstellen haben sollte. Dieser ist in /etc/hostname festgehalten und kann über hostname bzw. bei Verwendung von systemd auch über hostnamectl angezeigt und geändert werden. • Für die Namensauflösung gibt es die NSS-Datenbank „hosts“. Die Standardkonfiguration benutzt die Datei /etc/hosts und dann DNS als Quellen. • In der Datei /etc/hosts werden pro Zeile ein oder mehrere Namen mit einer IP-Adresse assoziiert: 127.0.0.1 127.0.1.1 localhost host99.ict host99 # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters Namensauflösung unter Linux - /etc/resolv.conf • Für die Konfiguration von DNS wird die Datei /etc/resolv.conf benutzt. Früher wurde diese Datei manuell erstellt, aktuell wird dafür das Paket resolvconf verwendet. • Auch wenn die Datei dynamisch generiert wird, kann man Änderungen immer noch manuell vornehmen, muss aber damit rechnen, dass diese bei der nächsten Änderung der Netzwerkkonfiguration überschrieben werden. • Eine /etc/resolv.conf-Datei kann z.B. so aussehen: # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 10.10.10.1 search ict univie.ac.at ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 92 von 139 • Die wichtigsten Anweisungen sind (siehe man resolv.conf): • nameserver IP-ADRESSE → Gibt den zu benutzenden DNS-Server an. Maximal drei DNS-Server können so angegeben werden. • search DOMAIN1 [DOMAIN2 ...] → Gibt die Suchliste an, die verwendet wird, wenn der Hostname nicht vollständig ist (i.e. es wird dann HOST.DOMAIN1, HOST.DOMAIN2, usw. gebildet). Namensauflösung unter Linux - resolvconf • Das Paket „resolvconf“ wird über Dateien in /etc/resolvconf konfiguriert. Dort können z.B. fixe DNS-Server eingetragen werden. • Weiters ist resolvconf in verschiedene Netzwerkdienste wie NetworkManager, ifup, dnsmasq und dhclient eingebunden, um DNS-Serveränderungen mitgeteilt zu bekommen. • Bei Verwendung von ifup können z.B. in /etc/network/interfaces bei einer Netzwerkschnittstelle die zusätzlichen Optionen „dns-nameserver“ und „dns-search“ verwendet werden, um DNS automatisch beim Aktivieren der Netzwerkschnittstelle zu konfigurieren. Namensauflösung - Befehle: host, dig host - Löst DNS-Namen auf. » Mit der Option -t kann der Abfragetyp ausgewählt werden (z.B. „A“ für IPv4, „AAAA“ für IPv6 oder „MX“ für Mailserver) » $ host login.univie.ac.at login.univie.ac.at has address 131.130.20.69 login.univie.ac.at has IPv6 address 2001:62a:4:22::22:4 login.univie.ac.at mail is handled by 10 zidmx1.univie.ac.at. login.univie.ac.at mail is handled by 10 zidmx3.univie.ac.at. login.univie.ac.at mail is handled by 10 zidmx2.univie.ac.at. dig - Löst DNS-Namen auf (und ist viel flexibler als host). » Der Befehl wird meist in der Variante dig @SERVER NAME TYP verwendet, wobei SERVER der DNS-Server, NAME der aufzulösende Name und TYP der Abfragetyp ist. » Über „+ABFRAGEOPTION“ kann die Abfrage bzw. die Ausgabe beeinflusst werden. » $ dig +nocomments +nostats +nocmd login.univie.ac.at ;login.univie.ac.at. IN A login.univie.ac.at. 249 IN A 131.130.20.69 $ dig +nocomments +nostats +nocmd login.univie.ac.at AAAA ;login.univie.ac.at. IN AAAA login.univie.ac.at. 148 IN AAAA 2001:62a:4:22::22:4 DHCP (Dynamic Host Configuration Protocol) • In größeren Netzwerken ist es mühsam, wenn jedes Gerät einzeln konfiguriert werden muss, d.h. IPAdresse, Netzwerkmaske und Default-Gateway zugewiesen werden müssen. Abhilfe schafft DHCP (definiert in RFC 2131). • Bei DHCP wird eine Anfrage an einen DHCP-Server geschickt (mittels der Broadcastadresse 255.255.255.255), in der um eine IP-Adresse und zusätzliche Konfiguration gebeten wird. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 93 von 139 • Der DHCP-Server antwortet mit einer noch nicht vergebenen IP-Adresse sowie der Netzwerkmaske. Zusätzlich werden normalerweise das Default-Gateway sowie DNS-Server mitgeteilt. Die vergebene IP-Adresse kann zudem zeitlich beschränkt gültig sein, vor Ablauf der Gültigkeit muss das Gerät erneut den DHCP-Server fragen. • Die meisten WLAN-Router und z.B. auch VirtualBox (für NAT- und interne Netzwerke) verwenden DHCP zur Konfiguration der angeschlossenen Geräte. DHCP-Konfiguration • Bei Verwendung von ifup braucht als Konfigurationsart nur „dhcp“ eingestellt werden. D.h. folgende Zeilen reichen für die automatische Konfiguration einer Netzwerkschnittstelle via DHCP: auto eno1 iface eno1 inet dhcp • Im Hintergrund verwendet ifup das Programm dhclient. Dieses kann natürlich auch manuell verwendet werden. Dazu braucht man nur dhclient SCHNITTSTELLE eingeben und das Programm konfiguriert die Schnittstelle via DHCP. Unter /etc/dhcp/ liegen die Konfigurationsdateien für dhclient, dort kann z.B. in dhclient.conf eingestellt werden, welche Informationen vom DHCP abgefragt werden sollen. Sonstige Befehle - Netzwerkmonitoring Zur Überwachung eines Netzwerks oder zum Untersuchen von Netzwerkpaketen gibt es mehrere Programme unter Linux: • tcpdump: CLI; Pakete, gefiltert nach Bedingungen, werden ausgegeben. • wireshark: GUI/CLI; Ähnlich wie tcpdump, aber leichter benutzbar. Kann tcpdump Ausgaben verwenden. • iptraf: CLI (ncurses); Zeigt unter anderem Statistiken für verschiedene Protokolle an. Netzwerkkonfiguration mit Puppet • In Puppet gibt es keine eingebauten Möglichkeiten, Netzwerkschnittstellen zu verwalten. • Es gibt aber mehrere nachinstallierbare Module, mit denen Netzwerkschnittstellen verwaltet werden können, z.B. das puppet/network Modul. Hostverwaltung mit Puppet • Hostnamen und deren IP werden in Puppet über die Ressource host verwaltet. • Unter Ubuntu wird standardmäßig der Provider parsed verwendet (der einzig mögliche). Dieser modifiziert die Datei /etc/hosts. • Wichtige Attribute: • name: Der Name des Computers (falls nicht angegeben, wird der Titel verwendet). • ensure: Der gewünschte Zustand (present oder absent). • comment: Ein Kommentar zum Computer. • host_aliases: Ein Aliasname oder ein Array von Aliasnamen. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 94 von 139 • ip: Die IP-Adresse des Computers. • target: Die Zieldatei, in der die Informationen gespeichert werden (Standardwert: /etc/hosts). Hostverwaltung mit Puppet - Beispiele • Anlegen oder Modifizieren eines Hosteintrags: host {'ict-infrastruktur.home: ensure => present, host_aliases => 'ict-infrastruktur', ip => '127.0.0.1', } • Löschen eines Hosteintrags: host {ict-infrastruktur.home': ensure => absent} ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 95 von 139 Foliensatz 7 Kerberos, LDAP und SSSD Inhalt • Kerberos • LDAP (Lightweight Directory Access Protocol) • SSSD (System Security Services Daemon) Die Grafik „Kerberos Protokoll“ steht unter der CC BY-SA 3.0 Lizenz. Kerberos • Kerberos ist ein Netzwerkauthentifizierungsprotokoll, das für das Athena-Projekt des MIT entwickelt wurde. Die aktuelle Version 5 ist in RFC4120 definiert. • Mittels Kerberos kann man eine sichere Authentifizierung in einem ungesicherten Netzwerk auf sicheren Rechnern anbieten, wobei die Authentifizierung durch eine dritte Partei, dem Kerberos-Server, übernommen wird. • Der Kerberos-Server authentifiziert den Client gegenüber dem Server, den Server gegenüber dem Client und sich selbst gegenüber dem Client und den Server. Dabei werden sogenannte Tickets verwendet, um die Identität nachzuweisen. Diese Tickets erlauben auch ein Single-Sign-On, d.h. Passwörter müssen nur einmal eingegeben werden. Zudem kann die Kommunikation zwischen den Parteien verschlüsselt werden. • Bekannte Implementierung sind MIT Kerberos (diese betrachten wir genauer), Heimdal Kerberos und Microsoft Active Directory. Links: Designing an Authentication System: a Dialogue in Four Scenes, Kerberos Tutorial Kerberos - Realm • Ein Kerberos-Server verwaltet genau ein Realm. Innerhalb dieses Realms kann der Server Benutzer, Rechner und Dienste authentifizieren. D.h. ein Benutzer/Rechner/Dienst gehört zu dem Realm, wenn er ein Geheimnis, nämlich einen Schlüssel, mit dem Kerberos-Server teilt. • Das bedeutet aber nicht, dass ein Benutzer und ein Dienst, an dem sich der Benutzer authentifizieren will, zum selben Realm gehören müssen. Falls sie zu verschiedenen Realms gehören und es eine Vertrauensstellung zwischen den Realms gibt, findet eine sogenannte Cross-Realm Authentifizierung statt. • Beim Namen eines Realms muss auf die Groß- und Kleinschreibung geachtet werden. Üblich ist die Verwendung des DNS-Domainnamens in Großbuchstaben als Name für ein Realm. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 96 von 139 Kerberos - Schlüssel • Kerberos verwendet symmetrische Kryptographie, um die verschiedenen, über das unsichere Netzwerk geschickten Nachrichten zu ver- bzw. entschlüsseln und erlaubt dabei die Verwendung mehrerer Algorithmen (z.B. DES, 3DES, AES256, …). • Damit verschiedene Kerberos-Implementierungen miteinander interagieren können, müssen sie zumindest einen Verschlüsselungsalgorithmus gemeinsam haben. • Jedem Benutzer/Rechner/Dienst ist ein Schlüssel zugeordent, der für die unterschiedlichen Verschlüsselungsalgorithmen verwendet wird. • Dienste verwenden üblicherweise per Zufall generierte Schlüssel, während der Schlüssel eines Benutzers mit Hilfe seines Passworts reproduzierbar erzeugt werden kann. • Zusätzlich hat jeder Schlüssel eine Versionnummer (kvno), die erhöht wird, wenn sich der Schlüssel/das Passwort ändert. Kerberos - Principal • Jedem Schlüssel am Kerberos-Server ist ein Name zugeordnet, der Principal. Dieser Principal hat die Form Komponente1/Komponente2/...@REALM. • Für Benutzer werden üblicherweise ein oder zwei Komponenten, Name/Instanz@REALM, verwendet, wobei der Name dem Benutzernamen entspricht und die Instanz eine zusätzliche Funktion beschreibt, z.B. ob der Benutzer Administrator ist. • Bei Diensten hat der Principal die Form Dienstname/FQDN@REALM. Oft wird als Dienstname „host“ verwendet, um den generischen Zugriff auf den Rechner selbst zu beschreiben. Kerberos - KDC, AS, TGS, Tickets • Der Kerberos-Server wird als Key Distribution Center (KDC) bezeichnet und besteht aus zwei logisch separaten Diensten: dem Authentication Server (AS) und dem Ticket Granting Server (TGS). • Der Authentication Server wird benutzt, um einen Benutzer über sein Passwort zu authentifizieren und ein Ticket Granting Ticket (TGT) auszustellen. Danach kann der Benutzer das TGT benutzen und braucht sein Passwort nicht mehr einzugeben. • Mit dem TGT können über den Ticket Granting Server spezielle Servicetickets für Dienste angefordert und über diese Tickets die Authentifizierung gegenüber den Diensten erledigt werden. Der Principal für den TGS hat die Form krbtgt/REALM@REALM. • Jedes Ticket, sowohl das TGT als auch ein Serviceticket, ist mit dem Schlüssel des Principals verschlüsselt, für den das Ticket vorgesehen ist. • Weiters besitzt jedes Ticket auch ein Ablaufdatum, nach dem es nicht mehr gültig ist, damit es nicht ewig verwendet werden kann. Kerberos - Funktionsweise ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 97 von 139 Kerberos - Funktionsweise Schritt 1 • Der Benutzer (der Client) schickt eine Authentifizierungsanfrage an den Server. Die Anfrage enthält seinen Principal, die IP-Adressen, für denen das TGT gültig sein soll, als auch die gewünschte Lebenszeit des TGT. • All diese Informationen werden unverschlüsselt übertragen, da diese nicht geheim sind. • Der AS erzeugt einen zufälligen Sitzungsschlüssel für den Client und den TGS. Dieser Sitzungsschlüssel zusammen mit dem Client-Principal, dem TGS-Principal, den IP-Adressen, dem aktuellen Zeitstempel und der Lebenszeit werden in ein Ticket verpackt (das TGT) und mit dem Schlüssel des TGS verschlüsselt. • Zusätzlich wird der TGS-Principal, der Zeitstempel, die Lebenszeit und der Sitzungsschlüssel mit dem Schlüssel des Benutzers verschlüsselt. Dieses Paket sowie das TGT werden an den Client zurückgesandt. • Gibt der Benutzer das richtige Passwort ein, so kann der Client den Teil, der mit dem Benutzerschlüssel verschlüsselt ist, öffnen und ist somit authentifiziert, da er nun den Sitzungschlüssel besitzt. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 98 von 139 Kerberos - Funktionsweise Schritt 2 • Der Client fordert ein Serviceticket für einen Dienst an, in dem er folgende Informationen an den TGS schickt: • Das TGT • Den Principal des Dienstes, für den das Serviceticket gewünscht ist, sowie die gewünschte Lebenszeit des Servicetickets • Einen Authenticator bestehend aus dem Benutzerprincipal und dem aktuellen Zeitstempel, verschlüsselt mit dem Sitzungsschlüssel für das TGS • Der TGS prüft die Anfrage auf Richtigkeit, z.B. Lebenszeit des TGT noch nicht vorbei, IP-Adresse der Anfrage passt auf die im TGT gespeicherten, Authenticator kann entschlüsselt werden und Inhalt passt zum TGT, … • Passt alles, so wird analog zum Ausstellen des TGT ein Serviceticket ausgestellt (i.e. Situngsschlüssel erzeugen, nötige Informationen hineinpacken, mit Schlüssel des Services verschlüsseln) und genauso auch ein entsprechendes Antwortpaket geschickt. Kerberos - Funktionsweise Schritt 3 • Der Client erzeugt wieder einen Authenticator, dieses Mal verschlüsselt mit dem Sitzungsschlüssel für den Dienst, und schickt diesen gemeinsam mit dem Serviceticket an den Dienst. • Kann der Dienst das Serviceticket entschlüsseln, so kann der darin enthaltene Sitzungschlüssel für das Entschlüsseln des Authenticators verwendet und damit der Benutzer authentifiziert werden. • Um auch den Dienst gegenüber den Client zu authentifizieren, schickt der Dienst als Antwort den Zeitstempel des Authenticators verschlüsselt mit dem Sitzungsschlüssel zurück an den Client. Kann der Client die Antwort entschlüsseln und passt der Zeitstempel, so wurde der richtige Sitzungsschlüssel verwendet und damit ist auch der Dienst gegenüber den Client authentifiziert. Kerberos - Vertrauensstellungen • Wie erwähnt, können zwischen zwei Realms A und B Vertrauensstellungen aufgebaut werden. Diese können unidirektional sein (Benutzer von A können auf Dienste von B zugreifen) oder bidirektional. • Weiters gibt es neben den direkten Vertrauensstellungen auch transitive und hierarchische. • Bei einer unidirektionalen Vertrauensstellung hat der KDC von B Vertrauen in den KDC von A. Dieses Vertrauen wird über einen geteilten Schlüssel für den Principal krbtgt/B@A (Remote TGT) bewerkstelligt. • Bei bidirektionalen Vertrauensstellungen wird zusätzlich noch ein geteilter Schlüssel für krbtgt/A@B gebraucht. Kerberos - Vertrauensstellungen - Beispiel • Zum besseren Verständnis ein Beispiel, in dem der Benutzer [email protected] auf den SSH-Dienst auf ssh.beta.at zugreifen möchte: • Der Benutzer „ict“ authentifiziert sich an seinem AS und bekommt ein TGT. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 99 von 139 • Er verbindet sich nun mit dem Server ssh.beta.at. Der SSH-Client sieht anhand der Domain, dass der Server nicht zum Realm ALPHA.AT gehört. Daher fragt er den TGS von ALPHA.AT nach dem Remote TGT krbtgt/[email protected]. • Mit dem Remote TGT fragt der SSH-Client den TGS von BETA.AT nach dem Serviceticket host/[email protected]. Der TGS überprüft, ob das Remote TGT mit dem lokal gespeicherten zusammenpasst und falls dem so ist, wird das Serviceticket an den SSH-Client geschickt. • Der SSH-Client kann nun das Serviceticket zum Authentifizieren beim SSH-Dienst verwenden. Kerberos - Vor- und Nachteile Vorteile: • Kerberos-Nachrichten sind gegen Lauschangriffe und Replay-Attacken geschützt. • Die Kommunikation zwischen Client und Server kann verschlüsselt werden. • Der Client und der Server können gegenseitig ihre Identität verifizieren. • Single-Sign-On wird unterstützt. • Das Protokoll funktioniert über ungesicherte Netzwerke hinweg. • Benutzerpasswörter müssen nicht über das Netzwerk übertragen werden. Nachteile: • Ohne Kerberos-Server funktioniert die Authentifizierung von Benutzern und Diensten nicht mehr (beheben durch Verwenden mehrerer Kerberos-Servern). • Die Uhren aller Rechner müssen wegen der Benutzung von Zeitstempeln unbedingt synchron gehalten werden (z.B. durch Verwendung von NTP). • Wird ein Server geknackt, auf dem ein Kerberos-Dienst läuft, so ist dessen privater Schlüssel nicht mehr sicher (beheben durch Erzeugen eines neues Schlüssels). • Wird der Kerberos-Server geknackt, sind alle Schlüssel potentiell kompromitiert. • Läuft das TGT ab, muss es vom Benutzer durch Eingabe seines Passworts erneuert werden. Kerberos - Microsoft Active Directory • Microsoft Active Directory (AD) verwendet für die Authentifizierung von Rechnern, Diensten und Benutzern auch Kerberos v5. • Jeder AD Server fungiert dabei als KDC, die Kerberos-Datenbank wird automatisch auf alle AD Server verteilt. • Die nötigen Schlüssel für Rechner, Dienste und Benutzer werden im entsprechenden Objekt im LDAP-Teil des AD gespeichert. • Hat man eine gemischte Systemumgebung bestehend aus Windows- und Linux-Rechnern, so ist es meistens am einfachsten, das AD zum Speichern der Benutzerdaten zu verwenden und dann die Benutzerdaten auf den Linux-Rechnern über LDAP vom AD abzufragen bzw. die Benutzer über Kerberos zu authentifizieren. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 100 von 139 Kerberos - Installation • Wichtig: Damit Kerberos richtig funktioniert, müssen alle Domainnamen aufgelöst werden können! • Die für den Kerberos-Server nötigen Pakete sind krb5-admin-server und krb5-kdc. Bei der Installation wird man nach einigen Daten gefragt: • „Voreingestellter Realm für Kerberos Version 5“ • „Kerberos-Server für Ihren Realm“ • „Administrations-Server für Ihren Kerberos-Realm“ • Der Administrationsserver ist üblicherweise der gleiche wie der Kerberos-Server und wird zum Verwalten der Kerberos-Datenbank verwendet. • Danach muss der Realm mit Hilfe von krb5_newrealm angelegt und mit einem Passwort geschützt werden. Die Kerberos-Datenbank selbst wird dabei unter /var/lib/krb5kdc/ abgelegt und die Datei mit dem Master-Passwort in der Datei /etc/krb5kdc/stash. Links: Ubuntu Kerberos Seite, Kerberos Installation von Spinlock Solutions Kerberos - Server-Konfiguration • Im Verzeichnis /etc/krb5kdc finden sich die folgenden Dateien: • kdc.conf → Konfigurationsdatei für die Server • kadm5.acl → Enthält ACLs für den Zugriff auf die Kerberos-Datenbank • stash → Enthält den Schlüssel für die Kerberos-Datenbank • In der Datei kdc.conf wird der Kerberos-Server sowie der Administrationsserver konfiguriert. Hier wird z.B. eingetragen, wo für welches Realm die Kerberos-Datenbank liegt und wie bzw. wo Informationen geloggt werden. • Damit Administratoren (Principals der Form Benutzername/admin@REALM) Vollzugriff auf die Kerberos-Datenbank haben, muss folgender Eintrag zu kadm5.acl hinzugefügt und danach der krb5-admin-server neu gestartet werden: */admin * Achtung: Beim Starten des Administrationsservers werden Zufallszahlen gebraucht, falls der Entropy-Speicher leer ist, hängt der Server bis genügend Entropy wieder vorhanden ist! Kerberos - Allgemeine Konfiguration • Die Clientprogramme für Kerberos sind im Paket krb5-user enthalten. Zusätzlich empfiehlt sich die Installation von krb5-doc, um die restlichen Manpages und die Kerberos-Dokumentation lokal verwenden zu können. • In der Datei /etc/krb5.conf sind Daten für die Grundkonfiguration von Kerberos eingetragen. • Diese Datei wird sowohl auf dem Serverrechner gebraucht als auch auf den Clientrechnern. • Es ist u.a. definiert, welche Realms es gibt und wie deren Server heißen. Zudem kann ein Realm als Standard-Realm festgelegt werden. • Weiters kann festgelegt werden, wie das Mapping von DNS-Domain bzw. Rechnername auf ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 101 von 139 Kerberos-Realm funktionieren soll. • Eine weitere, wichtige Option is k5login_authoritative (default: yes), die angibt, dass standardmäßig nur dem Benutzer NAME@DEFAULT_REALM der Login erlaubt wird, falls die Datei $HOME/.k5login nicht existiert bzw. falls sie existiert nur den Principals, die darin zeilenweise gelistet sind. Kerberos - Administration der Datenbank - kadmin • Es gibt zwei Programme zur Administration der Kerberos-Datenbank: kadmin und kadmin.local. Letzters kann als Administrator nur lokal am Administrationsserver, dafür ohne Authentifizierung ausgeführt werden, das andere auf jedem Rechner im Realm, da es die Kerberos-Authentifizierung verwendet. • Mit diesen Programmen können u.a. Principals aufgelistet (listprincs), erstellt (addprinc), gelöscht (delprinc), umbenannt (renprinc) oder ausgegeben (getprinc) werden. • Weiters können die zu einem Principal gehörenden Schlüssel in einer sogenannten keytab-Datei gespeichert (ktadd) oder von dieser gelöscht (ktremove) werden. Dies wird gebraucht, um Diensten den entsprechenden Schlüssel zur Verfügung stellen zu können. • Damit man als Administrator von überall die Kerberos-Datenbank administrieren kann, empfiehlt es sich, einen Principal root/admin@REALM anzulegen. Kerberos - Clientprogramme - kinit, kdestroy, klist kinit - Holt Ticket Granting Tickets. » Wird benutzt, um ein TGT vom KDC zu holen und lokal zu speichern. » $ kinit root/admin Password for root/[email protected]: kdestroy - Zerstört zwischengespeicherte Tickets. » Die Tickets werden durch Löschen der Datei mit den Tickets zerstört. » $ kdestroy klist - Zeigt zwischengespeicherte Tickets an. » Zeigt entweder die Principals und Tickets des Benutzers-Caches an oder den Inhalt einer keytabDatei. » Optionen: -f → zeige zusätzlich Flags an, -k → muss angegeben werden bei Verwendung mit einer keytab-Datei. » $ klist -f Ticket cache: FILE:/tmp/krb5cc_0 Default principal: root/[email protected] Valid starting Expires Service principal 2016-04-23 16:45:23 2016-04-24 02:45:23 krbtgt/[email protected] renew until 2016-04-24 16:45:10, Flags: FPRIA Kerberos - Clientprogramme - kpasswd, ktutil kpasswd - Ändert das Kerberos-Passwort eines Benutzers. » $ kpasswd [email protected] Password for [email protected]: ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 102 von 139 Enter new password: Enter it again: Password changed. ktutil - Verwaltet keytab-Dateien. » Dient zum Hinzufügen bzw. Löschen von Einträgen in einer keytab-Datei. » $ ktutil ktutil: l slot KVNO Principal ---- ---- --------------------------------------------------------------------ktutil: rkt /etc/krb5.keytab ktutil: l slot KVNO Principal ---- ---- -------------------------------------------------------------------- 1 1 host/[email protected] 2 1 host/[email protected] 3 1 host/[email protected] 4 1 host/[email protected] Kerberos - Konfiguration eines Dienstes am Beispiel SSH • Damit man per Kerberos über OpenSSH einloggen kann, muss man einen Principal host/FQDN@REALM mit zufälligem Schlüssel erzeugen. • Dieser Schlüssel muss dann in eine keytab-Datei exportiert werden, damit OpenSSH ihn verwenden kann. Die Standard-keytab-Datei, die Applikationen verwenden, wenn nichts anderes angegeben ist, ist /etc/krb5.keytab. • Anschließend muss der SSH-Server noch umkonfiguriert werden, damit die Authentifikation via Kerberos auch erlaubt ist. Dies wird mittels der Optionen KerberosAuthentication und GSSAPIAuthentication bewerkstelligt. Die erste Option sollte eigentlich nicht verwendet werden, weil hier das Passwort über die Leitung an den SSH-Server geschickt wird und der SSH-Server versucht, den Benutzer mit dem Passwort am Kerberos-Server zu authentifizieren. Bei der zweiten Option muss sich der Benutzer lokal am Kerberos-Server authentifizieren und das TGT wird dann benutzt, um ein entsprechendes Serviceticket für den SSH-Server zu bekommen. • Mittels der ssh-Option -K können die Tickets vom Client-Cache auch am Server verwendet werden. Kerberos - Konfiguration einer Vertrauensstellung • Um Dienste eines anderen Realms benutzen zu können, muss eine Vertrauensstellung hergestellt werden. • Wie erwähnt, müssen für eine bidirektionale Vertrauensstellung Principals der Form krbtgt/A@B und krbtgt/B@A in beiden Realms angelegt werden. • Zum Anlegen dieser Principals verwendet man auf beiden KDCs am besten kadmin.local und möglichst lange, zufällige Passwörter (aber nicht die Option -randkey). • Sobald beide KDCs konfiguriert sind, funktioniert das Verwenden der Dienste im jeweils anderen Realm. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 103 von 139 Kerberos - Zusammenfassung Konfiguration • Pakete für die Serverdienste installieren, entsprechende Werte bei der Installation eingeben • Realm mittels krb5_newrealm erzeugen • In /etc/krb5kdc/kadm5.acl eine Zeile */admin * für die Administration über kadmin hinzufügen und Administrationsserver neu starten • In /etc/krb5.conf für alle beteiligten Realms im Abschnitt „[realms]“ die Adressen der Server hinterlegen und im Abschnitt „[domain_realm]“ die nötigen Mappings Domain-Realm eintragen • Principals für Benutzer, Hosts und Dienste anlegen sowie für etwaige Vertrauensstellungen Kerberos - Einbindung in die Authentifizierung • Bis jetzt haben wird die Kerberos-Authentifizierung immer alleine betrachtet. D.h. um ein TGT zu bekommen, musste immer kinit verwendet werden. • Ist Kerberos aber einmal konfiguriert, so können die Benutzer natürlich auch über ihr KerberosPasswort authentifiziert werden. • Die einfachste Möglichkeit, dies zu bewerkstelligen, ist mittels des PAM-Moduls pam_krb5, welches durch das Paket libpam-krb5 installiert werden kann. Nach der Installation wird automatisch die PAM-Konfiguration aktualisiert und pam_krb5 aktiviert, wodurch die Authentifizierung über das Kerberos-Passwort möglich gemacht wird. • Loggt sich dann ein Benutzer mit seinem Kerberos-Passwort ein, so wird dann auch ein entsprechender Ticket-Cache erstellt, so, wie wenn kinit aufgerufen worden wäre. • Wird pam_krb5 verwendet, so ist auch die Aktivierung von „KerberosAuthentication“ im SSHDaemon nicht mehr nötig, da beide die selbe Aufgabe erfüllen. LDAP • Das Leightweight Directory Access Protocol (LDAP) ist ein Protokoll zur Abfrage von Daten eines Verzeichnisdienstes. Die aktuelle Version LDAPv3 ist in den RFCs 4510 bis 4519 definiert. • Ein LDAP-Server ist ein Verzeichnisdienst (Directory Server), der über LDAP abgefragt werden kann und dessen interne Struktur der LDAP-Spezifikation entspricht. • Das LDAP-Protokoll erlaubt auch die Anmeldung (LDAP-Bind) über ein Passwort oder mittels SASL an einen LDAP-Server sowie Suchabfragen bzw. Änderungsanfragen. • Bekannte Implementierungen von LDAP-Servern sind OpenLDAP, Apache Directory Server, 389 Directory Server (von RedHat) und Microsoft Active Directory. LDAP - DIT und DN • Ein LDAP-Server speichert zusammengehörige Daten in LDAP-Objekten, die ihrerseits hierarchisch in einer Baumstruktur, dem Directory Information Tree (DIT), angeordnet sind. • Die LDAP-Objekte können über den sogenannten Distinguished Name (DN) eindeutig referenziert werden. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 104 von 139 Jedes Objekt besitzt einen auf seiner Hierarchieebene eindeutigen Relative Distinguished Name (RDN). Die Zusammensetzung des RDNs eines Objekts mit dem DN seines übergeordneten Objekts (getrennt durch einen Beistrich) ist dann der eindeutig DN des Objekts. Ein Beispiel für einen DN ist cn=admin,dc=ict, wobei cn=admin der RDN ist und dc=ict der DN des übergeordneten Objekts. LDAP - Schema • Die Struktur des DIT wird durch ein genormtes, erweiterbares LDAP-Schema festgelegt. Erweiterbar bedeutet, dass auch im Nachhinein neue Schema zum DIT hinzugefügt werden können. • In einem Schema werden Objekt-Klassen und deren Attribute definiert. • Eine Objekt-Klasse fasst eine Menge von Attributen zusammen und definiert auch, welche Attribute zwingend vorhanden sein müssen bzw. welche optional sind. Weiters ist über Objekt-Klassen festgelegt, wie die Hierarchie aussehen muss, i.e. welche Objekte welche Sub-Objekte haben dürfen. • Für jedes Attribut einer Objekt-Klasse ist festgelegt, welcher Syntax es folgen muss (z.B. ob der Wert eine Ganzzahl oder eine Zeichenfolge sein muss), wie es verglichen werden kann und ob es ein oder mehr Werte haben darf. • Jedem LDAP-Objekt ist eine strukturelle Objekt-Klasse zugeordnet (die „Hauptklasse“) und eventuell zusätzliche Hilfsklassen. Diese Objekt-Klassen bestimmen, welche Attribute das Objekt haben muss bzw. welche es zusätzlich haben kann. LDAP - Schema - Beispiel Attribut und Objekt-Klasse attributetype ( 2.5.4.35 NAME 'userPassword' DESC 'RFC2256/2307: password of user' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} ) objectclass ( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) ) • Die Zeichenfolgen „2.5.4.35“, „2.5.6.6“ und „1.3.6.1.4.1.1466.115.121.1.40“ sind Object Identifier (OIDs), die eindeutig ein Attribut, eine Attributsyntax oder eine Objekt-Klasse beschreiben. • Beim Attribut „userPassword“ ist angegeben, welcher Syntax es folgen muss und wie es mit Werten verglichen werden kann. Wäre zusätzlich noch ‚SINGLE-VALUE‘ angegeben, so dürfte das Attribute nur einmal in einem Objekt vorkommen. • Die Objekt-Klasse „person“ ist von „top“ abgeleitet. Objekte dieser Klasse müssen die Attribute „sn“ und „cn“ besitzen, können optional aber auch noch ein paar andere besitzen. LDAP - Wichtige Objekt-Klassen und Attribute • Die folgenden Objekt-Klassen und Attribute trifft man häufig an: • dcObject: Domain-Komponente mit dem Attribut „dc“ ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 105 von 139 • organization: Organisation mit den Attributen „o“ (Name), „street“ (Straßenname), „ postalCode“ (PLZ), … • organizationalUnit: Organisationseinheit mit den Attributen „ou“ (Name) und sonst den gleichen Attributen wie für Organisationen • person → organizationalPerson → inetOrgPerson (Hierarchie von Objekt-Klassen): Person mit den Attributen „sn“ (Nachname), „cn“ (Common Name), „userPassword“ (Anmeldepasswort), „mail“ (E-Mailadresse), … • posixAccount: POSIX-Benutzerkonto mit den Attributen „uid“ (Benutzername), „uidNumber“ (UID), „gidNumber“ (GID), „loginShell“ (Shell), … • posixGroup: POSIX-Gruppe mit den Attributen „cn“, „gidNumber“ (GID der Gruppe) und „memberUid“ (Benutzername eines Gruppenmitglieds) LDAP - LDAP Data Interchange Format (LDIF) • Objekte eines LDAP-Verzeichnisses können mittels LDAP Data Interchange Format (LDIF) als ASCII-Text dargestellt werden. • LDIF-Dateien können zwei Arten von Informationen darstellen: Entweder eine Menge von LDAPObjekten oder eine Menge von Änderungseinträgen. • Die Syntax von LDIF ist relativ einfach: Attribute werden durch Doppelpunkte getrennt von den Werten geschrieben, Kommentare beginnen mit einem Hash-Zeichen und eine Leerzeile trennt einzelne Einträge. • Achtung: Die Werte dürfen nur ASCII-Zeichen (ohne NUL, CR und LF) enthalten und nicht mit „<“ oder „:“ anfangen, damit sie direkt verwendet werden können. Ansonsten müssen statt einem Doppelpunkt zwei Doppelpunkte verwendet und der Wert Base64-kodiert werden. LDAP - LDIF - Beispieldatei mit Objekten # ict dn: dc=ict objectClass: top objectClass: dcObject objectClass: organization o: ict dc: ict # admin, ict dn: cn=admin,dc=ict objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator LDAP - LDIF - Änderungseinträge • Bei Änderungseinträgen im LDIF-Format wird zuerst das Objekt, das geändert werden soll, über den DN angegeben und dann über das Attribut „changetype“ die Aktion. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 106 von 139 • Die Aktion „add“ fügt einen neuen Eintrag zum DIT hinzu. Die Attribute des Eintrags folgen direkt in den nächsten Zeilen: dn: ou=users,dc=ict changetype: add objectclass: organizationalUnit ou: users description: Bereich für die Benutzer • Die Aktion „delete“ löscht einen Eintrag aus dem DIT: dn: ou=users,dc=ict changetype: delete LDAP - LDIF - Änderungseinträge Fortseztung • Mittels der Aktion „modify“ kann ein Eintrag modifiziert und Attribute hinzugefügt, geändert oder gelöscht werden. Was gemacht werden soll, wird über die Attribute „add“, „delete“ und „replace“ angegeben, wobei der Wert immer der Name des Attributs ist, auf den sich die Aktion bezieht. Mehrere Anweisungen für ein Objekt können durch eine Zeile bestehend aus einem Bindestrich von einander getrennt werden. dn: ou=users,dc=ict changetype: modify add: telephoneNumber telephoneNumber: +43 1 4277 50639 telephoneNumber: +43 664 60277 50639 replace: description description: Neue Beschreibung delete: postalCode LDAP - Suchanfragen • Für das Durchführen von Suchanfragen wird eine spezielle Filtersyntax, die in RFC4515 definiert ist, benutzt. • Ein einfacher Filter hat die Form (Attribut Operator Wert). • • • Wird das Attribut weggelassen, so trifft der Filter auf alle Attribute zu. • Der Operator kann „=“, „>=“, „<=“ oder „~=“ (ungefähr gleich) sein. • Wird als Operator „=“ verwendet, so kann im Wert das Zeichen „*“ als Platzhalter benutzt werden. Weiters können die Filter logisch verknüpft werden: • (!(Filter)) → negierter Filter muss zutreffen • (&(Filter)(Filter)(...)) → alle Filter müssen zutreffen • (|(Filter)(Filter)(...)) → einer der Filter muss zutreffen Die Filtersyntax ist noch mächtiger als hier gezeigt, aber meistens kommt man mit dem ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 107 von 139 Beschriebenen aus. LDAP - Beispiele für Suchanfragen • (givenName=Thomas) Objekte, bei denen das Attribut „givenName“ den Wert „Thomas“ hat • (!(givenName=Thomas)) Objekte, bei denen das Attribut „givenName“ nicht den Wert „Thomas“ hat • (sn=*) Objekte, bei denen das Attribut „sn“ irgendeinen Wert hat • (givenName=*ris*) Objekte, bei denen im Attribut „givenName“ irgendwo der Wert „ris“ vorkommt • (&(objectClass=posixAccount)(|(uid=leitner)(sn=*leitner*))) Objekte, deren Attribut „objectClass“ den Wert „posixAccount“ hat und entweder „uid“ den Wert „leitner“ hat oder „sn“ den Wert „leitner“ enthält. OpenLDAP • Der Standard-LDAP-Server für Linux ist OpenLDAP. Dieser LDAP-Server wird schon seit fast 20 Jahren entwickelt, ist schnell, weit verbreitet und sehr stabil/gut getestet. • OpenLDAP kann zum Speichern der Daten sehr viele verschiedene Backends verwenden (z.B. Berkeley DB, LDIF, SQL, LMDB, LDAP, …). Standardmäßig wird derzeit LMDB verwendet. • Die eingebaute Replikation erlaubt den Betrieb mehrer LDAP-Server mit den gleichen Daten, was die Verfügbarkeit erhöht. Dabei können verschiedene Replikationsarten verwendet werden, z.B. eine Master/Slave- oder eine Multi-Master-Konfiguration. • OpenLDAP hat noch weitere Funktionalitäten, z.B. können Anfragen an den Server über Module durch sogenannte Overlays dynamisch geändert werden. Links: OpenLDAP Administrationshandbuch, Ubuntu OpenLDAP Server Installation/Konfiguration, OpenLDAP Installation von Spinlock Solutions OpenLDAP - Clientprogramme • Die CLI-Programme von OpenLDAP zur Kommunikation mit einem LDAP-Server können mittels des Pakets ldap-utils installiert werden. Diese Programme werden auch zur Konfiguration eines OpenLDAP-Servers gebraucht. • Die wichtigsten dieser Programme sind ldapmodify (Hinzufügen, Ändern oder Löschen von Objekten), ldapsearch (Durchsuchen des Verzeichnisses), ldapadd (Hinzufügen eines Objekts) und ldapdelete (Löschen eines Objekts). • Die folgenden Optionen werden von all diesen Programmen unterstützt: • -H → Server-URI (z.B. „ldapi://“ oder „ldap://host95.ict“) • -Y EXTERNAL → Externe SASL-Authentifizierung verwenden, nötig für „ldapi://“ • -x → Einfache Authentifizierung mit Passwort statt SASL verwenden • -D Bind-DN → DN zur Authentifizierung am Server ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 108 von 139 • -W → Passwort für Authentifizierung • -Z → Verwendung von StartTLS (bei -ZZ wird StartTLS erzwungen) • -f Datei → Verwenden der Datei anstatt der Standardeingabe OpenLDAP - Clientprogramme - ldapadd, ldapmodify ldapadd - Erstellt ein neues Objekt am LDAP-Server. » Ist eigentlich nur eine Aufrufform von ldapmodify mit der Option -a. » Eine über -f angegebene LDIF-Datei muss eine Liste von LDAP-Objekten beinhalten. » $ ldapadd -D cn=admin,dc=ict -W << EOF > dn: ou=users,dc=ict > objectClass: organizationalUnit > ou: users > EOF Enter LDAP Password: PASSWORT EINGEBEN adding new entry "ou=users,dc=ict" ldapmodify - Modifiziert ein Objekt am LDAP-Server. » Eine über -f angegebene LDIF-Datei muss eine Liste von Änderungsanfragen beinhalten. » $ ldapmodify -D cn=admin,dc=ict -W << EOF > dn: ou=users,dc=ict > changetype: modify > add: description > description: Bereich fuer Benutzer > EOF Enter LDAP Password: PASSWORT EINGEBEN modifying entry "ou=users,dc=ict" OpenLDAP - Clientprogramme - ldapdelete, ldapsearch ldapdelete - Löscht ein Objekt vom LDAP-Server. » Als Argument muss der DN des zu löschenden Objekts übergeben werden. » $ ldapdelete -D cn=admin,dc=ict -W ou=users,dc=ict Enter LDAP Password: <PASSWORT EINGEBEN> ldapsearch - Sucht am LDAP-Server nach Objekten. » Als Argumente können ein Suchfilter und danach die auszugebenden Attribute angegeben werden. » Optionen: -b → Suchbasis (Angabe erforderlich) » $ ldapsearch dn: dc=ict objectClass: objectClass: objectClass: o: ict dc: ict -b dc=ict -x -LLL top dcObject organization dn: cn=admin,dc=ict objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 109 von 139 OpenLDAP - Clientprogramme - Konfiguration • Über die Datei /etc/ldap/ldap.conf können einige Standardwerte für die Clientprogramme gesetzt werden (diese Datei wird üblicherweise auch von anderen Programme respektiert): • URI: Die abzufragenden Server (analog zur Option -H) • BASE: Die Standardsuchbasis (analog zur Option -b) • BINDDN: Der Standard-DN für die Authentifizierung (analog zur Option -D) • TIMEOUT: Anzahl an Sekunden, nachdem eine Anfrage abbrechen soll • TLS_CACERT: Die Datei mit den CA-Zertifikaten • TLS_REQCERT: Legt fest, ob das Zertifikat des Server überprüft werden soll: • never: Das Zertifikat wird nicht angefragt und auch nicht überprüft. • allow: Das Zertifikat wird angefragt, aber ein fehlendes oder ungültiges Zertifikat wird ignoriert. • try: Das Zertifikat wird angefragt und ein fehlendes wird ignoriert, aber bei einem ungültigen wird abgebrochen. • demand: Das Zertifikat wird angefragt und bei einem fehlenden oder ungültigen wird abgebrochen. OpenLDAP - Installation • OpenLDAP kann unter Ubuntu mittels des Pakets slapd (stand-alone LDAP daemon) installiert werden. • Bei der Installation wird ein DIT mit der Domain des Rechners als Wurzel angelegt (z.B. dc=ict) und ein zugehöriges Administratorkonto (z.B. cn=admin,dc=ict), dessen Passwort bei der Installation eingegeben werden muss. Dieser DIT kann dann über dieses Konto administriert werden. • Die Konfigurationsdateien für den Server befinden sich in /etc/ldap/slapd.d im LDIF-Format. Obwohl es so aussieht, als könnte man diese direkt dort ändern, darf das nicht gemacht werden! Es ist gedacht, die Konfiguration mittels LDAP-Anfragen durchzuführen! • Früher gab es auch die Möglichkeit, den LDAP-Server über die Datei /etc/ldap/slapd.conf zu konfigurieren. Diese Art der Konfiguration sollte aber nicht mehr verwendet werden. OpenLDAP - Konfiguration • Detailierte Informationen zur Konfiguration finden sich im Administrationshandbuch. • Die Schema-Definitionen core, cosine, nis und inetorgperson sind standardmäßig aktiviert. Weitere können bei Bedarf hinzugefügt werden (siehe Dateien im Verzeichnis /etc/ldap/schema/). • Die Konfiguration des Servers wird in einem speziellen DIT mit der Wurzel cn=config durchgeführt (siehe man 5 slapd-config). • Im DN cn=config wird die allgemeine Serverkonfiguration festgelegt. • In Einträgen unterhalb von cn=schema,cn=config befinden sich die benutzten SchemaDefinition. • Einträge der Form olcDatabase=BACKEND,cn=config definieren je einen DIT und legen dessen Konfiguration fest. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 110 von 139 • Bei Änderungsanfragen über LDAP werden die Änderungen automatisch aktiv und zusätzlich nach /etc/ldap/slapd.d gesichert. • Wichtig: Konfigurationsänderungen müssen als Benutzer root und den CLI-Optionen -Y EXTERNAL -H ldapi:/// gemacht werden, da standardmäßig kein Passwort für den Konfigurations-DIT gesetzt ist! OpenLDAP - Beispiel für DIT-Konfiguration $ ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config olcDatabase=mdb SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 dn: olcDatabase={1}mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: {1}mdb olcDbDirectory: /var/lib/ldap olcSuffix: dc=ict olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou s auth by * none olcAccess: {1}to dn.base="" by * read olcAccess: {2}to * by * read olcLastMod: TRUE olcRootDN: cn=admin,dc=ict olcRootPW: {SSHA}gA82cCLDItWFzpXz4Ujt/8TVwUCnlrpR olcDbCheckpoint: 512 30 olcDbIndex: objectClass eq olcDbIndex: cn,uid eq olcDbIndex: uidNumber,gidNumber eq olcDbIndex: member,memberUid eq olcDbMaxSize: 1073741824 OpenLDAP - Konfiguration von TLS • Standarmäßig läuft der Server ohne Verschlüsselung auf Port 389 (Zugriff via ldap://-URL). Außerdem ist er lokal am Server auch mittels IPC erreichbar (Zugriff via ldapi://-URL). • Um LDAPS auf Port 636 oder STARTTLS verwenden zu können, müssen zuerst die nötigen Zertifikate erstellt bzw. angefordert werden. Anschließend müssen im Konfigurations-DIT unter dem DN „cn=config“ folgende Attribute gesetzt werden: • • olcTLSCACertificateFile: Der Pfad zum CA-Zertifikat • olcTLSCertificateFile: Der Pfad zum Zertifikat des Servers, das gegenüber den Clients verwendet wird • olcTLSCertificateKeyFile: Der Pfad zum privaten Schlüssel für das Zertifikat des Servers Weiters muss in /etc/default/slapd bei SLAPD_SERVICES den Wert ldaps:/// hinzugefügt und der Server neu gestartet werden. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 111 von 139 OpenLDAP - Konfiguration von TLS - Fortsetzung • Um die Verwendung von TLS zu erzwingen, kann die Konfigurationsoption olcSecurity mit dem Wert „tls=1“ verwendet werden. Dann können sich Clients nur mehr per TLS mit dem Server verbinden. Achtung: Diese Option sollte nicht direkt auf „cn=config“ angewendet werden, sondern auf den DN einer DIT-Datenbank! • Zum Konfigurieren von TLS kann folgende LDIF-Datei verwendet werden (Werte entsprechend anpassen): dn: cn=config add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/ssl/certs/ca-certificate.pem add: olcTLSCertificateFile olcTLSCertificateFile: /etc/ssl/certs/ldap-certificate.pem add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ssl/private/ldap-certificate.key - • Zusätzlich könnte man den Server so konfigurieren, dass er auch Client-Zertifikate verlangt (Attribute olcTLSVerifyClient, olcTLSCRLFile und olcTLSCRLCheck). OpenLDAP - Zugriffskontrolle • Die Standardkonfiguration erlaubt recht breiten Zugriff auf den während der Installation erstellten DIT. Ohne Authentifizierung können z.B. alle Attribute bis auf userPassword und shadowLastChange gelesen werden. • Im Produktivbetrieb sollte der Zugriff eingeschränkt werden, um größtmögliche Sicherheit und Datenschutz zu gewähren. • Die Zugriffskontrolle wird über das Attribut olcAccess gesteuert, welches mehrfach vorkommen kann. Für die vollständige Syntax und alle Möglichkeiten siehe man 5 slapd.access. • Da die Reihenfolge wichtig ist, sollten die Werte mit dem Präfix {Nummer} versehen werden (bei LDAP-Objekten gibt es keine festgelegte Attributordnung). • Der Wert von olcAccess hat vereinfacht die Form to <Was> [ by <Wem> <Zugriffsrechte> ]+. • Beim Überprüfen der Zugriffsrechte werden die Attribute nach dem Präfix sortiert und sobald sowohl <Was> als auch <Wer> zutrifft, werden die entsprechenden Zugriffsrechte angewandt. OpenLDAP - Zugriffskontrolle - Was • Über <Was> wird festgelegt, auf welche Objekte sich die Zugriffsrechte beziehen. • Mögliche Werte dafür sind: • dn.<Bereich>=<Pattern> Die Objekte werden auf Grund des DNs ausgewählt. <Pattern> ist ein Ausdruck, in dem auch die Wildcard ‚*‘ vorkommen kann. <Bereich> gibt an, ob genau das Objekt ausgewählt wird ( dn.base), alle direkten Einträge unterhalb (dn.one), alle Einträge im Unterbaum (dn.subtree) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 112 von 139 oder alle Einträge unterhalb (dn.children). • filter=<Filter> Die Objekte werden auf Grund des LDAP-Filters ausgewählt. • attrs=<Attributlist> Die Zugriffsrechte beziehen sich auf die kommaseparierte Liste von Attributen. OpenLDAP - Zugriffskontrolle - Wem • Über <Wem> wird festgelegt, auf welche Clients, meist Benutzer, sich die Zugriffsrechte beziehen. • Einige mögliche Werte dafür sind: • dn.<Bereich>=DN Funktioniert analog zur ähnlichen Angabe bei <Was> und wählt einen Client über einen DN aus. • * Wählt alle Clienten aus. • anonymous Wählt alle Clienten aus, die sich nicht authentifiziert haben. • users Wählt alle Clienten aus, die sich authentifiziert haben. • self Wählt das Objekt selbst aus, das über <Was> festgelegt wurde. OpenLDAP - Zugriffskontrolle - Zugriffsrechte • Über <Zugriffsrechte> werden schließlich die Zugriffsrechte festgelegt. • Mögliche Werte dafür sind: • • none: Kein Zugriff, auch keine Fehlermeldung (=0) • disclose: Kein Zugriff, aber Fehlermeldung (=d) • auth: Erlaubnis zum Zugriff während der Authentifizierung (=dx) • compare: Erlaubnis zum Vergleichen (=dxc) • search: Erlaubnis zum Verwenden von Suchfiltern (=dxcs) • read: Erlaubnis zum Lesen von Einträgen (=dxcsr) • write: Erlaubnis zum Schreiben (=dxcsrw) • manage: Vollzugriff (=dxcsrwm) Wie man an den Rechten sieht, erlauben höhere Rechte automatisch alle niederen Rechte, d.h. read erlaubt auch automatisch search, compare, auth und disclose. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 113 von 139 OpenLDAP - Zugriffskontrolle - Beispiele • to * by * read Alle haben Lesezugriff. • to attr=userPassword by self write by anonymous auth by * none Clients, die als das Objekt authentifiziert sind, können das Attribut userPassword schreiben, anonyme Benutzer können sich gegen das Attribut authentifizieren, alle anderen haben keinen Zugriff. • to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage Ein über -Y EXTERNAL authentifizierter Benutzer mit der UID=0 und GID=0 hat Vollzugriff auf alle Einträge. OpenLDAP - Integration mit Kerberos • Um Clients via Kerberos am LDAP-Server zu authentifizieren, muss das Paket libsasl2-modulesgssapi-mit installiert werden. Dieses stellt die GSSAPI/Kerberos-Authentifizierung für SASL zur Verfügung. • Als nächstes muss ein Principal ldap/FQDN@REALM für das LDAP-Service angelegt werden und in die /etc/krb5.keytab exportiert werden (Achtung: Darauf achten, dass der Server Zugriff hat – er läuft unter dem Benutzer „openldap“). • Anschließend wird der LDAP-Server neugestartet. Hat alles geklappt, so sollte nun GSSAPI als unterstützte SASL-Methode in der Root DSE auftauchen: $ ldapsearch -x -b '' -s dn: supportedSASLMechanisms: supportedSASLMechanisms: supportedSASLMechanisms: supportedSASLMechanisms: supportedSASLMechanisms: supportedSASLMechanisms: supportedSASLMechanisms: supportedSASLMechanisms: base -LLL supportedSASLMechanisms SCRAM-SHA-1 GS2-IAKERB GS2-KRB5 GSSAPI GSS-SPNEGO DIGEST-MD5 CRAM-MD5 NTLM OpenLDAP - Integration mit Kerberos - Fortsetzung • Zum Zwecke der Authentifizierung wird der Principal BENUTZER/INSTANZ@REALM auf einen DN uid=BENUTZER/INSTANZ,cn=REALM,cn=gssapi,cn=auth abgebildet. Achtung: Der Teil cn=Realm wird weggelassen, falls es das Standard-Realm ist. • Mit Hilfe des Befehls ldapwhoami kann geprüft werden, welcher DN aktuell zugeordnet ist. • Um über Kerberos angemeldete Clients entsprechenden Zugriff auf Objekte zu geben, muss man deren DNs entweder direkt via olcAccess den Zugriff erlauben oder man bildet sie auf andere DNs ab, die bereits Zugriff haben. • Die Abbildung auf einen DN erfolgt über die Konfigurationsoption olcAuthzRegexp. Der Wert hat die Form REGEX ERSETZUNG. Im Ersetzungsstring können auch Gruppenreferenzen $1, $2, etc. verwendet ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 114 von 139 werden. Nach Änderungen muss der Server neu gestartet werden. Beispiel für die Abbildung aller */[email protected] Principals auf das bei der Installation angelegte DIT-Administrator-Objekt: olcAuthzRegexp: uid=.*?/admin(,cn=HOST95.ICT)?,cn=gssapi,cn=auth cn=admin,dc=ict OpenLDAP - Kerberosdatenbank, Sudoers, Autofs • Möchte man zur Authentifizierung Kerberos anstatt LDAP verwenden, so kann man einfach das entsprechende PAM-Modul dafür verwenden. Allerdings muss man dann weiterhin zwei getrennte Datenbanken (LDAP und Kerberos) vorhalten bzw. synchronisieren. • Die bessere Methode ist für Kerberos als Datenbankbackend LDAP zu verwenden. Dann können die Schlüssel für Benutzer, Computer und Services im LDAP-Verzeichnis direkt bei den entsprechenden LDAP-Objekten gespeichert werden. Eine Anleitung für die Einrichtung findet sich im Ubuntu Kerberos and LDAP Guide und im Kerberos Admin Guide von MIT Kerberos. • Weiters ist es möglich, sowohl die sudo-Konfiguration als auch die autofs-Konfiguration in das LDAPVerzeichnis zu verlagern. Dazu müssen die entsprechenden Schema-Dateien in den LDAP-Server geladen und dann die nötigen Objekte angelegt werden. SSSD - System Security Services Daemon • SSSD ist ein Daemon, der Zugang zu auf entfernten Ressourcen gespeicherten Identitätsinformationen und Authentifizierungsmöglichkeiten ermöglicht. Üblicherweise ist das die Anbindung an einen LDAP- bzw. Kerberos-Server. • Es ist auch möglich, SSSD so zu konfigurieren, dass diese Informationen am lokalen System gecached werden und damit auch bei Ausfall des Netzwerkes gearbeitet werden kann. • Weiters können mehrer Verwaltungsdomains verwendet werden, sprich, Informationen aus z.B. mehreren LDAP-Servern. • Damit kann SSSD statt den Paketen libpam-krb5, libnss-ldap und libpam-ldap verwendet werden und hat den Vorteil, dass alles über einen Daemon läuft und an einer Stelle konfiguriert werden kann. • Zur Verwendung muss das Paket sssd installiert werden. Zusätzlich sollten auch noch die Pakete sssd-ldap (für die LDAP-Anbindung) bzw. sssd-krb5 (für die Kerberos-Anbindung) installiert werden. SSSD - Konfiguration - Allgemein • SSSD wird über die Datei /etc/sssd/sssd.conf konfiguriert (siehe man 5 sssd.conf). Damit SSSD diese Datei akzeptiert, müssen der Besitzer und der Gruppenbesitzer „root“ und die Rechte „0600“ sein. • Die Syntax orientiert sich am INI-Format, d.h. Sektionen werden mit „[Name]“ eingeleitet, darauf folgen Schlüssel-Wert-Paare im Format „Schlüssel = Wert“. Kommentarzeilen sind alle Zeilen, die mit einem Hash-Zeichen beginnen. • In der Sektion „[sssd]“ werden die globalen Einstellungen konfiguriert: • config_file_version: Gibt die Version der Datei an und muss vorhanden sein mit dem Wert „2“. • services: Gibt die Services an, die verwaltet werden sollen. Für uns interessant sind „pam“ und ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 115 von 139 „nss“, es gäbe z.B. auch noch „sudo“ und „ssh“. • • domains: Enthält die Namen der zu verwenden Domains. Jede Domain muss in einer eigenen Sektion konfiguriert werden. In den Sektionen „[nss]“ und „[pam]“ können allgemeine Einstellungen zu diesen Services konfiguriert werden. Bei „[nss]“ könnte hier z.B. der Wert des Home-Verzeichnisses eines Benutzers modifiziert werden. SSSD - Konfiguration - Domains • In den Domain-Sektionen können die einzelnen Verwaltungsdomains konfiguriert werden. Diese Sektionen haben als Namen „[domain/DOMAIN_NAME]“. • Wichtige Optionen sind: • id_provider: Gibt an, von wo die Identitätsinformationen geholt werden. Mögliche Werte sind z.B. „proxy“ (über einen NSS-Provider) und „ldap“ (aus einem LDAP-Verzeichnis). • auth_provider: Gibt an, wie die Authentifizierung gemacht wird. Mögliche Werte sind z.B. „proxy“ (für die Weiterleitung an ein PAM-Modul), „ldap“ (LDAP-Authentifizierung) und „krb5“ (KerberosAuthentifizierung). • chpass_provider: Gibt an, wie Passwortänderungen gemacht werden. Mögliche Werte sind z.B. „proxy“ (für die Weiterleitung an ein PAM-Ziel), „ldap“ (um ein LDAP-Passwort zu ändern) und „krb5“ (um ein Kerberos-Passwort zu ändern). • Die einzelnen Provider müssen natürlich noch entsprechend konfiguriert werden. • An Benutzernamen einer Domain kann optional „@DOMAIN_NAME“ angehängt werden, damit SSSD nur diese eine Domain benutzt. Ansonsten wird die erste Domain, in der der Benutzername vorkommt, verwendet. SSSD - Konfiguration - LDAP • SSSD kann LDAP für Identitätsinformationen, Authentizifierung und Passwortänderungen benutzen. • Die Informationen im LDAP müssen entweder dem RFC2703, RFC2703bis oder dem Active Directory Schema folgen. Allerdings können über Optionen alle benötigten Attribute auf andere Attribute abgebildet werden. Damit könnten z.B. das Problem umgangen werden, wenn der Benutzername nicht wie erwartet im Attribut „uid“, sondern im Attribut „username“ gespeichert ist. • Die wichtigsten Optionen sind (siehe man 5 sssd-ldap): • ldap_uri: Der oder die URIs der LDAP-Server. • ldap_search_base: Die Suchbasis (meist die Wurzel des abzufragenden DIT) • ldap_default_bind_dn: Der DN, mit dem sich SSSD gegen den LDAP-Server authentifizieren soll • ldap_default_authtok: Das Passwort für den DN • Wichtig: SSSD verweigert die Authentifizierung, wenn die Verbindung zum LDAP-Server nicht geschützt ist, z.B. durch TLS. • Es ist natürlich auch möglich, SSSD über GSSAPI (Kerberos) am LDAP-Server zu authentifizieren. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 116 von 139 SSSD - Konfiguration - Kerberos, Proxy • SSSD kann Kerberos für Authentifizierung verwenden. Die wichtigsten Optionen sind (siehe man 5 sssd-krb5): • • krb5_server: Der oder die Kerberos-Server • krb5_realm: Der Name des Kerberos-Realms • krb5_keytab: Die keytab-Datei, die zur Validierung der Tickets verwendet wird (Default ist /etc/krb5.keytab; SSSD muss Zugriff darauf haben) Der „proxy“-Provider für SSSD erlaubt die Kombination mit beliebigen NSS- bzw. PAM-Ziele. Es gibt nur zwei Optionen: • proxy_lib_name: Der Name einer NSS-Bibliothek (z.B. „files“) • proxy_pam_target: Ein PAM-Target, an das die Authentifizierung delegiert wird SSSD - Beispiel: Reine LDAP-Anbindung [sssd] services = nss, pam domains = ICT config_file_version = 2 [domain/ICT] enumerate = true id_provider = ldap auth_provider = ldap chpass_provider = ldap ldap_uri = ldap://localhost ldap_search_base = dc=ict In dieser Konfiguration wird alles über den LDAP-Server abgewickelt. SSSD - Beispiel: Kerberos mit lokalen Benutzern [sssd] services = nss, pam domains = HOST95.ICT config_file_version = 2 [domain/HOST95.ICT] id_provider = proxy proxy_lib_name = files auth_provider = krb5 krb5_server = host95.ict krb5_realm = HOST95.ICT In dieser Konfiguration werden die Identitätsinformationen von den lokalen Dateien geholt und die Authentifizierung über Kerberos erledigt. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 117 von 139 OpenLDAP - Beispielszenario • Der LDAP-Server ist in einer Grundkonfiguration fertig und nun kann das LDAP-Verzeichnis organisiert, i.e. hierarchisch gegliedert, und mit Objekten befüllt werden. Zum Beispiel könnte man Äste für Organisationseinheiten erstellen und darunter Objekte speichern, die Computer, Benutzer und Gruppen innerhalb dieser Organisationseinheiten beschreiben. • Im Beispielszenario werden wir zwei Organisationseinheiten, eine für Personen und eine für Gruppen, definieren und dann einen Beispielbenutzer und eine Beispielgruppe hinzufügen. • Zum Abschluss wird SSSD so eingerichtet, dass sich ein LDAP-Benutzer am System einloggen kann. OpenLDAP - Beispielszenario - Benötigte Objekte dn: ou=users,dc=ict ou: users objectClass: organizationalUnit dn: ou=groups,dc=ict ou: groups objectClass: organizationalUnit dn: cn=ict-group,ou=groups,dc=ict cn: ict-group gidNumber: 20000 objectClass: posixGroup dn: cn=ict,ou=users,dc=ict uid: ict uidNumber: 20000 gidNumber: 20000 cn: ict sn: Nescio givenName: Nomen gecos: Nomen Nescio objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount loginShell: /bin/bash homeDirectory: /home/ict OpenLDAP - Beispielszenario - Benötigte Objekte • Die Einträge werden mit folgendem Befehl dem Verzeichnis hinzugefügt: $ ldapadd -x -D cn=admin,dc=ict -W -f /tmp/daten.ldif • Jetzt muss noch das Passwort für den Benutzer gesetzt werden: $ ldappasswd -D cn=admin,dc=ict -x -W -S "cn=ict,ou=users,dc=ict" Achtung: Zuerst wird das Authentifizierungspasswort! • zu setzende Passwort zweimal abgefragt, dann erst das Nun können die Einträge auch abgefragt werden: ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 118 von 139 $ ldapsearch -xLLL -b dc=ict '(uid=ict)' dn: cn=ict,ou=users,dc=ict uid: ict uidNumber: 20000 gidNumber: 20000 cn: ict sn: Nescio givenName: Nomen gecos: Nomen Nescio objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount loginShell: /bin/bash homeDirectory: /home/ict OpenLDAP - Beispielszenario - Systemeinbindung • Nachdem im LDAP-Verzeichnis Benutzer und Gruppen definiert sind, werden wir das System so anpassen, dass diese auch am System aufscheinen (NSS) und Benutzer sich authentifizieren können (PAM). • Dazu verwenden wir SSSD und passen die Datei /etc/sssd/sssd.conf entsprechend an. Folgender Abschnitt muss hinzugefügt werden: [domain/ICT] enumerate = true id_provider = ldap auth_provider = ldap chpass_provider = ldap ldap_uri = ldap://localhost ldap_search_base = dc=ict Anschließend muss noch im Abschnitt „[sssd]“ die Domain aktiviert und der SSSD neu gestartet werden. • Zum Testen, ob alles funktioniert hat, kann getent verwendet bzw. das Einloggen getestet werden. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 119 von 139 Foliensatz 8 Paketfilter Inhalt • Paketfilter/Firewall mit iptables • NAT mit iptables • iptables konfigurieren mit Puppet Paketfilter • Ein Paketfilter verarbeitet Netzwerkpakete, d.h. er entscheidet auf Grund von bestimmten Merkmalen eines Pakets und seiner Konfiguration, was mit einem Paket gemacht werden soll. Die Palette reicht dabei von annehmen oder verwerfen bis hin zur Änderungen von Informationen im Paket selbst. • Paketfilter werden z.B. zur Implementierung von Firewalls benutzt. Eine Firewall kann dabei der Sicherung eines ganzen Netzwerks (externe Firewall) oder eines einzelnen Computers dienen. • Wenn ein einzelner Computer geschützt werden soll, so wird die Paketfilter-Software auf dem Computer selbst installiert und der Administrator muss sicherstellen, dass Schadprogramme die Paketfilter nicht manipulieren. • Eine externe Firewall hat den Vorteil, dass sie vor Manipulationen besser geschützt ist und bietet, weil sie üblicherweise durch eine dezidierte Hardware implementiert ist, meist besseren Schutz und höhere Geschwindigkeit. • Es gibt verschiedene Arten, wie eine Firewall Netzwerkzugriffe unterbinden kann, z.B. durch das Sperren von bestimmten IP-Adressen (Internetschicht) oder das Sperren von bestimmten Ports oder durch anderen Informationen (Transportschicht). Paketfilter in Linux - netfilter • Die Paketfilterung in Linux wird durch das netfilter-Framework, das Teil des Linux-Kernels ist, bewerkstelligt. • Dieses Framework ermöglicht neben der zustandslosen und zustandsorientierten Paketfilterung auch Adressübersetzung (z.B. NAT), zusätzliche Paketmanipulationen (z.B. connection tracking) und Logging. • Der für uns interessante Bestandteil des netfilter-Frameworks heißt iptables. Dieser umfasst mehrere Kernelmodule, die die verschiedenen Funktionalitäten implementieren (dadurch kann das Framework leicht erweitert werden), und ein gleichheißendes Programm zur Verwaltung der Regeln. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 120 von 139 Paketfilter in Linux - netfilter - Fortsetzung • Die Implementierung der Paketfilter-Mechanismen direkt im Kernel hat den Vorteil, dass die IPPakete sehr schnell verarbeitet werden können. • Randnotiz: Der erste Paketfilter hieß ipfw, basierte auf BSD-Code und wurde 1994 implementiert. Mitte 1998 wurde dann für Linux 2.2 ein neuer Paketfilter namens ipchains eingeführt, der dann von iptables abgelöst wurde. Aber auch die Tage von iptables sind gezählt, denn diese Implementierung soll durch die schnelleren nftables abgelöst werden. Links: Homepage des netfilter-Frameworks, Fruzentux iptables Tutorial, Linux 2.4 Packet Filtering HOWTO, man iptables, man iptables-extensions. iptables - Tabellen und Ketten • Mit Hilfe des iptables-Befehls werden Filterregeln in Filterketten (chains) hinterlegt, die wiederum zu Tabellen (tables) gehören. Die Filterregeln legen fest, wie Pakete verarbeitet werden sollen. • Die standardmäßig vorhandenen /proc/net/ip_tables_names): • Tabellen sind (alle vorhandenen • filter: Die Standardtabelle, in der man allgemeine Filter hinterlegen kann. • nat: Eine spezielle Tabelle für NAT (network address translation). • mangle: Eine spezielle Tabelle für Veränderungen an Paketen. sieht man in In der Standardtabelle filter gibt es immer die folgenden drei Filterketten: • INPUT: Für Pakete, die lokal zugestellt werden sollen. • FORWARD: Für Pakete, die der Computer weiterleiten soll. • OUTPUT: Für Pakete, die lokal generiert werden. • Zusätzlich zu den diesen Ketten können auch weitere Ketten angelegt werden. • Da die Tabellen im gesicherten Speicher des Kernels hinterlegt sind, muss man die Regeln beim Start des Systems in den Kernel laden (z.B. mittles der Befehle iptables-save und iptablesrestore). iptables - Durchlaufen der Tabellen und Ketten ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 121 von 139 Achtung: Nicht alle Ketten sind eingetragen! Siehe auch: Traversing of tables and chains iptables - Filterregeln und deren Verarbeitung • In einer Filter-Kette werden die eigentlichen Regeln hinterlegt, die der Reihe nach durchgearbeitet werden. • Eine Regel besteht dabei aus einer oder mehreren Bedingungen und einem Ziel, das angibt, was mit einem passenden Paket gemacht werden soll. • • Es gibt sehr viele Bedingungen, die man verwenden kann. Meist braucht man aber nur einen kleinen Teil davon. • Ein Ziel kann entweder der Name einer Kette sein (dann werden die Regeln dieser Kette der Reihe nach abgearbeitet) oder ein spezielles Ziel (ACCEPT, DROP, …). Passen alle Bedingungen einer Regel auf ein Paket, so wird diese Regel angewandt und zu dem in der Regel definierten Ziel gesprungen. Falls eine Regel nicht passt, wird die nächste Regel in der Kette probiert. Passen alle Regeln einer Kette nicht, so wird zum Standardziel der Kette (chain policy, nur für eingebaute Ketten) gesprungen. iptables - Chain Policy • Je nachdem, ob als Standardziel einer Kette ACCEPT oder DROP verwendet wird, spricht man von einem Blacklist- oder Whitelist-Filterdesign. • Verwendet man eine Blacklist, so ist grundsätzlich alles erlaubt, was nicht explizit verboten wurde. Daher ist das Standardziel ACCEPT und die Filterregeln bestimmen, welche Pakete abgelehnt werden sollen. • Im Gegensatz dazu wird bei einer Whitelist von vorne herein nichts erlaubt. D.h. das Standardziel ist DROP und die Filterregeln bestimmen, welche Pakete dennoch durchgelassen werden. • Wenn man davon ausgehen kann, dass es nur wenige, „falsche“ Pakete gibt, so eignet sich dafür eine Blacklist. Obwohl der Whitelist-Ansatz meist ein wenig aufwändiger zu implementieren ist (z.B. muss für jeden neuen Dienst zumindest eine Regel hinzugefügt werden), ist er inhärent sicherer und man ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 122 von 139 hat mehr Kontrolle. iptables - Ziele • • Es gibt drei eingebaute Ziele: • ACCEPT: Paket akzeptieren. • DROP: Paket verwerfen und keine Rückmeldung an den Sender schicken. • RETURN: Aktuelle Kette verlassen und bei der nächsten Regel der vorigen Kette weitermachen. Weiters gibt es auch noch einige durch Erweiterungen verfügbare Ziele: • LOG: Informationen zum Paket in das Kernel-Log schreiben. Achtung: Es wird bei der nächsten Regel weitergemacht! • REJECT: Paket verwerfen, aber zusätzlich ein Antwortpaket zurückschicken. Mittels der Option --reject-with Typ wird festgelegt, welches Antwortpaket zurückgeschickt wird, standardmäßig wird „Port nicht verfügbar“ (icmp-port-unreachable) verwendet. iptables Befehl - Allgemeines iptables, ip6tables - Administrieren der IPv4/IPv6 Paketfilter. » Das sind die Programme, mit denen man die Paketfilter im Kernel verwalten kann. Man braucht root-Rechte für das Ausführen. » Es unterstützt alle Filtermethoden, die durch Kernel-Module bereitgestellt werden, d.h. man braucht wirklich nur dieses Programm. » Alle Unterbefehle (zum Erstellen/Löschen von benutzerdefinierten Ketten und Verwalten von Ketten) sind ähnlich aufgebaut und unterstützen eine Unmenge von Optionen. Wir sehen uns die Unterbefehle der Reihe nach an. » Standardmäßig wird die filter-Tabelle benutzt. » Globale Optionen: • -t TABELLE → Die angegebene Tabelle anstatt der filter-Tabelle verwenden. • -n → Keine Namensauflösung durchführen. • -v → Detailierte Ausgabe verwenden. • --line-numbers → Zeilennummer bei Regeln anzeigen. iptables Befehl - Ketten verwalten Optionen zum Verwalten von Ketten » -L [Kette] → Anzeigen der Regeln der spezifizierten Kette oder von allen Ketten. » -N Kette → Eine neue, benutzerdefinierte Kette anlegen. » -F [Kette] → Alle Regeln der spezifizierten Kette oder aller Ketten löschen. » -X [Kette] → Die spezifizierte oder alle benutzerdefinierten Ketten löschen (dürfen keine Regeln enthalten und auch nirgends referenziert werden). » -Z [Kette] → Die Zähler der spezifizierten Kette oder aller Ketten zurücksetzen. » -P Kette Ziel → Das Standardziel der Kette definieren. » # Zurücksetzen auf den Ursprungszustand $ iptables -F $ iptables -X ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 123 von 139 $ $ $ $ iptables iptables iptables iptables -Z -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT iptables Befehl - Regeln verwalten Optionen zum Verwalten von Regeln » -A Kette Regel → Anfügen einer Regel an eine Kette. » -D Kette Regel|Zeile → Löschen einer Regel (durch Angabe der Regel oder der Zeilennummer). » -I Kette [Zeile] Regel → Einfügen der Regel in die erste oder der spezifizierten Zeile. » -R Kette Zeile Regel → Ersetzen der Regel in der spezifizierten Zeile. » -j Ziel → Spezifiziert das Ziel einer Regel. » # Einige Beispielaufrufe $ iptables -A INPUT -p tcp -j $ iptables -D INPUT -p tcp -j $ iptables -I INPUT -p tcp -j $ iptables -I INPUT -p udp -j $ iptables -L INPUT Chain INPUT (policy ACCEPT) target prot opt source DROP udp -- anywhere DROP tcp -- anywhere DROP DROP # oder: iptables -D INPUT 1 DROP DROP destination anywhere anywhere iptables Befehl - Standardbedingungen Nützliche Standardbedingungen für Regeln » -p Protokoll → Angabe des Protokolls (z.B. tcp oder udp). » -i Schnittstelle → Angabe der Netzwerkschnittstelle, über die das Paket hereingekommen ist (z.B. lo oder eth0). » -o Schnittstelle → Angabe der Netzwerkschnittstelle, über die das Paket versandt werden wird. » -s Quelladresse → Angabe der Quell-IP oder des Quell-Netzes (z.B. 131.130.16.0/22). » -d Zieladresse → Angabe der Ziel-IP oder Ziel-Netzes. » Das Voranstellen eines Rufzeichens vor einer der obigen Bedingungen invertiert die Bedingung. » -m Modul → Modul für erweiterte Bindungen verwenden. » # $ # $ Alle Pakete iptables -A Alle Pakete iptables -A wegwerfen, außer die von einem bestimmten Netz INPUT ! -s 131.130.16.0/22 -j DROP an eine bestimmte IP wegwerfen OUTPUT -o eth0 -d 131.130.16.5 -j DROP iptables Befehl - Bedingungen für TCP/UDP/ICMP Zusätzliche Bedingungen für TCP/UDP/ICMP » -m tcp → Bedingungen für TCP-Pakete (wenn -p tcp) • --sport Port → Quellport • --dport Port → Zielport • --tcp-flags Maske Vergleich → Betrachtet alle über „Maske“ festgelegten Flags; alle in „Vergleich“ gelisteten müssen gesetzt sein, die anderen fehlen. • --syn → Paket, bei dem das SYN-Flag gesetzt und RST-, ACK- und FIN-Flags nicht gesetzt sind (erstes Paket bei Verbindungsaufbau) » -m udp → Bedingungen für UDP-Pakete (wenn -p udp) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 124 von 139 • --sport Port → Quellport • --dport Port → Zielport » -m icmp/icmp6 → Bedingungen für ICMP(v6)-Pakete (wenn -p icmp(6)) • --icmp-type Typ, --icmpv6-type Typ → ICMP(v6)-Pakete des angegebenen Typs » # Das erste Paket einer TCP-Verbindung akzeptieren $ iptables -A INPUT -p tcp --tcp-flags SYN,RST,ACK,FIN SYN -j ACCEPT # äquivalent zu: --syn # Alle Pakete an TCP-Port 80 zulassen $ iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables Befehl - Bedingungen für den Verbindungsstatus Zusätzliche Bedingungen für den Verbindungsstatus » Wie anfangs erwähnt, kann in Filterregeln der Zustand einer Verbindung berücksichtigt werden. Hinweis: Der Befehl conntrack aus dem gleichnamigen Paket erlaubt das Anzeigen der aktuell verfolgten Verbindungen. » -m state → Bedingungen für Verbindungsstatus • --state Status[,Status,...] → Verbindungsstatus muss einem der Werte entsprechen. Mögliche Werte: • NEW → Paket baut eine neue Verbindung auf. • ESTABLISHED → Paket gehört zu einer aufgebauten Verbindung. • RELATED → Paket hat eine neue Verbindung aufgebaut, steht aber in Beziehung zu einer bereits aufgebauten Verbindung (z.B. Datentransfer bei FTP). • INVALID → Paket gehört zu keiner bekannten Verbindung. » # Alle Pakete, die zu einer aufgebauten Verbindung gehören, zulassen $ iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables - Beispielkonfiguration # Pakete von der lokalen Schnittstelle werden immer akzeptiert $ iptables -A INPUT -i lo -j ACCEPT # Pakete von aufgebauten Verbindungen werden erlaubt $ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Pakete zum Verbindungsaufbau an den OpenSSH-Server sind erlaubt $ iptables -A INPUT -p tcp -m tcp --dport 22 --syn -j ACCEPT # $ $ $ Standardziele der Ketten zum Abschluss sinnvoll setzen iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables - IP-Forwarding • Der Linux-Kernel kann, wie auch in der Grafik zu Beginn gezeigt, Pakete von einer Schnittstelle an eine andere weiterleiten. Dazu muss aber der sysctl-Wert net.ipv4.ip_forward = 1 sein. • Die zur Weiterleitung bestimmten Pakete können dann in der FORWARD-Kette gefiltert werden. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 125 von 139 • Beispiel: # Erlauben des Weiterleitens von Paketen, die an Port 22 gehen $ iptables -A FORWARD -p tcp --dport 22 -j ACCEPT iptables - NAT • Network Address Translation (NAT) wird verwendet, um einen Addressbereich auf einen anderen abzubilden. Dies wird z.B. oft bei WLAN-Routern benutzt, um viele private IP-Adressen hinter einer öffentlichen zu verbergen. • Man unterscheidet zwischen Source NAT (SNAT) und Destination NAT (DNAT). Mit Hilfe von SNAT kann die Quelladresse/der Quellport, mit Hilfe von DNAT die Zieladresse/der Zielport eines Pakets verändert werden. • Unter Linux wird NAT mittels iptables eingerichtet. Dafür gibt es eine eigene nat-Tabelle mit den folgenden Standardketten: • PREROUTING: Zur Verarbeitung, sobald die Pakete von Netzwerk hereinkommen. • INPUT: Zur Verarbeitung von lokal zugestellten Paketen. • OUTPUT: Zur Verarbeitung von lokal erzeugten Paketen. • POSTROUTING: Zur Verarbeitung, bevor die Pakete ins Netzwerk gehen. iptables - NAT - Fortsetzung • Weiters gibt es drei spezielle Ziele: • SNAT: Für SNAT, nur gültig in den POSTROUTING- und INPUT-Ketten Mit --to-source [ipaddr][:port] kann die Quelladresse/der Quellport angegeben werden. SNAT wird z.B. benutzt, um viele IP-Adressen hinter einer zu verbergen. • DNAT: Für DNAT, nur gültig in den PREROUTING- und OUTPUT-Ketten. Mit --to-destination [ipaddr][:port] kann die Zieladresse/der Zielport angegeben werden. DNAT wird oft zum Weiterleiten von Ports verwendet, d.h. ein Computer kann damit eingehende Verbindungen an einen gewissen Port an einen anderen Computer weiterleiten: $ iptables -t nat -A PREROUTING -p tcp --dport 12299 -j DNAT --to-destination 10.10.10.199:22 • MASQUERADE: Nur gültig in der POSTROUTING-Kette. Dieses Ziel ist eine Variante von SNAT, die automatisch die Quelladdresse der Netzwerkschnittstelle benutzt, über die das Paket verschickt wird. Dies ist vor allem für Netzwerkschnittstellen ohne statische IP-Adressen nützlich. $ iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -j MASQUERADE iptables - Konfiguration mit Puppet • Um iptables mit Puppet zu verwalten, verwendet man am besten das puppetlabs/firewall Modul. Dieses erlaubt die Nutzung aller iptables-Befehle, um den Packetfilter zu konfigurieren. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 126 von 139 • Die Regeln werden automatisch durch Benutzung des Pakets iptables-persistent dauerhaft gespeichert. • Zuerst konfiguriert man das System so, dass alle nicht von Puppet verwalteten Regeln gelöscht werden: resources {'firewall': purge => true, } • Bei den Regeln, die über die Ressource firewall definiert werden, muss man im Namen am Anfang eine Zahl angeben, welche benutzt wird, um die Regeln zu sortieren. iptables - Konfiguration mit Puppet - Fortsetzung • Anschließend erstellt man eine Grundkonfiguration, damit man bei der Aktivierung der Regeln nicht aus dem System gesperrt wird: class firewall_pre { Firewall { require => undef, } firewall { '000 Akzeptieren von ICMP-Paketen': proto => 'icmp', action => 'accept', }-> firewall { '001 Akzeptieren von Paketen von der Loopback-Schnittstelle': proto => 'all', iniface => 'lo', action => 'accept', }-> firewall { '002 Verwerfen von lokalen Paketen, die nicht auf der LoopbackSchnittstelle sind': iniface => '! lo', proto => 'all', destination => '127.0.0.1/8', action => 'reject', }-> firewall { '003 Akzeptieren von Paketen von verwandten/aufgebauten Verbindungen': proto => 'all', state => ['RELATED', 'ESTABLISHED'], action => 'accept', } } iptables - Konfiguration mit Puppet - Fortsetzung • Dann werden noch Regeln gebraucht, um die restlichen Pakete zu verwerfen: class firewall_post { firewall { '999 Verwerfen von allen Paketen: proto => 'all', action => 'drop', before => undef, } ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 127 von 139 } • Der letzte Schritt ist das Aktivieren der obigen Konfiguration: Firewall { before => Class['firewall_post'], require => Class['firewall_pre'], } class { ['firewall_pre', 'firewall_post']: } class {'firewall': } iptables - Konfiguration mit Puppet - Fortsetzung • Jetzt können die eigentlichen Regeln definiert werden: firewall { "100 Pakete an den SSH-Server erlauben": proto => 'tcp', dport => 22, action => accept, } firewall { "100 DNAT zur Portweiterleitung": table => 'nat', chain => 'PREROUTING', proto => 'tcp', dport => "12299", jump => 'DNAT', todest => "10.10.10.199:22", } firewall { "100 SNAT/MASQUERADE von Paketen aus dem internen Netz": table => 'nat', proto => all, chain => 'POSTROUTING', source => '10.10.10.0/24', jump => 'MASQUERADE', } ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 128 von 139 Foliensatz 9 Netzwerkdateisysteme NFS und CIFS Inhalt • Network File System (NFS) • Common Internet File System (CIFS) Network File System (NFS) • Das Network File System (NFS) (definiert in RFC 1094, RFC 1813, RFC 7530 und RFC 5661) wurde ursprünglich von Sun Microsystems entwickelt und erlaubt den Zugriff auf Dateien über ein Netzwerk. • Am Server liegen die Dateien nicht in einer Datenbank oder etwas Ähnlichem, sondern sind in einem normalen Dateisystem (z.B. EXT4) gespeichert. • Es gibt verschiedene Versionen von NFS. Derzeit kommen die Versionen NFSv3, NFSv4 und NFSv4.1 zum Einsatz. Hauptvorteile von NFSv4 sind: • • Authentifikation von Benutzern, nicht nur Hostauthentifikation • Unterstützung von access control lists (ACLs) für erweiterte Zugriffsrechte • Datenübertragung nur mehr über TCP, weil das Protokoll nicht mehr zustandslos ist • Früher benötigte Serverdienste wie portmapper, rpc.mountd und rpc.lockd werden nicht mehr gebraucht Alle gängigen UNIX-/Linux-/BSD-Systeme unterstützen mittlerweile sowohl NFSv3 als auch NFSv4 und NFSv4.1. In aktuellen Windows-Versionen gibt es auch Unterstützung für NFSv3 und NFSv4.1. NFSv4 - Überblick • Da NFSv4 gegenüber NFSv3 viele Vorteile bietet, sollte, wenn möglich, nicht mehr NFSv3 eingesetzt werden. Dies wird dadurch erleichtert, dass NFSv4 in einem zu NFSv3 ähnlichen Modus ohne Benutzerauthentifikation betrieben werden kann. Wir betrachten ab jetzt nur mehr NFSv4, das meiste ist aber auch für NFSv3 gültig. • NFS basiert auf Open Network Computing (ONC) Remote Procedure Call (RPC). Das ist ein System, mit dem Applikationen Nachrichten über das Netzwerk austauschen können. Dabei sieht es für den Programmier so aus, als würde er nur lokal Nachrichten austauschen. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 129 von 139 NFSv4 - Authentifizierung • Die Authentifizierung erfolgt über RPC und nicht direkt über NFSv4. • Der einfachste Mechanismus, und der einzig sinnvolle, der vor NFSv4 verfügbar war, ist AUTH_SYS. Dabei werden einfach die UID, die primäre GID und die sekundären GIDs mitgeschickt. Damit kann dann der Zugriff auf Dateien am Server gesteuert werden. Da der Server aber nicht feststellen kann, ob der Benutzer sich am Client wirklich authentifiziert hat, ist diese Variante nicht sicher und sollte nur verwendet werden, wenn sowohl das Netzwerk als auch alle Rechner darin gesichert sind. • Mit NFSv4 wurde die Authentifizierung über GSS-API eingeführt, wobei sowohl Server als auch Clients Kerberos V5 via GSS-API unterstützen müssen. Man kann sich auf drei Arten via Kerberos verbinden: • Nur beidseitige Authentifizierung via Kerberos (krb5) • Beidseitige Authentifizierung via Kerberos und Integritätschecks (krb5i) • Beidseitige Authentifizierung via Kerberos und Verschlüsselung (krb5p) NFSv4 - Abbilden von Benutzern und Gruppen • Nachdem jeder Datei ein Benutzer und eine Gruppe zugeordnet ist, müssen diese Informationen auch per NFS übertragen werden. • Vor NFSv3 wurden einfach die UID und GID übertragen. Der Systemadministrator musste daher sicherstellen, dass auf dem Server und den Clients die Zuordnung von Benutzer-/Gruppennamen zu UIDs/GIDs übereinstimmt. Außerdem konnte damit NFS nur eingesetzt werden, wenn es am Client überhaupt so etwas wie eine UID gab. • Um diese beiden Probleme zu beheben, werden bei NFSv4 nicht mehr UID und GIDs über das Netzwerk übertragen, sondern Zeichenketten der Form „user@domain“ bzw. „group@domain“. Damit aber die Kompatibilität zu NFSv3 gewahrt bleibt, ist es weiterhin möglich, statt Namen UIDs und GIDs zu übertragen (siehe RFC 7530, Sektion 5.9). Diese Möglichkeit besteht aber nur, wenn nicht Kerberos verwendet wird und beide Seiten, Server und Client, sie unterstützen (was nicht der Fall sein muss!). NFSv4 - Abbilden von Benutzern und Gruppen unter Linux • Die NFS-Implementierung des Linux-Kernels unterstützt die Übertragung von UIDs und GIDs. • Standardmäßig ist diese Unterstützung aktiviert, d.h. es werden bei Verwendung von AUTH_SYS UIDs und GIDs übertragen. Durch Änderung der Modulparameter nfs.nfs4_disable_idmapping (für den Client) sowie nfsd.nfs4_disable_idmapping (für den Server) kann diese Unterstützung aber deaktiviert werden. • Das Zuordnen von UID/GID zu einem Namen erfolgt durch einen ID-Mapping-Dienst am Client bzw. Server. Unter Linux gibt es dafür zwei Möglichkeiten: die alte Variante mittels des rpc.idmapd Daemons oder die neue mittels des nfsidmap Programms. Standardmäßig wird die neue Variante verwendet und die alte nur dann, wenn die neue Variante ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 130 von 139 nicht konfiguriert ist. • Beide Varianten verwenden zur Konfiguration /etc/idmapd.conf. Dort solle man den Domain-Teil festlegen, wenn er nicht der DNS-Domain entspricht. NFSv4-Server einrichten • Es empfiehlt sich, dass am Server sowie auf den Clients die gleichen Benutzer die gleichen UIDs besitzen. Dies ist zwar nicht mehr unbedingt nötig, beugt aber Problemen vor (vor allem, wenn Kerberos nicht eingesetzt wird). • Unter Ubuntu werden alle nötigen Programme bei der Installation des Pakets nfs-kernel-server installiert und nach der Installation laufen alle benötigten Dienste mit den Standardeinstellungen. • Da nur NFSv4 angeboten werden soll, muss in /etc/default/nfs-kernel-server bei RPCMOUNTDOPTS die Optionen --no-nfs-version 3 --no-nfs-version 2 hinzugefügt und das nfs-kernel-server Service neugestartet werden. • In /etc/idmapd.conf muss der Domainnname der NFS-Domain festgelegt werden (außer er entspricht der DNS-Domain). Weiters sollen keine numerischen IDs unterstützt werden, daher müssen die entsprechenden Kernelmodulparameter geändert werden, i.e. die Datei /etc/modprobe.d/nfs.conf mit folgendem Inhalt anlegen: options nfs nfs4_disable_idmapping=N options nfsd nfs4_disable_idmapping=N NFSv4-Server einrichten - Exports • Nachdem die Dienste entsprechend eingerichtet worden sind, muss dem NFS-Server noch mitgeteilt werden, welche Verzeichnisse exportiert werden sollen. Dazu braucht man die Datei /etc/exports und den Befehl exportfs. • In der Datei /etc/exports werden die Verzeichnisse mit den dazugehörigen Optionen eingetragen, die man freigeben will. Jede Zeile enthält ein Verzeichnis und dann eine Liste von Rechnern (durch Leerzeichen getrennt), die darauf zugreifen können. Direkt nach der Angabe von Rechnern können Optionen in runden Klammern angegeben werden. /srv/exports hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) • Wichtig: Bei NFSv4 müssen (im Gegensatz zu NFSv3) alle Verzeichnisse unter einem Wurzelverzeichnis liegen. Das heißt, wenn das Wurzelverzeichnis /srv/exports ist, müssen alle zu exportierenden Verzeichnisse in diesem Verzeichnis liegen. Will man ein schon existierendes Verzeichnis exportieren, so muss man ein bind-Mount machen. NFSv4-Server einrichten - Exports Optionen • Einige wichtige Export-Optionen: • sec=Security → Authentifizierungsvariante angegben („sys“, „krb5“, „krb5i“ und „krb5p“) • rw → Lese- und Schreibzugriff ist möglich (sonst nur Lesezugriff) • sync → Synchroner Zugriff (Antwort von Server erst, nachdem Änderungen geschrieben worden sind) • no_subtree_check → Keine Überprüfung von Unterverzeichnissen (sollte man fast immer verwenden) ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 131 von 139 • • fsid=Wert → Angabe einer eindeutigen ID für das exportierte Verzeichnis (unter NFSv4 muss man die Wurzel der exportierten Verzeichnisse mit fsid=root exportieren) • [no_]root_squash → Den Administrator (nicht) auf den anonymen Benutzer abbilden Nach dem Eintragen der zu exportierenden Verzeichnisse müssen die Änderungen dem NFS-Server mitgeteilt werden: $ exportfs -rav NFSv4-Server einrichten - Kerberos • Sowohl für den Server als auch für den Client wird ein Principal der Form nfs/FQDN@REALM in /etc/krb5.keytab gebraucht. • In /etc/idmapd.conf muss das Kerberos-Realm als NFS-Domain angegeben werden. • Danach muss am Server das nfs-kernel-server Service neugestartet und am Client das rpc-gssd gestartet werden. Die Services rpc-gssd bzw. rpc-svcgssd sind für die Authentifizierung via GSS/Kerberos nötig. • Nun muss noch die Datei /etc/exports angepasst werden. Damit die Authentifizierung via Kerberos verwendet wird, muss bei den exportierten Verzeichnisse bei der Option sec= zusätzlich entweder krb5, krb5i oder krb5p angegeben werden. NFS-Client einrichten • Der ID-Mapper am Client muss gleich wie am Server konfiguriert werden, d.h. die NFS-Domain muss übereinstimmen. • Weiters muss auch der Modulparameter nfs.nfs4_disable_idmapping mit der Einstellung am Server übereinstimmen. • Anschließend braucht man das Netzwerkdateisystem nur wie ein normales Dateisystem einhängen. Die URIs, die NFS verwendet, haben die Form hostname:/Pfad/zu/Verzeichnis. $ mount -t nfs4 server:/ /mnt • Um ein NFS-Verzeichnis mittels Kerberos zu mounten, muss als Mount-Option „sec=krb5“ oder eine Variante davon verwendet werden. Common Internet File System (CIFS) • Das Common Internet File System (CIFS), auch bekannt unter Server Message Block (SMB), ist, wie NFS, ein Netzwerkdateisystem. Allerdings bietet es darüber hinaus auch noch andere Möglichkeiten, zum Beispiel Druckerfreigaben. • Das Protokoll wurde ursprünglich Anfang der 1980er Jahre bei IBM entwickelt und später stark von Microsoft weiterentwickelt. Änderungen im Protokoll müssen von Microsoft auf Druck der EU seit einige Jahren veröffentlicht werden, damit andere als die Microsoftimplementierung ohne ReverseEngineering möglich sind. • Unter Unix-artigen Betriebssystemen gibt es seit 1992 die freie Software Samba, die die Kommunikation über SMB bzw. CIFS ermöglicht. Die aktuelle Version von Samba ist Version 4, die es nun auch ermöglicht, einen Active Directory-Domain Controller zu betreiben. Damit kann man mit Samba ohne Microsoft-Server ein Windows-Netzwerk betreiben. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 132 von 139 Samba-Server einrichten - Basiskonfiguration • Unter Ubuntu werden die benötigten Komponenten für den Server durch das Paket samba bereitgestellt (ab Ubuntu 14.04 wird damit Samba 4 installiert). • Im Gegensatz zu NFS umfasst ein Samba-Server viel mehr Komponenten und ist dementsprechend auch schwieriger aufzusetzen, auch wenn man nur die Netzwerkdateisystem-Komponente benutzen will. • Die Konfigurationsdatei /etc/samba/smb.conf wird sowohl für die Konfiguration des Servers als auch der Client-Programme verwendet. Es gibt eine Unmenge von einstellbaren Optionen. Die Konfiguration von Samba als Active Directory-Domain Controller sprengt den Rahmen der Vorlesung, wir werden uns nur mit der Freigabe von Dateien beschäftigen. • Wichtige Konfigurationsoptionen der Gruppe global: • workgroup → Der Name der Arbeitsgruppe bzw. der Domain • security → Bestimmt das verwendete Sicherheitsmodell, ist für unseren einfachen Fall auf user zu setzen Samba-Server einrichten - Shares konfigurieren • • Konfigurationsoptionen für die Gruppe homes (erlaubt das automatische Exportieren der HomeVerzeichnisse der Benutzer unter deren Benutzernamen, falls aktiviert) bzw. für allgemeine Shares: • read only → Sollte no sein, wenn auch Schreibzugriffe möglich sein soll • guest ok → Anonymen Zugriff auf das Share erlauben • path → Das zu exportierende Verzeichnis (nicht nötig für die Gruppe homes) Um ein Verzeichnis als Share zu exportieren, eine Optionengruppe mit dem Namen anlegen und darin die nötigen Optionen setzen: [home] path = /home guest ok = no read only = no • Hinweis: Die geänderte Konfigurationsdatei kann mittels samba-tool testparm auf Fehler überprüft werden. • Nach Änderungen an der Konfigurationsdatei müssen die Samba-Dienste neugestartet werden: $ systemctl restart nmbd smbd Samba-Server einrichten - Benutzer definieren • Samba benutzt für die Authentifikation von Benutzern eine eigene Datenbank oder, falls so konfiguriert, einen LDAP-Server (Option passdb backend). Das heißt, dass die am System definierten Benutzer nicht automatisch zum Zugriff auf den Samba-Server verwendet werden. • Damit ein Benutzer zugreifen kann, muss man ihn als Administrator in die Passwortdatenbank mittels smbpasswd aufnehmen. $ smbpasswd -a ict New SMB password: ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 133 von 139 Retype new SMB password: Added user ict. Benutzer können später mit Hilfe dieses Programmes auch ihr Samba-Passwort ändern. • Das Programm pdbedit kann von root auch für die Verwaltung der Passwortdatenbank genutzt werden: $ pdbedit -x praxis # Benutzer löschen $ pdbedit -a praxis # Benutzer hinzufügen $ pdbedit -L # Benutzer auflisten Samba-Client einrichten • Am Client-Rechner müssen die Pakete smbclient und cifs-utils installiert werden. Das erste stellt das Programm smbclient zur Verfügung, das zweite erlaubt das Einhängen eines Samba-Shares mittels mount.cifs. • Der Befehl smbclient agiert ähnlich wie ein FTP-Client-Programm und kann für die Interaktion mit einem CIFS-Dateiserver verwendet werden. $ smbclient -U ict -L //server # Auflisten aller Shares am Server $ smbclient -U ict //server/home # Verbinden zum Share home • Um ein CIFS-Share in das Dateisystem einzuhängen, verwendet man den Befehl mount.cifs, welcher wie der Befehl mount funktioniert. Die wichtigsten Optionen sind dabei user, pass und dom (Arbeitsgruppenname bzw. Domain), wobei das Passwort interaktiv abgefragt wird, wenn es nicht spezifiziert worden ist. $ mount.cifs //host99.ict/home /mnt -o user=ict,dom=ICT Password: Ein Nachteil dieser Methode ist, dass nur ein Benutzer auf so ein Share zugreifen kann, weil beim Mounten der Benutzername explizit angegeben werden muss. Samba-Server einrichten - Kerberos • Soll die Authentifizierung am CIFS-Server statt über Benutzername und Passwort mittels Kerberos funktionieren, so hat man prinzipiell zwei Möglichkeiten: • Man richtet Samba als komplette Active Directory Domain ein. Dies erfordert mehr Aufwand und ist auch komplizierter. • Oder man verwendet wirklich nur die Authentifizierung via Kerberos und sonst keine zusätzlichen Komponenten von Samba. Diese Variante betrachten wir. Achtung: Bei dieser Variante ist aber ein Anmelden mit Passwort nicht mehr möglich! • Es muss ein Kerberos-Principal cifs/FQDN@REALM erstellt werden und am Server in die /etc/krb5.keytab exportiert werden. • Weiters muss die Samba-Konfiguration folgendermaßen angepasst werden (statt „ICT“ den richtigen Kerberos-Realm einsetzen): workgroup = ICT ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 134 von 139 realm = ICT security = ads kerberos method = dedicated keytab dedicated keytab file = /etc/krb5.keytab Samba-Server einrichten - Kerberos - Fortsetzung • Jetzt kann auf die Shares des Servers nur mehr mittels Kerberos (oder als anonymer Benutzer, falls eingestellt) zugegriffen werden. Für smbclient verwendet man die Option -k (zuvor ein KerberosTicket holen): $ smbclient -L //server -k • Hat man Kerberos aktiviert, so ist es auch möglich, Shares mit der Option multiuser zu mounten. Damit kann ein CIFS-Share einmal z.B. beim Start des Computer gemountet werden und die Benutzer können mit ihren eigenen Rechten darauf zugreifen (so wie bei NFSv4). Dazu legt man fürs Mounten am besten einen eigenen Systembenutzer cifs-mount am CIFS-Server an, erzeugt einen Kerberos-Principal mit zufälligem Schlüssel für diesen Benutzer und exportiert diesen Schlüssel in die /etc/krb5.keytab-Datei am Client. Anschließend kann als Administrator das Share so gemountet werden: $ mount -o sec=krb5,dom=ICT,multiuser,user=cifs-mount //server/share /mountpoint ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 135 von 139 Foliensatz 10 Verschiedenes Inhalt • Webserver mit Apache • Druckserver mit CUPS • Überblick: DHCP- und DNS-Server • Überblick: Sicherheit Webserver • Man könnte sich die Welt heutzutage kaum mehr ohne das World Wide Web vorstellen. Das Web ist ein Teil des Internets und besteht aus Hypertext-Dokumenten, die durch Hyperlinks miteinandern verbunden sind. • Grundlage für den Datenaustausch ist das Hypertext Transfer Protocol (HTTP; definiert in RFC 1945, RFC 2616 und RFC 7540) bzw. die sichere Variante HTTPS (definiert in RFC 2818). • Um auf Inhalte im Web zuzugreifen, verwendet man im Allgemeinen einen Webbrowser. Dieser verbindet sich dann über HTTP mit einem Webserver und lädt die angeforderten Dokumente. • Gerade im Bereich der Webserver haben Unix-artige Betriebssysteme eine Vorrangstellung, speziell auch Linux. Und der Webserver schlechthin ist der Apache HTTP Server, der freie Software ist. Andere oft benutzte Webserver sind nginx und Microsoft Internet Information Services (IIS). Apache HTTP Server • Der Apache HTTP Server ist modular aufgebaut, d.h. man braucht nur die Komponenten installieren, die man auch wirklich verwendet, was Ressourcen schont. Zudem ist er sehr stabil und schnell. • Einige Funktionen des Servers: • Virtual Hosts zur Bereitstellung von Websites verschiedener Domänen • Verschlüsselung der Daten mittels SSL (HTTPS-Protokoll) mittels mod_ssl • Manipulieren von HTTP-Kopfdaten (mod_headers) oder URLs (mod_rewrite) • Einbinden dynamischer Inhalte mittels CGI, FastCGI, oder anderen Modulen (z.B. mod_passenger für die Programmiersprache Ruby) • Verschiedene Authentifizierungsmodule • Unterstützung von zusätzlichen Protokollen wie WebDAV ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 136 von 139 Apache HTTP Server einrichten 1 • Die Installation des Servers erfolgt mittels des Pakets apache2. Damit sind auch die wichtigsten Module bereits vorhanden. • Die Konfigurationsdateien befinden sich im Verzeichnis /etc/apache2. In diesem Verzeichnis befinden sich mehrere Dateien und Verzeichnisse, unter anderem: • apache2.conf → Die Hauptkonfigurationsdatei • conf-available/ → Verzeichnis für zusätzliche Konfigurationen • conf-enabled/ → Symlinks nach conf-available/ für die aktivierten Konfigurationen • mods-available/ → Konfigurationsdateien für die verfügbaren Module • mods-enabled/ → Symlinks nach mods-available/ für die aktivierten Module • sites-available/ → Konfigurationsdateien für einzelne Websites • sites-enabled/ → Symlinks nach sites-available/ für aktivierte Websites • Das (de)aktivieren von Konfigurationen, Modulen und Webseiten kann entweder händisch durch Setzen der entsprechende Links gemacht werden oder über die Progamme a2enconf, a2disconf, a2enmod, a2dismod, a2ensite und a2dissite. • Das Standard-Webserver-Verzeichnis ist /var/www/html. Alle darin vorhandenen Dateien können über den Webserver abgefragt werden. Apache HTTP Server einrichten 2 • Die Standardkonfiguration ist für einfache Websites, die nur statische Dateien benutzen, ausreichend. Falls man auch dynamische Webseiten generieren will, muss man die entsprechenden Module nachinstallieren (z.B. das Paket libapache2-mod-php5 für die Programmiersprache PHP5). Nicht vergessen die Module mit Hilfe von a2enmod zu aktivieren! • Die Apache Dokumentation liefert zu allen Modulen und Einstellungen genaue Informationen und auch Anwendungsbeispiele. Falls etwas unklar ist, sollte man dort als erstes nachsehen. Druckserver • In einer Netzwerkumgebung bzw. auf einem Mehrbenutzersystem gibt es an das Drucksystem spezielle Anforderungen, z.B.: • Druckaufträge von Benutzern dürfen nicht durcheinander geraten. • Druckaufträge sollen nach Priorität abgearbeitet werden. • Festlegen von erzwungenen Richtlinien soll möglich sein. • Diese Anforderungen können durch die Benutzung eines Druckserver erfüllt werden. Dabei werden Druckaufträge nicht direkt an den Drucker geschickt, sondern zuerst an eine Warteschlange (Queue) des Druckservers. Dieser arbeitet die Warteschlange nach dem FIFO-Prinzip (und/oder anderen Kriterien, z.B. Druckpriorität) ab. • Unter Mac OS X und Unix/Linux wird CUPS als Standarddruckserver verwendet. CUPS unterstützt die meisten gängigen Drucker sowie das Internet Printing Protocol (IPP), um die Druckdienste über ein Netzwerk anbieten zu können. • Andere Druckserver unter Linux sind lpd/lpr (ursprünglich von BSD) und das neuere lprng, welche beide das LPD-Protokoll verwenden. Auch Samba kann als Druckserver fungieren. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 137 von 139 CUPS • Die Installation des Servers erfolgt mittels des Pakets cups. Damit ist alles für die Verwendung installiert. Zusätzliche Druckertreiber finden sich in printer-driver-* Paketen. • Die Konfigurationsdateien befinden sich im Verzeichnis /etc/cups, die wichtigsten sind: • cupsd.conf → Konfigurationsdatei für den Druckserver • printers.conf → Konfigurationsdatei für die Drucker • ppd/ → Verzeichnis mit PPD-Dateien für jeden Drucker • Über das Paket cups-bsd sind die Programme lpr, lprm und lpq verfügbar, die die LPD-Befehle emulieren und so den Umstieg auf CUPS vereinfachen. • Nach dem Starten des Serverdienstes cupsd kann man den Druckserver über eine Webschnittstelle auf Port 631 administrieren (standardmäßig nur vom eigenen Rechner aus). Das Programm lpadmin erlaubt die Konfiguration auf der Kommandozeile. CUPS - Konfiguration • Die Syntax der Konfigurationsdatei cupsd.conf ähnelt der von Apache. In ihr werden allgemeine Servereinstellungen getroffen und man kann auch genau festlegen, welche Benutzer/Gruppen auf welche Teile der Webschnittstelle zugreifen können. • Wichtige Einstellungen: • • Listen → IP-Adresse und Port, auf dem der Server lauschen soll. • Browsing → Definiert, ob Drucker über das Netzwerk erreichbar sein sollen. • SystemGroup → Benutzergruppen, die den Server administrieren dürfen (definiert in cupsfiles.conf) Die Drucker fügt man am einfachsten über die Webschnittstelle hinzu. Benötigt werden dafür zumindest folgende Informationen: • Verbindung zum Drucker (USB, seriell, parallel, LPD, AppSocket, IPP, SMB) • Name des Druckers • PPD-Datei oder Auswahl einer PPD-Datei über Marke und Modell des Druckers DHCP- und DNS-Server • Wir haben die Konfiguration von DHCP bzw. DNS auf Clientseite betrachtet, aber nicht die zugehörigen Serverdienste. • Der am weitesten verbreitete DHCP-Server ist DHCP des Internet Systems Consortium. Er wird mittels des Pakets isc-dhcp-server installiert, Details zur Konfiguration finden sich in der Ubuntu Dokumentation. • Der bekannteste DNS-Server ist BIND des Internet Systems Consortium. Er wird mittels des Pakets bind9 installiert, Details zur Konfiguration finden sich in der Debian Wiki und in der Ubuntu Dokumentation. • Für kleinere Netze wird oft dnsmasq als DHCP- und DNS-Server eingesetzt. Dieser Server ist nicht so ausgiebig konfigurierbar, hat aber eine gute Standardkonfiguration und reicht in vielen Fällen aus. ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 Seite 138 von 139 Sicherheit • Hardware physisch schützen (ev. Zutrittskontrolle, BIOS/UEFI mit Passwort sichern, etc.) • Benutzerauthentifikation über PAM zentral erledigen. • Passwort-Policy festlegen (z.B. mindestens acht Zeichen, davon eine Ziffer und ein Sonderzeichen; siehe auch z.B. Passwort-Policy des ZID). • Login von root über OpenSSH nur mit Schlüssel erlauben. • Die Dateien /etc/hosts.{allow,deny} für Host-basierte Zugriffskontrolle verwenden (siehe man hosts_access). • Eine Firewall mit iptables erstellen, die nur die benötigten Ports für Verbindungsanfragen von außen zulässt. • Für Netzwerkdienste wenn möglich SSL oder TLS verwenden. • Nur die unbedingt notwendigen Programme installieren (je mehr Programme, desto mehr Angriffsmöglichkeiten bietet man). • Dateien/Verzeichnisse mit den richtigen Zugriffsrechten versehen. • Auf mobilen Datenträgern verschlüsseln. verschlüsselte Dateisysteme verwenden oder ICT-Infrastruktur für Bildungsaufgaben | Sommersemester 2016 | Version: 2016-05-22 09:57 einzelne Dateien Seite 139 von 139