Baixar e fazer upload de objetos com URLs pré-assinados
É possível usar URLs pré-assinados para conceder acesso por tempo limitado a objetos no Amazon S3 sem atualizar a política de bucket. Um URL pré-assinado pode ser inserido em um navegador ou usado por um programa para baixar um objeto. As credenciais usadas pelo URL pré-assinado são as da entidade principal do AWS Identity and Access Management (IAM) que gerou o URL.
Também é possível usar URLs pré-assinados para permitir que alguém carregue um objeto específico para o bucket do Amazon S3. Isso permite um carregamento sem exigir que outra parte tenha credenciais ou permissões de segurança da AWS. Se um objeto com a mesma chave já existe no bucket como especificado no URL pré-assinado, o Amazon S3 substitui o objeto existente pelo objeto carregado.
É possível usar o pre-signed URL várias vezes, até a data e a hora de expiração.
Ao criar um URL pré-assinado, você deve fornecer suas credenciais de segurança e especificar o seguinte:
-
Um bucket do Amazon S3
-
Uma chave de objeto (se o download desse objeto for no bucket do Amazon S3, se estiver carregando, esse é o nome do arquivo a ser carregado)
-
Um método HTTP (
GETpara baixar objetos,PUTfazer upload,HEADpara ler metadados de objetos etc.) -
Um intervalo de tempo de validade
Ao usar URLs pré-assinados para fazer upload de objetos, é possível verificar a integridade do objeto usando somas de verificação. Enquanto os URLs pré-assinados criados com o AWS Signature Version 2 permitem apenas somas de verificação MD5, os URLs pré-assinados criados com o AWS Signature Version 4 permitem algoritmos de soma de verificação adicionais, como CRC-64/NVME, CRC32, CRC32C, SHA-1 e SHA-256. Para usar esses algoritmos de soma de verificação adicionais, use o AWS Signature Version 4 e inclua o cabeçalho de soma de verificação apropriado em sua solicitação de upload. Para ter mais informações sobre integridade de objeto, consulte Verificar a integridade do objeto no Amazon S3.
Tópicos
Quem pode criar um URL pré-assinado
Qualquer um com credenciais de segurança válidas pode criar um pre-signed URL. Mas para que alguém acesse com êxito um objeto, o URL pré-assinado deve ter sido criado por alguém que tenha permissão para executar a operação na qual o URL pré-assinado é baseado.
Veja a seguir os tipos de credencial que podem ser usados para criar um URL pré-assinado:
-
Usuário do IAM: válido por até 7 dias quando você estiver usando o AWS Signature Version 4.
Para criar um URL pré-assinado que seja válido por até sete dias, primeiro delegue credenciais de usuário do IAM (a chave de acesso e a chave secreta) ao método usado para criar o URL pré-assinado.
-
Credenciais de segurança temporárias: não podem ter um tempo de validade superior ao das credenciais em si. Essas credenciais incluem:
-
Credenciais de perfil do IAM: o URL pré-assinado expira quando a sessão do perfil expira, mesmo que você especifique um tempo de expiração maior.
-
Credenciais de perfil do IAM usadas por instâncias do Amazon EC2: permanecem válidas de acordo com a duração das credenciais do perfil (normalmente, seis horas).
-
Credenciais do AWS Security Token Service: permanecem válidas somente enquanto as credenciais temporárias forem válidas.
-
nota
Se você criou um URL pré-assinado usando uma credencial temporária, o URL expirará quando a credencial expirar. Em geral, um URL pré-assinado expira quando a credencial que você usou para criá-lo é revogada, excluída ou desativada. Isso se aplica mesmo que o URL tenha sido criado com um prazo de validade posterior. Para receber informações sobre a permanência de credenciais de segurança temporárias, consulte Comparação das operações de API do AWS STS no Guia do usuário do IAM.
Tempo de validade para URLs pré-assinados
Um URL pré-assinado permanece válido pelo período de tempo especificado quando o URL é gerado. Se você criar um URL pré-assinado com o console do Amazon S3, o tempo de validade pode ser definido entre 1 minuto e 12 horas. Se você usar a AWS CLI ou AWS SDKs, o tempo de validade poderá ser definido como até sete dias.
Se você criou um URL pré-assinado usando um token temporário, o URL expirará quando o token expirar. Em geral, um URL pré-assinado expira quando a credencial que você usou para criá-lo é revogada, excluída ou desativada. Isso se aplica mesmo que o URL tenha sido criado com um prazo de validade posterior. Para obter mais informações sobre como as credenciais que você usa afetam o tempo de validade, consulte Quem pode criar um URL pré-assinado.
O Amazon S3 confere a data e hora de validade de um URL assinado no momento da solicitação HTTP. Por exemplo, se um cliente começar a baixar um arquivo grande imediatamente antes do tempo de expiração, o download continuará mesmo que o tempo de expiração acabe durante o download. No entanto, se a conexão cair e o cliente tentar reiniciar o download posteriormente ao término do tempo de expiração, o download vai falhar.
Limitar recursos de pre-signed URLs
Os recursos de um URL pré-assinado são limitados pelas permissões do usuário que o criou. Em essência, os URLs pré-assinados são tokens ao portador que concedem acesso ao portador. Dessa forma, recomendamos que você os proteja adequadamente. Veja a seguir alguns métodos que podem ser usados para restringir o uso de URLs pré-assinados.
AWS Signature Version 4 (SigV4)
Para aplicar um comportamento específico quando solicitações de URL pré-assinado forem autenticadas usando AWS Signature Version 4 (SigV4), você pode usar chaves de condição nas políticas de bucket e políticas de ponto de acesso. Por exemplo, a política de bucket a seguir usará a condição s3:signatureAge para negar qualquer solicitação de URL pré-assinado do Amazon S3 em objetos no bucket amzn-s3-demo-bucket se a assinatura tiver mais de 10 minutos de existência. Para usar esse exemplo, substitua os user input
placeholders por suas próprias informações.
Para obter mais informações sobre as chaves de política relacionadas ao AWS Signature versão 4, consulte Autenticação do AWS Signature versão 4 na Referência de API do Amazon Simple Storage Service.
Restrição de caminho de rede
Se quiser restringir o uso de URLs pré-assinados e todo o acesso do Amazon S3 a caminhos de rede específicos, você poderá escrever políticas do AWS Identity and Access Management (IAM). Essas políticas podem ser definidas na entidade principal do IAM que faz a chamada, no bucket do Amazon S3 ou em ambos.
Uma restrição de caminho de rede na entidade principal do IAM exige que o usuário dessas credenciais faça solicitações pela rede especificada. Uma restrição no bucket ou no ponto de acesso exige que todas as solicitações encaminhadas para esse recurso tenham origem na rede especificada. Essas restrições também são aplicadas fora do cenário de URL pré-assinado.
A condição global do IAM que você usa depende do tipo de endpoint. Se estiver usando o endpoint público para o Amazon S3, use aws:SourceIp. Se você estiver usando um endpoint de nuvem privada virtual (VPC) para o Amazon S3, use aws:SourceVpc ou aws:SourceVpce.
A declaração de política do IAM a seguir requer que a entidade principal só acesse a AWS do intervalo de rede especificado. Com essa declaração de política, exige-se que qualquer acesso tenha origem nesse intervalo. Isso inclui o caso de alguém que esteja usando um URL pré-assinado para o Amazon S3. Para usar esse exemplo, substitua os user input
placeholders por suas próprias informações.
{ "Sid": "NetworkRestrictionForIAMPrincipal", "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "NotIpAddressIfExists": {"aws:SourceIp": "IP-address-range"}, "BoolIfExists": {"aws:ViaAWSService": "false"} } }
Perguntas frequentes sobre URLs pré-assinados
P: Por que meus URLs pré-assinados expiram antes do prazo de expiração configurado?
Os URLs pré-assinados são válidos somente enquanto suas credenciais subjacentes forem válidas. Um URL pré-assinado expira no prazo de expiração configurado ou quando suas credenciais correspondentes expiram, o que ocorrer primeiro. Para tarefas ou contêineres do Amazon Elastic Container Service, as credenciais de perfil normalmente são alternadas no intervalo de uma a seis horas. Ao usar AssumeRole do AWS Security Token Service (AWS STS), o URL pré-assinado expira quando a sessão do perfil termina, o que, por padrão, ocorre no espaço de uma hora. Para perfis de instância do Amazon EC2, as credenciais de metadados são alternadas periodicamente com um período máximo de validade de aproximadamente seis horas.
P: Por que estou recebendo o erro 403 Forbidden ao acessar um URL pré-assinado?
Antes de gerar um URL pré-assinado, verifique se você tem as permissões corretas configuradas. O usuário ou perfil do IAM que gera o URL deve ter as permissões necessárias (por exemplo, s3:GetObject) para a operação específica. Além disso, verifique se a política de bucket do Amazon S3 não nega explicitamente o acesso ao objeto.
P: Estou recebendo erros SignatureDoesNotMatch. Como posso corrigir isso?
Se você encontrar erros SignatureDoesNotMatch ao usar URLs pré-assinados do Amazon S3, considere várias causas comuns. Primeiro, verifique se o relógio do sistema está sincronizado com um servidor Network Time Protocol (NTP), pois mesmo pequenos intervalos de tempo podem invalidar as assinaturas. Em seguida, esteja ciente de que alguns proxies corporativos podem modificar cabeçalhos ou strings de consulta, o que pode causar falta de correspondência entre assinaturas. Para solucionar o problema, tente testar sem o proxy. Por fim, verifique se todos os parâmetros da solicitação, como método HTTP, cabeçalhos e string de consulta, correspondem exatamente entre a geração e o uso do URL. Ao solucionar esses problemas, geralmente é possível resolver erros SignatureDoesNotMatch.
P: Estou recebendo erros ExpiredToken. O que devo fazer?
Quando você recebe erros ExpiredToken ao usar URLs pré-assinados, isso indica que as credenciais da AWS usadas para gerar o URL não são mais válidas. Para resolver esse problema, atualize suas credenciais da AWS antes de gerar novos URLs pré-assinados. No caso de aplicações de longa execução, recomendamos implementar a lógica de atualização de credenciais para manter o acesso contínuo. Quando apropriado, você pode usar credenciais de vida mais longa ou implementar mecanismos de atualização de token. Se você estiver usando AssumeRole do AWS Security Token Service (AWS STS), verifique se a duração da sessão configurada atende aos requisitos do caso de uso. Lembre-se de que os URLs pré-assinados são válidos somente enquanto suas credenciais subjacentes forem válidas; portanto, implementar o gerenciamento adequado de credenciais é essencial.