Angeben vertraulicher Daten mithilfe von Secrets Manager - Amazon ECS

Angeben vertraulicher Daten mithilfe von Secrets Manager

Amazon ECS ermöglicht es Ihnen, sensible Daten in Ihre Container einzubringen, indem Sie Ihre sensiblen Daten in AWS Secrets Manager-Secrets speichern und dann in Ihrer Containerdefinition auf sie verweisen. Sensible Daten, die in Secret-Manager-Secrets gespeichert sind, können einem Container als Umgebungsvariablen oder als Teil der Protokollkonfiguration ausgesetzt werden.

Wenn Sie ein Secret als Umgebungsvariable einfügen, können Sie den vollständigen Inhalt eines Secrets, eines bestimmten JSON-Schlüssels innerhalb eines Secrets oder einer bestimmten Version eines einzufügenden Secrets angeben. Das hilft Ihnen, die sensiblen Daten zu steuern, die Ihrem Container zur Verfügung gestellt werden. Weitere Informationen zu Secret Versioning finden Sie unter Zentrale Begriffe und Konzepte für AWS-Secrets Manager im AWS Secrets Manager-Benutzerhandbuch.

Überlegungen zum Angeben sensibler Daten mit Secrets Manager

Folgendes ist bei der Angabe sensibler Daten für Container mit Secrets Manager zu beachten:

  • Für Amazon-ECS-Aufgaben auf AWS Fargate sollten Sie Folgendes berücksichtigen:

    • Um den vollständigen Inhalt eines Secrets als Umgebungsvariable oder in eine Protokollkonfiguration einzufügen, müssen Sie die Plattformversion 1.3.0 oder höher verwenden. Weitere Informationen finden Sie unter AWS Fargate-Plattformversionen.

    • Um einen bestimmten JSON-Schlüssel oder eine Version eines Geheimnisses als Umgebungsvariable oder in eine Protokollkonfiguration einzufügen, müssen Sie die Plattformversion 1.4.0 oder höher (Linux) oder 1.0.0 (Windows) verwenden. Weitere Informationen finden Sie unter AWS Fargate-Plattformversionen.

  • Nur Secrets, die Textdaten speichern, die Secrets sind, die mit dem SecretString-Parameter der CreateSecret-API erstellt wurden, werden unterstützt. Secrets, die Binärdaten speichern, bei denen es sich um Secrets handelt, die mit dem SecretBinary-Parameter des CreateSecret-API erstellt wurden, werden nicht unterstützt.

  • Wenn Sie eine Aufgabendefinition verwenden, die auf Secrets Manager-Secrets verweist, um vertrauliche Daten für Ihre Container abzurufen, müssen Sie bei Verwendung von Schnittstellen-VPC-Endpunkten die Schnittstellen-VPC-Endpunkte für Secrets Manager erstellen. Weitere Informationen finden Sie unter Verwenden von Secrets Manager mit VPC-Endpunkten im AWS Secrets Manager-Benutzerhandbuch.

  • Sensible Daten werden beim ersten Start des Containers an diesen übergeben. Wenn das Secret anschließend aktualisiert oder rotiert wird, erhält der Container nicht automatisch den aktualisierten Wert. Sie müssen eine neue Aufgabe starten. Alternativ können Sie, wenn Ihre Aufgabe Teil eines Services ist, den Service aktualisieren und die Option Force new deployment (Neue Bereitstellung erzwingen) auswählen, um den Service zu zwingen, eine neue Aufgabe zu starten.

  • Die von Ihrer Aufgabe verwendete VPC muss die DNS-Auflösung aktiviert sein.

Erforderliche IAM-Berechtigungen für Amazon ECS-Secrets

Zum Verwenden dieser Funktion benötigen Sie die Amazon-ECS-Aufgabenausführungsrolle und müssen in Ihrer Aufgabendefinition auf sie verweisen. Dies ermöglicht dem Container-Agent das Abrufen der erforderlichen Secrets Manager-Ressourcen. Weitere Informationen finden Sie unter IAM-Rolle für die Amazon-ECS-Aufgabenausführung.

Um Zugriff auf die Secrets Manager-Secrets zu gewähren, die Sie erstellen, müssen Sie die folgenden Berechtigungen manuell als eingebundene Richtlinie zur Aufgabendefinitionsrolle hinzufügen. Weitere Informationen finden Sie unter Hinzufügen und Entfernen von IAM-Richtlinien.

  • secretsmanager:GetSecretValue: Erforderlich, wenn Sie auf ein Secrets Manager-Secret verweisen.

  • kms:Decrypt: Nur erforderlich, wenn Ihr Secret einen benutzerdefinierten KMS-Schlüssel verwendet und nicht den Standardschlüssel. Der ARN für Ihren benutzerdefinierten Schlüssel muss als Ressource hinzugefügt werden.

Das folgende Beispiel einer Inline-Richtlinie fügt die erforderlichen Berechtigungen hinzu:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "kms:Decrypt" ], "Resource": [ "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:<secret_name>", "arn:aws:kms:<region>:<aws_account_id>:key/<key_id>" ] } ] }

Injizieren sensibler Daten als Umgebungsvariable

Innerhalb der Containerdefinition können Sie Folgendes angeben:

  • Das secrets-Objekt, das den Namen der Umgebungsvariablen enthält, die im Container festgelegt werden soll

  • Der Amazon-Ressourcenname (ARN) des Secrets Manager-Secrets

  • Zusätzliche Parameter, die die sensiblen Daten enthalten, die dem Container angezeigt werden sollen

Das folgende Beispiel zeigt die vollständige Syntax, die für das Secrets Manager-Secret angegeben werden muss.

arn:aws:secretsmanager:region:aws_account_id:secret:secret-name

Im folgenden Abschnitt werden die zusätzlichen Parameter beschrieben. Diese Parameter sind optional, aber wenn Sie sie nicht verwenden, müssen Sie die Doppelpunkte einschließen, damit : die Standardwerte verwendet. Beispiele finden Sie unten für weiteren Kontext.

json-key

Gibt den Namen des Schlüssels in einem Schlüssel-Wert-Paar mit dem Wert an, den Sie als Umgebungsvariablenwert festlegen möchten. Nur Werte im JSON-Format werden unterstützt. Wenn Sie keinen JSON-Schlüssel angeben, wird der vollständige Inhalt des Secrets verwendet.

version-stage

Gibt die Phasenbeschriftung der Version eines Secrets an, die Sie verwenden möchten. Wenn eine Versionsphasenbeschriftung angegeben ist, können Sie keine Versions-ID angeben. Wenn keine Versionsphase angegeben wird, besteht das Standardverhalten darin, das Secret Schlüssel mit der AWSCURRENT-Phasenbeschriftung abzurufen.

Phasenbeschriftungen werden verwendet, um verschiedene Versionen eines Secrets zu verfolgen, wenn sie aktualisiert oder rotiert werden. Jede Version eines Secrets hat eine oder mehrere Phasenbeschriftungen und eine ID. Weitere Informationen erhalten Sie unter Zentrale Begriffe und Konzepte für AWS Secrets Manager im AWS Secrets Manager-Benutzerhandbuch.

version-id

Gibt die eindeutige ID der Version des Secrets an, die Sie verwenden möchten. Wenn eine Versions-ID angegeben wird, können Sie keine Versionsphasenbeschriftung angeben. Wenn keine Versions-ID angegeben wird, besteht das Standardverhalten darin, den geheimen Schlüssel mit der AWSCURRENT-Phasenbeschriftung abzurufen.

Versions-IDs werden verwendet, um verschiedene Versionen eines Secrets zu verfolgen, wenn sie aktualisiert oder rotiert werden. Jede Version eines Secrets hat eine ID. Weitere Informationen erhalten Sie unter Zentrale Begriffe und Konzepte für AWS Secrets Manager im AWS Secrets Manager-Benutzerhandbuch.

Ein vollständiges Tutorial zum Erstellen eines Secrets Manager-Secrets und zum Einfügen in einen Container als Umgebungsvariable finden Sie unter Tutorial: Angeben vertraulicher Daten mithilfe von Secrets Manager-Secrets.

Beispiel-Containerdefinitionen

Die folgenden Beispiele zeigen, wie Sie auf Secrets Manager-Secrets in Ihren Containerdefinitionen verweisen können.

Beispiel Verweisen auf ein vollständiges Secret

Im Folgenden finden Sie einen Ausschnitt einer Aufgabendefinition mit dem Format beim Verweisen auf den vollständigen Text eines Secrets Manager-Secrets.

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf" }] }] }

Beispiel Verweisen auf einen bestimmten Schlüssel innerhalb eines Secrets

Im Folgenden wird eine Beispielausgabe eines get-secret-value-Befehls gezeigt, der den Inhalt eines Secrets zusammen mit der Versionsphasenbeschriftung und der zugehörigen Versions-ID anzeigt.

{
    "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf",
    "Name": "appauthexample",
    "VersionId": "871d9eca-18aa-46a9-8785-981ddEXAMPLE",
    "SecretString": "{\"username1\":\"password1\",\"username2\":\"password2\",\"username3\":\"password3\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1581968848.921
}

Verweisen Sie auf einen bestimmten Schlüssel aus der vorherigen Ausgabe in einer Containerdefinition, indem Sie den Schlüsselnamen am Ende des ARN angeben.

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::" }] }] }

Beispiel Verweisen auf eine bestimmte Secret-Version

Im Folgenden wird eine Beispielausgabe eines describe-secret -Befehls gezeigt, der den unverschlüsselten Inhalt eines Secrets zusammen mit den Metadaten für alle Versionen des Secrets anzeigt.

{
    "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf",
    "Name": "appauthexample",
    "Description": "Example of a secret containing application authorization data.",
    "RotationEnabled": false,
    "LastChangedDate": 1581968848.926,
    "LastAccessedDate": 1581897600.0,
    "Tags": [],
    "VersionIdsToStages": {
        "871d9eca-18aa-46a9-8785-981ddEXAMPLE": [
            "AWSCURRENT"
        ],
        "9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE": [
            "AWSPREVIOUS"
        ]
    }
}

Verweisen Sie auf eine bestimmte Versionsphasenbeschriftung aus der vorherigen Ausgabe in einer Containerdefinition, indem Sie den Schlüsselnamen am Ende des ARN angeben.

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf::AWSPREVIOUS:" }] }] }

Verweisen Sie auf eine bestimmte Versions-ID der vorherigen Ausgabe in einer Containerdefinition, indem Sie den Schlüsselnamen am Ende des ARN angeben.

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:::9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE" }] }] }

Injizieren sensibler Daten in einer Protokollkonfiguration

Bei der Angabe von logConfiguration können Sie secretOptions in Ihrer Containerdefinition mit dem Namen der im Container festzulegenden Protokolltreiberoption und dem vollständigen Amazon-Ressourcenname (ARN) des Secrets Manager-Secrets angeben, in dem die sensiblen Daten enthalten sind, die dem Container zur Verfügung gestellt werden sollen.

Im Folgenden finden Sie einen Ausschnitt einer Aufgabendefinition mit dem Format beim Verweisen auf ein Secrets Manager-Secret.

{ "containerDefinitions": [{ "logConfiguration": [{ "logDriver": "splunk", "options": { "splunk-url": "https://cloud.splunk.com:8080" }, "secretOptions": [{ "name": "splunk-token", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf" }] }] }] }

Erstellen eines AWS Secrets Manager-Secrets

Sie können die Secrets Manager-Konsole verwenden, um ein Secret für Ihre sensiblen Daten zu erstellen. Weitere Informationen finden Sie unter Erstellen eines Basic Secrets im AWS Secrets Manager-Benutzerhandbuch.

So erstellen Sie ein Basis-Secret

Verwenden Sie Secrets Manager zum Erstellen eines Secrets für Ihre sensiblen Daten.

  1. Öffnen Sie die Secrets-Manager-Konsole unterhttps://console.aws.amazon.com/secretsmanager/.

  2. Wählen Sie Store a new secret (Ein neues Secret speichern).

  3. Wählen Sie für Select secret type (Secret-Typ auswählen) die Option Other type of secrets (Anderer Secret-Typ) aus.

  4. Geben Sie die Daten Ihres benutzerdefinierten Secrets in Form von Paaren aus Key (Schlüssel) und Value (Wert) an. Sie können z. B. einen Schlüssel von UserName festlegen und dann den entsprechenden Benutzernamen als Wert angeben. Fügen Sie einen zweiten Schlüssel mit dem Namen Password und dem Passworttext als Wert hinzu. Sie können außerdem Einträge für einen Datenbanknamen, eine Serveradresse, einen TCP-Port usw. hinzufügen. Sie können so viele Paare wie nötig zum Speichern der von Ihnen benötigten Informationen hinzufügen.

    Alternativ können Sie die Registerkarte Plaintext (Klartext) wählen und den Secret-Wert auf beliebige Weise eingeben.

  5. Wählen Sie den AWS KMS-Schlüssel aus, mit dem Sie den geschützten Text im Secret verschlüsseln möchten. Wenn Sie keinen Schlüssel wählen, prüft Secrets Manager, ob es einen Standardschlüssel für das Konto gibt. Fall dies der Fall ist, wird er verwendet. Wenn kein Standardschlüssel vorhanden ist, erstellt Secrets Manager automatisch einen Schlüssel. Sie können auch Add new key (Neuen Schlüssel hinzufügen) auswählen, um einen benutzerdefinierten KMS-Schlüssel speziell für dieses Secret zu erstellen. Um Ihren eigenen KMS-Schlüssel zu erstellen, müssen Sie in Ihrem Konto zum Erstellen von KMS-Schlüssel berechtigt sein.

  6. Wählen Sie Next (Weiter).

  7. Geben Sie für Secret name (Secret-Name) einen optionalen Pfad und Namen ein, z. B. production/MyAwesomeAppSecret oder development/TestSecret, und wählen Sie Next (Weiter) aus. Optional können Sie eine Beschreibung hinzufügen. Mit dieser können Sie sich später besser an den Zweck dieses Secrets erinnern.

    Der Secret-Name darf nur ASCII-Zeichen, Ziffern oder eines der folgenden Zeichen enthalten: /_+=.@-.

  8. (Optional) Jetzt können Sie die Rotation für Ihr Secret konfigurieren. Belassen Sie die Option für dieses Verfahren auf Disable automatic rotation (Automatisches Rotieren deaktivieren) und klicken Sie auf Next (Weiter).

    Informationen darüber, wie Sie die Rotation für neue oder bestehende Geheimnisse konfigurieren, finden Sie unter Rotieren Ihrer AWS Secrets Manager-Geheimnisse.

  9. Überprüfen Sie die Einstellungen, und wählen Sie dann Store secret (Secret speichern) aus, um Ihre gesamte Eingabe als neues Secret im Secrets Manager zu speichern.

Erstellen einer Aufgabendefinition in der klassischen Konsole, die auf sensible Daten verweist

Sie können die Amazon ECS-Konsole verwenden, um eine Aufgabendefinition zu erstellen, die auf ein Secrets Manager-Secret verweist.

So erstellen Sie eine Aufgabendefinition, die ein Secret angibt

  1. Öffnen Sie die Amazon ECS-Konsole unter https://console.aws.amazon.com/ecs/.

  2. Wählen Sie im Navigationsbereich Task Definitions (Aufgabendefinitionen) Create new Task Definition (Neue Aufgabendefinition erstellen).

  3. Wählen Sie auf der Seite Select launch type compatibility (Starttypkompatibilität auswählen) den Starttyp, den Ihre Aufgaben verwenden sollen, und wählen Sie dann Next step (Nächster Schritt).

  4. Geben Sie unter Task Definition Name (Aufgabendefinitionsname) einen Namen für Ihre Aufgabendefinition ein. Bis zu 255 Buchstaben (Groß- und Kleinbuchstaben), Ziffern, Bindestriche und Unterstriche sind zulässig.

  5. Wählen Sie für Task execution role (Aufgabenausführungsrolle) entweder Ihre vorhandene Aufgabenausführungsrolle aus oder wählen Sie Create new role (Neue Rolle erstellen), damit eine für Sie erstellt wird. Diese Rolle autorisiert Amazon ECS zum Abrufen von privaten Images für Ihre Aufgabe. Weitere Informationen finden Sie unter Erforderliche IAM-Berechtigungen für die private Registrierungsauthentifizierung.

    Wichtig

    Wenn das Feld Task execution role (Ausführungsrolle der Aufgabe) nicht angezeigt wird, wählen Sie Configure via JSON (Konfiguration über JSON) und fügen Sie executionRoleArn manuell in das Feld hinzu, um Ihre Aufgabenausführungsrolle anzugeben. Der folgende Code zeigt die Syntax:

    "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole"
  6. Führen Sie für jeden Container, der in Ihrer Aufgabendefinition erstellt werden soll, die folgenden Schritte aus:

    1. Wählen Sie unter Container Definitions (Containerdefinitionen) Add container (Container hinzufügen).

    2. Geben Sie für Container name (Containername) den Namen für Ihren Container ein. Bis zu 255 Buchstaben (Groß- und Kleinbuchstaben), Ziffern, Bindestriche und Unterstriche sind zulässig.

    3. Geben Sie für Image den Image-Namen oder Pfad zu Ihrem privaten Image ein. Bis zu 255 Buchstaben (Groß- und Kleinbuchstaben), Ziffern, Bindestriche und Unterstriche sind zulässig.

    4. Erweitern Sie Advanced container configuration (Erweiterte Container-Konfiguration).

    5. Für sensitive Daten, die als Umgebungsvariablen eingefügt werden sollen, füllen Sie unter Environment (Umgebung) für Environment variables (Umgebungsvariablen) die folgenden Felder aus:

      1. Geben Sie unter Key (Schlüssel) den Namen der Umgebungsvariablen ein, die im Container gesetzt werden soll. Dies entspricht dem Feld name im Abschnitt secrets einer Containerdefinition.

      2. Wählen Sie für Value (Wert) ValueFrom. Geben Sie unter Add value (Wert hinzufügen), den ARN des Secrets Manager-Secrets ein, das die Daten enthält, die Ihrem Container als Umgebungsvariable präsentiert werden sollen.

    6. Für sensitive Daten, auf die in der Protokollkonfiguration für einen Container verwiesen wird, füllen Sie unter Storage and Logging (Speicher und Protokollierung) für Log configuration (Protokollkonfiguration) die folgenden Felder aus:

      1. Löschen Sie die Option Auto-configure CloudWatch Logs (CWL automatisch konfigurieren).

      2. Geben Sie unter Log options (Protokolloptionen) für Key (Schlüssel) den Namen der festzulegenden Protokollkonfigurationsoption ein.

      3. Wählen Sie für Value (Wert) ValueFrom. Geben Sie unter Add value (Wert hinzufügen) den vollständigen ARN des Secrets Manager-Secrets ein, das die Daten enthält, die Ihrer Protokollkonfiguration als Protokolloption präsentiert werden sollen.

    7. Füllen Sie die verbleibenden Pflichtfelder und beliebige optionale Felder aus, die Sie in Ihren Containerdefinitionen verwenden möchten. Weitere Containerdefinitionsparameter sind im Menü Advanced container configuration (Erweiterte Containerkonfiguration) verfügbar. Weitere Informationen finden Sie unter Aufgabendefinitionsparameter.

    8. Wählen Sie Add (Hinzufügen) aus.

  7. Wenn Ihre Container hinzugefügt werden, wählen Sie Create (Erstellen) aus.