ECS: Os objetos na retenção do bloqueio de objetos do S3 podem ser excluídos ou substituídos.
Resumo: O S3 foi configurado com retenção de bloqueio de objeto. Mesmo que a retenção seja definida, o objeto pode ser excluído ou substituído.
Sintomas
Causa
O ECS está funcionando de acordo com a documentação do AWS S3.
Quando o bloqueio de objeto está ativado, o controle de versão também é ativado. A retenção na operação PUT do S3 agora está configurada para esse ID de versão exato.
O objeto agora é considerado a versão "atual".
Quando um "DELETE" é enviado sem apontar para o ID da versão, um "dmarker" está sendo criado. A versão do objeto sob retenção é vista como versão "não atual".
Ao "substituir" o objeto, o processo é o mesmo: a versão atual se torna não atual e uma nova versão é criada. A nova versão também está sob a retenção configurada!
Exemplo:
O usuário neste exemplo tem todas as permissões, exceto "s3:BypassGovernanceRetention"
Consulte o "ECS Data Access Guide" para obter detalhes sobre os métodos de retenção "Compliance" e "Governance".
Ativando o bloqueio de objeto no bucket "ObjectLockBucket"
mathias@client:/usr/share/s3curl$ ./s3curl.pl --debug --id=b_mathias_iam -- http://loadbalancer.fq.dn:9020/ObjectLockBucket?enable-object-lock -X PUT mathias@client:/usr/share/s3curl$ ./s3curl.pl --debug --id=b_mathias_iam -- http://loadbalancer.fq.dn:9020/ObjectLockBucket?object-lock |xmllint --format - <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <ObjectLockEnabled>Enabled</ObjectLockEnabled> </ObjectLockConfiguration>
No ECS, vemos que, junto com o "Bloqueio de objeto", o "Controle de versões" está ativado:
admin@ecs-n2:~> svc_bucket info ObjectLockBucket
svc_bucket v1.0.39 (svc_tools v2.15.0) Started 2024-02-23 10:33:37
Bucket ID b_mathias_ns.ObjectLockBucket
Name ObjectLockBucket
Namespace b_mathias_ns
Owner User urn:ecs:iam::b_mathias_ns:root
Owner VDC Name VDC1
Owner zone/VDC ID urn:storageos:VirtualDataCenterData:c65ec181-5c44-4491-94d1-d8c75beb2963
Keypool Hash ID 03faef6729cc80adb7fbeb228a0b50536cea6791973eabc99b44f1a30a28cad3
Keypool Policy None
Bucket ACL:
Type Affects Name Access Rights
user file/dir urn:ecs:iam::b_mathias_ns:root FULL_CONTROL
Replication Group (vpool) Name RG1
Replication Group (vpool) ID urn:storageos:ReplicationGroupInfo:b94655e8-e8ad-4276-80ca-3eb095147f99:global
Bucket Creation Date 2024-02-23 10:29:38 (1708684178025)
Temp Failed (TSO) False
API Type S3
FS Access Enabled False
Encryption Enabled False
Versioning State Enabled <<<<<<<<<<<<<<<<<<<<<<<<<<<<
ADO Enabled False
ADO Read-Only False
Object Lock Enabled True <<<<<<<<<<<<<<<<<<<<<<<<<<<<
Auto commit period (seconds) None
Enforce Retention False
Lifecycle Policy None
Default FS Access permissions (for owner group):
File Dir
Read Write Exec Read Write Exec
Unk Unk Unk Unk Unk Unk
Object count 0
Total Object Size 0 GB
Definir uma política padrão, um tipo de governança e uma retenção de 5 dias:
mathias@client:/usr/share/s3curl$ ./s3curl.pl --debug --id=b_mathias_iam -- http://loadbalancer.fq.dn:9020/ObjectLockBucket?object-lock -X PUT \
> -d "<ObjectLockConfiguration><ObjectLockEnabled>Enabled</ObjectLockEnabled>
> <Rule><DefaultRetention><Mode>GOVERNANCE</Mode><Days>5</Days></DefaultRetention></Rule></ObjectLockConfiguration>"
mathias@client:/usr/share/s3curl$ ./s3curl.pl --debug --id=b_mathias_iam -- http://loadbalancer.fq.dn:9020/ObjectLockBucket?object-lock |xmllint --format -
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ObjectLockConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<ObjectLockEnabled>Enabled</ObjectLockEnabled>
<Rule>
<DefaultRetention>
<Mode>GOVERNANCE</Mode>
<Days>5</Days>
</DefaultRetention>
</Rule>
</ObjectLockConfiguration>
Criar o objeto "Object-under-retention", usando a opção de depuração no s3curl para receber o ID da versão.
O ID da versão, que é o registro de data e hora da época, é visto na resposta:
mathias@client:/usr/share/s3curl$ ./s3curl.pl --debug --id=b_mathias_iam --put=1k -- http://loadbalancer.fq.dn:9020/ObjectLockBucket/Object-under-retention > PUT /ObjectLockBucket/Object-under-retention HTTP/1.1 > Host: loadbalancer.fq.dn:9020 > User-Agent: curl/7.81.0 > Accept: */* > Date: Fri, 23 Feb 2024 11:00:16 +0000 > Content-Length: 28 > Expect: 100-continue > * Mark bundle as not supporting multiuse < HTTP/1.1 100 Continue * We are completely uploaded and fine * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Date: Fri, 23 Feb 2024 11:00:16 GMT < Server: ViPR/1.0 < x-amz-request-id: 0a3c0814:18dcc3986d8:178c:f42b9 < x-amz-id-2: c7eb1c173a8121b873ce4973eb16c326b7b02a920ca4d002fd3715b7b53adbf5 < ETag: "9f8e337286aa2bf5147061f1a9b8b934" < Last-Modified: Fri, 23 Feb 2024 11:00:16 GMT < x-emc-mtime: 1708686016872 < x-emc-previous-object-size: 0 < x-amz-version-id: 1708686016872 <<<<<<<<<<<<<<<<<<<<<<<<<<<< Version under retention. < Content-Length: 0 < * Connection #0 to host loadbalancer.fq.dn left intact
Esta versão é a nossa versão "atual", um cabeçalho para este objeto exibe a retenção.
Ele também exibe nosso ID de versão 1708686016872, que colocamos sob retenção.
mathias@client:/usr/share/s3curl$ ./s3curl.pl --id=b_mathias_iam --head -- http://loadbalancer.fq.dn:9020/ObjectLockBucket/Object-under-retention HTTP/1.1 200 OK Date: Fri, 23 Feb 2024 11:00:54 GMT Server: ViPR/1.0 x-amz-request-id: 0a3c0814:18dcc3986d8:1d87:6180 x-amz-id-2: c7eb1c173a8121b873ce4973eb16c326b7b02a920ca4d002fd3715b7b53adbf5 x-amz-version-id: 1708686016872 <<<<<<<<<<<<<<<<<<<<<<<<<<<< x-amz-object-lock-mode: GOVERNANCE <<<<<<<<<<<<<<<<<<<<<<<<<<<< x-amz-object-lock-retain-until-date: 2024-02-28T11:00:16.872Z <<<<<<<<<<<<<<<<<<<<<<<<<<<< ETag: "9f8e337286aa2bf5147061f1a9b8b934" Last-Modified: Fri, 23 Feb 2024 11:00:16 GMT x-emc-mtime: 1708686016872 Content-Type: application/octet-stream Content-Length: 28
Também podemos abordar o versionID para o mesmo resultado:
mathias@client:/usr/share/s3curl$ ./s3curl.pl --id=b_mathias_iam --head -- http://loadbalancer.fq.dn:9020/ObjectLockBucket/Object-under-retention?VersionId=1708686016872 HTTP/1.1 200 OK Date: Fri, 23 Feb 2024 11:01:41 GMT Server: ViPR/1.0 x-amz-request-id: 0a3c0814:18dcc3986d8:ff2:25dc4f x-amz-id-2: c7eb1c173a8121b873ce4973eb16c326b7b02a920ca4d002fd3715b7b53adbf5 x-amz-version-id: 1708686016872 x-amz-object-lock-mode: GOVERNANCE x-amz-object-lock-retain-until-date: 2024-02-28T11:00:16.872Z ETag: "9f8e337286aa2bf5147061f1a9b8b934" Last-Modified: Fri, 23 Feb 2024 11:00:16 GMT x-emc-mtime: 1708686016872 Content-Type: application/octet-stream Content-Length: 28
A exclusão dos resultados atuais no HTTP 1/1 200 - sucesso.
Isso se deve ao controle de versão, não é uma exclusão, mas um "dmarker" é criado.
A versão permanece sob retenção. O "dmarker" tem o ID de versão 170868621362.
Deleting: mathias@client:/usr/share/s3curl$ ./s3curl.pl --id=b_mathias_iam --head -- http://loadbalancer.fq.dn:9020/ObjectLockBucket/Object-under-retention 404 is reported correctly! The "current" for "Object-under-retention" no longer exists. But the VersionId is different: HTTP/1.1 404 Not Found Date: Fri, 23 Feb 2024 11:03:44 GMT Server: ViPR/1.0 x-amz-request-id: 0a3c0814:18dcc3986d8:1d94:124b x-amz-id-2: c7eb1c173a8121b873ce4973eb16c326b7b02a920ca4d002fd3715b7b53adbf5 Content-Type: application/xml Date: Fri, 23 Feb 2024 11:03:44 GMT x-amz-request-id: 0a3c0814:18dcc3986d8:1d94:124b Server: ViPR/1.0 x-amz-delete-marker: true x-amz-version-id: 1708686213620 <<<<<<<<<<<<<<<<<<<<<<<<<<<
A versão do objeto 1708686016872 ainda existe e está sob retenção:
mathias@client:/usr/share/s3curl$ ./s3curl.pl --id=b_mathias_iam --head -- http://loadbalancer.fq.dn:9020/ObjectLockBucket/Object-under-retention?versionId=1708686016872 HTTP/1.1 200 OK Date: Fri, 23 Feb 2024 11:08:20 GMT Server: ViPR/1.0 x-amz-request-id: 0a3c0814:18dcc3986d8:1d94:36e8 x-amz-id-2: c7eb1c173a8121b873ce4973eb16c326b7b02a920ca4d002fd3715b7b53adbf5 x-amz-version-id: 1708686016872 x-amz-object-lock-mode: GOVERNANCE x-amz-object-lock-retain-until-date: 2024-02-28T11:00:16.872Z ETag: "9f8e337286aa2bf5147061f1a9b8b934" Last-Modified: Fri, 23 Feb 2024 11:00:16 GMT x-emc-mtime: 1708686016872 Content-Type: application/octet-stream Content-Length: 28
Esta versão não pode ser excluída:
mathias@client:/usr/share/s3curl$ ./s3curl.pl --id=b_mathias_iam --delete -- http://loadbalancer.fq.dn:9020/ObjectLockBucket/Object-under-retention?versionId=1708686016872 <Error><Code>AccessDenied</Code><Message>Access Denied</Message><Resource>ObjectLockBucket/Object-under-retention</Resource><RequestId>0a3c0814:18dcc3986d8:1c48:26d90</RequestId></Error>
Resolução
O bloqueio de objeto no ECS exige a versão que está sendo endereçada para ver a retenção.
Novas versões podem ser criadas com o mesmo nome, também "dmarker" pode ser criado.
Consulte também a documentação do AWS S3 para esse comportamento:
https://aws.amazon.com/s3/features/object-lock/
https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html