Източник на изображението: freecodecamp.org

Как да обработваме и обслужваме данни от частната кофа на AWS S3 с AWS STS в node.js?

Когато за първи път започнах да използвам AWS S3 със STS, беше доста объркващо за мен да прилагам тези неща. Въпреки че в документацията има всичко споменато в нея, като начинаещ в AWS, все още беше трудна задача да извлече цялата информация от нея, тъй като тя се разпределя на твърде много страници и има много малко примери.

Така че този блог е върховно ръководство за разгръщане на система за обслужване на чувствително съдържание от вашата частна кофа S3 с помощта на AWS STS.

Първоначално публикуван на https://gosink.in/how-to-handle-and-serve-data-from-aws-s3-s-private-bucket-with-aws-sts-in-node-js/

Защо частна кофа?

Няколко месеца назад започнах да разработвам продукт, който обслужваше плочки с карти (изображения) с някаква чувствителна информация, кодирана в тези изображения.

Ние нямахме друг избор, освен да кодираме данните си в изображения, тъй като не можахме да служим JSON изрично, защото всеки може лесно да извлече всички данни от него.

Но дори и след кодирането на данните, новият проблем беше, ако направим публично публикувани тези изображения, всеки може поне да има всички плочки, за да направи своя собствена система и да ги показва лесно.

Знам, че ако някой го направи, можем да предприемем някои правни действия срещу тях. Но като стартъп не искахме да поемаме никакъв риск и предприемането на някои правни действия беше най-лошият сценарий, който някога можехме да си представим по това време. Предполагам, че беше най-добрата идея да направим нашето съдържание частно и да го сервираме на някои ограничени и надеждни клиенти (тъй като този продукт не беше полезен за нормалните хора така или иначе). Затова след някои изследвания и сравнение решихме да преминем с AWS.

Технологичен стек

AWS S3 (проста услуга за съхранение):

За да съхранявате данните. Ще създадем кофа и ще направим личните си данни. Съхранявам едно изображение за демонстрацията.

AWS STS (услуга за токени за сигурност):

Той предоставя някои временни идентификационни данни на потребителите. Така че не е нужно да създаваме нов потребител на IAM всеки път, когато нов потребител се регистрира.

AWS IAM (управление на идентичността и достъпа):

Добра практика е да не използвате идентификационните данни на потребител на root. За това ще създадем роля, която ще има достъп само за четене на една кофа и достъп за генериране на нови временни маркери за всеки клиент.

Node.js:

Ще добавим aws-sdk и ще генерираме нови идентификационни данни. Също така ще използваме тези идентификационни данни, за да отправим заявка и да вземем данните си от частна кофа S3.

AWS EC2:

Ние ще присвоим роля на този сървър и нашето приложение node.js ще се изпълнява на EC2 сървър.

Създаване на кофа S3:

Просто отидете на конзолата на S3 и създайте нова кофа. Обхватът на името на кофа е глобален, което означава, че само 1 потребител може да има специфичното име на кофата. Затова изберете уникално име и региона, в който очаквате да бъде голям брой ваши потребители, изберете подходящите конфигурации за вашата кофа и създайте такава. Също така обърнете внимание на ARN на вашата кофа. Това ще ни помогне да ограничим ролята си за генериране на идентификационни данни само за тази група.

Ще кача изображение в тази кофа. Можете да качите всеки друг документ, ако искате. Само не забравяйте да не правите публично досието си. Private е по подразбиране. Все пак, ако искате да сте сигурни, отворете URL адреса на обекта. Ако хвърли грешка, е добре да продължим (това означава, че не е обществено достъпен).

Създаване на правила за ролята и прикачването на IAM

Изберете услуга:

Отидете до конзолата си IAM и създайте нова роля. Докато създавате роля, изберете EC2 като услуга, която ще използва тази роля.

Прикачване на правила:

Натиснете бутона Next, за да добавите разрешения и да добавите AmazonS3ReadOnlyAccess, защото ако предоставим пълния достъп на нашата кофа S3, клиентите ни ще могат да манипулират съдържанието вътре в нашата кофа, освен ако не добавите някаква друга политика, докато генерирате идентификационните данни (тъй като това изисква пресечната точка както на ролята, така и на предоставения достъп до политиката).
Въпреки че приемането на някаква персонализирана политика е много приятна функция, аз обикновено избягвам това, защото ако мога да направя отделни роли за изпълнение на други задачи, защо да поемам риск?

Добави тагове:

Маркерите не са задължителни. Добавете akey и неговото описание, ако искате.

Преглед:

Докато преглеждате ролята си, проверете приложените към нея политики. Присвоих s3-temp на полето Role Name.

Добавете вградено правило:

След като създадете ролята, отворете тази роля в конзолата и ще видите опция с надпис Add inline policy. Щракнете върху него и потърсете STS и го добавете във вашата роля. Това ще помогне за създаването на временни идентификационни данни.

След като добавите тази вградена политика, дайте й подходящо име. Нарекох го STS. Можете също така да посочите за кои ресурси искате вашата роля да може да генерира временни идентификационни данни. Просто трябва да посочите ARN на вашата S3 кофа, ако не искате тази роля да може да генерира идентификационни данни за някои други групи.

Прикачете тази роля към екземпляр EC2

За първи път бях заседнал известно време, защото не знаех, че трябва да назнача роля на конкретен екземпляр EC2. Отнеха ми часове, за да разбера това, че трябва да конкретизирам доверителна връзка между EC2 инстанция и моята роля. Тази стъпка увеличава сигурността, тъй като не можете да генерирате нови идентификационни данни, без да възлагате ролята на своя инстанция.

За нов екземпляр EC2

Докато създавате нов екземпляр EC2, в опцията Конфигуриране на подробности за инстанцията изберете ролята на IAM, която създадохме.

За съществуващ случай на EC2

Щракнете с десния бутон върху съществуващия екземпляр EC2 и изберете Прикачване / Замяна на IAM Role вътре в инстанс Sesstings и възложете ролята.

Писане на кода

Използвам node.js за извличане на данните с помощта на aws-sdk. Докато пишете този блог, текущата версия на този SDK е 2.393.0

Първо, ще напишем кода, за да генерираме идентификационни данни

Използване на обратен сигнал:

Използване на async / чакайте:

Използване .then ():

Успешно генерирахме идентификационните данни Сега е добре да съхранявате данните в променлива след известно форматиране, за да ги използвате повторно.

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

Преди да извлечем данните, ще обсъдим различните опции, които имаме в aws-sdk, за да получим данните.

  1. getSignedUrl: Той отнема временните идентификационни данни и генерира нов подписан URL адрес всеки път, когато се обадите на този метод, тъй като отнема новите времеви отметки всеки път, за да го генерира.
  2. getObject: Той също отнема временните идентификационни данни, но не връща нов подписан URL адрес. Той връща съдържанието на нашия файл в частта Body на отговора във формата на буфер.

Какво да избера

В моя случай трябваше да генерирам нови URL адреси за плочки всеки път и нямах контрол над URL адреси, за да ги използвам повторно, тъй като картата генерира нови URL адреси всеки път, когато взаимодействаме с нея. По принцип във всяко приложение за карта кеширате плочките на картата и ги използвате повторно всеки път след всяко взаимодействие. Но не е възможно да се използва getSignedUrl. Но ако имате контрола над URL адресите и можете да ги използвате повторно, определено трябва да отидете за getSignedUrl. Тези URL адреси са валидни за определен период от време, който предоставяте, докато ги генерирате.

Но има някои случаи, когато URL адресите не са от полза и се нуждаете само от самия обект или ако не искате често да генерирате URL адреси и директно кеширате изображенията, getObject е добра опция.

PS: В крайна сметка използвах AWS CloudFront, защото getObject беше твърде бавен за моето приложение, тъй като като цяло в приложенията като моето, просто трябва да посоча

Код Справка

Ето официалните документи, ако искате да разгледате повече за операциите на S3 (Simple Storage Service) или всякакви други AWS услуги.

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

Бележки под линия

Кажете ми дали сте намерили някои по-добри идеи или има грешка в моя код или описанието. Ако имате някакви съмнения или не можете да разберете / приложите това, оставете коментар по-долу и ще се опитам да отговоря ASAP. До следващия път!