Zum Hauptinhalt springen

RevealSecret@1

Der Node RevealSecret@1 entschlüsselt ein benanntes Secret-Attribut einer Runtime-Entität und schreibt den Klartext in den DataContext, damit nachfolgende Nodes ihn verwenden können (zum Beispiel zur Authentifizierung gegenüber einem externen System).

Verfügbarkeit

Verfügbar ab dem System-CK-Modell 2.5.0 und dem Mesh-Adapter-Release, das den Werttyp Secret ausliefert. Der Node ist Teil des generierten pipeline-schema.json des Mesh Adapters.

Warum ein eigener Node​

Das Lesen von Entitäten mit GetRtEntitiesById@1, GetRtEntitiesByType@1 oder GetRtEntitiesByWellKnownName@1 liefert nie den Wert eines Secret-Attributs — nur den Marker { "isSet": true|false }. Eine Pipeline, die den Wert braucht, muss ihn ausdrücklich mit RevealSecret@1 anfordern:

  • Privilegiert: Der Node entschlüsselt im Prozess des Mesh Adapters. Keine öffentliche API ist beteiligt, und keine öffentliche API bietet Entschlüsselung an.
  • Ein Attribut pro Node: Die Konfiguration benennt die Entität, ihren Typ und das Attribut. Es gibt keine Wildcard.
  • Gezählt: Jede Entschlüsselung erhöht die Metrik octo.secrets.decrypt.
  • Nie geloggt: Der Wert erscheint nicht in Logs. Offengelegte Werte werden in Debug-Snapshots, Dry-Run-Ausgaben, Ausführungsergebnissen, Fehlermeldungen von Nodes und gespeicherten Ausführungsfehlern als *** maskiert. Debug-Snapshots listen die maskierten Stellen in redactedPaths (JSONPaths ab dem Snapshot-Objekt, z. B. $.output.smtp.password; ein innerhalb eines längeren Strings maskierter Wert wird mit dem Pfad dieses Strings gelistet), damit das Studio genau diese Pfade markiert.

Adapter-Voraussetzungen​

  • Mesh Adapter
  • Der Mesh Adapter muss den Secret Encryption Key Ring erhalten (Workload-Flag ReceivesClusterSecrets, siehe Secret Encryption Key Ring). Ohne ihn scheitert der Node mit einem Konfigurationsfehler.

Node-Konfiguration​

Zu den Feldern targetPath, targetValueWriteMode und targetValueKind siehe Übersicht.

transformations:
- type: RevealSecret@1
ckTypeId: System.Communication/EMailSenderConfiguration
rtIdPath: $.config.rtId
attributeName: Password
targetPath: $.smtp.password
identity: ServiceAccount

Parameter​

ParameterTypPflicht / StandardBeschreibung
attributeNameStringPflichtZu entschlüsselndes Secret-Attribut, Groß-/Kleinschreibung egal. Ein Punkt-Pfad ist nur durch einzelne Record-Attribute erlaubt (Connection.Password); Record-Arrays werden abgelehnt
ckTypeIdRtCkIdEines von ckTypeId / ckTypeIdPathConstruction-Kit-Typ-ID der Entität
ckTypeIdPathString (JSONPath)Pfad zur CK-Typ-ID im DataContext
rtIdString (24-stellige Hex-Objekt-ID)Eines von rtId / rtIdPathRuntime-ID der Entität. Hat Vorrang vor rtIdPath
rtIdPathString (JSONPath)Pfad zur Runtime-ID im DataContext
targetPathString (JSONPath)$Wohin der Klartext geschrieben wird
targetValueWriteModeEnumOverwriteSiehe Übersicht
targetValueKindEnumSimpleSiehe Übersicht
documentModeEnumExtendWie das Ergebnis in das DataContext-Dokument übernommen wird
identityCaller | ServiceAccountCallerIdentität, mit der die Entität gelesen wird. System wird vom Node abgelehnt
descriptionStringOptionalFreitext

Schema-Gruppen im Studio-Editor: Entity (ckTypeId, ckTypeIdPath, rtId, rtIdPath), Secret (attributeName), Paths, Write Mode, Execution (identity), General (description).

Verhalten​

  • Ist das Attribut nicht gesetzt, erhält das Ziel null.
  • Existiert die Entität nicht oder ist das Attribut nicht vom Werttyp Secret, scheitert der Node.
  • Wurde der gespeicherte Wert mit einer Key-ID verschlüsselt, die der Key Ring des Adapters nicht enthält (keyMissing, z. B. nach einem Restore aus einer anderen Umgebung), gilt er als nicht gesetzt: Der Node schreibt null und loggt einen Fehler ohne den Wert. Geben Sie den Wert neu ein oder nehmen Sie den Schlüssel in den Ring auf (siehe Nicht lesbare Secrets).
  • Ist der Strict Mode aktiv und der Wert noch als Klartext gespeichert, scheitert der Node; führen Sie den Encrypt-Sweep aus oder geben Sie den Wert neu ein.
  • Typwechselnde Nodes (ConvertDataType, SetPrimitiveValue, If, Switch, ExecuteCSharp, DataMapping) scheitern an einem Secret-Marker mit „Secret not supported“; das Lesen von <path>.isSet als Boolean funktioniert.
  • GetPipelineConfigByWellKnownName@1 und GetPipelineConfigByCkTypeId@1 maskieren die Secret-Attribute der Konfiguration, die sie kopieren.
  • Halten Sie den Klartext nur so lange wie nötig im DataContext. Schreiben Sie ihn nicht in Entitäten, Archive, Benachrichtigungen oder HTTP-Antworten.

Beispiel​

Eine Konfigurations-Entität über ihren Well-known Name auflösen, ihr Client Secret offenlegen und für einen HTTP-Request verwenden:

transformations:
- type: GetRtEntitiesByWellKnownName@1
ckTypeId: System.Communication/FinApiConfiguration
wellKnownNamePath: $.configurationName # z. B. "FinApi" im eingehenden Payload
rtIdTargetPath: $.configurationRtId
- type: RevealSecret@1
rtIdPath: $.configurationRtId
ckTypeId: System.Communication/FinApiConfiguration
attributeName: ClientSecret
targetPath: $.secrets.clientSecret
identity: ServiceAccount
- type: MakeHttpRequest@1
# ... verwendet $.secrets.clientSecret

Siehe auch​