Άρθρο

Πώς να μοιράζεσαι αρχεία S3 χωρίς να κάνεις το bucket δημόσιο

Ασφαλής κοινοποίηση αρχείων S3 με ιδιωτικό bucket: presigned URLs, signed URLs του CloudFront ή σύνδεσμοι με κωδικό, λήξη και όριο λήψεων.

Μπορείς να μοιράζεσαι αρχεία από το Amazon S3 χωρίς να κάνεις ποτέ το bucket δημόσιο. Κράτα το ιδιωτικό, άφησε ενεργό το Block Public Access και δώσε στους άλλους υπογεγραμμένη πρόσβαση σε συγκεκριμένα αντικείμενα: ένα presigned URL για ένα μεμονωμένο αρχείο, signed URLs του CloudFront όταν ήδη έχεις ένα CDN μπροστά από το bucket, ή έναν σύνδεσμο κοινοποίησης που προσθέτει κωδικό, ημερομηνία λήξης και όριο λήψεων. Και οι τρεις λειτουργούν με τον ίδιο τρόπο σε S3-συμβατούς παρόχους όπως Cloudflare R2, DigitalOcean Spaces, Wasabi και Backblaze B2 (το CloudFront υπάρχει μόνο στο AWS).

Επιλογές ασφαλούς κοινοποίησης αρχείων S3 με μια ματιά

ΜέθοδοςΙδανική γιαΚωδικόςΌριο λήψεωνΑνάκληση ενός συνδέσμουΟλόκληροι φάκελοιΧρειάζεται κώδικας
Δημόσιο αντικείμενο ή bucketΠραγματικά δημόσια αρχεία (ένα website)ΌχιΌχιΌχιΝαιΌχι
Presigned URLΈνα αρχείο, μία φορά, από το CLI ή την εφαρμογή σουΌχιΌχιΌχιΌχιCLI ή SDK
Signed URL του CloudFrontΕφαρμογές που ήδη αυθεντικοποιούν χρήστεςΌχιΌχιΌχιΜε signed cookiesΝαι
Σύνδεσμος κοινοποίησης του NubboΣυχνή κοινοποίηση με άτομα εκτός ομάδαςΝαιΝαιΝαιΝαι, με ZIPΌχι

Γιατί να μην κάνεις απλώς το αρχείο δημόσιο

Ο πιο γρήγορος τρόπος να μοιραστείς ένα αρχείο από το S3 είναι να το κάνεις δημόσιο και να στείλεις το URL του αντικειμένου. Είναι όμως και ο πιο επικίνδυνος: ό,τι είναι δημόσιο μπορεί να το κατεβάσει όποιος βρει ή μαντέψει τη διεύθυνση, χωρίς κωδικό, χωρίς λήξη και χωρίς καταγραφή του ποιος το πήρε. Τα ξεχασμένα δημόσια buckets είναι κλασική πηγή διαρροών δεδομένων και εκθέτουν τόσο τα ονόματα των αρχείων όσο και το περιεχόμενο.

Το AWS δηλώνει ότι τα νέα buckets, access points και αντικείμενα δεν επιτρέπουν δημόσια πρόσβαση από προεπιλογή. Επιπλέον, το S3 Block Public Access έχει τέσσερις ρυθμίσεις (BlockPublicAcls, IgnorePublicAcls, BlockPublicPolicy και RestrictPublicBuckets) που υπερισχύουν κάθε policy ή ACL που θα άνοιγε αργότερα το bucket. Μπορούν να οριστούν ανά bucket, ανά λογαριασμό ή για ολόκληρο ένα AWS Organization, και το S3 εφαρμόζει τον πιο περιοριστικό συνδυασμό. Το AWS συνιστά να ενεργοποιείς και τις τέσσερις σε επίπεδο λογαριασμού, εκτός αν πραγματικά φιλοξενείς δημόσιο περιεχόμενο, όπως ένα στατικό website.

Κράτα αυτόν τον διακόπτη ενεργό. Όλα όσα ακολουθούν λειτουργούν με αυτόν ενεργοποιημένο.

Επιλογή 1: presigned URLs

Ένα presigned URL είναι ένα URL αντικειμένου με μια υπογραφή στο query string. Επιτρέπει μία λειτουργία (συνήθως μια λήψη) σε ένα αντικείμενο μέχρι να λήξει, και το S3 ελέγχει την υπογραφή σε κάθε αίτημα.

aws s3 presign s3://my-bucket/reports/q3.pdf --expires-in 86400

Αυτό το URL λειτουργεί για 24 ώρες. Η προεπιλογή του CLI είναι μία ώρα και το μέγιστο 604.800 δευτερόλεπτα (7 ημέρες) όταν υπογράφεις με κλειδιά χρήστη IAM. Αν υπογράφεις με προσωρινά διαπιστευτήρια, όπως ένας assumed role, το URL πεθαίνει όταν λήξουν αυτά τα διαπιστευτήρια.

Τι κερδίζεις:

  • Καμία αλλαγή στο bucket ή στα policies του.
  • Ακριβή έλεγχο: ένα αντικείμενο, μία μέθοδος, μία λήξη.
  • Λειτουργεί σε κάθε πάροχο που υποστηρίζει προϋπογραφή με SigV4.

Τι δεν κερδίζεις:

  • Κωδικό. Όποιος έχει το URL μπορεί να το χρησιμοποιήσει, όσες φορές θέλει, μέχρι να λήξει.
  • Όριο λήψεων και ανάκληση ανά σύνδεσμο. Μπορείς να σταματήσεις ένα URL νωρίτερα μόνο ανακαλώντας τα κλειδιά που το υπέγραψαν.
  • Φακέλους. Υπογράφεις αντικείμενο προς αντικείμενο, οπότε η κοινοποίηση ενός φακέλου με 300 αρχεία σημαίνει 300 URLs.
  • Απόρρητο στα ονόματα. Το URL δείχνει το όνομα του bucket σου, το κλειδί του αντικειμένου και το access key ID σου.

Για τον μηχανισμό σε βάθος, μαζί με ανεβάσματα, κάθε παράμετρο X-Amz-* και κώδικα SDK, δες S3 presigned URLs: πώς λειτουργούν.

Επιλογή 2: signed URLs και signed cookies του CloudFront

Αν ήδη σερβίρεις το bucket μέσω του Amazon CloudFront, μπορείς να απαιτήσεις signed URLs ή signed cookies σε ένα cache behavior. Το bucket μένει ιδιωτικό πίσω από το origin access control (OAC), που το AWS προτείνει αντί για το παλαιότερο origin access identity: ένα bucket policy επιτρέπει μόνο στο distribution σου να διαβάζει τα αντικείμενα. Καταχωρείς δημόσια κλειδιά σε ένα trusted key group και υπογράφεις με το αντίστοιχο ιδιωτικό κλειδί.

  • Τα signed URLs ταιριάζουν σε μεμονωμένα αρχεία. Με ένα custom policy μπορείς επίσης να ορίσεις ώρα έναρξης και εύρος IP, και να επαναχρησιμοποιήσεις ένα policy για πολλά αρχεία με wildcards. Μπορούν να είναι σύντομης διάρκειας ή να κρατούν χρόνια.
  • Τα signed cookies ταιριάζουν σε πολλά αρχεία ταυτόχρονα, όπως κάθε τμήμα ενός βίντεο, χωρίς να αλλάξεις τα URLs σου.

Αυτό είναι το σωστό εργαλείο όταν τρέχεις μια εφαρμογή που ήδη αυθεντικοποιεί χρήστες και σερβίρει περιεχόμενο σε κλίμακα. Για να δώσεις λίγα αρχεία σε άτομα εκτός ομάδας, σημαίνει να στήσεις ένα distribution, να διαχειρίζεσαι κλειδιά και να γράψεις κώδικα που υπογράφει κάθε αίτημα.

Ο περιορισμός ενός bucket policy σε σταθερό εύρος IP είναι μια ακόμα εγγενής επιλογή, αλλά βοηθά μόνο όταν ξέρεις τα δίκτυα των παραληπτών, κάτι που σπάνια ισχύει με άτομα εκτός του οργανισμού σου.

Επιλογή 3: σύνδεσμοι κοινοποίησης με το Nubbo

Το Nubbo συνδέεται με το bucket σου και σου δίνει συνδέσμους κοινοποίησης με τους ελέγχους που λείπουν από τα presigned URLs, χωρίς να γράψεις κώδικα. Από κάτω εξακολουθεί να χρησιμοποιεί presigned URLs: το Nubbo ελέγχει πρώτα τους κανόνες του συνδέσμου και μόνο μετά εκδίδει ένα URL σύντομης διάρκειας, οπότε τα μεμονωμένα αρχεία ταξιδεύουν απευθείας από το bucket σου στον browser του παραλήπτη.

Βήμα 1: σύνδεσε το bucket σου

Κάνε δωρεάν εγγραφή, επιβεβαίωσε το email σου, μετά άνοιξε την ενότητα Buckets και πάτησε Σύνδεση bucket. Ο βοηθός σού ζητά τον πάροχό σου (Amazon S3, Cloudflare R2, DigitalOcean Spaces, Wasabi, Backblaze B2 ή ένα προσαρμοσμένο S3-συμβατό endpoint), τον τρόπο σύνδεσης (αυτόματη ρύθμιση με κλειδί πλήρους πρόσβασης ή κλειδί περιορισμένο σε ένα bucket), το κλειδί σου και το bucket σου. Ελέγχει το κλειδί και το bucket και τελειώνει δοκιμάζοντας το CORS με ένα πραγματικό ανέβασμα από τον browser σου. Το bucket μένει ιδιωτικό και τα κλειδιά σου αποθηκεύονται κρυπτογραφημένα με AES-256-GCM. Το πλάνο Δωρεάν περιλαμβάνει 2 συνδέσεις.

Βήμα 2: διάλεξε το αρχείο ή τον φάκελο

Βρες το στοιχείο στον εξερευνητή και επίλεξε Κοινοποίηση. Μπορείς επίσης να πας στη σελίδα Κοινόχρηστα, να πατήσεις Νέος σύνδεσμος και να επιλέξεις εκεί το bucket και το αρχείο ή τον φάκελο.

Βήμα 3: όρισε την προστασία

Και οι τρεις έλεγχοι είναι προαιρετικοί και διαθέσιμοι σε κάθε πλάνο:

ΈλεγχοςΠώς λειτουργεί
Κωδικός πρόσβασης4 έως 50 χαρακτήρες. Μετά από 10 λάθος προσπάθειες ο σύνδεσμος κλειδώνει για 15 λεπτά.
Ημερομηνία λήξηςΑνενεργή από προεπιλογή: ο σύνδεσμος μένει ενεργός όσο το αρχείο ή ο φάκελος βρίσκεται στο storage σου.
Μέγιστες λήψειςΚενό σημαίνει απεριόριστες. Όταν συμπληρωθεί ο αριθμός, ο σύνδεσμος σταματά να σερβίρει το αρχείο.

Βήμα 4: δημιούργησε και στείλε τον σύνδεσμο

Πάτησε Δημιουργία συνδέσμου, αντίγραψέ τον και στείλ’ τον με email, chat ή ό,τι χρησιμοποιείς. Ο παραλήπτης ανοίγει μια καθαρή σελίδα λήψης και δεν χρειάζεται λογαριασμό. Ένας σύνδεσμος φακέλου του επιτρέπει να εξερευνήσει τον φάκελο, να κατεβάσει μεμονωμένα αρχεία ή να πάρει τα πάντα ως ZIP, το οποίο συναρμολογεί ο browser του κατεβάζοντας κάθε αρχείο απευθείας από το bucket σου.

Βήμα 5: στείλε τον κωδικό χωριστά

Αν στείλεις τον κωδικό στο ίδιο μήνυμα με τον σύνδεσμο, χάνεται το νόημα. Αν ο σύνδεσμος έχει κωδικό, το Αποστολή κωδικού μέσω email τον στέλνει ως σύνδεσμο αποκάλυψης μίας χρήσης: ο κωδικός εμφανίζεται μία φορά, ο σύνδεσμος αποκάλυψης λήγει μετά από 24 ώρες, 3 ημέρες ή 7 ημέρες και μπορείς να προσθέσεις ένα σύντομο σημείωμα. Λαμβάνεις ειδοποίηση όταν ανοιχτεί.

Βήμα 6: παρακολούθησε και ανακάλεσε

Η σελίδα Κοινόχρηστα δείχνει κάθε σύνδεσμο με την κατάσταση και τον αριθμό λήψεών του. Μπορείς να αλλάξεις τον κωδικό, τη λήξη ή το όριο, να απενεργοποιήσεις έναν σύνδεσμο (σταματά αμέσως να εκδίδει νέα URLs λήψης) και να τον ξανανοίξεις αργότερα με την ίδια διεύθυνση.

Κοινοποίηση σε συγκεκριμένα άτομα αντί για σύνδεσμο

Ένας σύνδεσμος λειτουργεί για όποιον τον έχει. Όταν θέλεις να μπαίνουν μόνο συγκεκριμένα άτομα, η Κοινοποίηση με άτομα του Nubbo (στα πλάνα Personal και Pro) στέλνει ένα αρχείο ή φάκελο σε συγκεκριμένες διευθύνσεις email με δικαίωμα προβολής ή λήψης, προαιρετική λήξη και όριο λήψεων, και καταγράφει κάθε πρόσβαση. Οι παραλήπτες χρειάζονται λογαριασμό στο Nubbo και βρίσκουν το στοιχείο στο Κοινοποιήθηκαν σε εμένα. Το Personal επιτρέπει 10 άτομα ανά στοιχείο και 50 ενεργές κοινοποιήσεις. Το Pro επιτρέπει 50 και 500.

Τα πλάνα επί πληρωμή προσφέρουν επίσης κρυπτογραφημένους συνδέσμους: ο browser φτιάχνει ένα σφραγισμένο αντίγραφο του αρχείου και το κλειδί ταξιδεύει μόνο μέσα στον ίδιο τον σύνδεσμο, οπότε το Nubbo δεν μπορεί να το διαβάσει.

Ποια επιλογή να χρησιμοποιήσεις;

  • Ένα αρχείο, μία φορά, και έχεις ρυθμισμένο το AWS CLI: ένα presigned URL είναι ο πιο γρήγορος δρόμος.
  • Μια εφαρμογή που ήδη συνδέει χρήστες και σερβίρει πολύ περιεχόμενο: signed URLs ή cookies του CloudFront.
  • Συχνή κοινοποίηση με άτομα εκτός ομάδας, ολόκληροι φάκελοι ή οτιδήποτε χρειάζεται κωδικό ή όριο: ένας σύνδεσμος κοινοποίησης γλιτώνει χρόνο και λάθη.

Πέρα από έναν σύνδεσμο

Δύο σχετικές λειτουργίες καλύπτουν τις άλλες συνηθισμένες περιπτώσεις. Τα αιτήματα αρχείων σου δίνουν έναν δημόσιο σύνδεσμο ανεβάσματος, ώστε οι άλλοι να στέλνουν αρχεία στο bucket σου χωρίς να βλέπουν τίποτα άλλο μέσα του. Οι γκαλερί κάνουν έναν φάκελο με φωτογραφίες ή βίντεο μια σελίδα για περιήγηση με διατάξεις, υδατογράφημα και δικό της κωδικό. Στο πλάνο Δωρεάν παίρνεις 3 από το καθένα και απεριόριστους συνδέσμους κοινοποίησης. Το Personal και το Pro καταργούν αυτά τα όρια. Μια ειλικρινής σημείωση: οι μικρογραφίες δημιουργούνται στον server του Nubbo και αποθηκεύονται στο δικό σου bucket στο .nubbo-thumbs/.

Συχνές ερωτήσεις

Πώς μοιράζομαι ένα αρχείο από το S3 χωρίς να το κάνω δημόσιο;

Κράτα το bucket ιδιωτικό και δώσε αντί γι’ αυτό υπογεγραμμένη πρόσβαση: ένα presigned URL για ένα αντικείμενο (από το AWS CLI ή ένα SDK), ένα signed URL ή cookie του CloudFront αν ήδη σερβίρεις το bucket μέσω CloudFront, ή έναν σύνδεσμο κοινοποίησης από ένα εργαλείο όπως το Nubbo που προσθέτει κωδικό, λήξη και όριο λήψεων πάνω από τα presigned URLs.

Είναι ασφαλές το Amazon S3 για κοινοποίηση αρχείων;

Ναι, όσο το bucket μένει ιδιωτικό. Τα νέα buckets δεν επιτρέπουν δημόσια πρόσβαση από προεπιλογή και το S3 Block Public Access εμποδίζει οποιονδήποτε να τα ανοίξει αργότερα. Ο κίνδυνος έρχεται από το να κάνεις αντικείμενα δημόσια ή από τη διαρροή υπογεγραμμένων συνδέσμων, που λειτουργούν για όποιον τους έχει μέχρι να λήξουν.

Είναι τα νέα S3 buckets ιδιωτικά από προεπιλογή;

Ναι. Το AWS δηλώνει ότι τα νέα buckets, access points και αντικείμενα δεν επιτρέπουν δημόσια πρόσβαση από προεπιλογή, και οι τέσσερις ρυθμίσεις του Block Public Access υπερισχύουν κάθε policy ή ACL που θα τα άνοιγε αργότερα.

Χρειάζεται ο παραλήπτης λογαριασμό στο AWS ή στο Nubbo;

Όχι. Ένα presigned URL, ένα signed URL του CloudFront και ένας σύνδεσμος κοινοποίησης του Nubbo λειτουργούν όλα σε οποιονδήποτε browser χωρίς λογαριασμό. Μόνο η Κοινοποίηση με άτομα, που στέλνει ένα στοιχείο σε συγκεκριμένα άτομα, απαιτεί να έχουν λογαριασμό στο Nubbo.

Πόσο μπορεί να διαρκέσει ένας κοινόχρηστος σύνδεσμος S3;

Ένα presigned URL διαρκεί το πολύ 7 ημέρες όταν υπογράφεται με κλειδιά χρήστη IAM, και λιγότερο με προσωρινά διαπιστευτήρια. Τα signed URLs του CloudFront διαρκούν όσο ορίζει το policy σου. Ένας σύνδεσμος κοινοποίησης του Nubbo δεν λήγει αν δεν ορίσεις λήξη, γιατί εκδίδει νέο URL σύντομης διάρκειας σε κάθε λήψη.

Περνούν τα αρχεία από το Nubbo όταν κάποιος κατεβάζει από έναν κοινόχρηστο σύνδεσμο;

Όχι: ο browser κατεβάζει τα μεμονωμένα αρχεία απευθείας από το bucket σου με ένα presigned URL. Οι λήψεις ZIP με πολλά αρχεία συναρμολογούνται στον browser, που κατεβάζει κάθε αρχείο απευθείας από το bucket σου: το Nubbo δεν βλέπει το περιεχόμενο.

Πηγές

Οι τιμές και τα όρια προέρχονται από τις επίσημες σελίδες παρακάτω. Οι πάροχοι τα αλλάζουν, γι' αυτό έλεγξέ τα πριν δεσμευτείς.