Va bene passare le credenziali al client per consentirgli di caricare file su Amazon S3?

4

La nostra app mobile caricherà immagini su AWS S3. La domanda è se fare una delle seguenti opzioni:

  1. Carica l'immagine sul nostro server API, quindi il nostro server API carica l'immagine su S3
    Pro: Più sicuro, poiché le credenziali S3 vengono archiviate solo su cloud.
    Contro: Maggiore pressione sul server API, poiché migliaia di utenti caricheranno immagini, con dimensioni che variano da 2 MB a 10 MB

  2. Lascia che l'app mobile carichi l'immagine direttamente su S3, ottenendo le credenziali S3 temporali dal server API per ogni accesso S3.
    Pro: Meno pressione sul server dell'API, nessun file verrà caricato sul server.
    Contro: Meno sicuro, poiché le credenziali S3 saranno esposte sul cellulare, indipendentemente dal fatto, che l'app mobile richiederà ogni volta le credenziali temporanee per accedere a S3 e che ottiene le credenziali tramite la connessione SSL con il server API.

Quindi, l'opzione due sopra è ancora migliore? Poiché stiamo già concedendo credenziali temporanee valide per soli 15 minuti ogni volta per accedere a S3 tramite connessione SSL.

Qual è il modo consigliato per farlo?

    
posta Samir Sabri 06.03.2017 - 10:42
fonte

2 risposte

1

Non sono sicuro che ci sia una pratica consigliata, ma penso che abbia invece a che fare con i requisiti dell'applicazione e bilanciare i pro e i contro.

Potrebbe essere un carico basso del server? Ok, possiamo usare il server per lavorare con S3, è ovviamente il metodo preferito (e mantiene anche l'interazione sulla stessa API del resto del servizio app).

Potrebbe essere un carico troppo pesante per il server? Ok, le alternative sono per ridimensionare le risorse del server o per vedere se il rischio che l'app funzioni direttamente con S3 sia accettabile.

Le informazioni sono sensibili? Possiamo ragionevolmente assicurarlo se l'app dovesse comunicare direttamente con S3? Se non è altamente sensibile e può essere ragionevolmente protetto e il rischio è inferiore al costo di scalare il server per gestire i carichi, allora questa potrebbe essere la tua scelta.

Le informazioni sono altamente sensibili e accadono cose terribili se la chiave S3 viene estratta da SSL o dal dispositivo? In tal caso, potrebbe valere la pena spendere i soldi per ridimensionare l'architettura del server.

Non penso che ci sia un solo modo consigliato ... naturalmente è più sicuro gestire S3 dal tuo server (e lo chiedi in un forum di sicurezza, quindi presumo che sia il tuo obiettivo principale), ma tutto in tutto diventa un equilibrio guidato dai requisiti dell'applicazione.

    
risposta data 06.03.2017 - 11:40
fonte
1

Un buon modo per implementarlo è generare credenziali temporanee che possono essere caricate solo su una parte specifica del bucket (quella a cui l'utente ha accesso).

Anche nel caso in cui tali credenziali vengano rubate dalla memoria (suppongo che si usi https per ogni comunicazione, quindi non possono essere rubate durante la trasmissione), un utente finale può solo usarle per quello che erano intese: caricare i file.

Un esempio di questo è presentato qui

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":"s3:PutObject",
         "Resource":"arn:aws:s3:::my_corporate_bucket/uploads/widgetco/*"
      },
      {
         "Effect":"Deny",
         "NotAction":"s3:PutObject",
         "Resource":"arn:aws:s3:::my_corporate_bucket/uploads/widgetco/*"
      },
      {
         "Effect":"Deny",
         "Action":"s3:*",
         "NotResource":"arn:aws:s3:::my_corporate_bucket/uploads/widgetco/*"
      }
   ]
}

Suggerisco di controllare periodicamente tutti i file nel tuo bucket verificando le estensioni / le firme dei file consentiti (fai attenzione, potrebbe richiedere molto tempo). Puoi anche riscrivere di più la tua politica, in base alle estensioni di file (fonte qui )

{
  "Id": "Policy1464968545158",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1464968483619",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<yourbucket>/*.jpg",
      "Principal": "*"
    },
    {
      "Sid": "Stmt1464968543787",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<yourbucket>/*.png",
      "Principal": "*"
    }
  ]
}
    
risposta data 06.03.2017 - 11:59
fonte

Leggi altre domande sui tag