7 Min. Lesezeit

Wie sollten unsignierte lokale Builds eine Genehmigung erhalten?

Unsignierte lokale Builds lassen sich sicher betreiben, wenn Genehmigungen auf Prozessherkunft, Sitzungsgrenzen und eingeschränkten Zugangsdaten statt auf pauschalem Vertrauen beruhen.

Wie sollten unsignierte lokale Builds eine Genehmigung erhalten?

Ein unsignierter lokaler Build ist nicht automatisch verdächtig. Er besitzt aber auch keine erkennbare Identität. Beide Tatsachen müssen zusammenpassen. Sonst führt dein Genehmigungsprozess zu einer von zwei schlechten Gewohnheiten: Entwickler genehmigen jeden anonymen Prozess, weil sie arbeiten müssen, oder sie geben auf und lassen Agenten mit direkten Zugangsdaten laufen.

Die nützlichere Frage ist enger gefasst: Welche Belege erlauben es einer Person, genau diesen Lauf eines lokal kompilierten Agenten zu genehmigen, ohne so zu tun, als verdiene jeder Prozess aus einem bekannten Ordner dasselbe Vertrauen? Die Antwort ist ein Ablauf rund um Sitzungsgrenzen, Startherkunft, eingeschränkte Zugangsdaten und die Bereitschaft, Anfragen abzulehnen, die sich nicht erklären lassen.

Unsigniert ist eine fehlende Aussage, keine Risikobewertung

Unsignierter Code hat keine durch einen Herausgeber bestätigte Identität angegeben, die du über eine Zertifikatskette prüfen kannst. Das sagt allein nichts darüber aus, ob der Code bösartig, geprüft, lokal verändert oder gerade aus dem Repository gebaut wurde, das du geöffnet hast. Es entfernt lediglich eine bestimmte Art von Beleg.

Teams machen diesen Fehler in beide Richtungen. Die eine Gruppe behandelt jede unsignierte ausführbare Datei als feindlich und drängt normale Entwicklung in Nebenwege und persönliche API-Schlüssel. Die andere versteht «unsigniert» als Kurzform für «mein lokaler Code» und schafft damit eine breite Genehmigungskategorie, die ein unabhängiger Prozess ausnutzen kann.

Halte diese Unterscheidungen getrennt:

  • Identität des Herausgebers beantwortet, wer einen verteilten Build signiert hat.
  • Herkunft des Builds beantwortet, welcher Quellcode, welche Revision, welcher Rechner und welcher Befehl diese ausführbare Datei erzeugt haben.
  • Laufzeit-Herkunft beantwortet, was den Prozess, der gerade Zugriff anfordert, gestartet hat.
  • Aktionsberechtigung beantwortet, welche Zugangsdaten oder welchen Fernzugriff dieser Prozess verwenden darf.

Eine Signatur kann bei der ersten Frage helfen. Ein sauberer lokaler Ablauf muss die anderen drei beantworten. Wenn eine Entwicklerin oder ein Entwickler einen Agent-Client aus einem Arbeitsverzeichnis kompiliert, stammt das Vertrauen meist aus dem Zustand des Repositorys und dem gerade ausgeführten Befehl, nicht aus einem öffentlichen Zertifikat. Die Genehmigungsansicht sollte diese Belege zeigen, statt das Fehlen eines Zertifikats als Urteil zu behandeln.

Apples Dokumentation zur Codesignierung zieht dieselbe Grenze auf formellere Weise. Eine Designated Requirement identifiziert eine Instanz signierten Codes innerhalb der Richtlinie, die sie prüft. Sie beweist nicht, dass der Code für jede Ressource oder jede spätere Aktion geeignet ist. Apple weist außerdem darauf hin, dass jedes macOS-Subsystem seine eigene Vertrauensrichtlinie anwendet. Ein Aktions-Gateway sollte den Signaturstatus deshalb nicht in eine allgemeine Berechtigungsentscheidung verwandeln.

Eine Spur für lokale Builds braucht Belege, die andere Prozesse nicht übernehmen können

Gib lokal kompilierten Agent-Clients eine eigene Genehmigungsspur. Fasse sie nicht in einer Kategorie wie «unsigniert», «Entwicklung» oder «Terminal» zusammen. Diese Bezeichnungen beschreiben zu viele Prozesse, um hilfreich zu sein.

Vor der Genehmigung einer Sitzung sollte die Spur vier Belege verlangen:

  1. Der Pfad der ausführbaren Datei liegt in einem Checkout oder Build-Ausgabeverzeichnis, das die Entwicklerin oder der Entwickler kontrolliert.
  2. Der übergeordnete Prozess ist ein erwarteter Starter, normalerweise ein Terminal, eine IDE-Aufgabe oder ein Wrapper-Skript des Teams.
  3. Repository-Zustand und Build-Befehl lassen sich leicht prüfen, ohne den Tag aus dem Gedächtnis rekonstruieren zu müssen.
  4. Ziel und Zugangsdaten passen zur aktuellen Aufgabe.

Keines dieser Signale ist für sich perfekt. Zusammen erschweren sie es einem zufälligen Download, einem Hintergrundhelfer oder einer kompromittierten Abhängigkeit, als gewöhnlicher lokaler Lauf durchzugehen.

Hier greifen Teams oft zu einer Richtlinien-Engine: Pfade unterhalb eines Verzeichnisses erlauben, Befehle freigeben, deren Name mit agent beginnt, oder alles ausnehmen, was von einer bestimmten IDE gestartet wurde. Tu das nicht. Eine statische Regel wirkt attraktiv, weil sie Unterbrechungen beseitigt. Sie verwandelt aber eine leicht prüfbare Entscheidung in eine dauerhafte Ausnahme. Jeder Prozess, der den passenden Pfad oder die passende Elternkette herstellen kann, erbt diese Ausnahme.

Verwende stattdessen eine menschliche Genehmigung an der Sitzungsgrenze. Die Genehmigungskarte sollte die Codesignaturinstanz anzeigen, sofern eine vorhanden ist. Bei einem unsignierten Build braucht dieses Feld aber weiteren Kontext: Pfad der ausführbaren Datei, übergeordneter Befehl, Arbeitsverzeichnis, sofern verfügbar, und Ziel, das der Prozess erreichen möchte. So kann die Entwicklerin oder der Entwickler eine echte Frage beantworten: «Ist das der Client, den ich gerade für diese Aufgabe gebaut habe?»

Sallyports sitzungsbezogene Autorisierung passt zu dieser Spur, weil sie einmal für einen neuen Agent-Prozess fragt und die Genehmigung nur bis zum Ende des Prozesses behält. Die Prozesseinheit ist die Entscheidungsgrundlage, nicht eine vage Klasse unsignierter Software.

Ein vertrauter Pfad ist ein Beleg, keine Identität

Ein Pfad wie ~/src/agent-client/dist/agent wirkt beruhigend, weil er eine plausible Geschichte erzählt. Er ist aber keine Identitätsgrenze. Ein bösartiger Prozess kann von diesem Pfad aus laufen, wenn er dort schreiben, eine Ausgabe ersetzen, einen Symlink ändern oder einen Starter dazu bringen kann, eine andere ausführbare Datei aufzulösen.

Sorge zunächst dafür, dass die legitime Geschichte langweilig und wiederholbar ist. Jede Entwicklerin und jeder Entwickler sollte einen normalen Checkout-Ort besitzen. Build-Ausgaben sollten innerhalb dieses Checkouts oder in einem vorhersehbaren Verzeichnis liegen, in das nur das jeweilige Benutzerkonto schreiben kann. Vermeide gemeinsam genutzte Build-Verzeichnisse, Downloads, temporäre Ordner, synchronisierte Ordner und Projektverzeichnisse, in denen Paketskripte regelmäßig ausführbare Dateien neu schreiben.

Ein praktischer Startvertrag kann so klein sein:

#!/bin/zsh
set -eu

repo="$HOME/src/agent-client"
cd "$repo"

git status --short
git rev-parse --short HEAD
exec ./build/agent-client --mcp

Wichtig ist nicht die Shell-Syntax. Wichtig sind die Belege, die sie hinterlässt. Die übergeordnete Shell hat einen bekannten Skriptpfad, das Arbeitsverzeichnis verweist auf einen Checkout, die Git-Revision wird vor dem Start des Clients ausgegeben, und exec ersetzt die Shell durch das vorgesehene Programm, statt eine verwirrende Prozesskette zurückzulassen.

Lass dieses Skript keine Version herunterladen, einen Branch aus einer Umgebungsvariable auswählen, einen Paketmanager-Hook ausführen oder eine veränderliche Konfigurationsdatei außerhalb des Checkouts einlesen. Diese Bequemlichkeiten machen den Startvertrag weniger aussagekräftig, weil die prüfende Person nicht mehr erkennen kann, was das Skript tatsächlich ausgewählt hat.

Wenn der Agent-Client generierten Code braucht, erzeuge ihn als Teil des ausdrücklich angegebenen Build-Befehls. Wenn er eine lokale Konfigurationsdatei benötigt, übergib den Dateipfad sichtbar und halte die Datei nur dann außerhalb des Repositorys, wenn sie maschinenspezifische Einstellungen enthält. Verstecke keine Zugangsdaten darin. Dafür gibt es das Gateway: Der Client soll sie nicht benötigen.

Prüfe den Prozess, bevor du die Sitzung genehmigst

Eine gute Genehmigungsentscheidung dauert Sekunden, sollte aber nicht vom Gedächtnis abhängen. Wenn ein neuer lokaler Prozess eine API aufrufen oder SSH öffnen möchte, prüfe die ausführbare Datei und die Elternkette, bevor du auf «Genehmigen» klickst.

Unter macOS liefern diese Befehle einen nützlichen ersten Überblick. Ersetze die Beispiel-PID durch die PID, die dein Prozessmonitor oder Terminal anzeigt:

pid=48271

ps -o pid=,ppid=,user=,lstart=,command= -p "$pid"
ps -o pid=,ppid=,command= -p "$(ps -o ppid= -p "$pid" | tr -d ' ')"
lsof -a -p "$pid" -d cwd -Fn

Die Ausgabe sollte ungefähr so aussehen:

48271 47990 alex Tue Jul 22 10:14:03 2026 /Users/alex/src/agent-client/build/agent-client --mcp
47990 23112 /bin/zsh /Users/alex/src/agent-client/scripts/run-local-agent
n/Users/alex/src/agent-client

Du prüfst eine Kette und sammelst keine Nebensächlichkeiten. Die Binärdatei sollte am erwarteten Build-Ort liegen. Der übergeordnete Prozess sollte dein bekannter Starter sein. Das aktuelle Verzeichnis sollte zum Checkout passen. Ein Prozess aus /private/var/folders, ~/Downloads, einem unbekannten Paket-Cache oder einem unerwarteten Wrapper hat die Prüfung nicht bestanden, auch wenn sein Befehlsname korrekt aussieht.

Prüfe anschließend die ausführbare Datei selbst:

client="$HOME/src/agent-client/build/agent-client"
file "$client"
codesign --display --verbose=4 "$client" 2>&1 | sed -n '1,18p'
shasum -a 256 "$client"

Bei einer unsignierten Binärdatei meldet codesign möglicherweise, dass sie überhaupt nicht signiert ist. Eine Ad-hoc-signierte Binärdatei meldet eine Signatur ohne öffentliche Signaturinstanz. Auch das ist nützliche Information, aber lies daraus keine Teamidentität ab. Apple beschreibt Ad-hoc-Signierung als «Sign to Run Locally» und erklärt, dass die Designated Requirement an genau diese Codeversion gebunden ist. Ein Neubau verändert die Belege. Genau deshalb sollte eine Sitzungsgenehmigung einen Prozesswechsel nicht überleben.

Der Hash ist ein Vergleichswerkzeug, kein Vertrauenssignal. Er hilft, wenn zwei Personen feststellen müssen, ob sie dieselbe Ausgabe aus derselben Revision verwenden. Eine Binärdatei wird nicht sicher, nur weil neben ihr 64 Hexadezimalzeichen stehen.

Eine Anfrage sollte abgelehnt werden, sobald ein Teil der Kette überraschend ist. Genehmige nicht zuerst und untersuche erst nach dem API-Aufruf. Bei der Genehmigung sollte Unsicherheit wenige Minuten kosten, nicht eine Untersuchung nach einem Vorfall.

Verwende die Sitzung als Grenze zwischen einem Build und dem nächsten

Aufrufe zu Sitzungen zurückverfolgen
Das Aktivitätsprotokoll erfasst einzelne HTTP- und SSH-Aufrufe und verknüpft sie mit demselben verschlüsselten Audit-Log wie die Agent-Sitzungen.

Die Sitzungsgrenze löst ein Problem, das Pfad-Freigabelisten nicht lösen können: Lokaler Code ändert sich ständig. Eine Entwicklerin oder ein Entwickler kann den Client in einer Stunde zehnmal neu bauen. Jede Ausgabe kann ein anderes Abhängigkeitsdiagramm, eine andere Befehlsverarbeitung oder einen vorübergehenden Debug-Branch enthalten, der Anfragen an ein unerwartetes Ziel sendet.

Mach den Startprozess kurzlebig. Starte den Agent-Client für eine Aufgabe, genehmige diesen Prozess nach der Prüfung und lass die Genehmigung mit seinem Ende ablaufen. Wenn der Client neu gebaut wird, der Branch wechselt, der Wrapper geändert oder der Client neu gestartet wird, gibt es einen neuen Prozess und eine neue Entscheidung.

Das wirkt nur dann umständlich, wenn die Sitzung schlecht definiert ist. Falls ein Agent-Client für jeden einzelnen Tool-Aufruf startet und stoppt, verbessere den Lebenszyklus des Clients oder verwende einen bewussten lokalen Supervisor, der im Prozessbaum transparent bleibt. Löse häufige Neustarts nicht mit einer dauerhaften Genehmigung. Ein kurzlebiger Prozess soll kurzlebig bleiben.

Der folgende Ablauf eignet sich gut für eine Entwicklerin oder einen Entwickler, die oder der einen lokal kompilierten Coding-Agenten gegen eine Testumgebung ausführt:

  1. Baue aus dem Checkout und gib Revision sowie uncommittete Änderungen aus.
  2. Starte über das versionierte Wrapper-Skript.
  3. Bestätige bei der ersten Autorisierungsanfrage den angezeigten Prozesspfad, den übergeordneten Befehl und den Zieldienst.
  4. Genehmige die Sitzung, wenn diese Angaben zur Aufgabe passen.
  5. Beende den Client am Ende der Aufgabe und baue ihn für die nächste eigenständige Aufgabe neu oder starte ihn erneut.

Dieser Ablauf gibt Entwicklern einen sauberen Wiederherstellungsweg. Wenn ein Build fragwürdig ist, stoppe ihn. Es gibt keine versteckte Freigabe, die entwirrt werden muss, und keine Regeldatei, in der sich stillschweigend Ausnahmen für das halbe Team angesammelt haben.

Verwechsle eine Sitzungsgenehmigung nicht mit der Genehmigung eines Repositorys. Ein Repository kann sauber sein, während der Startbefehl falsch ist. Ein Startbefehl kann korrekt sein, während der Branch experimentell ist. Eine Sitzungsentscheidung sagt, dass dieser Prozess mit diesem Kontext während dieses Laufs gewöhnliche Aufrufe ausführen darf.

Genehmigungen pro Aufruf für nicht rückgängig zu machende Folgen reservieren

Eine Sitzungsgenehmigung ist der richtige Standard für wiederholbare Entwicklungszugriffe: Issue-Metadaten lesen, eine Sandbox-API abfragen, ein Repository über SSH abrufen oder einen verworfenen Testdatensatz aktualisieren. Eine menschliche Bestätigung für jeden dieser Aufrufe bringt Menschen dazu, ohne Lesen zu genehmigen.

Einige Zugangsdaten sollten trotzdem bei jeder Nutzung eine Genehmigung verlangen. Entscheide das anhand der Folgen der entfernten Aktion, nicht anhand der dramatischen Wirkung, die das Geheimnis selbst ausstrahlt.

Verwende eine Genehmigung pro Aufruf für Zugangsdaten, die Folgendes ermöglichen:

  • in eine Produktionsumgebung zu schreiben;
  • ein Paket, eine Version oder ein Deployment-Artefakt zu veröffentlichen;
  • einen Kundendatenexport oder einen anderen konzentrierten sensiblen Datensatz abzurufen;
  • Organisationsmitgliedschaften, Authentifizierungseinstellungen oder Wiederherstellungskontrollen zu ändern;
  • einen Produktionshost über SSH zu erreichen.

Markiere nicht jedes Entwicklungs-API-Token auf diese Weise. Das erzeugt Genehmigungsmüdigkeit. Genehmigungsmüdigkeit macht aus einer sorgfältig prüfenden Person jemanden, der nur noch auf Schaltflächen klickt. Das Gateway sollte gefährliche Momente so deutlich machen, dass sie auffallen.

Die Details der Anfrage sind ebenso wichtig wie die zweite Abfrage. Bei HTTP solltest du Methode und Ziel anzeigen, außerdem genug vom Pfad, um die Aktion zu erkennen, ohne sensible Inhalte in die Genehmigungsansicht zu kopieren. GET /v1/test-runs/123 und DELETE /v1/projects/123 dürfen niemals gleich aussehen. Bei SSH sollten Host und Konto angezeigt werden. Die Entwicklerin oder der Entwickler sollte bestätigen, warum dieser Host zur aktuellen Aufgabe gehört.

Eine Genehmigung pro Aufruf bremst auch einen lokal veränderten Client sinnvoll aus. Du kannst eine Sitzung für einen neuen experimentellen Build, der aus einem Staging-Dienst liest, problemlos genehmigen. Bevor derselbe Build jedoch eine Produktionsversion veröffentlichen darf, solltest du innehalten. Genau darum geht es.

Neubauten, Branch-Wechsel und Wrapper als neue Belege behandeln

Bei kritischen Schlüsseln pausieren
Fordere für jede Nutzung eines besonders sensiblen Zugangsschlüssels einen Klick oder Touch ID an.

Entwickler treffen oft morgens eine Genehmigungsentscheidung und verändern danach den ganzen Tag über die Fakten. Sie holen einen Branch, führen einen Codegenerator aus, aktualisieren Abhängigkeiten, ändern eine Prompt-Datei, fügen ein Shell-Alias hinzu oder ersetzen ein Wrapper-Skript. Die Binärdatei kann denselben Namen und Pfad behalten, während sich ihr Verhalten erheblich ändert.

Führe eine einfache Regel ein: Wenn sich die ausführbare Datei, ihr Starter oder ihre vorgesehene Umgebung ändert, beende die Sitzung und starte neu. Dafür brauchst du keine formelle Zeremonie bei jeder Bearbeitung. Du brauchst die Disziplin, den Kontext von gestern nicht in einen neuen Build mitzunehmen.

Drei Ereignisse sollten in deinem eigenen Ablauf automatisch eine Pause auslösen:

  • Du hast Branch, Commit, Abhängigkeitssperrdatei oder generierte Ausgabe geändert.
  • Du hast das Skript, das den Client startet, oder die Umgebungsvariablen geändert, die sein Verhalten bestimmen.
  • Der Agent möchte nun einen anderen API-Host, einen anderen SSH-Host oder Zugangsdaten mit weiterreichenden Folgen verwenden.

Ein Branch-Wechsel wird unterschätzt, weil der Name der Binärdatei stabil bleibt. Ein Feature-Branch kann jedoch eine experimentelle Integration, ein verändertes Tool-Manifest oder einen Debug-Endpunkt enthalten. Die richtige Reaktion besteht nicht darin, Branches zu verbieten. Der erste Aufruf des neuen Laufs muss sichtbar und prüfbar sein.

Umgebungsvariablen verdienen dieselbe Skepsis wie Argumente der ausführbaren Datei. Ein Client, der mit API_BASE_URL, SSH_AUTH_SOCK, PATH, DYLD_* oder einem benutzerdefinierten Konfigurationspfad gestartet wird, kann sich anders verhalten als der geprüfte Quellcode. Dein Wrapper sollte nur die benötigten Variablen setzen, nicht geheime Werte ausgeben, aber routingrelevante Werte anzeigen und fehlende Werte ablehnen, statt ein umfangreiches Shell-Profil einzulesen.

Zum Beispiel ist das gut prüfbar:

export AGENT_ENVIRONMENT=staging
export AGENT_API_ORIGIN=https://staging.example.internal
exec ./build/agent-client --mcp

Das hier nicht:

source "$HOME/.agent-env"
eval "$(tooling configure-agent)"
exec "$AGENT_BIN" "$@"

Die zweite Form mag bequem sein, verbirgt aber ausführbare Datei, Konfigurationsquelle, Argumente und Seiteneffekte. Die genehmigende Person muss dadurch einem ganzen Stapel von Indirektionen vertrauen. Lokale Entwicklung enthält ohnehin genug bewegliche Teile.

Zugangsdaten außerhalb des Clients halten, auch wenn der Client dir gehört

Ein lokal kompilierter Client ist am leichtesten zu vertrauen, wenn er die Zugangsdaten, die er verwenden möchte, nie erhält. Liest der Client ein API-Token aus einer Umgebungsvariable oder einen SSH-Schlüssel aus einer Datei, kann er ihn ausgeben, weiterleiten, zwischenspeichern, in einen Absturzbericht aufnehmen oder an einen Unterprozess übergeben. Das Vertrauen in den eigenen Build ändert an dieser Gefährdung nichts.

Lege das Geheimnis in das Aktions-Gateway und lass den Client eine Aktion per Referenz anfordern. Der Client sollte den HTTP-Aufruf oder den SSH-Befehl mit dem nötigen Kontext liefern. Das Gateway fügt die Zugangsdaten ein, führt den Aufruf aus und gibt das Ergebnis zurück. So konzentriert sich die Genehmigung auf die Aktion und nicht auf die Frage, ob der Client dauerhaft ein Bearer-Token besitzen darf.

Verwende für HTTP getrennte Zugangsdaten für getrennte Umgebungen und Zwecke. Ein Staging-Token darf nicht allein deshalb in die Produktion führen, weil der Client einen anderen Host angegeben hat. Für SSH solltest du für unterschiedliche Rollen getrennte Host-Einträge oder Zugangsdaten verwenden. Verlasse dich nicht auf einen allmächtigen Schlüssel und das Versprechen einer Person, das richtige Ziel auszuwählen.

Sallyport bewahrt API- und SSH-Zugangsdaten in einem verschlüsselten Tresor auf und führt die Aktion selbst aus. Ein Agent erhält dadurch Ergebnisse statt Geheimnisse im Klartext. Dieses Design ist bei lokalen Builds besonders wichtig, weil Quellcodeänderungen erwartbar sind und eine offengelegte Umgebungsvariable sonst nur einen Debug-Ausdruck entfernt wäre.

Die Trennung verbessert auch die Reaktion auf Vorfälle. Wenn sich ein Client merkwürdig verhält, kannst du seine Sitzung stoppen oder widerrufen, ohne alle Geheimnisse zu erneuern, die er möglicherweise in den Speicher geladen hat. Das Tresor-Gateway bleibt im gesperrten Zustand absolut und verweigert Aktionen, statt die Absicht der Entwicklerin oder des Entwicklers zu erraten.

Die Audit-Spur sollte Streitfragen klären, nicht nur Ereignisse sammeln

Lokale Builds ohne Zugangsdaten
API- und SSH-Schlüssel bleiben in Sallyports verschlüsseltem Tresor und gelangen nie in den lokal gebauten Agenten.

Wenn ein Genehmigungsablauf für lokale Builds funktioniert, wird gelegentlich jemand fragen, warum ein Agent einen Dienst aufgerufen hat oder ob ein Prozess nach einer Übergabe noch lief. Die Antwort sollte aus einer Ereignisspur kommen, nicht aus Vermutungen, Terminalverläufen oder einer nachträglich geschriebenen Chatnachricht.

Erfasse zwei Ansichten derselben Aktivität. Eine sollte Agent-Läufe zeigen und sofortigen Widerruf unterstützen. Die andere sollte einzelne HTTP- und SSH-Aktionen zeigen. Verknüpfe die Belege so, dass eine prüfende Person von einer verdächtigen Anfrage zur Sitzung, die sie autorisiert hat, und anschließend zum Prozesskontext gelangen kann, der die Entscheidung ausgelöst hat.

Ein manipulationssicheres Log ist hier besonders hilfreich, weil lokale Builds von denselben Personen verändert werden können, die sie prüfen. Sallyport stellt seine Journale für Sitzungen und Aktivitäten aus einem verschlüsselten, hashverketteten Audit-Log bereit. sp audit verify prüft diese Kette offline über Chiffretext, ohne einen Tresorschlüssel zu benötigen. So erhält ein Team eine Integritätsprüfung, ohne der prüfenden Person Zugriff auf die hinter den Aktionen liegenden Geheimnisse zu geben.

Führe die Prüfung im Rahmen einer Untersuchung oder Notfallübung aus:

sp audit verify

Das erwartete Ergebnis ist eine eindeutige Erfolgsmeldung oder ein Bericht, der ein Problem in der Kette benennt. Behandle eine fehlgeschlagene Prüfung als betriebliches Problem, bis du sie verstanden hast. Lösche das Journal nicht, installiere die Anwendung nicht neu und akzeptiere keine neue Ausgangsbasis, bevor du die betroffenen Aufzeichnungen gesichert hast.

Das Journal ersetzt die Prüfung zum Zeitpunkt der Genehmigung nicht. Es zeigt, ob dein Ablauf tatsächlich brauchbare Belege erzeugt. Wenn das Log nur sagt, dass «ein unsignierter Client» einen Aufruf ausgeführt hat, verbessere deinen Startvertrag und den Kontext in der Genehmigungsansicht. Wenn Prozess, Sitzung, Ziel, Zeitpunkt und Aktion sichtbar sind, kann das Team untersuchen, was passiert ist, ohne jeden Entwicklerrechner in ein forensisches Projekt zu verwandeln.

Teamkonventionen verhindern, dass Genehmigungsabfragen zu Hintergrundrauschen werden

Der schwierigste Teil eines Genehmigungsablaufs für lokale Builds ist nicht die Befehlszeile. Es geht darum, die menschliche Bedeutung einer Genehmigung auch nach Monaten normaler Arbeit zu erhalten.

Schreibe eine kurze Konvention für lokale Agenten auf und bewahre sie in der Nähe des Repositorys auf, nicht in einem versteckten Sicherheitshandbuch. Sie sollte festlegen, wo unterstützte Checkouts liegen, wie Starter-Skripte aussehen, welche Umgebungen als normale Entwicklung gelten, welche Zugangsdaten eine Genehmigung pro Aufruf benötigen und was Entwickler tun, wenn die Abfrage einen unerwarteten Prozess zeigt.

Mach den Ablehnungsweg normal. Eine Entwicklerin oder ein Entwickler, die oder der wegen eines merkwürdigen Elternprozesses auf «Ablehnen» klickt, sollte nicht das Gefühl haben, den Fortschritt aufzuhalten. Der Prozess sollte beendet, geprüft und über den bekannten Wrapper neu gestartet werden. Danach kann der saubere Lauf genehmigt werden. Das ist schneller, als einen unbekannten Prozess zu normalisieren und später erklären zu müssen.

Überprüfe die Konvention nach einer echten Überraschung: Ein Paketskript hat eine Ausgabe überschrieben, eine IDE hat einen unerwarteten Helfer gestartet, ein Branch zeigte auf die falsche Umgebung oder ein Agent forderte Zugangsdaten außerhalb seiner Aufgabe an. Solche Fehler sind nützlich, weil sie zeigen, welche Belege gefehlt haben. Reagiere nicht mit einer dauerhaften Freigaberegel. Verschärfe den Startvertrag, verbessere die Informationen in der Genehmigungsansicht oder schränke die Zugangsdaten ein.

Wer einen eigenen Agenten kompiliert, sollte nicht zwischen Sicherheitstheater und ständigen Unterbrechungen wählen müssen. Gib der Person eine Sitzungsgenehmigung, die sich auf einen sichtbaren Prozess bezieht, halte folgenreiche Aufrufe hinter einer separaten Entscheidung zurück und verlange eine neue Prüfung, sobald sich die Geschichte des lokalen Builds ändert. Das ist streng genug, um den falschen Prozess zu erkennen, und praktikabel genug, damit Menschen den Ablauf weiter nutzen.

FAQ

Sind unsignierte lokale Builds sicher zu genehmigen?

Nein. Ein unsignierter Build bedeutet, dass keine öffentliche Signaturinstanz für ihn bürgt. Er sagt nicht, wer ihn erstellt hat, woher er stammt oder warum er ausgeführt wird. Behandle ihn als lokale Vertrauensentscheidung und verlange Belege, die den Prozess mit einer Person, einem Checkout und einem klar begrenzten Zweck verbinden.

Soll ich einen lokal kompilierten Agenten einmalig oder bei jedem Start genehmigen?

Ein lokaler Build sollte eine neue Sitzungsgenehmigung erhalten, sobald der vorherige Client-Prozess beendet wurde. So kann die Entwicklerin oder der Entwickler weiterarbeiten, ohne dass ein einmaliger Klick später am Tag als Berechtigung für unabhängige Prozesse gilt.

Wie erkenne ich, ob ein lokaler Agent aus meinem eigenen Quellbaum stammt?

Verwende einen stabilen Checkout, der der Entwicklerin oder dem Entwickler gehört, sowie einen dokumentierten Startbefehl. Prüfe anschließend vor der Genehmigung den Pfad der ausführbaren Datei und den übergeordneten Prozess. Ein Verzeichnisname allein beweist fast nichts, denn jeder Prozess kann aus einem Verzeichnis mit vertrauenswürdigem Namen gestartet werden.

Macht Ad-hoc-Signierung einen lokal gebauten Agenten vertrauenswürdig?

Ad-hoc-Signierung gibt macOS eine mit diesem Build verbundene Code-Identität, aber keine Identität des Herausgebers. Sie kann helfen, versehentliches Ersetzen zu erkennen, sollte jedoch weder Sitzungsgenehmigungen noch eingeschränkte Zugangsdaten und Aktivitätsprüfungen ersetzen. Apple weist darauf hin, dass die Designated Requirement einer Ad-hoc-Signatur an genau diese Codeversion gebunden ist. (developer.apple.com)

Kann ich jedem Prozess vertrauen, der denselben Namen wie mein lokaler Build hat?

Genehmige ihn nicht als allgemeine Kategorie. Prüfe den aktuellen Prozess und genehmige diesen Lauf nur, wenn Quellort, übergeordneter Befehl, vorgesehenes Repository und angeforderte Aktion zusammenpassen. Ein neuer Prozess braucht eine neue Entscheidung.

Wann sollte ein unsignierter Build für jeden Aufruf eine Genehmigung verlangen?

Verwende eine Sitzungsgenehmigung für gewöhnliche Entwicklungsaufrufe. Für Zugangsdaten, bei denen ein einzelner Aufruf die Produktion verändern, Code veröffentlichen, Geld bewegen oder sensible Datensätze offenlegen kann, solltest du dagegen eine Genehmigung pro Aufruf verlangen. Die zweite Abfrage soll die gefährliche Nutzung absichern, nicht eine schwache Prozessprüfung ausgleichen.

Was soll ich tun, wenn ich den falschen lokalen Agent-Prozess genehmigt habe?

Beende den Agent-Prozess, widerrufe die aktive Sitzung, falls das Gateway diese Funktion anbietet, und prüfe die einzelnen Aktionen, bevor du etwas neu startest. Versuche nicht, nachträglich aus dem Terminalverlauf zu erschließen, was passiert ist, während der Agent weiterlief.

Kann ein Team ein gemeinsames Verzeichnis für einen unsignierten Agent-Build verwenden?

Ein gemeinsam genutztes Build-Verzeichnis ist eine schlechte Grenze, weil eine andere Person, ein Skript, ein Paketmanager oder ein Synchronisationsdienst Dateien dort ersetzen kann. Jede Entwicklerin und jeder Entwickler sollte aus einem selbst kontrollierten Checkout bauen und den Agenten über einen Befehl starten, der eine sichtbare Spur im Prozessbaum hinterlässt.

Ist es sicher, einen lokalen Agenten über ein Shell-Skript zu starten?

Ein normales Shell-Skript ist unproblematisch, wenn es nur bekannte Pfade setzt und die erwartete ausführbare Datei startet. Problematisch wird es, wenn es Code abruft, einen Branch auswählt, eine ungeprüfte Umgebungsvariable auswertet oder vor dem Agenten unbemerkt ein anderes Programm startet.

Setzt das Sperren meines Mac das Vertrauen in einen lokalen Agenten zurück?

Nein. Das Gateway sollte Aktionen bei gesperrtem Gerät verweigern. Nach dem Entsperren braucht ein neuer Agent-Prozess weiterhin eine eigene Sitzungsentscheidung. Die Bildschirmsperre schützt das Gerät, identifiziert aber nicht den nächsten Prozess, der einen Zugang verwenden möchte.

Sallyport

Sallyport führt API-Aufrufe und SSH-Befehle für Ihren KI-Agenten aus. Die Schlüssel bleiben in einem lokalen Tresor auf Ihrem Mac; Sie geben jeden Lauf frei, und jede Aktion landet in einem versiegelten Journal.

© 2026 Sallyport · Open Source unter Apache-2.0 · Oleg Sotnikov