% <#>-----------------------------------------------------------------------<#>
\section{Benutzer, Gruppen und Dateiberechtigungen}%
\label{sec:benutzer-gruppen-und-berechtigungen}

Die Verwaltung von Benutzer, Gruppen und Dateiberechtigungen unter Unix-artigen
Systemen sind identisch. Das hat den Vorteil, dass es für Anwender einfacher ist
Benutzer, Gruppen und Dateiberechtigungen auf Linux Distributionen wie Debian,
Ubuntu, Linux Mint oder RHEL, CentOS, Fedora als auch BSD Distributionen wie
MacOS, FreeBSD oder OpenBSD zu übertragen.

Optional können durch sogenannte \acrfull{acr:acl} Berechtigungen
erweitert werden, um die Rechtevergabe für Benutzer und Gruppen noch feiner
einteilen zu können.

In der Praxis gibt es jedoch sehr selten Szenarien, bei denen dies notwendig ist.
Aus diesem Grund liefern manche Distributionen die notwendigen Programme zum
verfeinern der Rechtevergabe nicht standardmäßig aus.

% #>------------------------------------------------------------------------<#
\subsection{Benutzer und Gruppen}%
\label{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen}

Linux ist als Mehrbenutzer-Betriebssystem entwickelt worden. Dies bedeutet, dass
mehrere Benutzer gleichzeit auf dem System Prozesse ausführen können. Dabei
werden die Berechtigungen auf Dateien und Verzeichnisse klar durch den Besitzer,
als auch durch die Gruppe, welche mehrere Benutzer zusammenfasst, geregelt.

% #>------------------------------------------------------------------------<#
\subsubsection{Benutzer}%
\label{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen.benutzer}

Man unterscheidet bei Benutzern zwischen funktionalen und realen Benutzern.
Funktionale Benutzer werden vorwiegend für Dienste verwendet, um zu vermeiden,
dass der Dienst ungewollt auf Dateien und Verzeichnisse Zugriff erhält. Aus
diesem Grund wird auch vermieden, dass funktionale Benutzer eine Shell öffnen
können. Dazu später mehr.

Reale Benutzer sind natürliche Personen, die sich entweder direkt per
Desktopmanager, einer Shell oder über ein Protokoll (\acrshort{acr:rdp},
\acrshort{acr:ssh}, \acrshort{acr:vnc}) Zugang verschaffen.

Alle Benutzer werden in der Datei \textit{/etc/passwd} gelistet. Sie wird als
Tabellenform geführt, getrennt durch einen Doppelpunkt \textbf{:}. Zur
einfacheren Darstellung kann folgender Befehl verwendet werden.

\begin{bashcode}
cat /etc/passwd | column --table --separator :
\end{bashcode}

Die Spalten, exemplarisch für den Benutzer root, haben folgende Bedeutung:

\begin{itemize}[itemsep=0pt]
  \item[\textbf{1. Spalte}] Name des Benutzers
  \item[\textbf{2. Spalte}] Ehemals Spalte für das Kennwort. Das \textit{x}
  kennzeichnet, dass für den Benutzer in der Datei \textit{/etc/shadow} ein
  Kennwort existiert. Dazu später mehr.
  \item[\textbf{3. Spalte}] Die ID des Benutzers. Wird oft auch als \textit{UID}
  angegeben.
  \item[\textbf{4. Spalte}] Die ID der Hauptgruppe. Wird oft auch als \textit{GID}
  angegeben.
  \item[\textbf{5. Spalte}] Erweiterter Name des Benutzers. Damit
  nachvollziehbar ist, welchem Dienst oder welcher realen Person der Benutzer
  zuzuordnen ist.
  \item[\textbf{6. Spalte}] Das Heimatverzeichnis des Benutzers. Im Regelfall
  wird dieses Verzeichnis betreten, sofern der Benutzer sich über eine
  Login-Shell anmeldet. Die Tilde verweist auf das hier definierte
  Heimatverzeichnis.
  \item[\textbf{7. Spalte}] Enthält den absoluten Pfad zur Login-Shell. Dies ist
  im Regelfall die \acrfull{acr:bash}. Um zu vermeiden, dass sich als Benutzer
  eines Dienstes angemeldet werden kann, kann hier auch auf
  \textit{/usr/bin/nologin} verwiesen werden.
\end{itemize}

Die 2. Spalte wurde ausgelagert nach \textit{/etc/shadow}, um die Sicherheit auf
dem System zu erhöhen. In der Datei \textit{/etc/shadow} werden weitere
Informationen gespeichert. Beispielsweise die Information, mit welchem
Hash-Algorithmus die Kennwörter gehasht wurden bzw. wie der Salt-Wert lautet.

Erzeugen Sie sich erneut mit dem genannten Befehl aus Kapitel
\ref{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen.benutzer} eine
Ausgabe in tabellarischer Form für die Datei \textit{/etc/shadow}. Die Spalten
haben folgende Bedeutung:

\begin{itemize}[itemsep=0pt]
  \item[\textbf{1. Spalte}] Name des Benutzers.
  \item[\textbf{2. Spalte}] Das Kennwort, gespeichert als Hash mit Informationen
  zum Hash.-Algorithmus. Der Wert \textit{!} bedeutet, dass kein Kennwort
  definiert wurde.
  \item[\textbf{3. Spalte}] Enthält die Tage seit Beginn der
  \href{https://de.wikipedia.org/wiki/Unixzeit}{Unix-Zeitrechnung}, wann das
  Kennwort zuletzt geändert wurde.
  \item[\textbf{4. Spalte}] Tage bevor das Kennwort geändert werden muss.
  \item[\textbf{5. Spalte}] Tage, ab wann eine Warnung, für das ablaufende Kennwort, ausgegeben werden soll.
  \item[\textbf{6. Spalte}] Tage bevor das Kennwort abläuft, nachdem keine
  Anmeldung erfolgt ist.
  \item[\textbf{7. Spalte}] Enthält die Tage seit Beginn der
  \href{https://de.wikipedia.org/wiki/Unixzeit}{Unix-Zeitrechnung}, seit dem das
  Kennwort abgelaufen ist.
  \item[\textbf{8. Spalte}] Reservierte Spalte. Wird aktuell nicht verwendet.
\end{itemize}

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 1a:} Ermitteln Sie den Hash-Algorithmus, welcher
  verwendet wurde um Ihr Kennwort zu hashen.
  \item \textbf{Aufgabe 1b:} Wann beginnt die Unix-Zeitrechnung?
  \item \textbf{Aufgabe 1c:} Wann wurde zuletzt das Kennwort des Benutzers root geändert?
  \item \textbf{Aufgabe 1d:} Ermitteln Sie die \textbf{User-ID} ihres aktuellen
  Benutzers mithilfe eines Befehls, welcher in den GNU Core Utilities enthalten
  und dem Bereich \glqq{}Shell Utilities\grqq{} zugeordnet ist.
  \item \textbf{Aufgabe 1e:} Nutzen Sie den Befehl \textit{wc}, um alle
  eingerichteten Benutzer auf ihrem System zu zählen. Lesen Sie die Manpage für
  weitere Informationen zu diesem Befehl.
\end{itemize}

% #>------------------------------------------------------------------------<#
\subsubsection{Gruppen}%
\label{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen.gruppen}

Ähnlich wie bei Benutzern gibt es auch Dateien in denen die Gruppen bzw.
Gruppenkennwörter festgehalten sind. Dies sind die Dateien \textit{/etc/group}
und \textit{/etc/gshadow}. Die beiden Dateien sind ähnlich wie
\textit{/etc/passwd} und \textit{/etc/shadow} aufgebaut. Sie enthalten jedoch
weniger Spalten.

Die Datei \textit{/etc/group} enthält eine Spalte für den Namen der Gruppe, ob
ein Eintrag in \textit{/etc/gshadow} vorhanden ist, die Gruppen-ID, als auch
alle Benutzer, welche der Gruppe angehören. Die Benutzer werden durch ein Komma
getrennt aufgelistet.

Die Datei \textit{/etc/gshadow} enthält noch weniger Informationen. Die ersten
drei Spalten sind identisch zu den Spalten aus der Datei \textit{/etc/shadow}.
Die letzte Spalte enthält Benutzer, welcher das Kennwort ändern dürfen.

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 2a:} Ermitteln Sie die \textbf{Gruppen-ID} ihres
  aktuellen Benutzers mithilfe eines Befehls, welcher in den GNU Core Utilities
  enthalten und dem Bereich \glqq{}Shell Utilities\grqq{} zugeordnet ist.
  \item \textbf{Aufgabe 2b:} Nutzen Sie den Befehl \textit{wc}, um die Gruppen
  zu zählen. Lesen Sie die Manpage für weitere Informationen zu diesem Befehl.
\end{itemize}

% #>------------------------------------------------------------------------<#
\subsubsection{Benutzer root}%
\label{sec:benutzer-gruppen-und-berechtigungen.root}

Der Benutzer root besitzt auf allen Unix-artigen Systemen die User-ID und
Gruppen-ID 0. Er besitzt vollen Zugriff auf das gesamte System und damit auf
alle Dateien und Einstellungen aller Benutzer. Er kann beispielsweise ohne
Einschränkungen auf alle angeschlossenen Geräte unter \textit{/dev}, als auch
die Heimatverzeichnisse der Benutzer unter \textit{/home}, zugreifen.

Der Benutzer root ist ein funktionaler Benutzer, mit dem sich reale Benutzer
anmelden können, um Befehle, welche einen höheren Berechtigungsgrad benötigen,
auszuführen. Durch die Verwendung des Benutzers root ist nachträglich nicht mehr
nachvollziehbar, welcher reale Benutzer welchen Befehl ausgeführt hat. Aus
diesem Grund und anderen Gründen wurde das Programm \textit{sudo} entwickelt.

% #>------------------------------------------------------------------------<#
\subsubsection{sudo}%
\label{sec:benutzer-gruppen-und-berechtigungen.sudo}

Das Programm \textit{sudo} führt den nachgestellten Befehl mit root
Berechtigungen aus. Mithilfe von sudo lässt sich die Verwendung von root
Berechtigungen auf einzelne Benutzer einschränken. Für die Verwendung von
\textit{sudo} muss ein Benutzer unter RHEL basierenden Distributionen der Gruppe
\textit{wheel} angehören oder der Gruppe \textit{sudo} bei Debian basierende
Distributionen.

Mithilfe des Befehls \textit{visudo} lässt sich die Konfiguration von
\textit{sudo} bearbeiten. Dort kann unter anderem auch eingestellt werden, dass
der Aufruf eines Befehls mit \textit{sudo} keiner erneuten Kennworteingabe des
Benutzers benötigt.

Mit dem folgenden Beispiel kann ein realer Benutzer mit \textit{sudo} den Ordner
\textit{/mnt/sda1} erstellen, für welchen root Berechtigungen notwendig sind, da
root der Eigentümer des Verzeichnisses \textit{/mnt} ist.

\begin{bashcode}
sudo mkdir --parent /mnt/sda1
\end{bashcode}

Möchte man mehrere Befehle mit root Berechtigungen ausführen lohnt sich die
Anmeldung als root Benutzer von einem normalen Benutzer aus. Dies kann entweder
mit \textit{sudo -i} oder alternativ mit \textit{su} erreicht werden.

% #>------------------------------------------------------------------------<#
\subsubsection{Passwort ändern}%
\label{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen.s}

Um das Passwort zu ändern reicht die Ausführung des Befehls \textit{passwd}.
Damit ist es möglich das Kennwort des gerade verwendeten Benutzers zu ändern.
Möchte man das Kennwort anderer Benutzer ändern, muss man root Berechtigungen
besitzen, sei es als Benutzer root oder per \textit{sudo}, und gibt hinter den
Befehl den Namen des Benutzers an, wessen Kennwort man ändern möchte.

Das Programm \textit{passwd} ändert dem entsprechend die Zeile in
\textit{/etc/shadow} für den Benutzer, für welchen das Passwort geändert werden
soll, ab.

Nachteil von \textit{passwd} ist, dass es interaktiv bedient werden muss -
sprich, mit \textit{passwd} ist es nicht möglich Kennwörter von Benutzern per
Skript zu ändern. Aus diesem Grund wurde das Programm \textit{chpasswd}
entwickelt.

Allerdings möchte man nicht nur das Kennwort eines Benutzers ändern können,
sondern auch wann das Kennwort ablaufen soll oder ab wann das System eine
Warnung ausgeben soll. Mit Hilfe des Programms \textit{chage} ist dies möglich.

\begin{bashcode}
  sudo chage --list ${USER}
\end{bashcode}

% #>------------------------------------------------------------------------<#
\subsubsection{Gruppe hinzufügen, bearbeiten und löschen}%
\label{sec:benutzer-gruppen-und-berechtigungen.gruppen.add-mod-rm}

Das Bearbeiten der Gruppen direkt in der Datei \textit{/etc/group} sollte
vermieden werden und stattdessen auf die Programme zurück gegriffen werden,
welche die Distribution bereit stellt.

Zum Erstellen, Bearbeiten und Löschen werden folgende Programme zur Verfügung
gestellt.

\begin{itemize}[label={},itemsep=0pt]
  \item \textit{groupadd:} Erstellt eine neue Gruppe
  \item \textit{groupmod:} Modifiziert eine bestehende Gruppe
  \item \textit{groupdel:} Löscht eine Gruppe
\end{itemize}

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 3a:} Estellen Sie die Gruppe \textit{hr} für
  \textit{human resources} mit der \textit{GID} 2000.
  \item \textbf{Aufgabe 3b:} Vergewissern Sie sich, dass in der Datei
  \textit{/etc/group} die neue Gruppe mit entsprechender \textit{GID} angelegt wurde.
  \item \textbf{Aufgabe 3c:} Benennen Sie die Gruppe \textit{hr} nach
  \textit{dev} für \textit{development} um und überprüfen Sie, ob sich der Name
  der Gruppe in der Datei \textit{/etc/group} geändert hat.
  \item \textbf{Aufgabe 3d:} Ändern Sie die \textit{GID} auf 3000 und überprüfen
  Sie, ob diese sich in der Datei \textit{/etc/group} geändert hat.
  \item \textbf{Aufgabe 3e:} Löschen Sie die Gruppe \textit{dev}.
\end{itemize}

% #>------------------------------------------------------------------------<#
\subsubsection{Benutzer hinzufügen, bearbeiten und löschen}%
\label{sec:benutzer-gruppen-und-berechtigungen.benutzer.add-mod-rm}

Ähnlich wie Gruppen können auch Benutzer hinzugefügt, modifiziert und gelöscht
werden. Auf folgende Befehle kann zurück gegriffen werden.

\begin{itemize}[label={},itemsep=0pt]
  \item \textit{useradd:} Erstellt einen neuen Benutzer
  \item \textit{usermod:} Modifiziert einen bestehenden Benutzer
  \item \textit{userdel:} Löscht den Benutzer
\end{itemize}

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 4a:} Erstellen Sie den Benutzer \textit{manfred} mit dem
  Namen \textit{Manfred Mertens}. Der Benutzer nutzt die \acrlong{acr:bash}.
  Sein Heimatverzeichnis soll unter \textit{/home} erstellt werden. Das Kennwort
  lautet \textit{manni}. Seine Primärgruppe lautet \textit{manfred}. Als
  \textit{UID} verwenden Sie \textit{2000}.
  \item \textbf{Aufgabe 4b:} Setzen Sie das Ablaufdatum des Kennworts für den
  Benutzer \textit{manni} auf den \textit{31. Juni} des nächsten Jahres und
  überprüfen Sie die passende Spalte aus der Datei \textit{/etc/shadow} oder
  nutzen Sie alternativ \textit{chage} oder \textit{passwd} zur Überprüfung.
  \item \textbf{Aufgabe 4c:} Fügen Sie den Benutzer der Gruppe \textit{wheel} hinzu.
  \item \textbf{Aufgabe 4d:} Entfernen Sie den Benutzer \textit{manfred} aus der
  Gruppe \textit{wheel} ohne ihn dabei aus anderen Gruppen zu entfernen.
  \item \textbf{Aufgabe 4e:} Setzen Sie das Kennwort des Benutzers auf
  \textit{manni-der-busfahrer}.
  \item \textbf{Aufgabe 4f:} Entfernen Sie den Benutzer \textit{manfred} und
  löschen Sie ggfls. seine Primärgruppe, sofern niemand mehr Mitglied ist.
\end{itemize}

% #>------------------------------------------------------------------------<#
\subsection{Dateiberechtigungen}%
\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen}

% #>------------------------------------------------------------------------<#
\subsubsection{DOS Ideologie}%
\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.dos-ideologie}

Unter Windows sind Grundsätzlich alle Dateien, welche auf den Suffix
\textit{.exe} enden Ausführbar. Unix-artige Systeme interpretieren Dateiendungen
anders. Sie sind ausschließlich dafür da, damit Desktopmanager wie gnome,
cinnamon, kde, xfce oder andere erkennen, um welche Datei es sich hier handelt
und mit welchen Programmen, aus einer definierten Liste, diese geöffnet werden
können.

Dies bedeutet, dass auch die PDF-Datei \texttt{Aufgabensammlung.pdf} ausführbar
sein kann, obwohl diese nur lesbar sein sollte, damit Programme wie
\textit{evince} oder \textit{masterpdfeditor} sie einlesen können.

% #>------------------------------------------------------------------------<#
\subsubsection{Einfache Dateiberechtigungen}%
\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.einfach}

Unter Unix-artigen Systemen, welche die GNU Core Utilities verwenden, ist das
Programm \textit{ls} vorinstalliert. Das Programm dient zu Auflistung von
Dateien und Verzeichnissen.

Die Ausgabe ist eine Zusammenstellung von mehreren Einträgen unterschiedlicher
Auflistungen, um Dateiberechtigungen exemplarisch zu erklären.

\begin{verbatim}
drwxr-xr-x.  2 markus    users      40 29. Sep 21:48 hello-world
-rw-r--r--.  1 christian users       0 29. Sep 21:48 hello-world2
srw-rw----.  1 root      docker      0  5. Okt 19:34 docker.sock
lrwxrwxrwx.  1 markus    markus     38 14. Apr 11:32 .g -> .gnupg
brw-rw----.  1 root      disk        8  5. Okt 19:34 sda
crw--w----.  1 root      tty         4  5. Okt 19:34 tty0
-rwx------.  1 demo      users       0  5. Okt 20:01 mybin
\end{verbatim}

Die Attributzeichenkette besteht auch 10 Zeichen und gibt Auskunft über den Typ
als auch die Berechtigungen auf die Ressource.

Das erste Attribut gibt den Typ der Ressource wieder. Folgende Attribute
beschreiben die Ressource.

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{-:} Ist eine normale Datei.
  \item \textbf{d:} \textbf{d}irectory - Verzeichnis.
  \item \textbf{s:} unix \textbf{s}ocket - Beispielsweise TCP socket eines Web Servers
  \item \textbf{l:} symbolic \textbf{l}ink - Link auf eine andere Datei oder
  anderes Verzeichnis. Ähnlich wie Desktop-Links unter Windows.
  \item \textbf{b:} \textbf{b}lock device - Festplatten.
  \item \textbf{c:} \textbf{c}haracter device - Terminal.
\end{itemize}

Die verbleibenden neun Attribute werden in drei Gruppen gesplittet. Jede Gruppe
beschreibt die Berechtigungen für den Besitzer (engl. user, kurz u), die Gruppe
(engl. group, kurz g) und alle anderen Benutzer, welche weder als Besitzer noch
Mitglied in der genannten Gruppe sind. Diese Benutzer werden auch als Andere
(engl. other, kurz o) beschrieben.

Dabei haben die Attribute folgende Bedeutung:

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{r:} \textbf{r}ead - Von Ressource lesen oder Verzeichnisinhalt
  auflisten.
  \item \textbf{w:} \textbf{w}rite - Ressource beschreiben oder
  Verzeichnisinhalt ändern (hinzufügen, umbenennen, löschen).
  \item \textbf{x:} e\textbf{x}ecute - Programm ausführen oder in das
  Verzeichnis hineinwechseln.
\end{itemize}

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 5a}: Sind block devices in der obrigen Ausgabe gelistet,
  wenn ja welche?
  \item \textbf{Aufgabe 5b:} Nenne alle Dateien aus der obrigen Ausgabe.
  \item \textbf{Aufgabe 5c:} Kann der Benutzer \textit{root} in das Verzeichnis
  \textit{hello-word} hineinwechseln, wenn ja warum?
  \item \textbf{Aufgabe 5d:} Welche Gruppe und was für Berechtigungen wurden der
  Aufzählung \textit{hello-world2} zugewiesen?
  \item \textbf{Aufgabe 5e:} Kann der Benutzer \textit{christian} das Programm
  \textit{mybin} ausführen?
  \item \textbf{Aufgabe 5f:} Kann der Benutzer \textit{demo} die Datei
  \textit{helloworld2} lesen?
  \item \textbf{Aufgabe 5g:} Wer kann mit welchen Berechtigungen mit dem
  Unix-Socket \textit{docker.sock} kommunizieren?
\end{itemize}

% #>------------------------------------------------------------------------<#
\subsubsection{Änderung der Dateiberechtigungen}%
\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.mod}

Die Berechtigungen auf Ressourcen als auch der Besitzer bzw. die Gruppe kann
geändert werden. Dazu sind in GNU Core Utilities folgende Programme enthalten.

\begin{itemize}[label={},itemsep=0pt]
  \item \textit{chown:} Ändert den Besitzer einer Ressource.
  \item \textit{chgrp:} Ändert die Gruppe einer Ressource.
  \item \textit{chmod:} Ändert die Berechtigung auf eine Ressource für alle
  anderen Benutzer, welche weder als Besitzer noch Mitglieder der Gruppe sind.
\end{itemize}

Das Ändern des Besitzers per \textit{chown} kann durch \textit{chown user
ressource} geändert werden. Gleiches gilt für das Ändern der Gruppe:
\textit{chgrp group ressource}. Möchte man den Besitzer als auch die Gruppe in
einem ändern kann dies durch \textit{chown} umgesetzt werden. Dabei muss der
Besitzer als auch die Gruppe getrennt durch einen Doppelpunkt angegeben werden:
\textit{chown user:group ressource}. Alternativ zu den Namen kann auch die
\textit{UID} bzw. die \textit{GID}, für den Name der Gruppe, verwendet werden.

Die Dateiberechtigungen lassen sich per \textit{chmod} anpassen. Das Programm
\textit{chmod} unterstützt die Symbolische- als auch die Oktal-Notation, um
Berechtigungen für Ressourcen zu beschreiben.

Für die Oktal-Natation müssen die Oktal-Werte für jede Gruppe (Besitzer, Gruppe,
Andere) addiert werden, um die symbolische Notation nachbilden zu können. Bei
der Symbolischen-Notation können die Gruppen über die Buchstaben u für engl. user, g
für engl. group und o für engl. other referenziert werden.

\begin{table}[H]
  \centering
  \begin{tabularx}{\textwidth}{X|X|X}
    \textbf{Berechtigung} & \textbf{Oktal-Wert} & \textbf{Symbolisches-Attribut}  \\
    \hline\hline
    read                  & 4                   & r                               \\
    write                 & 2                   & w                               \\
    execute               & 1                   & x                               \\
  \end{tabularx}
\end{table}

Hier zwei Beispiele, um die Berechtigungen aus der Aufzählung aus Kapitel
\ref{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.einfach}
anzupassen. Dabei führen die ersten beiden und letzen beiden Befehle, unabhängig
von der Notation, zu dem gleichen Ergebnis.

\begin{bashcode}
$ chmod 750 helloworld2
$ chmod u=+rwx,g=+rx-w,o=-rwx helloworld2

$ chmod 775 helloworld mybin
$ chmod u=+rwx,g=+rwx,o=+rx-w mybin

$ ls -la
drwxr-x---  2 markus    users      40 29. Sep 21:48 hello-world
-rwxrwxr-x  1 demo      users       0  5. Okt 20:01 mybin
\end{bashcode}

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 6a:} Wie lautet der Befehl die Berechtigung zum lesen
  des Verzeichnis \textit{helloworld2} für die Gruppe zu entfernen? Bitte gebe
  die Symbolische- und Oktal-Notation an.
  \item \textbf{Aufgabe 6b:} Wie lautet der Befehl der Datei mybin die
  Berechtigung zum Ausführen für alle Gruppen (Besitzer, Gruppe und Andere) zu
  entfernen? Symbolische- und Oktal-Notation erforderlich.
  \item \textbf{Aufgabe 6c:} Wie lautet der Befehl anderen Benutzern, welche
  nicht Besitzer oder Mitglied der Gruppe docker sind von dem Unix-Socket
  \textit{docker.sock} zu lesen. Symbolische- und Oktal-Notation erforderlich.
  \item \textbf{Aufgabe 6d:} Wie lautet der Befehl den Besitzer auf
  \textit{root} und die Gruppe auf \textit{markus} für die Datei
  \textit{helloworld} zu setzen? Einzeiler bitte.
\end{itemize}

% #>------------------------------------------------------------------------<#
\subsubsection{Erweiterte Dateiberechtigungen}%
\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.erweitert}

Neben den einfachen Dateiberechtigungen unterstützen alle Unix-artige Systeme
die erweiterten Dateiberechtigungen. Diese werden \textit{setuid},
\textit{setgid} und \textit{sticky bit} genannt.

Sie lassen sich ebenfalls über die Symbolische- als auch die Oktal-Notation
setzen.

\begin{table}[H]
  \centering
  \begin{tabularx}{\textwidth}{X|X|X}
    \textbf{Berechtigung} & \textbf{Oktal-Wert} & \textbf{Symbolisches-Attribut}  \\
    \hline\hline
    setuid                & 4                   & s                               \\
    setgid                & 2                   & s                               \\
    sticky bit            & 1                   & t                               \\
  \end{tabularx}
\end{table}

Die \textit{setuid} auf Dateien wird ignoriert, außer sie ist ausführbar. Ist
die Datei ausführbar wird diese mit den Berechtigungen des Besitzers ausgeführt.
Ein gutes Beispiel ist das Programm \textit{/bin/passwd}. Ohne die Option
\textit{setuid} wäre ein normaler Benutzer nicht in der Lage sein Kennwort zu
ändern, da das Programm die Dateien \textit{/etc/passwd} und
\textit{/etc/shadow} bearbeitet, welche dem Besitzer \textit{root} als auch der
Gruppe \textit{root} gehören.

Ist das \textit{setuid} auf eine Datei oder ein Verzeichnis gesetzt, wird das
Attribut \textit{x} durch ein \textit{s} unter den Berechtigungen des Besitzers
in der Attributzeichenkette ersetzt.

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 7a:} Überprüfen Sie, ob für das Programm \textit{/bin/passwd}
  \textit{setuid} gesetzt ist.
\end{itemize}

Das setzen von \textit{setuid}, \textit{setgid} und \textit{sticky bit} wird per
\textit{chmod} erreicht. Es kann die Symbolische- als auch die Oktal-Notation
verwendet werden. Exemplarisch wird nachfolgend \textit{setuid} über die
Symbolische- als auch Oktal-Notation für die Datei hello-world.py gesetzt.

\begin{bashcode}
$ chmod 4755 hello-world-py
$ chmod u=+rws,g=+rx-w,o=+rx-w hello-world-py
\end{bashcode}

Die erweiterte Berechtigung \textit{setgid} verhält sich analog zu
\textit{setuid}, was Dateien betrifft. Es hat jedoch noch die Besonderheit, dass
wenn \textit{setgid} auf ein Verzeichnis gesetzt ist alle erstellten Dateien und
Verzeichnisse unterhalb des Verzeichnisses die Gruppe erben. Allerdings
\textbf{nicht} die Berechtigungen. Dies kann per \acrlongpl{acr:acl} realisiert
werden.

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 7b:} Erstellen Sie das Verzeichnis \textit{/tmp/setgid}
  und setzen Sie die Gruppe auf \textit{users}. Überprüfen Sie, ob
  \textit{setgid} erfolgreich gesetzt wurde.
  \item \textbf{Aufgabe 7c:} Erstellen Sie eine neue Datei als auch ein neues
  Verzeichnis in \textit{/tmp/setgid}. Überprüfen Sie, ob die Gruppe
  \textit{users} für die von ihnen erstellte Datei als auch Verzeichnis gesetzt
  wurde.
\end{itemize}

Das \textit{sticky bit} wird auf Dateien ignoriert. Wird es allerdings auf ein
Verzeichnis gesetzt verhindert es, dass Benutzer Dateien und Verzeichnisse
löschen können für welche sie nicht als Besitzer hinterlegt sind.


% #>------------------------------------------------------------------------<#
\subsubsection{Access-Control-List}%
\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.acl}

Mit \acrfull{acr:acl} können Berechtigungen granularer vergeben werden. Sie
erweitern somit die Rechteverwaltung unter Linux und werden insbesondere dafür
verwendet, Berechtigungen für neu angelegte Dateien und Verzeichnisse innerhalb
eines Verzeichnisses zu vererben.

Unter Fedora muss das Paket \textit{acl} installiert sein, um die
Rechteverwaltung granularer einstellen zu können.

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 8a:} Installieren Sie mit \textit{yum} das Paket
  \textit{acl}, sofern dies nicht installiert ist.
\end{itemize}

Das Paket \textit{acl} enthält mehrere Programme, um \acrshortpl{acr:acl} auf
dem System verwalten zu können. Dies sind die wichtigsten:

\begin{itemize}[label={},itemsep=0pt]
  \item \textit{setfacl:} Dient zum definieren von \acrshortpl{acr:acl} auf ein
  Verzeichnis oder eine Datei
  \item \textit{getfacl:} Liest definierte \acrshortpl{acr:acl} von einem
  Verzeichnis oder einer Datei aus
\end{itemize}

Die Programme \textit{setfacl} und \textit{getfacl} folgen einer ähnlichen
Befehlsstruktur wie \textit{chmod}, \textit{chown} und \textit{chgrp}.

Hier ein Beispiel, um dem Benutzer \textit{christian} die Berechtigung
\textit{rwx} auf das Programm \textit{mybin} per \acrshort{acr:acl} einzuräumen.

\begin{bashcode}
$ setfacl -m "u:christian:rwx" mybin
\end{bashcode}

Ähnlich verhält sich das Programm, wenn man einer Gruppe oder Benutzern, welche
weder Besitzer noch Mitglieder einer Gruppe sind, Berechtigungen einräumen
möchte.

\begin{bashcode}
$ setfacl -m "g:christian:r-x" mybin
$ setfacl -m "o:r-x" mybin
\end{bashcode}

Führt man den Befehl \textit{ls -la} erneut aus, macht das \textit{+}-Zeichen
hinter der Attributzeichenkette auf die definierte \acrshort{acr:acl}
aufmerksam.

\begin{verbatim}
drwxr-xr-x.  2 markus    users      40 29. Sep 21:48 hello-world
-rw-r--r--.  1 christian users       0 29. Sep 21:48 hello-world2
srw-rw----.  1 root      docker      0  5. Okt 19:34 docker.sock
lrwxrwxrwx.  1 markus    markus     38 14. Apr 11:32 .g -> .gnupg/
brw-rw----.  1 root      disk        8  5. Okt 19:34 sda
crw--w----.  1 root      tty         4  5. Okt 19:34 tty0
-rwx------+  1 demo      users       0  5. Okt 20:01 mybin
\end{verbatim}

Die definierte \acrshort{acr:acl} kann per \textit{getfacl} ausgelesen werden.

\begin{bashcode}
$ getfacl mybin
# file: mybin
# owner: demo
# group: users
user::rwx
user:christian:rwx
group::---
group:christian:r-x
mask::rwx
other::r-x
\end{bashcode}

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 8b:} Erstellen Sie folgende Verzeichnisstruktur:
  \textit{/tmp/acl-test/share}
  \item \textbf{Aufgabe 8c:} Stellen Sie sicher, dass ausschließlich der
  Benutzer \textit{root} und die Gruppe \textit{root} über die klassichen
  Dateiberechtigungen Zugriff auf das Verzeichnis \textit{/tmp/acl-test} erhalten.
  \item \textbf{Aufgabe 8d:} Erstellen Sie einen neuen Benutzer mit dem Namen
  \textit{fuacl} und räumen Sie diesem per \acrshort{acr:acl} Berechtigungen
  ein, Dateien und Verzeichnisse aus dem Verzeichnis \textit{/tmp/acl-test} zu
  lesen, ändern und deren Inhalt aufzulisten. Überprüfen Sie die Einstellung!
  \item \textbf{Aufgabe 8e:} Entziehen Sie dem Benutzer \textit{fuacl} die
  Berechtigung Dateien und Verzeichnisse aus dem Verzeichnis
  \textit{/tmp/acl-test/shared} zu lesen und aufzulisten. Überprüfen Sie die
  Einstellung!
  \item \textbf{Aufgabe 8f:} Stellen Sie sicher, dass neu erstellte Dokumente in
  \textit{/tmp/acl-test} immer der Gruppe \textit{root} gehören und die
  Berechtigung \textit{rwx} für Verzeichnisse und \textit{rw-} für Dateien
  gesetzt werden. \textit{Tipp: setfact --default}. Überprüfen Sie die
  Berechtigung durch erstellen eines neuen Dokuments.
  \item \textbf{Aufgabe 8g:} Entfernen Sie ausschließlich jene
  \acrshort{acr:acl}, welche vererbt wird.
  \item \textbf{Aufgabe 8h:} Entfernen Sie rekursive alle \acrshortpl{acr:acl}.
\end{itemize}

% #>------------------------------------------------------------------------<#
\subsection{Praxisaufgabe: Verzeichnisstruktur mit Dateiberechtigungen erstellen}%
\label{sec:benutzer-gruppen-und-berechtigungen.praxis-task}

Sie befinden sich in folgender Situation:

Das Unternehmen indem Sie arbeiten wechselt aus Kostengründen von Windows
Sharepoint zu Samba. Ihr Vorgesetzter hat Sie daher gebeten Vorbereitungen für
den Umstieg zu treffen. Darunter auch die notwendige Verzeichnisstruktur für die
Abteilungen als auch die Benutzer und Gruppen zu erstellen, sowie Berechtigungen
den Vorgaben entsprechend anzupassen.

Folgende Beziehungen führt das Unternehmen zwischen Mitarbeiter und Abteilungen.

\begin{table}[H]
  \centering
  \begin{tabularx}{\textwidth}{X|X}
    \textbf{Mitarbeiter} & \textbf{Abteilungen}                 \\
    \hline\hline
    Hugo McKinnock       & Entwicklung                          \\
    Hans Rakinzky        & Entwicklung, System Administration   \\
    Marie Haseloff       & Personalabteilung, Buchhaltung       \\
    Sophie Becker        & Personalabteilung                    \\
    Axel Tuller          & System Administration                \\
    Tobias Moretti       & Entwicklung, Qualitätssicherung      \\
    Lisa Meerkamp        & Sekretärin                           \\
    Manfred Krupp        & Vorstand                             \\
  \end{tabularx}
\end{table}

Die Verzeichnisstruktur ist unter \textit{/srv/documents} zu erstellen. Dabei
besitzt jede Abteilung ihr eigenes Verzeichnis. Innerhalb ihres Verzeichnisses
erhalten fast alle Abteilungen das Verzeichnis \textit{public} und
\textit{private}. Die Abteilung Entwicklung und Qualitätssicherung haben kein
Verzeichnis \textit{private}, da ihre Dokumente allen Benutzern im Unternehmen
zugänglich sein sollen. Dagegen besitzen die Abteilungen Sekreteriat als auch
Vorstand kein Verzeichnis \textit{public}, sondern ausschließlich
\textit{private}.

In den Verzeichnissen \textit{private} können ausschließlich Mitglieder der
Abteilung lesen und schreiben. Neu erstellte Dokumente gehören der Abteilung und
dem Benutzer \textit{root}. Ähnlich ist dies für das Verzeichnis
\textit{public}. Alle Benutzer können die Dateien oder Verzeichnisse öffnen.
Allerdings können nur Mitglieder der Abteilung neue Dokumente erstellen und
bearbeiten.

Bitte geben Sie die nötigen Befehle an, mit denen Sie die nachfolgenden Aufgaben
lösen.

\begin{itemize}[label={},itemsep=0pt]
  \item \textbf{Aufgabe 9a:} Erstellen Sie die Gruppen, beginnend mit der
  \textit{GID} 2000.
  \item \textbf{Aufgabe 9b:} Erstellen Sie die Benutzer, beginnend mit der
  \textit{UID} 2000. Die Primärgruppe ist \textit{users}.
  \item \textbf{Aufgabe 9c:} Verknüpfen Sie die Benutzer mit den Gruppen.
  \item \textbf{Aufgabe 9d:} Erstellen Sie die beschriebene Verzeichnisstruktur.
  \item \textbf{Aufgabe 9e:} Setzen Sie die beschriebenen Berechtigungen um.
  \item \textbf{Aufgabe 9f:} Melden Sie sich unter dem Benutzer von Marie
  Haseloff per \textit{sudo} an und überprüfen Sie folgende Berechtigungen:
  \begin{itemize}[label={},itemsep=0pt]
    \item \textbf{Aufgabe 9f$_1$:} Erstellen, bearbeiten und löschen von Dateien
    und Verzeichnissen in der für Ihr, über die Abteilung, zugewiesenen
    Verzeichnisse.
    \item \textbf{Aufgabe 9f$_2$:} Neu erstellte Dokumente und Verzeichnisse
    gehören der jeweiligen Abteilung. Verzeichnisse haben die
    Gruppenberechtigung \textit{rwx}. Dateien haben die Gruppenberechtigung
    \textit{rw-}.
    \item \textbf{Aufgabe 9f$_3$:} Von Dateien und Verzeichnissen der Abteilung
    Vorstand darf weder gelesen noch geschrieben als auch deren Inhalt gelistet
    werden.
    \item \textbf{Aufgabe 9f$_4$:} Dateien aus dem Verzeichnis \textit{public}
    der Abteilung System Administration sind lesbar, aus dem Verzeichnis
    \textit{private} nicht.
  \end{itemize}
\end{itemize}
