Billedkilde: freecodecamp.org

Hvordan håndteres og serveres data fra AWS S3s private spand med AWS STS i node.js?

Da jeg først begyndte at bruge AWS S3 med STS, var det ret forvirrende for mig at implementere disse ting. Selvom dokumentationen har alle de ting, der er nævnt i den, som en nybegynder i AWS, var det stadig en vanskelig opgave at udtrække alle oplysningerne ud af den, da den er distribueret over for mange sider, og der er meget få eksempler.

Så denne blog er en ultimativ guide til at implementere et system til at servere følsomt indhold fra din S3 private spand ved hjælp af AWS STS.

Oprindeligt offentliggjort på https://gosink.in/how-to-handle-and-serve-data-from-aws-s3-s-private-bucket-with-aws-sts-in-node-js/

Hvorfor en privat spand?

For et par måneder tilbage begyndte jeg at udvikle et produkt, der serverede kortfliser (billeder) med nogle følsomme oplysninger kodet på disse billeder.

Vi havde ikke andet valg end at kode vores data i billeder, fordi vi ikke kunne tjene JSON eksplicit, fordi nogen nemt kan udtrække alle dataene ud af dem.

Men selv efter kodning af dataene var det nye emne, hvis vi offentliggør disse billeder, kan enhver i det mindste have alle fliserne til at lave deres eget system og vise dem let.

Jeg ved, at hvis nogen gør det, kan vi tage nogle juridiske sager mod dem. Men som en opstart ønskede vi ikke at tage nogen risiko, og at tage nogle juridiske handlinger var det værste tilfælde, vi nogensinde kunne forestille os på det tidspunkt. Jeg gætte, det var den bedste idé at gøre vores indhold privat og servere det til nogle begrænsede og pålidelige klienter (da dette produkt alligevel ikke var nyttigt for normale mennesker). Så efter noget research og sammenligning besluttede vi at gå med AWS.

Teknologibunke

AWS S3 (Simple Storage Service):

For at gemme dataene. Vi opretter en spand og laver vores dataprivat. Jeg gemmer et enkelt billede til demonstrationen.

AWS STS (Security Token Service):

Det giver nogle midlertidige legitimationsoplysninger til brugerne. Så vi behøver ikke at oprette en ny IAM-bruger, hver gang en ny bruger bliver registreret.

AWS IAM (Identity and Access Management):

Det er en god praksis at ikke bruge rodbrugerens legitimationsoplysninger. Til dette skaber vi en rolle, der kun har læse-adgangen til en enkelt spand og adgangen til at generere nye midlertidige tokens for hver klient.

node.js:

Vi tilføjer aws-sdk og genererer nye legitimationsoplysninger. Vi bruger også disse legitimationsoplysninger til at stille en anmodning og hente vores data fra en privat S3-spand.

AWS EC2:

Vi tildeler en rolle til denne server, og vores node.js-applikation kører på en EC2-server.

Oprettelse af en S3-spand:

Gå bare til S3's konsol og opret en ny spand. Omfanget af navnet på en spand er globalt, hvilket betyder, at kun 1 bruger kan have det specifikke spandnavn. Så vælg et unikt navn og det område, hvor du forventer, at et stort antal af dine brugere skal være, vælg de passende konfigurationer til din spand og opret et. Bemærk også din spands ARN. Det vil hjælpe os med at begrænse vores rolle til at generere legitimationsoplysninger til kun denne spand.

Jeg uploader et billede til denne spand. Du kan uploade ethvert andet dokument, hvis du vil. Husk bare ikke at offentliggøre din fil. Privat er standard. Hvis du stadig vil være sikker, skal du åbne objektets URL. Hvis det kaster en fejl, er vi gode til at gå (det betyder, at det ikke er offentligt tilgængeligt).

Oprettelse af en IAM-rolle og vedhæftningspolitik

Vælg en service:

Gå til din IAM-konsol, og opret en ny rolle. Mens du opretter en rolle, skal du vælge EC2 som den tjeneste, der vil bruge denne rolle.

Vedhæft politikker:

Tryk på Next-knappen for at tilføje tilladelser og tilføje en AmazonS3ReadOnlyAccess, fordi hvis vi giver fuld adgang til vores S3-spand, vil vores klienter være i stand til at manipulere indholdet i vores spand, medmindre du tilføjer en anden politik, mens vi genererer legitimationsoplysningerne (Fordi det tager skæringspunktet af både rolle og leverede politikens adgang).
Selvom det er en meget flot funktion at videregive nogle brugerdefinerede politikker, undgår jeg generelt dette, fordi hvis jeg er i stand til at lave separate roller til at udføre andre opgaver, hvorfor skal jeg tage nogen risiko?

Tilføj tags:

Mærker er valgfri. Tilføj akey og dens beskrivelse, hvis du vil.

Anmeldelse:

Mens du gennemgår din rolle, skal du kontrollere de politikker, der er knyttet til den. Jeg har tildelt s3-temp til feltet Role Name.

Tilføj inline-politik:

Når du har oprettet rollen, skal du åbne den rolle i konsollen, og du kan se en indstilling, der siger Tilføj inline-politik. Klik på det og søg efter STS og tilføj det i din rolle. Det vil hjælpe med at skabe midlertidige legitimationsoplysninger.

Når du har tilføjet denne inline-politik, skal du give den et passende navn. Jeg har navngivet det STS. Du kan også specificere, hvilke ressourcer du ønsker, at din rolle skal være i stand til at generere midlertidige legitimationsoplysninger til. Du skal bare specificere ARN for din S3-spand, hvis du ikke ønsker, at denne rolle skal være i stand til at generere legitimationsoplysninger til nogle andre spande.

Fastgør denne rolle til en EC2-instans

For første gang sad jeg et stykke tid, fordi jeg ikke vidste, at jeg skulle tildele en rolle til en bestemt EC2-instans. Det tog mig timer at finde ud af, at jeg er nødt til at specificere et tillidsforhold mellem en EC2-instans og min rolle. Dette trin øger sikkerheden, da du ikke kan generere nye legitimationsoplysninger uden at tildele rollen til din instans.

For en ny EC2-instans

Mens du opretter en ny EC2-forekomst, vælg den rolle, vi oprettede, i indstillingen Konfigurer forekomstdetaljer.

For en eksisterende EC2-instans

Højreklik på den eksisterende EC2-forekomst, og vælg Vedhæft / udskift IAM-rolle i Instance Sesstings og tildele rollen.

Skrivning af koden

Jeg bruger node.js til at hente dataene ved hjælp af aws-sdk. Når du skriver denne blog, er den aktuelle version af denne SDK 2.393.0

Først skriver vi koden for at generere legitimationsoplysninger

Brug af et tilbagekald:

Brug af async / afvent:

Brug af .then ():

Vi har genereret legitimationsoplysninger. Det er nu godt at gemme dataene i en variabel efter nogen formatering for at genbruge dem.

const accessparams = {
    accessKeyId: data.Credentials.AccessKeyId,
    secretAccessKey: data.Credentials.SecretAccessKey,
    sessionToken: data.Credentials.SessionToken,
};

Før vi henter dataene, diskuterer vi de forskellige muligheder, vi har i aws-sdk for at hente dataene.

  1. getSIGNUrl: Det tager de midlertidige legitimationsoplysninger og genererer en ny underskrevet URL hver gang du kalder denne metode, fordi det tager de nye tidsstempler hver gang for at generere den.
  2. getObject: Det tager også de midlertidige legitimationsoplysninger, men det returnerer ikke en ny underskrevet URL. Det returnerer indholdet af vores fil i kropsdelen af ​​svaret i buffertformatet.

Hvad man skal vælge

I mit tilfælde var jeg nødt til at generere nye fliser-URL'er hver gang, og jeg havde ingen kontrol over URL'er til at genbruge dem, fordi kortet genererer nye URL-adresser, hver gang vi interagerer med dem. Generelt i ethvert kortprogram cache cacher du fliserne og genbruger dem hver gang efter enhver interaktion. Men det er ikke muligt at bruge getSIGNUrl. Men hvis du har kontrol over webadresserne, og du kan genbruge dem, skal du bestemt gå til getSIGNUrl. Disse webadresser er gyldige i den bestemte periode, som du angiver, mens du genererer dem.

Men der er nogle tilfælde, hvor URL'er ikke er til nogen nytte, og du kun har brug for selve objektet, eller hvis du ikke ønsker at generere URL'er ofte og cache billederne direkte, er getObject en god mulighed.

PS: Jeg endte med at bruge AWS CloudFront, fordi getObject var for langsom til min applikation, fordi jeg generelt i applikationer som min, bare skal specificere

Kodehenvisning

Her er de officielle dokumenter, hvis du vil udforske mere om driften af ​​S3 (Simple Storage Service) eller andre AWS-tjenester.

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

Fodnoter

Lad mig vide, om du har fundet nogle bedre ideer, eller der er en fejl i min kode eller beskrivelsen. Hvis du er i tvivl eller ikke er i stand til at forstå / implementere dette, skal du efterlade en kommentar nedenfor, så vil jeg prøve at svare ASAP. Indtil næste gang!