Unveränderlichen Object Storage zum Schutz von Buckets verwenden

Immutable Object Storage (IOS) dient der Aufbewahrung elektronischer Aufzeichnungen und stellt die Aufrechterhaltung der Datenintegrität sicher. Aufbewahrungsrichtlinien stellen sicher, dass die Daten nach dem WORM-Prinzip (Write-Once-Read-Many) in einer nicht löschbaren und nicht mehrfach beschreibbaren Form gespeichert werden. Diese Richtlinie bleibt bis zum Ende des Aufbewahrungszeitraums und der gesetzlichen Aufbewahrungspflicht in Kraft.

Diese Funktion wird derzeit in Object Storage für Satellite nicht unterstützt. Weitere Informationen.

Richtlinien werden bis zum Ende eines Aufbewahrungszeitraums durchgesetzt und können erst nach Ablauf des Aufbewahrungszeitraums geändert werden. Während IBM Cloud Object Storage für die meisten Vorgänge auf die API S3 zurückgreift, ist die für die Konfiguration von Aufbewahrungsrichtlinien verwendete API nicht mit der API S3 identisch, auch wenn einige Begriffe gemeinsam verwendet werden können. Lesen Sie diese Dokumentation sorgfältig, um zu verhindern, dass Benutzer in Ihrer Organisation Objekte erstellen, die nicht gelöscht werden können, auch nicht von IBM Cloud Administratoren.

Diese Funktion kann von allen Benutzern verwendet werden, in deren Umgebung Bedarf für die Langzeitaufbewahrung von Daten besteht. Dies gilt u. a. für Organisationen in den folgenden Branchen:

  • Finanzwesen
  • Gesundheitswesen
  • Medieninhaltsarchive
  • Branchen, in denen die Verhinderung privilegierter Änderungen oder der Löschung von Objekten oder Dokumenten von Bedeutung ist

Aufbewahrungsrichtlinien können auch von Organisationen eingesetzt werden, die für die Verwaltung von Finanzunterlagen verantwortlich sind (z. B. Broker-Dealer-Transaktionen) und die Bedarf für die Aufbewahrung von Daten in nicht mehrfach beschreibbarer und nicht löschbarer Form haben.

Immutable Object Storage steht nur in bestimmten Regionen zur Verfügung. Detaillierte Informationen hierzu finden Sie im Abschnitt Integrierte Services. Des Weiteren ist zur Nutzung von IOS ein Standardpreisstrukturplan erforderlich. Detaillierte Informationen hierzu finden Sie im Abschnitt zur Preisstruktur.

Für Buckets, für die eine Aufbewahrungsrichtlinie definiert wurde, ist die Nutzung der Aspera-Hochgeschwindigkeitsübertragung nicht möglich.

Terminologie und Verwendung

Aufbewahrungszeitraum

Die Zeitdauer, die ein Objekt im Bereich IBM Cloud Object Storage gespeichert sein muss.

Aufbewahrungsrichtlinie

Eine Aufbewahrungsrichtlinie ist auf der Ebene von IBM Cloud Object Storage aktiviert. In dieser Richtlinie werden die mindestens erforderliche, maximal zulässige und standardmäßige Aufbewahrungszeitdauer definiert, die für alle Objekte im Bucket gelten.

Die mindestens erforderliche Aufbewahrungsdauer stellt den Zeitraum dar, für den ein Objekt mindestens unverändert im Bucket aufbewahrt werden muss.

Die maximal zulässige Aufbewahrungsdauer stellt den Zeitraum dar, für den ein Objekt maximal unverändert im Bucket aufbewahrt werden kann.

Wird ein Objekt im Bucket ohne Angabe einer angepassten Aufbewahrungsdauer gespeichert, dann verwendet das System den Standardaufbewahrungszeitraum. Die mindestens erforderliche Aufbewahrungsdauer muss kleiner oder gleich dem Standardaufbewahrungszeitraum sein, der seinerseits kleiner oder gleich der maximal zulässigen Aufbewahrungsdauer sein muss.

Für die Objekte kann eine maximale Aufbewahrungsfrist von 99 Jahren festgelegt werden.

Zum Erstellen einer Aufbewahrungsrichtlinie für ein Bucket benötigen Sie die Rolle 'Manager'. Weitere Einzelheiten hierzu finden Sie im Abschnitt zu den Bucketberechtigungen.

Beweissicherung

Für bestimmte Objekte muss möglicherweise nach Ablauf der Aufbewahrungsdauer eine Änderung verhindert werden. Ein Beispiel ist eine noch nicht abgeschlossene rechtliche Überprüfung, bei der Datensätze für eine längere Zeitdauer zugänglich bleiben müssen, die über die ursprünglich festgelegte Aufbewahrungsdauer hinausgeht. Ein Beweissicherungsvermerk kann auf Objektebene angewendet werden.   Solche Beweissicherungsvermerke können während des ersten Uploads oder nach dem Hinzufügen eines Objekts auf Objekte angewendet werden.   Hinweis: Pro Objekt können maximal 100 Beweissicherungsvermerke angewendet werden.

Unbegrenzte Aufbewahrung

Mit dieser Option kann der Benutzer festlegen, dass das Objekt für unbegrenzte Zeit aufbewahrt werden soll, es sei denn, es wird zu einem späteren Zeitpunkt eine neue Aufbewahrungsdauer definiert. Diese Option wird auf Objektebene festgelegt.

Ein Objekt, das mit unbestimmter Aufbewahrung aufbewahrt wird, ist nicht vollständig unveränderlich, bis die Aufbewahrung des Objekts von -1 in einen positiven endlichen Wert umgewandelt wurde. Während ein Objekt, das mit -1 (Unbegrenzte Aufbewahrung) geschrieben wurde, nicht mit DELETE object gelöscht oder überschrieben werden kann, kann die Aufbewahrung des Objekts von -1 auf das aktuelle Datum/Uhrzeit aktualisiert werden, wodurch das Objekt sofort gelöscht werden kann.

Die Benutzer sollten dieses Verhalten berücksichtigen, wenn sie die Eignung des Systems für ihre Speicheranforderungen beurteilen. Ein häufiger Anwendungsfall für die unbestimmte Aufbewahrung wird in Ereignisbasierte Aufbewahrung beschrieben. Wenn Sie eine ereignisbasierte Aufbewahrung verwenden möchten, können Sie mit Object Storage eine unbegrenzte Aufbewahrung für das Objekt festlegen, wenn Sie sich beim ersten Hochladen des Objekts in das System nicht sicher sind, welche Aufbewahrungszeit erforderlich ist. Einmal auf unbestimmt gesetzt, können Benutzeranwendungen die Objektspeicherung auf einen endlichen Wert ändern, wenn ein bestimmtes Ereignis eingetreten ist.

Beispiel Angenommen, ein Unternehmen hat eine Richtlinie, nach der Mitarbeiterakten drei Jahre nach dem Ausscheiden des Mitarbeiters aufbewahrt werden.

  • Wenn ein Arbeitnehmer in ein Unternehmen eintritt, können die mit diesem Arbeitnehmer verbundenen Unterlagen auf unbestimmte Zeit aufbewahrt werden.
  • Und wenn derselbe Mitarbeiter das Unternehmen verlässt, wird die unbefristete Weiterbeschäftigung in einen endlichen Wert von drei Jahren ab dem aktuellen Zeitpunkt umgewandelt, der durch die Unternehmenspolitik festgelegt ist.

Eine Benutzer- oder Drittanbieteranwendung kann die Aufbewahrungsdauer mit einem SDK oder einer REST-API von unbegrenzt in begrenzt ändern.

Bucket-Besitzer und zugelassene Benutzer können die neue Aufbewahrung begrenzen, die für ein Objekt konfiguriert werden kann, das derzeit mit unbegrenzter Aufbewahrung aufbewahrt wird. Dazu werden die zulässigen Mindest- und Höchstwerte für die Eimerspeicherung verwendet. Auf diese Weise können die Benutzer verhindern, dass die Aufbewahrungszeit eines Objekts, das auf unbestimmte Zeit aufbewahrt wird, auf den aktuellen Zeitpunkt aktualisiert wird, so dass es sofort löschbar ist.

Ereignisgesteuerte Aufbewahrung

Immutable Object Storage (IOS) ermöglicht Benutzern das Festlegen einer unbegrenzten Aufbewahrungsdauer für Objekte, wenn die endgültige Zeitdauer der Aufbewahrung noch nicht feststeht oder wenn die ereignisgesteuerte Aufbewahrung verwendet werden soll. Nachdem eine unbegrenzte Aufbewahrungsdauer festgelegt wurde, kann in Benutzeranwendungen die Aufbewahrungsdauer eines Objekts zu einem späteren Zeitpunkt geändert und eine begrenzte Aufbewahrungsdauer angegeben werden. Beispiel: Ein Unternehmen verfügt über eine Richtlinie zur Aufbewahrung von Mitarbeiterdaten, in der eine Aufbewahrungsdauer von drei Jahren nach Ausscheiden des Mitarbeiters aus dem Unternehmen vorgegeben ist. Wenn ein Mitarbeiter ins Unternehmen eintritt, dann wird angegeben, dass die Datensätze des Mitarbeiters unbeschränkt aufbewahrt werden sollen. Verlässt der betreffende Mitarbeiter das Unternehmen, dann wird die unbeschränkte Aufbewahrungsdauer in eine beschränkte Aufbewahrungsdauer von drei Jahren ab dem aktuellen Zeitpunkt umgewandelt, was den Angaben in der Unternehmensrichtlinie entspricht. Das Objekt wird dann nach Änderung der Aufbewahrungsdauer für drei Jahre geschützt. Eine Benutzer- oder Drittanbieteranwendung kann die Aufbewahrungsdauer mit einem SDK oder einer REST-API von unbegrenzt in begrenzt ändern.

Dauerhafte Aufbewahrung

Die permanente Aufbewahrung stellt sicher, dass Daten nicht von jedermann gelöscht werden können. Lesen Sie die Dokumentation sorgfältig und verwenden Sie keine permanente Aufbewahrung, es sei denn, es besteht ein zwingender Bedarf an gesetzlichen Bestimmungen oder Compliance für permanente Datenspeicherung.

Die permanente Aufbewahrung kann nur auf IBM Cloud Object Storage Bucket-Ebene aktiviert werden, wenn die Aufbewahrungsrichtlinie aktiviert ist und die Benutzer beim Hochladen von Objekten die Option für die permanente Aufbewahrungsdauer auswählen können. Nach seiner Aktivierung kann dieser Prozess nicht umgekehrt werden und Objekte, die unter Verwendung einer dauerhaften Aufbewahrung hochgeladen wurden, können nicht gelöscht werden. Es liegt in der Verantwortung der Benutzer, auf ihrer Seite zu überprüfen, ob es einen legitimen Bedarf für die dauerhafte Speicherung von Objekten gibt, indem sie Object Storage Buckets mit einer Aufbewahrungsrichtlinie verwenden.

Bei Verwendung von Immutable Object Storage sind Sie für die Einhaltung der IBM Cloud-Richtlinien und -Leitlinien für Ihr IBM Cloud-Konto verantwortlich, solange Ihre Daten einer Aufbewahrungsrichtlinie unterliegen. Weitere Informationen hierzu finden Sie im Abschnitt zu den IBM Cloud Service-Bedingungen.

Immutable Object Storage und Hinweise zu verschiedenen Regelungen

Bei Verwendung von Immutable Object Storage (IOS) liegt es im Verantwortungsbereich des Kunden, zu prüfen und sicherzustellen, dass die hier behandelte Funktionalität verwendet werden kann, um die wichtigsten Regelungen in Bezug auf die Speicherung und Aufbewahrung elektronischer Aufzeichnungen eingehalten werden. Hierbei sind insbesondere folgende Regelungen zu beachten:

Um Kunden bei der Entscheidungsfindung zu unterstützen, hat IBM Cohasset Associates Inc. beauftragt, eine unabhängige Bewertung von IBM Immutable Object Storage durchzuführen. Lesen Sie den Bericht von Cohasset Associates Inc., der Details zur Bewertung der Funktion Immutable Object Storage von IBM Cloud Object Storage enthält.

Zugriff und Transaktionen protokollieren

Die Immutable Object Storage-Protokolldaten können verwendet werden, um Änderungen der Aufbewahrungsparameter, der Aufbewahrungsdauer für Objekte sowie die Anwendung von Beweissicherungsvermerken auf Fallbasis zu überprüfen. Hierzu kann ein Kundenservice-Ticket geöffnet werden.

Verwendung der Konsole

Aufbewahrungsrichtlinien können zu neuen oder bereits vorhandenen, leeren Buckets hinzugefügt werden. Nach dem Hinzufügen können sie nicht wieder entfernt werden. Für ein neues Bucket müssen Sie sicherstellen, dass das Bucket in einer unterstützten Region erstellt wird. Anschließend müssen Sie die Option Aufbewahrungsrichtlinie hinzufügen auswählen. Für ein bereits vorhandenes Bucket müssen Sie sich vergewissern, dass es keine Objekte enthält, und dann zu den Konfigurationseinstellungen navigieren und auf die Schaltfläche Richtlinie erstellen unterhalb des Abschnitts für die Aufbewahrungsrichtlinie des Buckets klicken. In beiden Fällen müssen Sie Werte für die mindestens erforderliche, maximal zulässige und standardmäßige Aufbewahrungsdauer festlegen.

REST-API, Bibliotheken und SDKs verwenden

Mehrere neue APIs wurden in die IBM Cloud Object Storage SDKs aufgenommen, um Anwendungen zu unterstützen, die mit Aufbewahrungsrichtlinien arbeiten. Wählen Sie eine Sprache ( HTTP, Java, JavaScript, oder Python ) am Anfang dieser Seite, um Beispiele zu sehen, die das entsprechende Object Storage SDK verwenden.

Beachten Sie hierbei, dass in allen Codebeispielen davon ausgegangen wird, dass ein Clientobjekt mit dem Namen cos vorhanden ist, mit dem die verschiedenen Methoden aufgerufen werden können. Detaillierte Informationen zum Erstellen von Clients finden Sie in den Leitfäden zum jeweiligen SDK.

Alle Datumswerte, die zum Festlegen der Aufbewahrungszeiträume verwendet werden, werden als GMT-Werte (GMT = Greenwich Mean Time) angegeben. Ein Content-MD5-Header oder ein checksum-Header (einschließlich x-amz-checksum-crc32, x-amz-checksum-crc32c, x-amz-checksum-crc64nvme, x-amz-checksum-sha1 oder x-amz-checksum-sha256) ist erforderlich, um die Datenintegrität zu gewährleisten. Beachten Sie, dass bei Verwendung eines SDKs automatisch ein Hash- oder Prüfsummenwert gesendet wird.

Aufbewahrungsrichtlinie für vorhandenes Bucket hinzufügen

Bei dieser Implementierung der PUT-Operation wird der Abfrageparameter protection verwendet, um die Aufbewahrungsparameter für ein vorhandenes Bucket festzulegen. Diese Operation ermöglicht Ihnen das Festlegen der Werte für die mindestens erforderliche, maximal zulässige und standardmäßige Aufbewahrungsdauer. Mit dieser Operation können Sie auch den Schutzstatus des Buckets ändern.

Objekte, die in ein geschütztes Bucket geschrieben wurden, können erst gelöscht werden, nachdem die Schutzfrist abgelaufen ist und alle Beweissicherungsvermerke für das Objekt entfernt wurden. Einem Objekt wird der Standardaufbewahrungswert des Buckets zugewiesen, es sei denn, bei der Erstellung des Objekts wird ein objektspezifischer Wert angegeben. Objekte in geschützten Buckets, die nicht mehr aufbewahrt werden müssen (Aufbewahrungszeitraum ist abgelaufen und für das Objekt wurden keine Beweissicherungsvermerke angegeben), werden im Falle einer Überschreibung erneut mit einer Aufbewahrungsdauer versehen. Die neue Aufbewahrungsdauer kann als Teil der Objektüberschreibungsanforderung angegeben werden oder dem Objekt wird der Standardaufbewahrungszeitraum des Buckets zugeordnet.

Die unterstützten Mindest- und Höchstwerte für die Einstellungen der Aufbewahrungsfrist MinimumRetention, DefaultRetention und MaximumRetention betragen mindestens 0 Tage und höchstens 36135 Tage (99 Jahre).

Eine Content-MD5 Kopfzeile oder eine checksum Kopfzeile (einschließlich x-amz-checksum-crc32, x-amz-checksum-crc32c,x-amz-checksum-crc64nvme, x-amz-checksum-sha1, oder x-amz-checksum-sha256) ist erforderlich. Diese Operation verwendet keine zusätzlichen Abfrageparameter.

Weitere Informationen zu Endpunkten finden Sie in Endpunkte und Speicherpositionen.

Syntax

PUT https://{endpoint}/{bucket-name}?protection= # path style
PUT https://{bucket-name}.{endpoint}?protection= # virtual host style

Beispielanforderung

PUT /example-bucket?protection= HTTP/1.1
Authorization: {authorization-string}
x-amz-date: 20181011T190354Z
x-amz-content-sha256: 2938f51643d63c864fdbea618fe71b13579570a86f39da2837c922bae68d72df
Content-MD5: GQmpTNpruOyK6YrxHnpj7g==
Content-Type: text/plain
Host: 67.228.254.193
Content-Length: 299
<ProtectionConfiguration>
  <Status>Retention</Status>
  <MinimumRetention>
    <Days>100</Days>
  </MinimumRetention>
  <MaximumRetention>
    <Days>10000</Days>
  </MaximumRetention>
  <DefaultRetention>
    <Days>2555</Days>
  </DefaultRetention>
</ProtectionConfiguration>

Beispielantwort

HTTP/1.1 200 OK
Date: Wed, 5 Oct 2018 15:39:38 GMT
X-Clv-Request-Id: 7afca6d8-e209-4519-8f2c-1af3f1540b42
Accept-Ranges: bytes
Server: Cleversafe/3.14.1
X-Clv-S3-Version: 2.5
x-amz-request-id: 7afca6d8-e209-4519-8f2c-1af3f1540b42
Content-Length: 0
def add_protection_configuration_to_bucket(bucket_name):
    try:
        new_protection_config = {
            "Status": "Retention",
            "MinimumRetention": {"Days": 10},
            "DefaultRetention": {"Days": 100},
            "MaximumRetention": {"Days": 1000}
        }

        cos.put_bucket_protection_configuration(Bucket=bucket_name, ProtectionConfiguration=new_protection_config)

        print("Protection added to bucket {0}\n".format(bucket_name))
    except ClientError as be:
        print("CLIENT ERROR: {0}\n".format(be))
    except Exception as e:
        print("Unable to set bucket protection config: {0}".format(e))
function addProtectionConfigurationToBucket(bucketName) {
    console.log(`Adding protection to bucket ${bucketName}`);
    return cos.putBucketProtectionConfiguration({
        Bucket: bucketName,
        ProtectionConfiguration: {
            'Status': 'Retention',
            'MinimumRetention': {'Days': 10},
            'DefaultRetention': {'Days': 100},
            'MaximumRetention': {'Days': 1000}
        }
    }).promise()
    .then(() => {
        console.log(`Protection added to bucket ${bucketName}!`);
    })
    .catch((e) => {
        console.log(`ERROR: ${e.code} - ${e.message}\n`);
    });
}
public static void addProtectionConfigurationToBucket(String bucketName) {
    System.out.printf("Adding protection to bucket: %s\n", bucketName);

    BucketProtectionConfiguration newConfig = new BucketProtectionConfiguration()
        .withStatus(BucketProtectionStatus.Retention)
        .withMinimumRetentionInDays(10)
        .withDefaultRetentionInDays(100)
        .withMaximumRetentionInDays(1000);

    cos.setBucketProtection(bucketName, newConfig);

    System.out.printf("Protection added to bucket %s\n", bucketName);
}

public static void addProtectionConfigurationToBucketWithRequest(String bucketName) {
    System.out.printf("Adding protection to bucket: %s\n", bucketName);

    BucketProtectionConfiguration newConfig = new BucketProtectionConfiguration()
        .withStatus(BucketProtectionStatus.Retention)
        .withMinimumRetentionInDays(10)
        .withDefaultRetentionInDays(100)
        .withMaximumRetentionInDays(1000);

    SetBucketProtectionConfigurationRequest newRequest = new SetBucketProtectionConfigurationRequest()
        .withBucketName(bucketName)
        .withProtectionConfiguration(newConfig);

    cos.setBucketProtectionConfiguration(newRequest);

    System.out.printf("Protection added to bucket %s\n", bucketName);
}

Aufbewahrungsrichtlinie eines Buckets prüfen

Bei dieser Implementierung der GET-Operation werden die Aufbewahrungsparameter eines vorhandenen Buckets abgerufen.

Syntax

GET https://{endpoint}/{bucket-name}?protection= # path style
GET https://{bucket-name}.{endpoint}?protection= # virtual host style

Beispielanforderung

GET /example-bucket?protection= HTTP/1.1
Authorization: {authorization-string}
x-amz-date: 20181011T190354Z
Content-Type: text/plain
Host: 67.228.254.193

Beispielantwort

HTTP/1.1 200 OK
Date: Wed, 5 Oct 2018 15:39:38 GMT
X-Clv-Request-Id: 7afca6d8-e209-4519-8f2c-1af3f1540b42
Accept-Ranges: bytes
Server: Cleversafe/3.13.1
X-Clv-S3-Version: 2.5
x-amz-request-id: 7afca6d8-e209-4519-8f2c-1af3f1540b42
Content-Length: 299
<ProtectionConfiguration>
  <Status>Retention</Status>
  <MinimumRetention>
    <Days>100</Days>
  </MinimumRetention>
  <MaximumRetention>
    <Days>10000</Days>
  </MaximumRetention>
  <DefaultRetention>
    <Days>2555</Days>
  </DefaultRetention>
</ProtectionConfiguration>

Wenn für ein Bucket keine Schutzkonfiguration festgelegt wurde, dann gibt der Server den Status 'Inaktiviert' aus.

<ProtectionConfiguration>
  <Status>Disabled</Status>
</ProtectionConfiguration>
def get_protection_configuration_on_bucket(bucket_name):
    try:
        response = cos.get_bucket_protection_configuration(Bucket=bucket_name)
        protection_config = response.get("ProtectionConfiguration")

        print("Bucket protection config for {0}\n".format(bucket_name))
        print(protection_config)
        print("\n")
    except ClientError as be:
        print("CLIENT ERROR: {0}\n".format(be))
    except Exception as e:
        print("Unable to get bucket protection config: {0}".format(e))
function getProtectionConfigurationOnBucket(bucketName) {
    console.log(`Retrieve the protection on bucket ${bucketName}`);
    return cos.getBucketProtectionConfiguration({
        Bucket: bucketName
    }).promise()
    .then((data) => {
        console.log(`Configuration on bucket ${bucketName}:`);
        console.log(data);
    }
    .catch((e) => {
        console.log(`ERROR: ${e.code} - ${e.message}\n`);
    });
}
public static void getProtectionConfigurationOnBucket(String bucketName) {
    System.out.printf("Retrieving protection configuration from bucket: %s\n", bucketName;

    BucketProtectionConfiguration config = cos.getBucketProtection(bucketName);

    String status = config.getStatus();

    System.out.printf("Status: %s\n", status);

    if (!status.toUpperCase().equals("DISABLED")) {
        System.out.printf("Minimum Retention (Days): %s\n", config.getMinimumRetentionInDays());
        System.out.printf("Default Retention (Days): %s\n", config.getDefaultRetentionInDays());
        System.out.printf("Maximum Retention (Days): %s\n", config.getMaximumRetentionInDays());
    }
}

Objekt mit Aufbewahrungsrichtlinie in Bucket hochladen

Diese Erweiterung der PUT-Operation fügt drei neue Anforderungsheader hinzu: Zwei zur Angabe der Aufbewahrungsdauer auf unterschiedliche Weise und einen zum Hinzufügen eines einzelnen Beweissicherungsvermerks zu dem neuen Objekt. Für unzulässige Werte bei neuen Headern werden neue Fehler definiert. Wenn für ein Objekt eine Aufbewahrungsdauer angegeben ist, dann schlagen Überschreibungen fehl.

Objekte in Buckets mit Aufbewahrungsrichtlinie, die nicht mehr aufbewahrt werden müssen (Aufbewahrungszeitraum ist abgelaufen und für das Objekt wurden keine Beweissicherungsvermerke angegeben), werden im Falle einer Überschreibung erneut mit einer Aufbewahrungsdauer versehen. Die neue Aufbewahrungsdauer kann als Teil der Objektüberschreibungsanforderung angegeben werden oder dem Objekt wird der Standardaufbewahrungszeitraum des Buckets zugeordnet.

Ein Content-MD5-Header oder ein checksum-Header (einschließlich x-amz-checksum-crc32, x-amz-checksum-crc32c, x-amz-checksum-crc64nvme, x-amz-checksum-sha1 oder x-amz-checksum-sha256) ist als Integritätsprüfung für die Nutzlast für jede Art von Objekt-Upload-Anforderung für einen Bereich mit einer Aufbewahrungsrichtlinie erforderlich.

Wert Typ Beschreibung
Retention-Period Nicht negative Ganzzahl (Sekunden) Die Aufbewahrungsdauer des Objekts in Sekunden. Das Objekt kann vor Ablauf der Aufbewahrungsdauer weder überschrieben noch gelöscht werden. Wenn dieses Feld und Retention-Expiration-Date angegeben werden, wird der Fehler 400 zurückgegeben. Wird keiner dieser Werte angegeben, dann wird der Wert für DefaultRetention des Buckets verwendet. Null (0) ist ein gültiger Wert und bedeutet, dass die Mindestaufbewahrungsdauer des Buckets 0 beträgt.
Retention-expiration-date Datum (ISO 8601-Format) Das Datum, an dem das Löschen oder Ändern des Objekts wieder zulässig sein wird. Sie können nur diesen Header oder den Header 'Retention-Period' angeben. Werden beide angegeben, dann gibt das System den Fehler 400 zurück. Wird keiner dieser Werte angegeben, dann wird der Wert für DefaultRetention des Buckets verwendet. Das unterstützte ISO 8601-Format ist [YYYY]-[MM]-[DD]T[hh]:[mm]:[ss]Z oder [YYYY][MM][DD]T[hh][mm][ss]Z (beispielsweise sind 2020-11-28T03:10:01Z oder 20201128T031001Z beide gültig).
Retention-legal-hold-id Zeichenfolge Ein einzelner Beweissicherungsvermerk, der auf das Objekt angewendet wird. Ein Beweissicherungsvermerk wird in einer langen Zeichenfolge (Y) angegeben. Das Objekt kann erst überschrieben oder gelöscht werden, nachdem alle dem Objekt zugeordneten Beweissicherungsvermerke entfernt wurden.
def put_object_add_legal_hold(bucket_name, object_name, file_text, legal_hold_id):
    print("Add legal hold {0} to {1} in bucket {2} with a putObject operation.\n".format(legal_hold_id, object_name, bucket_name))

    cos.put_object(
        Bucket=bucket_name,
        Key=object_name,
        Body=file_text,
        RetentionLegalHoldId=legal_hold_id)

    print("Legal hold {0} added to object {1} in bucket {2}\n".format(legal_hold_id, object_name, bucket_name))

def copy_protected_object(source_bucket_name, source_object_name, destination_bucket_name, new_object_name):
    print("Copy protected object {0} from bucket {1} to {2}/{3}.\n".format(source_object_name, source_bucket_name, destination_bucket_name, new_object_name))

    copy_source = {
        "Bucket": source_bucket_name,
        "Key": source_object_name
    }

    cos.copy_object(
        Bucket=destination_bucket_name,
        Key=new_object_name,
        CopySource=copy_source,
        RetentionDirective="Copy"
    )

    print("Protected object copied from {0}/{1} to {2}/{3}\n".format(source_bucket_name, source_object_name, destination_bucket_name, new_object_name));

def complete_multipart_upload_with_retention(bucket_name, object_name, upload_id, retention_period):
    print("Completing multi-part upload for object {0} in bucket {1}\n".format(object_name, bucket_name))

    cos.complete_multipart_upload(
        Bucket=bucket_name,
        Key=object_name,
        MultipartUpload={
            "Parts":[{
                "ETag": part["ETag"],
                "PartNumber": 1
            }]
        },
        UploadId=upload_id,
        RetentionPeriod=retention_period
    )

    print("Multi-part upload completed for object {0} in bucket {1}\n".format(object_name, bucket_name))

def upload_file_with_retention(bucket_name, object_name, path_to_file, retention_period):
    print("Uploading file {0} to object {1} in bucket {2}\n".format(path_to_file, object_name, bucket_name))

    args = {
        "RetentionPeriod": retention_period
    }

    cos.upload_file(
        Filename=path_to_file,
        Bucket=bucket_name,
        Key=object_name,
        ExtraArgs=args
    )

    print("File upload complete to object {0} in bucket {1}\n".format(object_name, bucket_name))
function putObjectAddLegalHold(bucketName, objectName, legalHoldId) {
    console.log(`Add legal hold ${legalHoldId} to ${objectName} in bucket ${bucketName} with a putObject operation.`);
    return cos.putObject({
        Bucket: bucketName,
        Key: objectName,
        Body: 'body',
        RetentionLegalHoldId: legalHoldId
    }).promise()
    .then((data) => {
        console.log(`Legal hold ${legalHoldId} added to object ${objectName} in bucket ${bucketName}`);
    })
    .catch((e) => {
        console.log(`ERROR: ${e.code} - ${e.message}\n`);
    });
}

function copyProtectedObject(sourceBucketName, sourceObjectName, destinationBucketName, newObjectName, ) {
    console.log(`Copy protected object ${sourceObjectName} from bucket ${sourceBucketName} to ${destinationBucketName}/${newObjectName}.`);
    return cos.copyObject({
        Bucket: destinationBucketName,
        Key: newObjectName,
        CopySource: sourceBucketName + '/' + sourceObjectName,
        RetentionDirective: 'Copy'
    }).promise()
    .then((data) => {
        console.log(`Protected object copied from ${sourceBucketName}/${sourceObjectName} to ${destinationBucketName}/${newObjectName}`);
    })
    .catch((e) => {
        console.log(`ERROR: ${e.code} - ${e.message}\n`);
    });
}
public static void putObjectAddLegalHold(String bucketName, String objectName, String fileText, String legalHoldId) {
    System.out.printf("Add legal hold %s to %s in bucket %s with a putObject operation.\n", legalHoldId, objectName, bucketName);

    InputStream newStream = new ByteArrayInputStream(fileText.getBytes(StandardCharsets.UTF_8));

    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentLength(fileText.length());

    PutObjectRequest req = new PutObjectRequest(
        bucketName,
        objectName,
        newStream,
        metadata
    );
    req.setRetentionLegalHoldId(legalHoldId);

    cos.putObject(req);

    System.out.printf("Legal hold %s added to object %s in bucket %s\n", legalHoldId, objectName, bucketName);
}

public static void copyProtectedObject(String sourceBucketName, String sourceObjectName, String destinationBucketName, String newObjectName) {
    System.out.printf("Copy protected object %s from bucket %s to %s/%s.\n", sourceObjectName, sourceBucketName, destinationBucketName, newObjectName);

    CopyObjectRequest req = new CopyObjectRequest(
        sourceBucketName,
        sourceObjectName,
        destinationBucketName,
        newObjectName
    );
    req.setRetentionDirective(RetentionDirective.COPY);


    cos.copyObject(req);

    System.out.printf("Protected object copied from %s/%s to %s/%s\n", sourceObjectName, sourceBucketName, destinationBucketName, newObjectName);
}

Aufbewahrungsdauer eines Objekts verlängern

Bei dieser Implementierung der POST-Operation wird der Abfrageparameter extendRetention verwendet, um die Aufbewahrungsdauer eines geschützten Objekts in einem geschützten Bucket zu verlängern.

Die Aufbewahrungsdauer eines Objekts kann nur verlängert werden. Sie kann gegenüber dem momentan konfigurierten Wert nicht verkürzt werden.

Der Wert für die Verlängerung der Aufbewahrungsdauer kann auf die folgenden drei Arten festgelegt werden:

  • Hinzufügen zusätzlicher Zeit zum aktuellen Wert (Additional-Retention-Period oder ähnliche Methode)
  • Definieren einer neuen Verlängerungszeitdauer in Sekunden (Extend-Retention-From-Current-Time oder ähnliche Methode)
  • Definieren eines neuen Ablaufdatums für die Aufbewahrung des Objekts (New-Retention-Expiration-Date oder ähnliche Methode)

Die in den Objektmetadaten momentan gespeicherte Aufbewahrungsdauer wird entweder um die angegebene zusätzliche Zeitdauer verlängert oder durch den neuen Wert ersetzt. Welche Methode verwendet wird, hängt von dem Parameter ab, der in der Anforderung für extendRetention festgelegt wird. In allen Fällen wird der Parameter für die Verlängerung des Aufbewahrungszeitraums mit den Angaben für den aktuellen Aufbewahrungszeitraum verglichen; der erweiterte Parameter wird nur akzeptiert, wenn der aktualisierte Aufbewahrungszeitraum größer ist als der aktuelle Aufbewahrungszeitraum.

Das unterstützte ISO 8601-Format für New-Retention-Expiration-Date ist [YYYY]-[MM]-[DD]T[hh]:[mm]:[ss]Z oder [YYYY][MM][DD]T[hh][mm][ss]Z (beispielsweise sind 2020-11-28T03:10:01Z oder 20201128T031001Z beide gültig).

Objekte in geschützten Buckets, die nicht mehr aufbewahrt werden müssen (Aufbewahrungszeitraum ist abgelaufen und für das Objekt wurden keine Beweissicherungsvermerke angegeben), werden im Falle einer Überschreibung erneut mit einer Aufbewahrungsdauer versehen. Die neue Aufbewahrungsdauer kann als Teil der Objektüberschreibungsanforderung angegeben werden oder dem Objekt wird der Standardaufbewahrungszeitraum des Buckets zugeordnet.

Syntax

POST https://{endpoint}/{bucket-name}/{object-name}?extendRetention= # path style
POST https://{bucket-name}.{endpoint}/{object-name}?extendRetention= # virtual host style

Beispielanforderung

POST /BucketName/ObjectName?extendRetention HTTP/1.1
Host: myBucket.mydsNet.corp.com
Date: Fri, 8 Dec 2018 17:50:00GMT
Authorization: authorization string
Content-Type: text/plain
Additional-Retention-Period: 31470552

Beispielantwort

HTTP/1.1 200 OK
Date: Fri, 8 Dec 2018 17:50:00GMT
Connection: close
def extend_retention_period_on_object(bucket_name, object_name, additional_seconds):
    print("Extend the retention period on {0} in bucket {1} by {2} seconds.\n".format(object_name, bucket_name, additional_seconds))

    cos.extend_object_retention(
        Bucket=bucket_ame,
        Key=object_name,
        AdditionalRetentionPeriod=additional_seconds
    )

    print("New retention period on {0} is {1}\n".format(object_name, additional_seconds))
function extendRetentionPeriodOnObject(bucketName, objectName, additionalSeconds) {
    console.log(`Extend the retention period on ${objectName} in bucket ${bucketName} by ${additionalSeconds} seconds.`);
    return cos.extendObjectRetention({
        Bucket: bucketName,
        Key: objectName,
        AdditionalRetentionPeriod: additionalSeconds
    }).promise()
    .then((data) => {
        console.log(`New retention period on ${objectName} is ${data.RetentionPeriod}`);
    })
    .catch((e) => {
        console.log(`ERROR: ${e.code} - ${e.message}\n`);
    });
}
public static void extendRetentionPeriodOnObject(String bucketName, String objectName, Long additionalSeconds) {
    System.out.printf("Extend the retention period on %s in bucket %s by %s seconds.\n", objectName, bucketName, additionalSeconds);

    ExtendObjectRetentionRequest req = new ExtendObjectRetentionRequest(
        bucketName,
        objectName)
        .withAdditionalRetentionPeriod(additionalSeconds);

    cos.extendObjectRetention(req);

    System.out.printf("New retention period on %s is %s\n", objectName, additionalSeconds);
}

Beweissicherungsvermerke eines Objekts auflisten

Bei dieser Implementierung der GET-Operation wird der Abfrageparameter legalHold verwendet, um die Liste der Beweissicherungsvermerke für ein Objekt und den zugehörigen Aufbewahrungsstatus in einem XML-Antworthauptteil zurückzugeben.

Nach dem Ausführen dieser Operation wird Folgendes zurückgegeben:

  • Objekterstellungsdatum
  • Aufbewahrungsdauer des Objekts in Sekunden
  • Berechnetes Ablaufdatum der Aufbewahrung auf Basis der Aufbewahrungsdauer und des Erstellungsdatums
  • Liste der Beweissicherungsvermerke
  • Kennung des Beweissicherungsvermerks
  • Zeitmarke für Anwendung des Beweissicherungsvermerks

Wenn für das Objekt keine Beweissicherungsvermerke definiert wurden, dann gibt das System ein leeres Element LegalHoldSet zurück. Wurde keine Aufbewahrungsdauer für das Objekt angegeben, dann wird der Fehler 404 zurückgegeben.

Syntax

GET https://{endpoint}/{bucket-name}/{object-name}?legalHold= # path style
GET https://{bucket-name}.{endpoint}/{object-name}?legalHold= # virtual host style

Beispielanforderung

GET /BucketName/ObjectName?legalHold HTTP/1.1
Host: myBucket.mydsNet.corp.com
Date: Fri, 8 Dec 2018 17:50:00 GMT
Authorization: {authorization-string}
Content-Type: text/plain

Beispielantwort

HTTP/1.1 200 OK
Date: Fri, 8 Dec 2018 17:51:00 GMT
Connection: close
<?xml version="1.0" encoding="UTF-8"?>
<RetentionState>
  <CreateTime>Fri, 8 Sep 2018 21:33:08 GMT</CreateTime>
  <RetentionPeriod>220752000</RetentionPeriod>
  <RetentionPeriodExpirationDate>Fri, 1 Sep 2023 21:33:08
GMT</RetentionPeriodExpirationDate>
  <LegalHoldSet>
    <LegalHold>
      <ID>SomeLegalHoldID</ID>
      <Date>Fri, 8 Sep 2018 23:13:18 GMT</Date>
    </LegalHold>
    <LegalHold>
    ...
    </LegalHold>
  </LegalHoldSet>
</RetentionState>
def list_legal_holds_on_object(bucket_name, object_name):
    print("List all legal holds on object {0} in bucket {1}\n".format(object_name, bucket_name));

    response = cos.list_legal_holds(
        Bucket=bucket_name,
        Key=object_name
    )

    print("Legal holds on bucket {0}: {1}\n".format(bucket_name, response))
function listLegalHoldsOnObject(bucketName, objectName) {
    console.log(`List all legal holds on object ${objectName} in bucket ${bucketName}`);
    return cos.listLegalHolds({
        Bucket: bucketName,
        Key: objectId
    }).promise()
    .then((data) => {
        console.log(`Legal holds on bucket ${bucketName}: ${data}`);
    })
    .catch((e) => {
        console.log(`ERROR: ${e.code} - ${e.message}\n`);
    });
}
public static void listLegalHoldsOnObject(String bucketName, String objectName) {
    System.out.printf("List all legal holds on object %s in bucket %s\n", objectName, bucketName);

    ListLegalHoldsResult result = cos.listLegalHolds(
        bucketName,
        objectName
    );

    System.out.printf("Legal holds on bucket %s: \n", bucketName);

    List<LegalHold> holds = result.getLegalHolds();
    for (LegalHold hold : holds) {
        System.out.printf("Legal Hold: %s", hold);
    }
}