Zdroj obrázku: freecodecamp.org

Jak zpracovávat a obsluhovat data ze soukromého bloku AWS S3 s AWS STS v node.js?

Když jsem poprvé začal používat AWS S3 s STS, bylo pro mě docela matoucí implementovat tyto věci. Ačkoli dokumentace obsahuje všechny věci, které jsou v ní uvedeny, jako nováček v AWS, bylo stále obtížné z ní extrahovat všechny informace, protože jsou distribuovány na příliš mnoha stránkách a existuje jen velmi málo příkladů.

Tento blog je tedy dokonalým průvodcem pro nasazení systému sloužícího k citlivému obsahu z vašeho soukromého kbelíku S3 pomocí AWS STS.

Původně publikováno na https://gosink.in/how-to-handle-and-serve-data-from-aws-s3-s-private-bucket-with-aws-sts-in-node-js/

Proč soukromý kbelík?

Před několika měsíci jsem začal vyvíjet produkt, který obsluhoval mapové dlaždice (obrázky) s některými citlivými informacemi kódovanými v těchto obrázcích.

Neměli jsme jinou možnost, než zakódovat naše data do obrázků, protože jsme nemohli JSONovi sloužit explicitně, protože z něj kdokoli mohl snadno extrahovat všechna data.

Ale i po kódování dat bylo novým problémem, že pokud tyto obrázky zveřejníme, kdokoli může mít alespoň všechny dlaždice, aby si vytvořil svůj vlastní systém a snadno je zobrazil.

Vím, že pokud to někdo udělá, můžeme proti nim podniknout nějaké právní kroky. Ale jako start jsme nechtěli riskovat, a podniknout nějaké právní kroky byl ten nejhorší scénář, jaký jsme si kdy dokázali představit. Myslím, že to byl nejlepší nápad, jak učinit náš obsah soukromým a sloužit jej některým omezeným a důvěryhodným klientům (protože tento produkt stejně nebyl pro běžné lidi užitečný). Takže po nějakém výzkumu a srovnání jsme se rozhodli jít s AWS.

Technologický zásobník

AWS S3 (Simple Storage Service):

Pro uložení dat. Vytvoříme kbelík a vyrobíme náš dataprivát. Pro demonstraci ukládám jeden obrázek.

AWS STS (Security Token Service):

Poskytuje uživatelům dočasná pověření. Nemusíme tedy vytvářet nového uživatele IAM pokaždé, když se nový uživatel zaregistruje.

AWS IAM (Správa identit a přístupu):

Je dobrým zvykem nepoužívat přihlašovací údaje uživatele root. Za tímto účelem vytvoříme roli, která bude mít přístup pouze pro čtení jednoho bloku a přístup ke generování nových dočasných tokenů pro každého klienta.

Node.js:

Přidáme aws-sdk a vygenerujeme nová pověření. Tyto přihlašovací údaje použijeme také k vytvoření žádosti a získání našich dat ze soukromého kbelíku S3.

AWS EC2:

Tomuto serveru přiřadíme roli a naše aplikace node.js bude spuštěna na serveru EC2.

Vytvoření kbelíku S3:

Jednoduše přejděte na konzolu S3 a vytvořte nový kbelík. Rozsah názvu kbelíku je globální, což znamená, že pouze 1 uživatel může mít konkrétní název kbelíku. Vyberte jedinečný název a oblast, ve které očekáváte, že bude velký počet uživatelů, vyberte vhodné konfigurace pro svůj kbelík a vytvořte je. Také si všimněte ARN vašeho kbelíku. Pomůže nám to omezit naši roli při vytváření pověření pouze pro tuto skupinu.

Do tohoto kbelíku nahraju obrázek. Pokud chcete, můžete nahrát jakýkoli jiný dokument. Nezapomeňte svůj soubor zveřejnit. Výchozí je soukromé. Pokud si chcete být jisti, otevřete URL objektu. Pokud vyvolá chybu, je dobré jít (to znamená, že není veřejně přístupný).

Vytvoření zásad role a připojení IAM

Vyberte službu:

Přejděte do konzoly IAM a vytvořte novou roli. Při vytváření role vyberte EC2 jako službu, která bude tuto roli používat.

Připojit zásady:

Stisknutím tlačítka Další přidáte oprávnění a přidáte AmazonS3ReadOnlyAccess, protože pokud poskytneme plný přístup k našemu kbelíku S3, naši klienti budou moci manipulovat s obsahem uvnitř našeho kbelíku, dokud nepřidáte nějaké jiné zásady při generování pověření (Protože to vyžaduje průnik role a přístupu k dané politice).
Přestože předávání některých vlastních zásad je velmi pěkná funkce, obecně se tomu vyhýbám, protože pokud mohu provést samostatné role, abych mohl plnit jiné úkoly, proč bych měl riskovat?

Přidat štítky:

Značky jsou volitelné. Pokud chcete, přidejte akey a jeho popis.

Posouzení:

Při kontrole vaší role zkontrolujte zásady, které jsou k ní připojeny. Do pole Název role jsem přiřadil s3-temp.

Přidat inline politiku:

Po vytvoření role otevřete tuto roli uvnitř konzoly a zobrazí se možnost s názvem Přidat inline zásady. Klikněte na něj a vyhledejte STS a přidejte jej do své role. Pomůže to vytvořit dočasná pověření.

Po přidání této inline zásady zadejte vhodný název. Pojmenoval jsem to STS. Můžete také určit, pro které zdroje chcete, aby vaše role mohla generovat dočasná pověření. Pokud nechcete, aby tato role mohla generovat přihlašovací údaje pro některé další skupiny, musíte zadat ARN svého segmentu S3.

Připojte tuto roli k instanci EC2

Poprvé jsem byl na chvíli uvíznutý, protože jsem nevěděl, že musím roli přiřadit konkrétní instanci EC2. Trvalo mi hodiny, než jsem zjistil, že musím určit vztah důvěryhodnosti mezi instancí EC2 a mou rolí. Tento krok zvyšuje zabezpečení, protože nemůžete generovat nová přihlašovací údaje bez přiřazení role vaší instanci.

Pro novou instanci EC2

Při vytváření nové instance EC2 vyberte v konfiguraci Konfigurovat podrobnosti instance roli IAM, kterou jsme vytvořili.

Pro existující instanci EC2

Klikněte pravým tlačítkem na existující instanci EC2 a vyberte Připojit / Nahradit roli IAM uvnitř instance Sesstings a přiřadit roli.

Psaní kódu

K načtení dat pomocí aws-sdk používám node.js. Při psaní tohoto blogu je aktuální verze této sady SDK 2,393,0

Nejprve napíšeme kód, abychom vygenerovali pověření

Použití zpětného volání:

Použití asynchronní / čekat:

Použití .then ():

Úspěšně jsme vygenerovali přihlašovací údaje. Nyní je dobré po určitém formátování data uložit do proměnné a znovu je použít.

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

Nyní před načtením dat probereme různé možnosti, které máme v aws-sdk k získání dat.

  1. getSignedUrl: Převezme dočasná pověření a vygeneruje novou podepsanou adresu URL pokaždé, když zavoláte tuto metodu, protože vygenerování nové časové značky trvá pokaždé.
  2. getObject: Převezme také dočasná pověření, ale nevrací novou podepsanou adresu URL. Vrací obsah našeho souboru v části Body odpovědi ve formátu vyrovnávací paměti.

Co si vybrat

V mém případě jsem musel pokaždé generovat nové adresy URL dlaždic a neměl jsem žádnou kontrolu nad adresami URL pro jejich opětovné použití, protože mapa generuje nové adresy URL pokaždé, když s nimi interagujeme. Obecně se v jakékoli mapové aplikaci ukládá do mezipaměti mapové dlaždice a po každé interakci je znovu použijete. Není však možné použít getSignedUrl. Ale pokud máte kontrolu nad URL a můžete je znovu použít, určitě byste měli jít za getSignedUrl. Tyto adresy URL jsou platné po určité časové období, které zadáte při jejich generování.

Existují však případy, kdy adresy URL jsou k ničemu a potřebujete pouze objekt samotný nebo pokud nechcete generovat adresy URL často a přímo obrázky ukládat do mezipaměti, getObject je dobrá volba.

PS: Nakonec jsem použil AWS CloudFront, protože getObject byl pro moji aplikaci příliš pomalý, protože obecně v aplikacích, jako je moje, stačí zadat

Odkaz na kód

Zde jsou oficiální dokumenty, pokud chcete prozkoumat více o operacích S3 (Simple Storage Service) nebo jiných služeb AWS.

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

Poznámky pod čarou

Dejte nám vědět, pokud jste našli nějaké lepší nápady nebo došlo k chybě v mém kódu nebo popisu. Máte-li jakékoli pochybnosti nebo to nedokážete pochopit / implementovat, zanechte komentář níže a pokusím se odpovědět na ASAP. Až příště!