2 votes

Lecture publique S3 restreinte par plage IP pour un objet téléchargé par un tiers

Je suis en train de tenter de réaliser le scénario suivant:

1) Le compte A télécharge un fichier dans un bucket S3 appartenant au compte B. Lors du téléchargement, je spécifie un contrôle total pour le propriétaire du compte B

s3_client.upload_file(
    local_file, 
    bucket, 
    remote_file_name, 
    ExtraArgs={'GrantFullControl': 'id='}
)

2) Le compte B définit une stratégie de bucket qui limite l'accès aux objets par IP (voir ci-dessous)

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowIPs",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucketB/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        ,

                    ]
                }
            }
        }
    ]
}

J'obtiens un accès refusé si j'essaie de télécharger le fichier en tant qu'utilisateur anonyme, même de la plage IP spécifique. Si lors du téléchargement je rajoute une permission de lecture publique pour tout le monde, alors je peux télécharger le fichier depuis n'importe quelle IP.

s3_client.upload_file(
    local_file, 
    bucket, 
    remote_file_name, 
    ExtraArgs={
        'GrantFullControl': 'id=AccountB_CanonicalID', 'GrantRead':'uri="http://acs.amazonaws.com/groups/global/AllUsers"'
    }
)

Question : est-il possible de télécharger le fichier du compte A vers le compte B tout en restreignant l'accès public par une plage IP.

0voto

Eugen Points 530

Cela n'est pas possible. Selon la documentation :

Politique de compartiment – Pour votre compartiment, vous pouvez ajouter une politique de compartiment pour accorder des autorisations à d'autres comptes AWS ou utilisateurs IAM pour le compartiment et les objets qu'il contient. Les autorisations des objets s'appliquent uniquement aux objets créés par le propriétaire du compartiment. Les politiques de compartiment complètent et, dans de nombreux cas, remplacent les politiques d'accès basées sur les ACL.

Cependant, il existe une solution de contournement pour ce scénario. Le problème est que le propriétaire du fichier téléchargé est le Compte A. Nous devons télécharger le fichier de telle manière que le propriétaire du fichier soit le Compte B. Pour ce faire, nous devons :

  1. Créer dans le Compte B un rôle pour une entité de confiance (sélectionnez "Un autre compte AWS" et spécifiez le Compte A). Ajoutez l'autorisation de téléchargement pour le compartiment.
  2. Créez dans le Compte A une politique qui autorise l'action AssumeRole et spécifiez comme ressource l'ARN du rôle créé à l'étape 1.

Pour télécharger le fichier depuis boto3, vous pouvez utiliser le code suivant. Notez l'utilisation de cachetools pour gérer la durée de vie limitée des informations d'identification temporaires.

import logging
import sys
import time

import boto3

from cachetools import cached, TTLCache

CREDENTIALS_TTL = 1800
credentials_cache = TTLCache(1, CREDENTIALS_TTL - 60)
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
logger = logging.getLogger()

def main():
    local_file = sys.argv[1]
    bucket = ''
    client = _get_s3_client_for_another_account()
    client.upload_file(local_file, bucket, local_file)
    logger.info('Uploaded to %s to %s' % (local_file, bucket))

@cached(credentials_cache)
def _get_s3_client_for_another_account():
    sts = boto3.client('sts')
    response = sts.assume_role(
        RoleArn='',
        DurationSeconds=CREDENTIALS_TTL
    )
    credentials = response['Credentials']
    credentials = {
        'aws_access_key_id': credentials['AccessKeyId'],
        'aws_secret_access_key': credentials['SecretAccessKey'],
        'aws_session_token': credentials['SessionToken'],
    }
    return boto3.client('s3', 'eu-central-1', **credentials)

if __name__ == '__main__':
    main()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X