|
|
|
@@ -11,8 +11,8 @@ Ein Artefakt des Brainstormings ist eine Mind-Map, die unter \fullref{app:ideens
|
|
|
|
|
\subsubsection{Ansatz 1}
|
|
|
|
|
Der aus dieser Mindmap, nach individueller Meinung des Autors, vielversprechenste Ansatz ist es,
|
|
|
|
|
die \ac{1P}-Restful-API zu verwenden.
|
|
|
|
|
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
|
|
|
|
|
Bei diesem Ansatz würden Administratoren*innen und Entwicklern*innen API-Keys für \ac{1P} erhalten.
|
|
|
|
|
Entwickler*innen hätten mit ihren Keys bestimmte Leseberechtigungen $r$ und Administratoren*innen
|
|
|
|
|
die Berechtigung $r$ zu verändern.
|
|
|
|
|
|
|
|
|
|
\begin{nicepic}
|
|
|
|
@@ -30,7 +30,7 @@ Der nächste Lösungsansatz befasst sich mit einer Abstraktionsebene: Der \ac{MA
|
|
|
|
|
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
|
|
|
|
|
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,
|
|
|
|
|
Die \ac{MASA} provisioniert eigene API-Keys an Entwickler*innen und vermerkt serverseitig,
|
|
|
|
|
welcher API-Key berechtigt ist, welche \ac{1P}-Einträge abzufragen.
|
|
|
|
|
Der API-Key könnte grundlegende Informationen wie zum Beispiel Entwickler*innennamen und Ablaufzeitpunkte des
|
|
|
|
|
Keys einbetten. Dieser Ansatz trägt viel Sicherheitsverantwortung, da eine mögliche Ausnutzung einer
|
|
|
|
@@ -40,9 +40,9 @@ Um diesem Risikofaktor entgegenzuwirken würde der \ac{1P}-Key der \ac{MASA} ver
|
|
|
|
|
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,
|
|
|
|
|
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
|
|
|
|
|
erhalten würde. Dieser Ansatz erlaubt weitreichende Flexibilität, da sämtliche Logik, die sich mit Berechtigungen
|
|
|
|
|
beschäftigt, anwendungsfallspezifisch geplant und umgesetzt wäre.
|
|
|
|
|
|
|
|
|
|
\begin{nicepic}
|
|
|
|
@@ -53,12 +53,13 @@ beschäftigt, anwendungsfallspezifisch geplant und umgesetzt wäre.
|
|
|
|
|
\end{nicepic}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
\clearpage
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
\subsubsection{Ansatz 3}
|
|
|
|
|
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.
|
|
|
|
|
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}
|
|
|
|
|
\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}
|
|
|
|
|
Um den vom Stakeholder ausgewählten Ansatz 3 wie geplant umzusetzen, wurden zunächst
|
|
|
|
@@ -78,7 +79,8 @@ 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 \\
|
|
|
|
|
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.
|
|
|
|
|
Einen API-Key zu erstellen, zu übermitteln und als Nutzer zu verorten ist kostspielig und umständlich.
|
|
|
|
|
Ein \ac{1P}-Konto haben dem gegenüber viele externe Partner*innen des Partnerunternehmens bereits.
|
|
|
|
|
\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 \\
|
|
|
|
@@ -94,7 +96,7 @@ Es wurde eine rudimentäre Architektur entworfen, die beschreibt, welche Kompone
|
|
|
|
|
Am unteren Ende dieses Aggregatbaumes stehen atomare Operationen. Im Kontext dieses Werkzeuges sind atomare Operationen Operationen,
|
|
|
|
|
die vom \ac{1P}-CLI ausgeführt werden. Diese Operationen implementiert also \ac{1P} selbst.
|
|
|
|
|
Hierbei handelt es sich nur um Lese, Erstell- und Löschvorgänge. Das Erfassen, auf welchen Eintrag welche*r Entwickler*in Zugriff hat,
|
|
|
|
|
und auf welche nicht, übernimmt \textit{sync-dev-vault.py}. Die Funktionen der andere Skripte ergeben sich in Gänze aus ihren Dateinamen.
|
|
|
|
|
und auf welche nicht, übernimmt \textit{sync-dev-vault.py}. Die Funktionen der anderen Skripte ergeben sich in Gänze aus ihren Dateinamen.
|
|
|
|
|
|
|
|
|
|
\begin{nicepic}
|
|
|
|
|
\includegraphics[width=1\textwidth]{images/config-file.png}
|
|
|
|
@@ -120,7 +122,7 @@ Die Funktionsweise des Programmes ist wie folgt:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\subsubsection{Performanzprobleme und Optimierung}
|
|
|
|
|
Eine Schwierigkeit, die sich im Rahmen der Umsetzung offenbart hat, ist, dass das \ac{1P}-CLI sehr langsam ist.
|
|
|
|
|
Eine Schwierigkeit, die sich im Rahmen der Umsetzung offenbarte, ist, dass das \ac{1P}-CLI sehr langsam ist.
|
|
|
|
|
Soll die Liste aller Einträge eines Vaults ausgelesen werden, dauert das nach Erfahrungen des Autors etwa eine Sekunde, da es sich hierbei um \emph{eine} Anfrage handelt.
|
|
|
|
|
Diese Listenansicht zeigt jedoch nur begrenzte Informationen der Einträge.
|
|
|
|
|
Soll ein bestimmtes Feld eines Eintrages (z.B. \enquote{Originale Eintrags-ID}) in Erfahrug gebracht werden, müssen alle Informationen \textit{eines} Eintrages
|
|
|
|
@@ -131,14 +133,16 @@ Das \ac{1P}-CLI kann zwar für Detail-Aufrufe mehrere Eintrags-IDs auf Standard-
|
|
|
|
|
wie zehn Anfragen für jeweils einen Eintrag zu stellen.
|
|
|
|
|
\\
|
|
|
|
|
\\
|
|
|
|
|
Die naive Herangehensweise, um einen Eintrag einer bestimmten originalen \ac{UUID} zu finden, ist es, jeden Eintrag auf dessen originale \ac{UUID} zu prüfen, bis der passende Eintrag gefunden wurde.
|
|
|
|
|
Diese Lösungsweg hat eine Zeitkomplexität von $O(n^2)$.
|
|
|
|
|
Eine spätere Ergänzung, um die programmatische Auslesung der Einträge einer bestimmten originalen \ac{UUID} in $O(n)$ anstatt $O(n^2)$ zu gewährleisten, ist die Unterhaltung von Mapping-Objekten in Entwickler*innen-Vaults.
|
|
|
|
|
Je Entwickler*innen-Vault wird abschließend der Synchronisierung ein Mapping-Objekt erstellt.
|
|
|
|
|
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.
|
|
|
|
|
Dieser Lösungsweg hat für \emph{einen} Eintrag eine Zeitkomplexität von $O(n)$.
|
|
|
|
|
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.
|
|
|
|
|
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.
|
|
|
|
|
Mit diesen Mapping-Objekten kann ein beliebiger Eintrag anhand einer öffentlichen \ac{UUID}
|
|
|
|
|
binnen zwei Anfragen erfasst werden: Anfragen des Mapping-Objektes und Anfragen des privaten Objektes.
|
|
|
|
|
Das entspricht einer Zeitkomplexität von $O(2n) = O(n)$.
|
|
|
|
|
Das entspricht einer Zeitkomplexität von $O(2) = O(1)$.
|
|
|
|
|
Desweiteren kann \ac{1P} Eintragsdaten lokal zwischenspeichern.
|
|
|
|
|
Diese Option lässt sich mit dem Flag \textit{--cache} auf Leseoperationen anwenden
|
|
|
|
|
und beschleunigt das Auslesen der angefragten Informationen, soweit diese im Cache existieren.
|
|
|
|
@@ -146,29 +150,28 @@ Auf Unix-ähnlichen Betriebssystemen ist dieses Verhalten
|
|
|
|
|
standardmäßig aktiviert. \cite{bib:1password-cli-caching}
|
|
|
|
|
|
|
|
|
|
\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
|
|
|
|
|
Werkzeug alle sich dort befindlichen Zugänge löschen. Das wäre ein Super-GAU in Form von Datenverlust.
|
|
|
|
|
|
|
|
|
|
\subsubsection{Sicherheitsvorkehrungen}
|
|
|
|
|
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.
|
|
|
|
|
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.
|
|
|
|
|
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 Funktion einen deskriptiven Fehler und beendet die Programmausführung.
|
|
|
|
|
Somit ist gewährleistet, dass selbst bei einer fatalen Fehlkonfiguration kein Datenverlust entseht.
|
|
|
|
|
|
|
|
|
|
\section{Integration in Ansible}
|
|
|
|
|
Eine Anfordergung beschreibt, dass \ac{1P}-Einträge von Entwickler*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.
|
|
|
|
|
|
|
|
|
|
\ac{1P} unterstützt nativ das Ersetzen von \ac{1P}-Referenzen in Dateien durch Secrets.
|
|
|
|
|
Diese Technik nennt sich \enquote{\ac{1PSA}}.
|
|
|
|
|
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 keinen Zugriff auf den gesamten Vault.
|
|
|
|
|
Eine feingranularere Steuerung ist hier nicht möglich, jedoch für die hier gegebenen Anforderungen nötig. \cite{bib:1password-secrets-automation}
|
|
|
|
|
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}
|
|
|
|
|
\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.
|
|
|
|
|
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 ein*e 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}
|
|
|
|
|
\includegraphics[width=0.75\textwidth]{images/docker-ansible-structure.png}
|
|
|
|
@@ -183,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:
|
|
|
|
|
\begin{description}
|
|
|
|
|
\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.
|
|
|
|
|
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 \\
|
|
|
|
|
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-Vaults.
|
|
|
|
|
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.
|
|
|
|
|
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 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.
|
|
|
|
|
\end{description}
|
|
|
|
|
|
|
|
|
@@ -200,8 +206,12 @@ Texttransformator und kann in Ansible verwendet werden.
|
|
|
|
|
\\
|
|
|
|
|
\texttt{\{\{\ \enquote{hello world} | uppercase \}\}}.\\
|
|
|
|
|
\cite{bib:ansible-filter-plugins}
|
|
|
|
|
\\
|
|
|
|
|
\\
|
|
|
|
|
Dieses Beispiel führt das \enquote{uppercase}-Filtermodul an.
|
|
|
|
|
Ein Beispiel mit dem im Rahmen dieser Ausarbeitung bereitgestellten Filtermodul würde so aussehen:\\
|
|
|
|
|
Ein Beispiel mit dem im Rahmen dieser Ausarbeitung bereitgestellten Filtermodul würde so aussehen:
|
|
|
|
|
\\
|
|
|
|
|
\\
|
|
|
|
|
\texttt{\{\{ smtp.password | resolve\_1p\_secret \}\}}.
|
|
|
|
|
|
|
|
|
|
\begin{nicepic}
|
|
|
|
@@ -212,10 +222,11 @@ Ein Beispiel mit dem im Rahmen dieser Ausarbeitung bereitgestellten Filtermodul
|
|
|
|
|
\end{nicepic}
|
|
|
|
|
|
|
|
|
|
\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}
|
|
|
|
|
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.
|
|
|
|
|
Das gewährleistet eine flüssigere Migration der Host-Konfigurationen, da somit bestehende Dateien weiterhin valide sind.
|
|
|
|
|
|
|
|
|
@@ -226,7 +237,7 @@ Es wird versucht, das Feld \enquote{password} aus diesem Eintrag zu dereferenzie
|
|
|
|
|
\subsubsection*{Objektformat}
|
|
|
|
|
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
|
|
|
|
|
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}
|
|
|
|
@@ -241,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.
|
|
|
|
|
|
|
|
|
|
\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.
|
|
|
|
|
|
|
|
|
|
\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}
|
|
|
|
|
\item Datenbank-Host
|
|
|
|
|
\item Datenbank-Port
|
|
|
|
@@ -253,7 +264,7 @@ Um diese Konfiguration zu testen, werden in einem Testszenario fünf Werte aus \
|
|
|
|
|
\item Datenbank-Passwort
|
|
|
|
|
\item Datenbank-Name
|
|
|
|
|
\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}
|
|
|
|
|
Es bieten sich zwei Möglichkeiten an, den in \fullref{fig:flowchart-filtermodule-resolve-1p-secret} abgebildeten Prozess zu beschleunigen.
|
|
|
|
@@ -261,15 +272,15 @@ Diese beschäftigen sich damit, zu limitieren, wie oft das \ac{1P}-CLI angefragt
|
|
|
|
|
|
|
|
|
|
\begin{description}
|
|
|
|
|
\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 \\
|
|
|
|
|
Für den Fall, dass ein Eintrag mehrach 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üsse der gesamte Eintrag nur ein mal angefragt werden.
|
|
|
|
|
Für den Fall, dass ein Eintrag mehrfach angefragt wird, könnte ein einmal angefragter Eintrag zwischengespeichert 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}
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
Daher muss dieses zwischengespeichert in einer Datei stattfinden. Hierfür wird eine Tempdatei über Pythons \textit{tempfile.gettempdir()}-Funktion ermittelt.
|
|
|
|
|
Also nach jedem angefragten Secret verliert das Filtermodul seinen Zustand.
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
\begin{nicepic}
|
|
|
|
@@ -283,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.
|
|
|
|
|
Falls ja, wird diese geladen und verwendet.
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
|
|
\begin{enumerate}
|
|
|
|
@@ -305,10 +316,10 @@ Dieser Prozess würde durch diese Vorkehrung so aussehen:
|
|
|
|
|
\item Der Prozess ist erfolgreich
|
|
|
|
|
\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}
|
|
|
|
|
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
|
|
|
|
|
im Entwickler*innen-Vault manuell verändert wird. Das ist jedoch nicht angedacht.
|
|
|
|
|
Die Entwickler*innen sollten keine Schreibberechtigung auf ihren Vault haben.
|
|
|
|
@@ -334,6 +345,6 @@ Durch das Implementieren des Eintrags-Zwischenspeichers wird die Ausführzeit vo
|
|
|
|
|
\end{table}
|
|
|
|
|
|
|
|
|
|
\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.
|
|
|
|
|
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}
|
|
|
|
|