Criar um URL pré-assinado para objetos do Amazon S3 utilizando o CloudShell - AWS CloudShell

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Criar um URL pré-assinado para objetos do Amazon S3 utilizando o CloudShell

Este tutorial mostra como criar um URL pré-assinado para compartilhar um objeto do Amazon S3 com terceiros. Como os proprietários do objeto especificam suas próprias credenciais de segurança ao compartilhar, qualquer pessoa que receba um URL pré-assinado pode acessar o objeto por tempo limitado.

Pré-requisitos

  • Um usuário do IAM com permissões de acesso fornecidas pela política AWSCloudShellFullAccess.

  • Para obter as permissões do IAM necessárias para criar um URL pré-assinado, consulte Compartilhar um objeto com terceiros no Guia do usuário do Amazon Simple Storage Service.

Etapa 1: criar um perfil do IAM para conceder acesso ao bucket do Amazon S3

Esta etapa descreve como criar um perfil do IAM para conceder acesso ao bucket do Amazon S3.

  1. Para obter detalhes do IAM que possam ser compartilhados, chame o comando get-caller-identity do AWS CloudShell.

    aws sts get-caller-identity

    Se a chamada tiver êxito, a linha de comando exibirá uma resposta semelhante à seguinte.

    { "Account": "123456789012", "UserId": "AROAXXOZUUOTTWDCVIDZ2:redirect_session", "Arn": "arn:aws:sts::531421766567:assumed-role/Feder08/redirect_session" }
  2. Pegue as informações do usuário que você obteve na etapa anterior e adicione-as a um modelo CloudFormation. Esse modelo cria um perfil do IAM. Esse perfil concede ao seu colaborador permissões de privilégio mínimo para os recursos compartilhados.

    Resources: CollaboratorRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: AWS: "arn:aws:iam::531421766567:role/Feder08" Action: "sts:AssumeRole" Description: Role used by my collaborators MaxSessionDuration: 7200 CollaboratorPolicy: Type: AWS::IAM::Policy Properties: PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - 's3:*' Resource: 'arn:aws:s3:::<YOUR_BUCKET_FOR_FILE_TRANSFER>' Condition: StringEquals: s3:prefix: - "myfolder/*" PolicyName: S3ReadSpecificFolder Roles: - !Ref CollaboratorRole Outputs: CollaboratorRoleArn: Description: Arn for the Collaborator's Role Value: !GetAtt CollaboratorRole.Arn
  3. Salve o modelo CloudFormation em um arquivo chamado template.yaml.

  4. Use o modelo para implantar a pilha e criar o perfil do IAM chamando o comando deploy.

    aws cloudformation deploy --template-file ./template.yaml --stack-name CollaboratorRole --capabilities CAPABILITY_IAM

Como gerar o URL pré-assinado

Esta etapa descreve como gerar o URL pré-assinado.

  1. Usando seu editor no AWS CloudShell, adicione o código a seguir. Esse código cria um URL que fornece aos usuários federados acesso direto ao Console de gerenciamento da AWS.

    import urllib, json, sys import requests import boto3 import os def main(): sts_client = boto3.client('sts') assume_role_response = sts_client.assume_role( RoleArn=os.environ.get(ROLE_ARN), RoleSessionName="collaborator-session" ) credentials = assume_role_response['Credentials'] url_credentials = {} url_credentials['sessionId'] = credentials.get('AccessKeyId') url_credentials['sessionKey'] = credentials.get('SecretAccessKey') url_credentials['sessionToken'] = credentials.get('SessionToken') json_string_with_temp_credentials = json.dumps(url_credentials) print(f"json string {json_string_with_temp_credentials}") request_parameters = f"?Action=getSigninToken&Session={urllib.parse.quote(json_string_with_temp_credentials)}" request_url = "https://signin.aws.amazon.com/federation" + request_parameters r = requests.get(request_url) signin_token = json.loads(r.text) request_parameters = "?Action=login" request_parameters += "&Issuer=Example.org" request_parameters += "&Destination=" + urllib.parse.quote("https://us-west-2.console.aws.amazon.com/cloudshell") request_parameters += "&SigninToken=" + signin_token["SigninToken"] request_url = "https://signin.aws.amazon.com/federation" + request_parameters # Send final URL to stdout print (request_url) if __name__ == "__main__": main()
  2. Salve o código em um arquivo chamado share.py.

  3. Execute o seguinte na linha de comando para recuperar o nome do recurso da Amazon (ARN) do perfil do IAM no CloudFormation. Em seguida, use-o no script Python para obter credenciais de segurança temporárias.

    ROLE_ARN=$(aws cloudformation describe-stacks --stack-name CollaboratorRole --query "Stacks[*].Outputs[?OutputKey=='CollaboratorRoleArn'].OutputValue" --output text) python3 ./share.py

    O script retorna um URL no qual um colaborador pode clicar para acessá-lo no AWS CloudShell pelo Console de gerenciamento da AWS. O colaborador tem controle total sobre a pasta myfolder/ no bucket do Amazon S3 pelos próximos 3.600 segundos (uma hora). As credenciais expiram após uma hora. Após esse período, o colaborador não poderá mais acessar o bucket.