126 lines
7.9 KiB
TeX
Raw Normal View History

2025-01-29 00:54:27 +01:00
%
% Chapter: Technische Umsetzung
%
\chapter{Technische Umsetzung}
\section{Berechtigungsverwaltung}
2025-01-31 02:12:09 +01:00
\subsection{Ausarbeitung der Herangehensweise}
2025-01-29 15:56:05 +01:00
Zunächst wurde gebrainstormed, welche Herangehensweisen hier möglich sind.
Ein Artefakt des Brainstormings ist eine Mind-Map, die unter \fullref{app:ideensammlung} zu finden ist.
2025-01-31 02:12:09 +01:00
\subsubsection{Ansatz 1}
2025-01-29 15:56:05 +01:00
Der aus dieser Mindmap, nach individueller Meinung des Autors, vielversprechenste Ansatz ist es,
die \ac{1P}-Restful-API zu verwenden.
2025-01-31 02:38:57 +01:00
Bei diesem Ansatz würden Administrator*innen und Entwickler*innen API-Keys für \ac{1P} erhalten.
Entwickler*innen hätten mit ihren Keys bestimmte Leseberechtigungen $r$ und Administratoren
2025-01-29 15:56:05 +01:00
die Berechtigung $r$ zu verändern.
\begin{nicepic}
\includegraphics[width=0.75\textwidth]{images/dev-stuff-via-api-keys.png}
\captionof{figure}{Relationsdiagramm: Ansatz 1 | 1Password-API}
\caption*{Quelle: Eigene Darstellung}
\label{fig:ansatz-1-mit-api-keys}
\end{nicepic}
Dieser Ansatz wurde zeitnah als unumsetzbar erkannt und verworfen, da \ac{1P} das nachträgliche Verändern
von API-Key-Berechtigungen nicht erlaubt.
2025-01-31 02:12:09 +01:00
\subsubsection{Ansatz 2}
2025-01-29 17:31:18 +01:00
Der nächste Lösungsansatz befasst sich mit einer Abstraktionsebene: Der \ac{MASA}.
Hier ist die grundlegende Idee, dass es eine serverseitige Anwendung gibt, die sich \ac{MASA} nennt.
Diese Anwendung übernimmt die Aufgabe anhand eines hinterlegten \ac{1P}-API-Keys Secrets
2025-01-31 02:38:57 +01:00
aus dem \ac{1P}-Vault des Partnerunternehmens abzufragen und an Entwickler*innen weiterzureichen.
Die \ac{MASA} provisioniert eigene API-Keys an Entwickler*innen und vermermerkt serverseitig,
2025-01-29 17:31:18 +01:00
welcher API-Key berechtigt ist, welche \ac{1P}-Einträge abzufragen.
2025-01-31 02:38:57 +01:00
Der API-Key könnte grundlegende Informationen wie zum Beispiel Entwickler*innennamen und Ablaufzeitpunkte des
2025-01-29 17:31:18 +01:00
Keys einbetten. Dieser Ansatz trägt viel Sicherheitsverantwortung, da eine mögliche Ausnutzung einer
Sicherheitslücke der \ac{MASA} direkt in den Firmen-Passwortmanager führen würden.
Um diesem Risikofaktor entgegenzuwirken würde der \ac{1P}-Key der \ac{MASA} verschlüsselt werden und die
2025-01-31 02:38:57 +01:00
\ac{MASA} würde nur einen Teil des Entschlüsselungs-Keys vorrätig halten. Der andere Teil wäre in jedem Entwickler*innen-Key
eingebettet. Dadurch wäre gewährleistet, dass ein*e Angreifer*in, selbst bei sehr weitreichendem Zugriff
in die \ac{MASA}, nicht auf das Innere des Passwortmanagers zugreifen könne, da die \ac{MASA} dazu selbstständig
gar nicht im Stande wäre. Da Entwickler*innen lediglich ein Schlüsselfragment des Verschlüsselungs-Schlüssels
in ihrem Key eingebettet hätten, der einen serverseitigen Schlüssel der \ac{MASA} zum auslesen benötigt,
bestünde auch keine Gefahr, dass ein*e Entwickler*in anhand seines bzw. ihres Keys ungeschützten Zugang zum Passwortmanager
erhalten würde. Dieser Ansatz erlaubt für weitreichende Flexibilität, da sämtliche Logik, die sich mit Berechtigungen
beschäftigt, anwendungsfallspezifisch geplant und umgesetzt wäre.
2025-01-29 17:31:18 +01:00
2025-01-31 00:53:51 +01:00
\begin{nicepic}
\includegraphics[width=0.75\textwidth]{images/masa-diagram.png}
\captionof{figure}{Relationsdiagramm: Ansatz 2 | MASA}
\caption*{Quelle: Eigene Darstellung}
\label{fig:ansatz-2-mit-masa}
\end{nicepic}
2025-01-29 17:31:18 +01:00
Letztendlich entschied sich der Stakeholder gegen die Umsetzung der \ac{MASA}, da dieser Ansatz für zu
Aufwändig betrachtet wird und für den durch sie erbrachten Vorteil zu viel Aufwand und Angriffsfläche schaffen würde.
2025-01-31 02:12:09 +01:00
\subsubsection{Ansatz 3}
2025-01-31 02:38:57 +01:00
Der letzte Lösungsansatz befasst sich mit dem Erstellen dedizierter Vaults für jede*n Entwickler*in $e$.
2025-01-31 00:53:51 +01:00
Hierbei existiert eine Python-Toolbox, die anhand eine Yaml-Datei Referenzen auf diese Passwort-Einträge
in $\text{Vault}_e$ legt und von dort entfernt, wenn ein solcher Zugriff laut der Yaml-Datei nicht mehr vorgesehen ist.
2025-01-31 02:38:57 +01:00
Diese Einträge können über feste Eintrags-IDs und über Regex bezogen auf die Eingrags-Titel einem/r Entwickler*in vorgesehen werden.
2025-01-31 00:53:51 +01:00
\begin{nicepic}
\includegraphics[width=0.75\textwidth]{images/dev-stuff-python.png}
\captionof{figure}{Relationsdiagramm: Ansatz 2 | Python-Toolbox}
\caption*{Quelle: Eigene Darstellung}
2025-01-31 02:12:09 +01:00
\label{fig:ansatz-3-mit-python}
2025-01-31 00:53:51 +01:00
\end{nicepic}
2025-01-29 17:31:18 +01:00
2025-01-31 02:38:57 +01:00
Letztendlich entschied sich der Stakeholder für Ansatz 3, da er ihm kostengünstig und aursreichend erschien.
2025-01-31 02:12:09 +01:00
\subsection{Kodierung}
Um den vom Stakeholder ausgewählten Ansatz 3 wie geplant umzusetzen, wurden zunächst
die Dokumentationen diverser \ac{1P}-Schnittstellen konsultiert. Schnell offenbarte sich eine Alternative
zu API-Keys: Die \ac{1P}-Desktop-Anwendung stellt eine CLI-API bereit.
Die CLI-API der Desktop-Anwendung zu verwenden, würde drei Probleme lösen:
\begin{description}
\item [Kosten und hedonische Qualität] \hfill \\
2025-01-31 02:38:57 +01:00
Einen API-Key zu erstellen und zu übermitteln ist kostenspielig und umständlich. Ein \ac{1P}-Konto haben dem gegenüber bereits alle Entwickler*innen des Partnerunternehmens.
2025-01-31 02:12:09 +01:00
\item [Authentifizierung und Sicherheit] \hfill \\
Anstatt einen API-Key unsicher zu speichern und in relevante Programme (=Ansible) zu laden, wird die Authentifizierung zu \ac{1P} ausgelagert.
\item [Manuelle Einsicht] \hfill \\
2025-01-31 02:38:57 +01:00
Da über die CLI-Methode der Zugriff auf die Entwickler*innen-Vaults direkt über die \ac{1P}-Desktop-App geschieht, kann diese den Vault-Inhalt auch dem Nutzer in ihrem GUI offenbaren.
2025-01-31 02:12:09 +01:00
\item [Integrationsaufwand] \hfill \\
Die Verwendung der \ac{1P}-Restful-API erscheint dem Autor nach ihrer Dokumentation sehr aufwändig und kompliziert. Eine CLI-API zu verwenden würde somit in der Umsetzung Projektressourcen sparen.
\end{description}
So begründet fällt die Wahl der Schnittstelle zu \ac{1P} auf ihre CLI-API.
Um schnelle Softwareentwicklung mit minimalem Overhead zu gewährleisten und um für eine spätere Einbindung in Ansible
bereits in Vorleistung zu treten, fällt die Wahl der Programmiersprache auf Python. Ansible-Module können mit Python geschrieben werden. \cite{bib:ansible-docs-python-module}
2025-01-31 02:38:57 +01:00
Es wurde eine rudimentäre Architektur entworfen, die beschreibt, welche Komponente des Werkzeuges aus welchen kleineren Komponenten besteht.
Am unteren Ende dieses Aggregatbaumes stehen atomare Operationen. Im Kontext dieses Werkzeuges sind atomare Operationen Operationen,
2025-01-31 02:12:09 +01:00
die vom \ac{1P}-CLI ausgeführt werden. Diese Operationen implementiert also \ac{1P} selbst.
2025-01-31 02:38:57 +01:00
Hierbei handelt es sich nur um Lese, Erstell- und Löschvorgänge. Das Erfassen, auf welchen Eintrag welche*r Entwickler*in Zugriff hat,
2025-01-31 02:18:22 +01:00
und auf welche nicht, übernimmt \textit{sync-dev-vault.py}. Die Funktionen der andere Skripte ergeben sich in Gänze aus ihren Dateinamen.
\begin{nicepic}
\includegraphics[width=1\textwidth]{images/config-file.png}
\captionof{figure}{Struktur der Zugriffs-config.yml}
\caption*{Quelle: Eigene Darstellung}
\label{fig:config-file}
\end{nicepic}
2025-01-31 02:12:09 +01:00
\begin{nicepic}
\includegraphics[width=0.75\textwidth]{images/program-structure.png}
\captionof{figure}{Diagramm: Programmstruktur Secret-Synchronizer}
\caption*{Quelle: Eigene Darstellung}
\label{fig:programmstruktur-secret-synchronizer}
\end{nicepic}
\subsubsection{Sicherheitsbedenken}
2025-01-31 02:38:57 +01:00
Die Konfigurationsdatei definiert Zielvaults, nach ihren kryptsichen IDs. Anhand dieser IDs sieht ein*e Administrator*in keine Vaultnamen.
Wenn nun aus etwaigen Gründen dort die ID eines Nutzvaults des Partnerunternehmems aufgeführt wäre, würde das
Werkzeug alle sich dort befindlichen Zugänge löschen. Das wäre ein Super-GAU in Form von Datenverlust.
2025-01-31 02:12:09 +01:00
\subsubsection{Sicherheitsvorkehrungen}
2025-01-31 02:38:57 +01:00
Um das zu verhindern, wurde eine Liste mit wichtigen Vault-IDs fest einkodiert.
2025-01-31 02:12:09 +01:00
Alle Erstell- oder Löschmethoden müssen einen Vault-ID-Parameter erhalten, selbst wenn dieser technisch nicht notwendig ist.
2025-01-31 02:38:57 +01:00
Wenn diese Vault-ID nun in der Liste der fest kodierten Nutzvault-IDs vorkommt, meldet die Methode einen deskriptiven Fehler und beendet die Programmausführung.
2025-01-31 02:12:09 +01:00
Somit ist gewährleistet, dass selbst bei einer fatalen Fehlkonfiguration kein Datenverlust entseht.
2025-01-29 15:56:05 +01:00
2025-01-29 00:54:27 +01:00
\section{Integration in Ansible}