Compare commits

..

9 Commits

Author SHA1 Message Date
bd2096f494 selbst probelesen 2025-02-26 16:46:35 +01:00
09781d02c2 bump version 2025-02-26 14:53:40 +01:00
8a3210bc3c feedback von dem mlemmer 2025-02-26 14:50:48 +01:00
df86b1cf95 inconsistent gendering 2025-02-26 11:19:16 +01:00
fad8920281 fix course of study name 2025-02-26 10:51:22 +01:00
5a0ae52ce0 make pdf 2025-02-26 10:50:00 +01:00
07ede6ab3a fix date and wrong word 2025-02-26 10:49:47 +01:00
c87deb721d feedback jochen 2025-02-25 20:08:41 +01:00
45ad50de47 heinemann feedback 2025-02-25 20:08:02 +01:00
15 changed files with 66 additions and 54 deletions

View File

@@ -2,7 +2,7 @@
\label{app:ideensammlung} \label{app:ideensammlung}
\begin{nicepic} \begin{nicepic}
\includegraphics[width=1\textwidth]{images/ideensammlung.jpg} \includegraphics[width=0.75\textwidth]{images/ideensammlung.jpg}
\captionof{figure}{Ideensammlung} \captionof{figure}{Ideensammlung}
\caption*{Quelle: Eigene Darstellung} \caption*{Quelle: Eigene Darstellung}
\label{fig:ideensammlung} \label{fig:ideensammlung}

View File

@@ -5,7 +5,6 @@
\textbf{und -Schnittstelle} \\ \textbf{und -Schnittstelle} \\
\textbf{16.10.2024 und 23.10.2024, Bad Dürkheim} \\ \textbf{16.10.2024 und 23.10.2024, Bad Dürkheim} \\
\textbf{Teilnehmer: Leon Etienne, Jochen Stange} \\ \textbf{Teilnehmer: Leon Etienne, Jochen Stange} \\
\textbf{Dokumententyp: Gedächtnisprotokoll} \\
\textbf{Frage:} Was sind die Aufgabenbereiche von externen Entwickler*innen? \textbf{Frage:} Was sind die Aufgabenbereiche von externen Entwickler*innen?
\begin{quote} \begin{quote}

View File

@@ -2,8 +2,9 @@
\label{app:old-relation-diagram} \label{app:old-relation-diagram}
\begin{nicepic} \begin{nicepic}
\includegraphics[width=0.9\textwidth]{images/old-usage-diagram.jpg} \includegraphics[width=0.75\textwidth]{images/old-usage-diagram.jpg}
\captionof{figure}{Relationsdiagramm: (Überholt) Relationsdiagramm} \captionof{figure}{Relationsdiagramm: (Überholt) Relationsdiagramm}
\caption*{Quelle: Eigene Darstellung} \caption*{Quelle: Eigene Darstellung}
\label{fig:relationsdiagramm-old} \label{fig:relationsdiagramm-old}
\end{nicepic} \end{nicepic}

View File

@@ -7,16 +7,15 @@
\section{Anforderungserfassung} \section{Anforderungserfassung}
Obwohl bereits vor Beginn des Projektes einige Anforderungen bekannt sind, Obwohl bereits vor Beginn des Projektes einige Anforderungen bekannt sind,
müssen manche Details nachträglich in Erfahrung gebracht werden. müssen manche Details nachträglich in Erfahrung gebracht werden.
Hierfür wurde ein informales Interview mit dem Stakeholder durchgeführt. Hierfür wurde ein informelles Interview mit dem Stakeholder durchgeführt.
Im Rahmen dieses Interviews wurden vorbereitete Fragen gestellt, dem Stakeholder aber auch die Möglichkeit Im Rahmen dieses Interviews wurde frei gesprochen.
gegeben frei heraus zu sprechen und Wünsche zu äußern. Eine Mitschrift dieses Interviews befinden sich im Anhang unter
Notizen zu diesem Interview befinden sich im Anhang unter
\fullref{app:stakeholder-interview}. \fullref{app:stakeholder-interview}.
\section{Ergebnisse} \section{Ergebnisse}
Das Ergebnis der Anforderungserfassung ist ein Lastenheft, das in constraints, funktionale und Das Ergebnis der Anforderungserfassung ist ein Lastenheft, das in Constraints, funktionale und
nicht-funktioniale Anforderungen unterteilt ist. Im Zuge des Interviews und diversen anderen, informalen Gespräche, nicht-funktioniale Anforderungen unterteilt ist. Im Zuge des Interviews und diversen anderen, ad-hoc geführten Gesprächen,
hat sich der Autor ein tiefes Verständnis für das vorliegende Problem des Auftraggebers anggeignet. hat sich der Autor ein tiefes Verständnis für das vorliegende Problem des Auftraggebers angeignet.
Das untenstehende Lastenheft wurde mit dem Stakeholder besprochen und bestätigt. Das untenstehende Lastenheft wurde mit dem Stakeholder besprochen und bestätigt.
\begin{table}[ht] \begin{table}[ht]
@@ -27,7 +26,7 @@ Das untenstehende Lastenheft wurde mit dem Stakeholder besprochen und bestätigt
\textbf{Funktionale Anforderungen} \\ \hline \textbf{Funktionale Anforderungen} \\ \hline
Entwickler*innen erhalten verschiedene Zugänge zu verschiedenen \ac{1P}-Einträgen (Zugänge), Entwickler*innen erhalten verschiedene Zugänge zu verschiedenen \ac{1P}-Einträgen (Zugänge),
definiert in einer YAML-Datei. \\ \hline definiert in einer YAML-Datei. \\ \hline
Wildcard-Matching auf den \ac{1P}-Eintragstitel für zusammenhängende Einträge. \\ \hline Wildcard-Matching auf den \ac{1P}-Eintragstitel. \\ \hline
\ac{1P}-Einträge sollen Entwicklern*innen einzeln zuweisbar sein. \\ \hline \ac{1P}-Einträge sollen Entwicklern*innen einzeln zuweisbar sein. \\ \hline
Nicht in der Konfiguration gelistete Zugänge sollen bei Anwendung entfernt werden. \\ \hline Nicht in der Konfiguration gelistete Zugänge sollen bei Anwendung entfernt werden. \\ \hline
Ansible-Secrets müssen aus \ac{1P} dereferenziert werden können. \\ \hline Ansible-Secrets müssen aus \ac{1P} dereferenziert werden können. \\ \hline
@@ -38,7 +37,7 @@ Das untenstehende Lastenheft wurde mit dem Stakeholder besprochen und bestätigt
Das System muss einfach zu pflegen sein. \\ \hline Das System muss einfach zu pflegen sein. \\ \hline
Die benötigte Zeit zur Ausführung der Anwendung soll angemessen lange sein. \\ \hline Die benötigte Zeit zur Ausführung der Anwendung soll angemessen lange sein. \\ \hline
Das System muss robust gegenüber Misskonfigurationen sein, die zur Löschung Das System muss robust gegenüber Misskonfigurationen sein, die zur Löschung
der zugrunde liegenden \ac{1P}-Einträgen führen könnten.\\ \hline der zugrunde liegenden \ac{1P}-Einträge führen könnten.\\ \hline
\textbf{Constraints} \\ \hline \textbf{Constraints} \\ \hline
Nutzung von \ac{1P} ist zwingend erforderlich. \\ \hline Nutzung von \ac{1P} ist zwingend erforderlich. \\ \hline
Die Übermittlung der Secrets muss über das Internet erfolgen. \\ \hline Die Übermittlung der Secrets muss über das Internet erfolgen. \\ \hline

View File

@@ -10,7 +10,7 @@
Auf diese Umsetzung aufbauend sollten die bestehenden Ansible-Roles im Docker-Ansible-Repository Auf diese Umsetzung aufbauend sollten die bestehenden Ansible-Roles im Docker-Ansible-Repository
des Partneruntehmens so angepasst werden, dass diese das \textit{resolve\_1p\_secret} Filtermodul verwenden. des Partneruntehmens so angepasst werden, dass diese das \textit{resolve\_1p\_secret} Filtermodul verwenden.
Ebenso sollte das bestehende Inventar an Host-Konfigurationsdateien migriert werden, sodass diese keine Klartext-Secrets mehr beinhalten, Ebenso sollte das bestehende Inventar an Host-Konfigurationsdateien migriert werden, sodass diese keine Klartext-Secrets mehr beinhalten,
sondern diese nach \ac{1P} verschoben werden und die Host-Konfigurationsdateien lediglich eine IT-sicherheitstechnisch unbedenkliche Referenz auf \ac{1P}-Einträge sondern diese nach \ac{1P} ausgelagert werden und die Host-Konfigurationsdateien lediglich eine IT-sicherheitstechnisch unbedenkliche Referenz auf \ac{1P}-Einträge
aufweisen. aufweisen.
\endgroup \endgroup

View File

@@ -7,5 +7,5 @@ Einige Anforderungen sind bereits im Voraus definiert.
Weiterführende Anforderungen werden im Rahmen einer Anforderungserfassung ermittelt. Weiterführende Anforderungen werden im Rahmen einer Anforderungserfassung ermittelt.
Anschließend werden verschiedene Lösungsansätze betrachtet und auf Tauglichkeit geprüft. Anschließend werden verschiedene Lösungsansätze betrachtet und auf Tauglichkeit geprüft.
Nachdem ein akzeptabler Lösungsweg gefunden ist, wird dieser umgesetzt. Nachdem ein akzeptabler Lösungsweg gefunden ist, wird dieser umgesetzt.
Abschließend wird der Erfolg des Unterfanges evaluiert und mögliche, auf dieses Projekt aufbauende Arbeiten in Ausblick gestellt. Abschließend wird der Erfolg des Unterfangens evaluiert und mögliche, auf dieses Projekt aufbauende.

View File

@@ -4,7 +4,7 @@
\section{Problemstellung} \section{Problemstellung}
In der Arbeitsumgebung des Partnerunternehmens besteht zum Zeitpunkt der Themenfindung der hier beleuchteten Arbeit kein In der Arbeitsumgebung des Partnerunternehmens besteht zum Zeitpunkt der Themenfindung der hier beleuchteten Arbeit kein
Management für Secrets und Logindaten zwischen Entwickler*innen. Logindaten zu den Projekten des Unternehmens liegen schlicht in einem \ac{1P}-Vault. Management für Secrets und Logindaten zwischen Entwickler*innen. Logindaten zu den Projekten des Unternehmens liegen in einem großen \ac{1P}-Vault.
\ac{1P} ist der vom Unternehmen verwendete Passwortmanager. Auf diesen Vault haben sämtliche internen Entwickler*innen Zugriff, jedoch keine externen Entwickler*innen. \ac{1P} ist der vom Unternehmen verwendete Passwortmanager. Auf diesen Vault haben sämtliche internen Entwickler*innen Zugriff, jedoch keine externen Entwickler*innen.
Der Grund dafür ist, dass anderenfalls Lesezugriff auf sämtliche Einträge dieses Vaults gegeben werden müssten. Der Grund dafür ist, dass anderenfalls Lesezugriff auf sämtliche Einträge dieses Vaults gegeben werden müssten.
\ac{1P} unterstützt keine Freigaben einzelner Einträge an andere Nutzer, ohne diese Einträge in einen eigenen Vault zu kopieren. \ac{1P} unterstützt keine Freigaben einzelner Einträge an andere Nutzer, ohne diese Einträge in einen eigenen Vault zu kopieren.
@@ -14,7 +14,7 @@ All das gestaltet das Einbinden von externen Entwickler*innen, wie z.B. Freelanc
\\ \\
\\ \\
Ein weiteres Problem ist, dass Secrets in Konfigurationsdateien, die firmeninternen Ansible-Scripten Ein weiteres Problem ist, dass Secrets in Konfigurationsdateien, die firmeninternen Ansible-Scripten
beilegen, unverschlüsselt einsichtig sind. Das macht es zu einem großen Sicherheitsrisiko und somit, beilegen, unverschlüsselt einsichtig sind. Das macht es zu einem großen Sicherheitsrisiko und somit
inpraktikabel externen Entwickler*innen Zugriff auf dieses Ansible-Repository zu gewähren. inpraktikabel externen Entwickler*innen Zugriff auf dieses Ansible-Repository zu gewähren.
Dieses Ansible-Repository ist jedoch zwingend erforderlich, um eine Entwicklungsungebung für Dieses Ansible-Repository ist jedoch zwingend erforderlich, um eine Entwicklungsungebung für
Firmenprojekte auf dem lokalen Rechner zu schaffen. Auch hier sind Lösungen für externe Firmenprojekte auf dem lokalen Rechner zu schaffen. Auch hier sind Lösungen für externe

View File

@@ -8,12 +8,12 @@ ist ein Python-Projekt, das in der Lage ist, anhand einer Berechtigungs-Konfigur
\ac{1P}-Einträge in Entwickler*innen-Vaults zu kopieren, zu löschen und deren Referenz zu den originalen Einträgen zu wahren. \ac{1P}-Einträge in Entwickler*innen-Vaults zu kopieren, zu löschen und deren Referenz zu den originalen Einträgen zu wahren.
Diese Berechtigungs-Konfigurationsdatei unterstützt das Erfassen von Berechtigungen über Wildcard-Matching sowie über einzelne Diese Berechtigungs-Konfigurationsdatei unterstützt das Erfassen von Berechtigungen über Wildcard-Matching sowie über einzelne
\ac{UUID}-Zuweisungen. Diese Einträge können Entwickler*innen anschließend in der \ac{1P}-GUI-Anwendung einsehen.\\ \ac{UUID}-Zuweisungen. Diese Einträge können Entwickler*innen anschließend in der \ac{1P}-GUI-Anwendung einsehen.\\
Das Synchronisations-Werkzeug verweigert Anfragen, die zur Löschung von originalen Einträgen führen könnte. Das Synchronisations-Werkzeug verweigert Anfragen, die zur Löschung von originalen Einträgen führen könnten.
\\ \\
\\ \\
Ebenso ist Teil des Ergebnisses ein Ansible-Filtermodul, das in der Lage ist, unsensible \ac{1P}-Referenzen Ebenso ist Teil des Ergebnisses ein Ansible-Filtermodul, das in der Lage ist, unsensible \ac{1P}-Referenzen
in Host-Konfigurationsdateien aus \ac{1P} zu derereferenzieren, sowohl als interne*r Entwickler*in ohne Entwickler*innen-Vault, in Host-Konfigurationsdateien aus \ac{1P} zu dereferenzieren, sowohl als interne*r Entwickler*in ohne Entwickler*innen-Vault,
als auch als externe*r Entwickler*in mit\\ als auch als externe*r Entwickler*in mit
Entwickler*innen-Vault. Das geschiet in einer IT-sicherheitstechnich unbedenklichen Entwickler*innen-Vault. Das geschiet in einer IT-sicherheitstechnich unbedenklichen
und performanten Art- und Weise. und performanten Art- und Weise.
\\ \\
@@ -21,9 +21,8 @@ und performanten Art- und Weise.
Hiermit ist das in \fullref{tbl:lastenheft} definierte Lastenheft des Stakeholders in Gänze erfüllt. Hiermit ist das in \fullref{tbl:lastenheft} definierte Lastenheft des Stakeholders in Gänze erfüllt.
Nach Vorstellung der erarbeiteten Ergebnisse vor dem Stakeholder zeigt sich sich dieser zufrieden und bestätigt die Nach Vorstellung der erarbeiteten Ergebnisse vor dem Stakeholder zeigt sich sich dieser zufrieden und bestätigt die
pragmatische Korrektheit des Produktes. pragmatische Korrektheit des Produktes.
Die hier geschaffene Technologie bringt dem Partnerunternehmen zweierlei Mehrwert: Die hier geschaffene Technologie bringt dem Partnerunternehmen zweierlei Mehrwert:
Einerseits können \ac{1P}-Berechtigungen nun ohne weiteres beschränkt an Praktikant*innen, neu einngestellte und externe Entwickler*innen Einerseits können \ac{1P}-Berechtigungen nun ohne weiteres beschränkt an Praktikant*innen, neu eingestellte und externe Entwickler*innen
vergeben werden. Darüber hinaus bereitet diese Technologie den Weg für das Partnerunternehmen, vergeben werden. Darüber hinaus bereitet diese Technologie den Weg für das Partnerunternehmen,
ihr Docker-Ansible-Repository so anzupassen, dass es keine Klartext-Secrets mehr beinhaltet. ihr Docker-Ansible-Repository so anzupassen, dass es keine Klartext-Secrets mehr beinhaltet.
Das erlaubt dem Partnerunternehmen diese Toolbox mit externen Entwickler*innen und Agenturen zu teilen Das erlaubt dem Partnerunternehmen diese Toolbox mit externen Entwickler*innen und Agenturen zu teilen

View File

@@ -53,12 +53,13 @@ beschäftigt, anwendungsfallspezifisch geplant und umgesetzt wäre.
\end{nicepic} \end{nicepic}
\clearpage
Letztendlich entschied sich der Stakeholder gegen die Umsetzung der \ac{MASA}, da dieser Ansatz als zu Letztendlich entschied sich der Stakeholder gegen die Umsetzung der \ac{MASA}, da dieser Ansatz als zu
aufwändig betrachtet wird und für den durch sie erbrachten Vorteil zu viel Aufwand und Angriffsfläche schaffen würde. aufwändig betrachtet wird und für den durch sie erbrachten Vorteil zu viel Aufwand und Angriffsfläche schaffen würde.
\subsubsection{Ansatz 3} \subsubsection{Ansatz 3}
Der letzte Lösungsansatz befasst sich mit dem Erstellen dedizierter Vaults für jede*n Entwickler*in $d$. Der letzte Lösungsansatz befasst sich mit dem Erstellen dedizierter Vaults für jede*n Entwickler*in $d$.
Hierbei existiert eine Python-Toolbox, die anhand einer Yaml-Datei Referenzen auf diese Passwort-Einträge Hierbei existiert eine Python-Toolbox, die anhand einer Yaml-Datei Referenzen auf die Passwort-Einträge
in $\text{Vault}_d$ legt und von dort entfernt, wenn ein solcher Zugriff laut der Yaml-Datei nicht mehr vorgesehen ist. in $\text{Vault}_d$ legt und von dort entfernt, wenn ein solcher Zugriff laut der Yaml-Datei nicht mehr vorgesehen ist.
Diese Einträge können über feste Eintrags-IDs und über Regex bezogen auf die Eingrags-Titel einem/r Entwickler*in vorgesehen werden. Diese Einträge können über feste Eintrags-IDs und über Regex bezogen auf die Eingrags-Titel einem/r Entwickler*in vorgesehen werden.
@@ -69,7 +70,7 @@ Diese Einträge können über feste Eintrags-IDs und über Regex bezogen auf die
\label{fig:ansatz-3-mit-python} \label{fig:ansatz-3-mit-python}
\end{nicepic} \end{nicepic}
Letztendlich entschied sich der Stakeholder für Ansatz 3, da er ihm kostengünstig und aursreichend erschien. Nach Betrachtung der diversen Ansätze entschied sich der Stakeholder für Ansatz 3, da er ihm kostengünstig und ausreichend erschien.
\subsection{Kodierung} \subsection{Kodierung}
Um den vom Stakeholder ausgewählten Ansatz 3 wie geplant umzusetzen, wurden zunächst Um den vom Stakeholder ausgewählten Ansatz 3 wie geplant umzusetzen, wurden zunächst
@@ -135,7 +136,7 @@ wie zehn Anfragen für jeweils einen Eintrag zu stellen.
In der naiven Herangehensweise, um einen Eintrag einer bestimmten originalen \ac{UUID} zu finden, In der naiven Herangehensweise, um einen Eintrag einer bestimmten originalen \ac{UUID} zu finden,
wird jeder Eintrag auf dessen originale \ac{UUID} geprüft, bis der passende Eintrag gefunden wurde. wird jeder Eintrag auf dessen originale \ac{UUID} geprüft, bis der passende Eintrag gefunden wurde.
Dieser Lösungsweg hat für \emph{einen} Eintrag eine Zeitkomplexität von $O(n)$. Dieser Lösungsweg hat für \emph{einen} Eintrag eine Zeitkomplexität von $O(n)$.
Eine spätere Ergänzung, um die programmatische Auslesung \emph{eines} Eintrages einer bestimmten originalen \ac{UUID} in $O(1)$ anstatt $O(n)$ zu gewährleisten, Eine spätere Ergänzung, um das programmatische Auslesen \emph{eines} Eintrages einer bestimmten originalen \ac{UUID} in $O(1)$ anstatt $O(n)$ zu gewährleisten,
ist die Unterhaltung von Mapping-Objekten in Entwickler*innen-Vaults. ist die Unterhaltung von Mapping-Objekten in Entwickler*innen-Vaults.
Je Entwickler*innen-Vault wird abschließend zur Synchronisierung ein Mapping-Objekt erstellt. Je Entwickler*innen-Vault wird abschließend zur Synchronisierung ein Mapping-Objekt erstellt.
Diese Mapping-Objekte halten die Informationen vorrätig, welche öffentliche \ac{1P}-\ac{UUID} zu welcher privaten \ac{1P}-\ac{UUID} gehört. Diese Mapping-Objekte halten die Informationen vorrätig, welche öffentliche \ac{1P}-\ac{UUID} zu welcher privaten \ac{1P}-\ac{UUID} gehört.
@@ -149,29 +150,28 @@ Auf Unix-ähnlichen Betriebssystemen ist dieses Verhalten
standardmäßig aktiviert. \cite{bib:1password-cli-caching} standardmäßig aktiviert. \cite{bib:1password-cli-caching}
\subsubsection{Sicherheitsbedenken} \subsubsection{Sicherheitsbedenken}
Die Konfigurationsdatei definiert Entwickler*innen-Vaults, über ihre \acp{UUID}. In diesen IDs sieht ein*e Administrator*in keine Vaultnamen. Diese sind nicht sprechend. Die Konfigurationsdatei definiert Entwickler*innen-Vaults über ihre \acp{UUID}. In diesen IDs sieht ein*e Administrator*in keine Vaultnamen. Diese sind nicht sprechend.
Wenn nun aus etwaigen Gründen dort die \ac{UUID} eines Nutzvaults des Partnerunternehmems aufgeführt wäre, würde das Wenn nun aus etwaigen Gründen dort die \ac{UUID} 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. Werkzeug alle sich dort befindlichen Zugänge löschen. Das wäre ein Super-GAU in Form von Datenverlust.
\subsubsection{Sicherheitsvorkehrungen} \subsubsection{Sicherheitsvorkehrungen}
Um das zu verhindern, wurde eine Liste mit wichtigen Vault-IDs fest einkodiert. Um das zu verhindern, wurde eine Liste mit wichtigen Vault-IDs fest einkodiert.
Alle Erstell- oder Löschmethoden müssen einen Vault-ID-Parameter erhalten, selbst wenn dieser technisch nicht notwendig ist. Alle Erstell- oder Löschfunktionen müssen einen Vault-ID-Parameter erhalten, selbst wenn dieser technisch nicht notwendig ist.
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. Wenn diese Vault-ID nun in der Liste der fest kodierten Nutzvault-IDs vorkommt, meldet die Funktion einen deskriptiven Fehler und beendet die Programmausführung.
Somit ist gewährleistet, dass selbst bei einer fatalen Fehlkonfiguration kein Datenverlust entseht. Somit ist gewährleistet, dass selbst bei einer fatalen Fehlkonfiguration kein Datenverlust entseht.
\section{Integration in Ansible} \section{Integration in Ansible}
Eine Anfordergung beschreibt, dass \ac{1P}-Einträge von Entwicklern*innen innerhalb von Ansible-Playbooks Eine Anfordergung beschreibt, dass \ac{1P}-Einträge von Entwicklern*innen innerhalb von Ansible-Playbooks
dereferenziert und verwendet werden können. dereferenziert und verwendet werden können.
\ac{1P} unterstützt nativ das Ersetzen von \ac{1P}-Referenzen in Dateien durch Secrets. \ac{1P} unterstützt nativ das Ersetzen von \ac{1P}-Referenzen in Dateien durch Secrets.
Diese Technik nennt sich \enquote{\ac{1PSA}}. Diese Technik nennt sich \enquote{\ac{1PSA}}.
Diese Technologie ist jedoch nicht für die hier vorliegende Aufgabenstellung verwertbar, da die dem zugrunde liegende Diese Technologie ist jedoch nicht für die hier vorliegende Aufgabenstellung verwertbar, da die dem zugrunde liegende
Berechtigungsverwaltung auf Vault-Basis steht. Entweder hat ein*e Entwickler*in Zugriff auf einen gesamten Vault, oder er*sie hat keinen Zugriff auf den gesamten Vault. Berechtigungsverwaltung auf Vaults basiert. Entweder hat ein*e Entwickler*in Zugriff auf einen gesamten Vault, oder er*sie hat keinen Zugriff auf den gesamten Vault.
Eine feinere Steuerung ist hier nicht möglich, jedoch für die hier gegebenen Anforderungen nötig. \cite{bib:1password-secrets-automation} Eine feinere Steuerung ist hier nicht möglich, jedoch für die hier gegebenen Anforderungen nötig. \cite{bib:1password-secrets-automation}
\ac{1PSA} erfasst \acp{UUID} und ist daher mit dem Konzept von Entwickler*innen-Vaults inkompatibel, da \ac{1PSA} erfasst \acp{UUID} und ist daher mit dem Konzept von Entwickler*innen-Vaults inkompatibel, da
Entwickler*innen hierbei eigene Kopien der originalen Einträge führen, die jeweils eigene \acp{UUID} haben. Entwickler*innen hierbei eigene Kopien der originalen Einträge führen, die jeweils eigene \acp{UUID} haben.
Externe Entwickler*innen haben somit keinen Zugriff auf die originalen, öffentlichen \acp{UUID} und die privaten \acp{UUID}, die im Entwickler*innen-Vault Externe Entwickler*innen haben somit keinen Zugriff auf die originalen, öffentlichen \acp{UUID} und die privaten \acp{UUID}, die im Entwickler*innen-Vault
vorhanden sind, gelten jeweils nur für eine*n Entwickler*in. Das erfordert eine maßgeschneiderte, programmatische Lösung: vorhanden sind, existieren jeweils nur für eine*n Entwickler*in. Das erfordert eine maßgeschneiderte, programmatische Lösung:
\begin{nicepic} \begin{nicepic}
\includegraphics[width=0.75\textwidth]{images/docker-ansible-structure.png} \includegraphics[width=0.75\textwidth]{images/docker-ansible-structure.png}
@@ -186,13 +186,16 @@ Also eine UUID, die für alle Entwickler*innen greifbar ist.
Ab hier wird die Nutzergruppe \enquote{Entwickler*innen} in zwei Untergruppen strukturiert: Ab hier wird die Nutzergruppe \enquote{Entwickler*innen} in zwei Untergruppen strukturiert:
\begin{description} \begin{description}
\item [Interne Entwickler*innen] \hfill \\ \item [Interne Entwickler*innen] \hfill \\
Interne, festangestellte Entwickler*innen haben Vollzugriff auf den \ac{1P} und somit auch Zugriff auf die Interne, festangestellte Entwickler*innen haben Vollzugriff auf \ac{1P} und somit auch Zugriff auf die
in den Host-Konfigurationen vermerkte, öffentliche \ac{UUID} eines Eintrages. in den Host-Konfigurationen vermerkte, öffentliche \ac{UUID} eines Eintrages.
Da diese Entwickler*innen keinen Entwickler*innen-Vault haben, müssen sie direkt auf diese notierte, öffentliche \ac{UUID} zugreifen. Da diese Entwickler*innen keinen Entwickler*innen-Vault haben, müssen sie direkt auf diese notierte, öffentliche \ac{UUID} zugreifen.
\end{description}
\clearpage
\begin{description}
\item [Externe Entwickler*innen] \hfill \\ \item [Externe Entwickler*innen] \hfill \\
Externe Entwickler*innen verfügen über einen Entwickler*innen-Vault, nicht jedoch über direkten Zugriff auf die vermerkte, öffentliche \ac{UUID}. Externe Entwickler*innen verfügen über einen Entwickler*innen-Vault, nicht jedoch über direkten Zugriff auf die vermerkte, öffentliche \ac{UUID}.
Falls der*die jeweilige Entwickler*in Zugriff auf einen verlinkten Eintrag hat, dann nur auf eine Kopie des Eintrages in dessen*deren jeweiligen Entwickler*innen-Vault. Falls der*die jeweilige Entwickler*in Zugriff auf einen verlinkten Eintrag hat, dann nur auf eine Kopie des Eintrages in dessen*deren jeweiligen Entwickler*innen-Vault.
Diese Kopie hat eine andere \ac{UUID} als die, die in der Host-Konfiguration steht. Sie ist ja auf technischer Ebene ein anderer Eintrag, nur mit identischem Inhalt. Diese Kopie hat eine andere \ac{UUID} als die, die in der Host-Konfiguration steht. Sie ist auf technischer Ebene ein anderer Eintrag, nur mit identischem Inhalt.
Die in den Host-Konfigurationen vermerkten, öffentlichen \acp{UUID} müssen also zunächst in eine private, sich im Entwickler*innen-Vault befindliche, \ac{UUID} übersetzt werden. Die in den Host-Konfigurationen vermerkten, öffentlichen \acp{UUID} müssen also zunächst in eine private, sich im Entwickler*innen-Vault befindliche, \ac{UUID} übersetzt werden.
\end{description} \end{description}
@@ -219,10 +222,11 @@ Ein Beispiel mit dem im Rahmen dieser Ausarbeitung bereitgestellten Filtermodul
\end{nicepic} \end{nicepic}
\subsection{Akzeptierte Formate} \subsection{Akzeptierte Formate}
Das Filtermodul akzeptiert mehrere, verschiedene Eingabeformate und ist rückwärtskompatibil. Das Filtermodul akzeptiert mehrere, verschiedene Eingabeformate und ist rückwärtskompatibel.
\subsubsection*{Kein erkanntes Format} \subsubsection*{Kein erkanntes Format}
Wird kein bekanntes Format erkannt, wird der Wert unverändert zurückgegeben. Das ermöglicht Rückwärtskompatibilät, Wird kein bekanntes Format erkannt, wird der Wert unverändert zurückgegeben.
Das ermöglicht Rückwärtskompatibilität,
sodass nach-wie-vor hardgecodede Secrets funktionieren, und nicht versehentlich als \ac{UUID} interpretiert werden. sodass nach-wie-vor hardgecodede Secrets funktionieren, und nicht versehentlich als \ac{UUID} interpretiert werden.
Das gewährleistet eine flüssigere Migration der Host-Konfigurationen, da somit bestehende Dateien weiterhin valide sind. Das gewährleistet eine flüssigere Migration der Host-Konfigurationen, da somit bestehende Dateien weiterhin valide sind.
@@ -233,7 +237,7 @@ Es wird versucht, das Feld \enquote{password} aus diesem Eintrag zu dereferenzie
\subsubsection*{Objektformat} \subsubsection*{Objektformat}
Wird ein Yaml-Objekt übergeben, so werden die Keys \enquote{1P\_secret\_uuid} und \enquote{1P\_field\_id} erwartet. Wird ein Yaml-Objekt übergeben, so werden die Keys \enquote{1P\_secret\_uuid} und \enquote{1P\_field\_id} erwartet.
Diese definieren die Werte der Eintrags-\ac{UUID} und der Feld-ID in der ein Secret steht. Das ermöglicht z.B. auch den Benutzernamen (\textit{1P\_field\_id: username}) eines Diese definieren die Werte der Eintrags-\ac{UUID} und der Feld-ID in der ein Secret steht. Das ermöglicht z.B. auch den Benutzernamen (\textit{1P\_field\_id: username}) eines
Eintrages abzufragen, anstelle nur des Passworts. Ist keine Feld-ID gegeben, so wird auf das Standardfeld \enquote{password} zurückgefallen. Eintrages abzufragen, anstelle des Passworts. Ist keine Feld-ID gegeben, so wird auf das Standardfeld \enquote{password} zurückgefallen.
\subsection{Übersetzung der UUIDs} \subsection{Übersetzung der UUIDs}
@@ -248,11 +252,11 @@ von einem*r interne*n Entwickler*in ausgegangen. Sind beide Konfigurationen zugl
Ist ein*e interne*r Entwickler*in angenommen, so wird der Mapping-Schritt übersprungen. Der verbleibende Prozess bleibt unberührt. Ist ein*e interne*r Entwickler*in angenommen, so wird der Mapping-Schritt übersprungen. Der verbleibende Prozess bleibt unberührt.
\subsection{Kommunikation mit 1Password} \subsection{Kommunikation mit 1Password}
Ist eine \ac{UUID} ermittelt, auf die der*ie Nutzer*in Zugriff hat, wird diese über das \ac{1P}-CLI angefragt. Ist eine \ac{UUID} ermittelt, auf die der*die Nutzer*in Zugriff hat, wird diese über das \ac{1P}-CLI angefragt.
Dieser Aufruf ist: \textit{op item get <UUID>} mit dem Zusatz \textit{--format json}, um die Ausgabe programmatisch auswerten zu können. Dieser Aufruf ist: \textit{op item get <UUID>} mit dem Zusatz \textit{--format json}, um die Ausgabe programmatisch auswerten zu können.
\subsection{Performanz und Benchmarks} \subsection{Performanz und Benchmarks}
Um diese Konfiguration zu testen, werden in einem Testszenario fünf Werte aus \ac{1P} ausgelesen: Um die Implementation zu testen, werden in einem Testszenario fünf Werte aus \ac{1P} ausgelesen:
\begin{itemize} \begin{itemize}
\item Datenbank-Host \item Datenbank-Host
\item Datenbank-Port \item Datenbank-Port
@@ -260,7 +264,7 @@ Um diese Konfiguration zu testen, werden in einem Testszenario fünf Werte aus \
\item Datenbank-Passwort \item Datenbank-Passwort
\item Datenbank-Name \item Datenbank-Name
\end{itemize} \end{itemize}
Diese Einträge abzufragen dauert durch das imperformante \ac{1P}-CLI rund 17 Sekunden. Diese Einträge abzufragen dauert durch das imperformante \ac{1P}-CLI 17 Sekunden.
\subsection{Optimierung} \subsection{Optimierung}
Es bieten sich zwei Möglichkeiten an, den in \fullref{fig:flowchart-filtermodule-resolve-1p-secret} abgebildeten Prozess zu beschleunigen. Es bieten sich zwei Möglichkeiten an, den in \fullref{fig:flowchart-filtermodule-resolve-1p-secret} abgebildeten Prozess zu beschleunigen.
@@ -268,15 +272,15 @@ Diese beschäftigen sich damit, zu limitieren, wie oft das \ac{1P}-CLI angefragt
\begin{description} \begin{description}
\item [Das Mapping-Objekt zwischenspeichern] \hfill \\ \item [Das Mapping-Objekt zwischenspeichern] \hfill \\
Anstatt das Mapping-Objekt für jedes angefragte Secret erneut abzufragen, könnte es zwischengespeichert werden. Anstatt das Mapping-Objekt für jedes angefragte Secret erneut abzufragen, kann es zwischengespeichert werden.
\item [Ganze Einträge zwischenspeichern] \hfill \\ \item [Ganze Einträge zwischenspeichern] \hfill \\
Für den Fall, dass ein Eintrag mehrach angefragt wird, könnte ein einmal angefragter Eintrag zwischengespeichert werden. Für den Fall, dass ein Eintrag mehrfach angefragt wird, könnte ein einmal angefragter Eintrag zwischengespeichert werden.
Würden mehrere Felder eines Eintrages angefragt werden (z.B. \textit{=Host, Port, Benutzername, Passwort, Name}), so müsste der gesamte Eintrag nur ein mal angefragt werden. Würden mehrere Felder desselben Eintrages angefragt werden (z.B. \textit{=Host, Port, Benutzername, Passwort, Name}), so müsste der gesamte Eintrag nur ein mal angefragt werden.
\end{description} \end{description}
All diese Ansätze erfordern es Daten zwischenzuspeichern. Filtermodule haben allerdings keinen persistenten Arbeitsspeicher über verschiedene Aufrufe hinaus. All diese Ansätze erfordern es Daten zwischenzuspeichern. Filtermodule haben allerdings keinen persistenten Arbeitsspeicher über verschiedene Aufrufe hinaus.
E.g. nach jedem angefragten Secret, verliert er seinen internen Zustand. Also nach jedem angefragten Secret verliert das Filtermodul seinen Zustand.
Daher muss dieses zwischengespeichert in einer Datei stattfinden. Hierfür wird eine Tempdatei über Pythons \textit{tempfile.gettempdir()}-Funktion ermittelt. Daher muss der Zwischenspeicher eine Datei sein. Hierfür wird eine Tempdatei über Pythons \textit{tempfile.gettempdir()}-Funktion ermittelt.
Diese Zwischenspeicher beinhalten die vom \ac{1P}-CLI zurückgegebenen Informationen. Diese Zwischenspeicher beinhalten die vom \ac{1P}-CLI zurückgegebenen Informationen.
\begin{nicepic} \begin{nicepic}
@@ -290,7 +294,7 @@ Diese Zwischenspeicher beinhalten die vom \ac{1P}-CLI zurückgegebenen Informati
Wenn das Mapping-Objekt angefragt wird, so wird zunächst geprüft, ob es eine lokal zwischengespeicherte Version gibt. Wenn das Mapping-Objekt angefragt wird, so wird zunächst geprüft, ob es eine lokal zwischengespeicherte Version gibt.
Falls ja, wird diese geladen und verwendet. Falls ja, wird diese geladen und verwendet.
Falls nein, wird es via dem \ac{1P}-CLI angefragt und lokal gespeichert. Falls nein, wird es via dem \ac{1P}-CLI angefragt und lokal gespeichert.
Sollte der Mapping-Zwischenspeicher verwendet werden und das gesuchte Objekt nicht darin gefunden werden, so wird dieser Zwischenspeicher gelöscht und das Mapping-Objekt erneut angefragt. Sollte der Mapping-Zwischenspeicher verwendet werden und das gesuchte Objekt nicht darin gefunden werden, so wird der Zwischenspeicher gelöscht und das Mapping-Objekt neu angefragt.
Das deckt folgenden Problemfall ab: Das deckt folgenden Problemfall ab:
\begin{enumerate} \begin{enumerate}
@@ -312,10 +316,10 @@ Dieser Prozess würde durch diese Vorkehrung so aussehen:
\item Der Prozess ist erfolgreich \item Der Prozess ist erfolgreich
\end{enumerate} \end{enumerate}
Durch die Implementation des Mapping-Zwischenspeichers, wird die Ausführzeit von 17 Sekunden auf acht Sekunden reduziert. Durch die Implementation des Mapping-Zwischenspeichers wird die Ausführzeit von 17 Sekunden auf acht Sekunden reduziert.
\subsubsection{Eintrags-Zwischenspeicher} \subsubsection{Eintrags-Zwischenspeicher}
Wird ein Eintrag von \ac{1P} angefragt, so soll das Filtermodul diessen lokal zwischengespeichern. Wird ein Eintrag von \ac{1P} angefragt, so soll das Filtermodul diesen lokal zwischenspeichern.
Das stellt ein Problem dar, sobald der Eintrag Das stellt ein Problem dar, sobald der Eintrag
im Entwickler*innen-Vault manuell verändert wird. Das ist jedoch nicht angedacht. im Entwickler*innen-Vault manuell verändert wird. Das ist jedoch nicht angedacht.
Die Entwickler*innen sollten keine Schreibberechtigung auf ihren Vault haben. Die Entwickler*innen sollten keine Schreibberechtigung auf ihren Vault haben.
@@ -341,6 +345,6 @@ Durch das Implementieren des Eintrags-Zwischenspeichers wird die Ausführzeit vo
\end{table} \end{table}
\subsubsection{Sicherheit} \subsubsection{Sicherheit}
Um zu vermeiden, dass sensible Daten, wie zum Beispiel die Secrets in den Eintrags-Daten des Passwortmanagers im Klartext im Zwischenspeicher, für viele Prozesse lesbar, gespeichert werden, Um zu vermeiden, dass sensible Daten, wie zum Beispiel die Secrets in den Eintragsdaten des Passwortmanagers im Klartext im Zwischenspeicher, für viele Prozesse lesbar, gespeichert werden,
werden diese in der Schreib- und Lesefunktion mit AES-256 verschlüsselt. werden diese in der Schreib- und Lesefunktion mit AES-256 verschlüsselt.
Die Wahl fällt auf AES-256, weil es keine bekannten Angriffe gegen AES-256 gibt, die wesentlich effektiver sind als generische Angriffe gegen Blockchiffren. \cite{bib:BSI-TR-02102-1-2024} Die Wahl fällt auf AES-256, weil es keine bekannten Angriffe gegen AES-256 gibt, die wesentlich effektiver als generische Angriffe gegen Blockchiffren sind. \cite{bib:BSI-TR-02102-1-2024}

View File

@@ -10,10 +10,10 @@
\newcommand{\cfgDocClassification}{Projektbericht} \newcommand{\cfgDocClassification}{Projektbericht}
% Document version % Document version
\newcommand{\cfgDocVersion}{1.2} \newcommand{\cfgDocVersion}{1.4}
% Last modification date % Last modification date
\newcommand{\cfgDateLastModification}{17. Februar 2025} \newcommand{\cfgDateLastModification}{26. Februar 2025}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -40,7 +40,7 @@
\newcommand{\cfgUniversityDepartment}{Fachbereich Informatik} \newcommand{\cfgUniversityDepartment}{Fachbereich Informatik}
% University degree course % University degree course
\newcommand{\cfgUniversityDegreeCourse}{Angewandte Informatik - dual (M.Sc)} \newcommand{\cfgUniversityDegreeCourse}{Angewandte Informatik - dual (M.Sc.)}
% University supervisor name % University supervisor name
\newcommand{\cfgUniversitySupervisorName}{Professor Dr. Heinemann} \newcommand{\cfgUniversitySupervisorName}{Professor Dr. Heinemann}
@@ -56,3 +56,4 @@
% University course name % University course name
\newcommand{\cfgCourseName}{Deep Dive} \newcommand{\cfgCourseName}{Deep Dive}

View File

@@ -6,7 +6,7 @@
\begin{description} \begin{description}
\item [(1P-)Eintrag/Secret] \hfill \\ \item [(1P-)Eintrag/Secret] \hfill \\
Eine Gruppierung an Daten, die einen Login ermögliche. Z.B. $(\text{Nutzername},\text{Passwort})$. Eine solche Struktur kann bein \ac{1P} aus beliebig vielen Schlüsselwertpaaren bestehen. Wird in dieser Ausarbeitung synonym zu 'Secret' verwendet. Eine Gruppierung an Daten, die einen Login ermöglichen. Z.B. $(\text{Nutzername},\text{Passwort})$. Eine solche Struktur kann bei \ac{1P} aus beliebig vielen Schlüsselwertpaaren bestehen. Wird in dieser Ausarbeitung synonym zu 'Secret' verwendet.
\item [(1P-)Vault] \hfill \\ \item [(1P-)Vault] \hfill \\
Eine Kollektion an Secret-Einträgen in einem Passwort-Manager (1Password). Eine Kollektion an Secret-Einträgen in einem Passwort-Manager (1Password).
\item [Ansible-Playbook/s] \hfill \\ \item [Ansible-Playbook/s] \hfill \\
@@ -20,14 +20,17 @@
\item [Entwickler*innen-Vault] \hfill \\ \item [Entwickler*innen-Vault] \hfill \\
Ein 1P-Vault, in dem die Kopien bzw. Referenzen auf Einträge des Partnerunternehmens verortet sind. Hier liegen nur Kopien bzw. Referenzen! Ein 1P-Vault, in dem die Kopien bzw. Referenzen auf Einträge des Partnerunternehmens verortet sind. Hier liegen nur Kopien bzw. Referenzen!
Der Sinn eines solchen Vaultes ist es, Entwickler*innen beschränkten Lesezugriff auf Daten der Nutzvaults zu gewähren. Der Sinn eines solchen Vaultes ist es, Entwickler*innen beschränkten Lesezugriff auf Daten der Nutzvaults zu gewähren.
\end{description}
\clearpage
\begin{description}
\item [Jinja-Templating-Engine] \hfill \\ \item [Jinja-Templating-Engine] \hfill \\
Eine Templating Engine, die das Jina-Format verwendet. Ansible verwendet eine Jinja-Templating-Engine. Eine Templating Engine, die das Jinja-Format verwendet. Ansible verwendet eine Jinja-Templating-Engine.
\item [Listenansicht / Listenaufruf] \hfill \\ \item [Listenansicht / Listenaufruf] \hfill \\
Eine Anfrage, die eine Liste von Objekten oder Einträgen zurückgibt. Eine Anfrage, die eine Liste von Objekten oder Einträgen zurückgibt.
\item [Nutzvault] \hfill \\ \item [Nutzvault] \hfill \\
Ein 1P-Vault, in dem die originalen Einträge des Partnerunternehmens verortet sind. Hier liegen keine Kopien, sondern Originale! Ein 1P-Vault, in dem die originalen Einträge des Partnerunternehmens verortet sind. Hier liegen keine Kopien, sondern Originale!
\item [Öffentliche 1P-UUID] \hfill \\ \item [Öffentliche 1P-UUID] \hfill \\
Die 1P-UUID, die zu einem originalen Eintrag gehört, und nicht zu einer Referenz. Die 1P-UUID, die zu einem originalen Eintrag gehört und nicht zu einer Referenz.
Externe Entwickler*innen haben also keinen direkten Zugriff auf einen solchen Eintrag, sondern müssen stattdessen eine Referenz auf diesen Eintrag verwenden. Externe Entwickler*innen haben also keinen direkten Zugriff auf einen solchen Eintrag, sondern müssen stattdessen eine Referenz auf diesen Eintrag verwenden.
Eine solche UUID kann beispielsweise in Ansible-Konfigurationdateien stehen Eine solche UUID kann beispielsweise in Ansible-Konfigurationdateien stehen
und von jedem*r Entwickler*in verwendet werden. und von jedem*r Entwickler*in verwendet werden.

View File

@@ -92,6 +92,11 @@ hidelinks, % avoid weird ref highlighting
\usepackage{float} \usepackage{float}
% Reduce excessive line height in lists
\usepackage{enumitem,setspace,lipsum,etoolbox}
\AtBeginEnvironment{itemize}{\par\medskip\setstretch{0.5}}
\AtBeginEnvironment{enumerate}{\par\medskip\setstretch{0.5}}
% Metadaten % Metadaten
\usepackage[pdftex, \usepackage[pdftex,
pdfauthor={\cfgAuthorName}, pdfauthor={\cfgAuthorName},
@@ -105,3 +110,4 @@ hidelinks, % avoid weird ref highlighting
% Load custom environments % Load custom environments
\input{environments} \input{environments}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 103 KiB

BIN
main.pdf

Binary file not shown.