4

Mon application appengine crée des fichiers cloudstorage. Les fichiers seront téléchargés par un tiers. Les fichiers contiennent informations médicales personnelles.Stockage cloud et stratégie de téléchargement sécurisé sur le moteur de l'application. GCS acl ou blobstore

Quel serait le meilleur moyen de téléchargement:

  1. L'utilisation d'un lien de téléchargement de GCS direct avec un utilisateur LECTEUR acl.
  2. Ou à l'aide d'un gestionnaire de téléchargement blobstore dans une application appengine.

Les deux solutions nécessitent la connexion du tiers (connexion Google). La performance n'est pas un problème. La vie privée et la survenance d'erreurs de sécurité et d'erreurs sont. L'utilisation d'un fichier zip chiffré pour le téléchargement est une option.

Cela signifie que je dois stocker le mot de passe dans le projet. Ou envoyez un mot de passe aléatoire par e-mail?

Mise à jour Le code AppEngine J'utilisé pour créer une URL de téléchargement signé

import time 
import urllib 
from datetime import datetime, timedelta 
from google.appengine.api import app_identity 
import os 
import base64 

API_ACCESS_ENDPOINT = 'https://storage.googleapis.com' 

# Use the default bucket in the cloud and not the local SDK one from app_identity 
default_bucket = '%s.appspot.com' % os.environ['APPLICATION_ID'].split('~', 1)[1] 
google_access_id = app_identity.get_service_account_name() 


def sign_url(bucket_object, expires_after_seconds=60): 
    """ cloudstorage signed url to download cloudstorage object without login 
     Docs : https://cloud.google.com/storage/docs/access-control?hl=bg#Signed-URLs 
     API : https://cloud.google.com/storage/docs/reference-methods?hl=bg#getobject 
    """ 

    method = 'GET' 
    gcs_filename = '/%s/%s' % (default_bucket, bucket_object) 
    content_md5, content_type = None, None 

    expiration = datetime.utcnow() + timedelta(seconds=expires_after_seconds) 
    expiration = int(time.mktime(expiration.timetuple())) 

    # Generate the string to sign. 
    signature_string = '\n'.join([ 
     method, 
     content_md5 or '', 
     content_type or '', 
     str(expiration), 
     gcs_filename]) 

    _, signature_bytes = app_identity.sign_blob(signature_string) 
    signature = base64.b64encode(signature_bytes) 

    # Set the right query parameters. 
    query_params = {'GoogleAccessId': google_access_id, 
        'Expires': str(expiration), 
        'Signature': signature} 

    # Return the download URL. 
    return '{endpoint}{resource}?{querystring}'.format(endpoint=API_ACCESS_ENDPOINT, 
                 resource=gcs_filename, 
                 querystring=urllib.urlencode(query_params)) 

Répondre

3

Si un petit nombre d'utilisateurs ont accès à tous les fichiers dans le seau, la solution n ° 1 serait alors suffisante, la gestion de l'ACL ne serait pas trop pénible.

Toutefois, si vous avez plusieurs utilisateurs différents qui requièrent chacun un accès différent aux différents fichiers du compartiment, la solution n ° 1 est peu pratique.

J'éviterais également la solution n ° 2, car vous paieriez pour la bande passante GAE entrante/sortante superflue. Peut-être qu'une troisième solution à envisager consisterait à utiliser l'authentification du gestionnaire App Engine et à écrire une logique pour déterminer quels utilisateurs ont accès à quels fichiers. Ensuite, lorsqu'un fichier est demandé pour le téléchargement, vous créez Signed URLs pour télécharger les données directement depuis GCS. Vous pouvez définir le paramètre d'expiration sur une valeur qui fonctionne pour vous, ce qui invaliderait l'URL après un certain laps de temps.

+0

Merci pour la troisième solution. La première partie de votre réponse est déjà en place. L'URL signée avec l'expiration est une bonne idée. Pas d'administration acl et un téléchargement de lien direct. Mais toute personne connaissant l'URL peut accéder à la ressource pour une durée limitée. – voscausa

+0

L'URL est obscure et vous pouvez définir l'expiration sur quelques secondes. Assez de temps pour rediriger vers votre utilisateur et démarrer le téléchargement. –

+0

Oui. Cela rend pratiquement impossible de détourner le lien. – voscausa