# Amazon S3 e CloudFront: passo a passo Conecte um bucket S3 privado ao DRM-X 6.0 com permissões IAM limitadas, CORS para o navegador, distribuição HTTPS via CloudFront e uma lista de verificação de uploads. O vídeo criptografado e as licenças DRM seguem caminhos diferentes A CDN entrega o vídeo criptografado. Seu backend verifica o acesso, e o serviço de licenças DRM autoriza a descriptografia em um dispositivo compatível. - 01**Armazenamento / CDN** Entrega a mídia criptografada ao player. - 02**Seu backend** Verifica se o espectador pode assistir e solicita a autorização de reprodução ao DRM-X. - 03**DRM-X** Valida a autorização de reprodução e processa a solicitação de licença DRM. - 04**Player + dispositivo** Usa o sistema DRM do dispositivo para obter uma licença e reproduzir a mídia criptografada. Sua infraestrutura decide o acesso; DRM-X aplica a política assinada. Mídia criptografada e licenças DRM seguem caminhos de entrega separados. **De um bucket privado para entrega de mídia criptografada pública** Crie um bucket S3, forneça credenciais de upload com escopo DRM-X, configure o navegador CORS, conecte CloudFront e carregue e recupere um objeto de teste. Mantenha vídeos originais e arquivos privados fora deste bucket de entrega. ## 1. Entenda a conexão[#](#architecture) DRM-X carrega diretamente para S3 usando solicitações assinadas. Os visualizadores baixam mídia criptografada através de CloudFront em HTTPS. Mantenha S3 **Block all public access** ativado; CloudFront obtém acesso de leitura com escopo definido por meio de **Origin Access Control (OAC)**. CloudFront fornece um hostname `https://….cloudfront.net` que pode ser usado em produção. Seu domínio próprio é opcional. A distribuição pública permite acessar os bytes dos objetos; DRM continua controlando a descriptografia da mídia corretamente empacotada. CORS não é autorização. Este guia usa distribuição CDN pública comum. URLs ou cookies assinados para os espectadores exigem uma integração separada. ## 2. Crie seu bucket S3[#](#create-bucket) ![AWS S3 formulário de criação: General purpose, Global namespace e um exemplo de nome de bucket.](https://docs.drm-x.com/assets/storage/s3-create.png)12**1:** escolha General purpose. **2:** insira seu próprio nome exclusivo. Este é um formulário de console real com um exemplo não enviado; os cabeçalhos das contas são excluídos. - Abra **Amazon S3 → General purpose buckets → Create bucket**. - Selecione uma região e registre seu código, como `us-east-1`. Escolha **General purpose**. Se for solicitado um namespace, use **Global namespace** para este passo a passo. - Insira seu próprio nome de bucket globalmente exclusivo. Mantenha **Object Ownership → ACLs disabled (Bucket owner enforced)**. - Mantenha **Block all public access** marcado. Você concederá acesso CloudFront por meio de uma política com escopo definido. - Para este guia, mantenha **Default encryption → Server-side encryption with Amazon S3 managed keys (SSE-S3)**. Essa criptografia de armazenamento complementa o empacotamento DRM e não o substitui. SSE-KMS exige permissões KMS adicionais para o uploader e para CloudFront. - Revise e crie o bucket. Não ative a hospedagem de sites estáticos S3. ## 3. Crie um usuário IAM com permissões limitadas e uma chave de acesso[#](#iam-credentials) - Abra **IAM → Policies → Create policy → JSON**. Cole a política abaixo, substituindo o nome do bucket de exemplo em todos os lugares. - O exemplo permite apenas `protected/`. Se você usar outro caminho base, atualize a condição do prefixo e o objeto ARN. Para uso bucket-root, remova a condição de prefixo ListBucket e use `arn:aws:s3:::YOUR_BUCKET/*` para objetos. - Salve a política. Abra **IAM → Users → Create user**, crie um usuário de integração dedicado sem acesso AWS Console e anexe apenas esta política. - Abra o **Security credentials → Access keys → Create access key** do usuário. Escolha o caso de uso de um aplicativo em execução fora de AWS e siga as instruções. Guarde com segurança Access key ID e Secret access key para DRM-X. ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "ListProtectedFolder", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::customer-drm-media-example", "Condition": { "StringLike": { "s3:prefix": [ "protected", "protected/", "protected/*" ] } } }, { "Sid": "BucketRegion", "Effect": "Allow", "Action": "s3:GetBucketLocation", "Resource": "arn:aws:s3:::customer-drm-media-example" }, { "Sid": "ManageProtectedObjects", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::customer-drm-media-example/protected/*" } ] } ``` Não use chaves root ou AdministratorAccess. A cópia usa GetObject e PutObject; não há ação `s3:CopyObject` IAM separada. A renomeação também precisa de DeleteObject. Este guia segue o formato de chave de acesso atual de DRM-X; uma função ARN por si só não substitui o par de chaves. ## 4. Configure S3 CORS para uploads do navegador[#](#bucket-cors) - Abra seu bucket S3 → **Permissions**. - Role até **Cross-origin resource sharing (CORS) → Edit**. - Cole este JSON, substituindo `https://www.example.com` pelo site que incorpora seu player. Mantenha a origem DRM-X Console. Preservar outras regras obrigatórias em buckets existentes. - Selecione **Save changes**. Manter Block Public Access ativado: CORS não torna o bucket público. ``` [ { "AllowedOrigins": [ "https://6.drm-x.com" ], "AllowedMethods": [ "PUT" ], "AllowedHeaders": [ "Content-Type", "x-amz-meta-drmx-sha256" ], "ExposeHeaders": [ "ETag" ], "MaxAgeSeconds": 3600 }, { "AllowedOrigins": [ "https://6.drm-x.com", "https://multi-drm.drm-x.com", "https://www.example.com" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedHeaders": [ "Range" ], "ExposeHeaders": [ "ETag", "Content-Length", "Content-Range", "Accept-Ranges" ], "MaxAgeSeconds": 3600 } ] ``` Os uploads vão diretamente para S3, então PUT CORS pertence a S3. A reprodução através de CloudFront também precisa da configuração CDN na etapa 5. ## 5. Crie uma URL de distribuição HTTPS com CloudFront[#](#cloudfront) - Abra **CloudFront → Distributions → Create distribution**. Use uma distribuição padrão. Se AWS mostrar uma seleção de plano de integração ou de preços, revise e escolha o plano apropriado para sua conta antes de criar recursos. - Selecione o **S3 REST origin** normal do bucket, não o endpoint do site. Deixe **Origin path vazio** para o mapeamento de pastas usado neste guia. - Escolha **Origin access control settings (recommended)**. Crie ou selecione um OAC com **Sign requests (recommended)**. - Defina a política de protocolo do visualizador para **Redirect HTTP to HTTPS** ou **HTTPS only**. Permitir **GET, HEAD, OPTIONS**. Os uploads usam o endpoint S3, portanto CloudFront não precisa de PUT. - Crie a distribuição. Aplique a política de bucket gerada por CloudFront em **S3 → Bucket → Permissions → Bucket policy → Edit**. Mesclar com as instruções existentes necessárias. Restrinja o acesso ao ARN desta distribuição. O exemplo abaixo limita a leitura a `protected/`. - Abra **CloudFront → Policies → Response headers → Create response headers policy**. Configure os campos CORS na tabela abaixo. Anexe esta política ao comportamento padrão/mídia da distribuição. - Aguarde a conclusão da implantação. Copie **Distribution domain name**. Sua origem de entrega é `https://YOUR_DISTRIBUTION.cloudfront.net`. | Campo da política Response headers | Valor | | --- | --- | | Access-Control-Allow-Origin | Suas origens exatas de player, mais `https://6.drm-x.com` e `https://multi-drm.drm-x.com` para testes de DRM-X. | | Access-Control-Allow-Methods | GET, HEAD, OPTIONS | | Access-Control-Allow-Headers | Range | | Access-Control-Expose-Headers | ETag, Content-Length, Content-Range, Accept-Ranges | | Access-Control-Allow-Credentials | Desativado para este fluxo de trabalho de mídia criptografada pública. | | Access-Control-Max-Age | 3600 | | Origin override | Habilitado para que CloudFront controle CORS voltado para o visualizador de forma consistente. | Para o preflight OPTIONS, associe a política gerenciada **CORS-S3Origin**. Ela encaminha Origin, Access-Control-Request-Method e Access-Control-Request-Headers ao S3. Inicialmente, armazene em cache somente GET/HEAD e desative o cache de OPTIONS. Se ativá-lo depois, inclua esses cabeçalhos na chave de cache e teste diferentes origens de player. Encaminhar um cabeçalho não o adiciona automaticamente à chave de cache. ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowThisCloudFrontDistribution", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::customer-drm-media-example/protected/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EEXAMPLE123" } } } ] } ``` Substitua a conta de exemplo ID, distribuição ID e nome do bucket. O SourceArn deve identificar a distribuição que você acabou de criar. Após alterações de cabeçalho, invalide os caminhos de teste/mídia afetados se as respostas anteriores permanecerem em cache. ### Opcional: use media.example.com - Solicite um certificado público ACM cobrindo seu nome de host em **US East (N. Virginia), us-east-1** e conclua a validação DNS. - Adicione o nome do host sob **Alternate domain names** da distribuição e anexe seu certificado. - No seu provedor DNS, crie o CNAME ou o alias suportado apontando para o nome do host CloudFront. Aguarde DNS, certificado e implantação de distribuição. - Use `https://media.example.com` como origem de entrega. Um DNS CNAME sozinho é insuficiente sem o domínio CloudFront e a configuração do certificado. ## 6. Conecte Amazon S3 a DRM-X 6.0[#](#connect-drmx) Abra [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage). Escolha **Amazon S3**. | Campo | O que inserir | | --- | --- | | Display name | Um nome fácil de identificar, como Production S3. | | Bucket name | O nome exato, sem `s3://`. | | Region | O código de região AWS exato do bucket. | | Protected-content base path | `protected`, correspondendo às políticas IAM e bucket. | | Public URL prefix | `https://YOUR_DISTRIBUTION.cloudfront.net/protected` ou `https://media.example.com/protected`. | | Access key ID / Secret access key | O par de chaves do usuário dedicado IAM. | Os exemplos usam uma pasta chamada `protected`. O nome do bucket não é automaticamente uma pasta. Com o mapeamento direto de domínio para bucket usado aqui, inclua a mesma pasta de armazenamento exatamente uma vez no prefixo público URL. ``` Bucket: customer-drm-media-example Protected-content base path: protected Public URL prefix: https://media.example.com/protected File selected for upload: sample.encrypted.bin Object key in the bucket: protected/sample.encrypted.bin Preview URL: https://media.example.com/protected/sample.encrypted.bin ``` Para usar a raiz do bucket, deixe o caminho base em branco e insira apenas a origem da entrega como prefixo público. Não anexe um nome de bucket, a menos que você o use deliberadamente como uma pasta. Deixe CloudFront Origin path vazio para este mapeamento. Selecione o destino de upload padrão, se desejar, e então **Save and verify**. O nome do host S3 API não é sua entrega CloudFront URL. ### Gere seus campos CORS e URL correspondentes Esta ferramenta é executada no seu navegador. Insira apenas origens públicas; não solicita chaves de acesso. Origens do site do playerSubstitua o exemplo. Separe múltiplas origens HTTPS com espaços ou vírgulas. Use o site incorporando seu player, sem caminho de página. DRM-X Console e Playback Lab são incluídos automaticamente.Origem da entrega públicaInsira seu domínio personalizado conectado, habilitado r2.dev URL ou CloudFront origem. Omita a pasta aqui.Pasta de armazenamento (opcional)Gerar configuração Copiar CORS JSON ``` ``` Protected-content base path``Public URL prefix``Exemplo de chave de objeto``Exemplo de URL completa`` ## 7. Faça upload de um arquivo e verifique se funciona[#](#test-upload) - Abra [Cloud Storage](https://6.drm-x.com/console/cloud-storage), selecione este destino e escolha **Verify location**. Sucesso significa que o servidor DRM-X pode listar o bucket. Não estabelece permissão de gravação, navegador CORS ou entrega pública. - Selecione **Upload encrypted files** e escolha um pequeno segmento criptografado de um pacote DRM-X existente. Se você não possui um pacote, use o diagnóstico criptografado descartável abaixo. Não carregue um vídeo original ou documento pessoal. - Aguarde a mensagem de sucesso. Verifique se o nome e o tamanho do arquivo aparecem em Cloud Storage. Encontre o mesmo objeto em `protected/` no console do seu provedor. - Clique em **Preview URL** e teste o mesmo objeto em uma janela privada do navegador. Deve baixar ou retornar HTTP 200 sem um login AWS ou Cloudflare. Teste um objeto real: a raiz de um domínio pode retornar 403/404 mesmo quando a entrega do objeto funciona. - Verifique a entrega de origem cruzada no site do seu player. O painel Rede do navegador deve mostrar `Access-Control-Allow-Origin` correspondente à origem da página do player. Um download direto da barra de endereço não testa CORS. O exemplo de terminal abaixo também verifica os cabeçalhos. - Remova apenas o objeto de diagnóstico descartável quando terminar. Em seguida, siga o [Desktop Packager guide](https://docs.drm-x.com/pt/packaging/desktop), selecione este destino de armazenamento em Package content e carregue o pacote criptografado completo. O upload manual de um arquivo não registra um Published Content ID. - Teste o arquivo Published resultante em [Universal Playback Lab](https://multi-drm.drm-x.com/pt/player) e no site do seu próprio player. Verifique vídeo, áudio, avanço na linha do tempo e os dispositivos necessários. Um download binário bem-sucedido não é prova de reprodução de DRM. Nenhuma amostra criptografada? Crie um arquivo de teste descartável em Windows Execute isto em Windows PowerShell em uma pasta temporária que você controla. Ele criptografa uma mensagem curta não pessoal com uma chave AES de uso único, mantida apenas na memória. A saída é um diagnóstico de armazenamento, não uma mídia reproduzível; não contém nenhuma chave de conteúdo DRM ou dados do cliente. ``` $samplePath = Join-Path (Get-Location) 'drmx-storage-check.encrypted.bin' if (Test-Path -LiteralPath $samplePath) { throw 'Choose a new folder; this test file already exists.' } $aes = [System.Security.Cryptography.Aes]::Create() try { $aes.GenerateKey() $aes.GenerateIV() $encryptor = $aes.CreateEncryptor() try { $bytes = [Text.Encoding]::UTF8.GetBytes('DRM-X disposable storage check') $encrypted = $encryptor.TransformFinalBlock($bytes, 0, $bytes.Length) [IO.File]::WriteAllBytes($samplePath, $encrypted) } finally { $encryptor.Dispose() } } finally { $aes.Dispose() } Get-Item -LiteralPath $samplePath | Select-Object Name, Length ``` Carregue `drmx-storage-check.encrypted.bin`, verifique seu tamanho e Preview URL e remova-o do bucket. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` Substitua ambos os URLs. Espere HTTP 200 e uma origem permitida correspondente ao site do seu player. Para entrega de intervalo, uma solicitação GET com `Range: bytes=0-15` deve retornar HTTP 206 e um cabeçalho Content-Range válido. Preservar tipos de mídia MIME: DASH manifestos usam application/dash+xml, HLS playlists usam application/vnd.apple.mpegurl e arquivos de mídia devem usar seu tipo de mídia apropriado. ## 8. Resolva problemas[#](#troubleshooting) | Resultado | Ação | | --- | --- | | Verify location passa, mas o upload pelo navegador falha | Inspecione o navegador Console e os painéis de rede. Permitir PUT CORS da origem exata Console e Content-Type. Verifique também a conectividade e tente novamente para obter um novo URL pré-assinado. | | O upload retorna 403 | Verifique a permissão de gravação do objeto, escopo do bucket/pasta, endpoint, região, expiração da solicitação e relógio. Não compartilhe URLs de upload assinados. | | Upload bem-sucedido; público URL retorna 403 | Verifique se a entrega pública está habilitada e se o domínio/distribuição concluiu a implantação. | | Público URL retorna 404 | Compare o URL completo com a chave exata do objeto. Verifique as pastas ausentes ou duplicadas e as maiúsculas e minúsculas do nome do arquivo. | | URL abre diretamente; busca do player falha | Adicione a origem da página do player a GET/HEAD CORS. Verifique os cabeçalhos de resposta CDN e invalide as respostas obsoletas afetadas em cache. | | Download bem-sucedido; a reprodução falha | Verifique a publicação do pacote, caminhos de manifesto, tipos MIME e autorização de licença DRM. Consulte [solução de problemas de reprodução](https://docs.drm-x.com/pt/troubleshooting/playback). | **CloudFront 403:** confirma que OAC assina solicitações, a política de bucket usa a distribuição correta ARN e prefixo, e a origem é o endpoint S3 REST. Mantenha S3 Block Public Access ativado. Verifique as permissões KMS se você escolheu SSE-KMS. ## Referências oficiais[#](#references) - [Crie um bucket S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html) - [Gerenciar IAM chaves de acesso](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-key-self-managed.html) - [S3 CORS configuração](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html) - [CloudFront OAC e S3 políticas de bucket](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) - [CloudFront cabeçalhos de resposta](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/adding-response-headers.html) - [Políticas de solicitação de origem gerenciada](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html) - [Domínios e certificados personalizados](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/add-domain-existing-distribution.html) Usando Cloudflare? Siga [Cloudflare R2 configuração](https://docs.drm-x.com/pt/storage/cloudflare-r2).