Amazon S3 - це сервіс, який дозволяє вам зберігати великі обсяги даних.
Amazon S3 надає кілька варіантів для досягнення захисту даних у спокої. Опції включають дозвіл (політика), шифрування (клієнтське та серверне), версію віджета та видалення на основі MFA. Користувач може активувати будь-яку з цих опцій для забезпечення захисту даних. Реплікація даних - це внутрішній сервіс AWS, де S3 автоматично реплікує кожен об'єкт у всіх зонах доступності, і організація не повинна активувати це у цьому випадку.
За допомогою дозволів на основі ресурсів можна визначити дозволи для підкаталогів вашого віджета окремо.
Версіювання віджета та видалення на основі MFA
Коли активовано версіювання віджета, будь-яка дія, яка намагається змінити файл всередині файлу, генеруватиме нову версію файлу, зберігаючи також попередній вміст того ж самого. Таким чином, він не перезапише свій вміст.
Крім того, видалення на основі MFA запобігатиме видаленню версій файлу у віджеті S3 та також відключенню версіювання віджета, тому зловмисник не зможе змінювати ці файли.
Журнали доступу до S3
Можливо активувати журнали доступу до S3 (які за замовчуванням вимкнені) для деякого віджета та зберегти журнали в іншому віджеті, щоб знати, хто отримує доступ до віджета (обидва віджети повинні бути в одному регіоні).
Підписані URL-адреси S3
Можливо згенерувати підписаний URL-адресу, який зазвичай можна використовувати для доступу до вказаного файлу у віджеті. Підписаний URL-адреса виглядає так:
Пресигнований URL може бути створений з CLI за допомогою облікових даних основного користувача з доступом до об'єкту (якщо обліковий запис, який ви використовуєте, не має доступу, буде створений коротший пресигнований URL, але він буде некорисним)
Єдиним обов'язковим дозволом для створення підписаного URL є дозвіл, який надається, тому для попередньої команди єдиним необхідним дозволом для принципала є s3:GetObject
Також можливо створювати підписані URL з іншими дозволами:
DEK означає ключ шифрування даних і завжди генерується та використовується для шифрування даних.
Шифрування на стороні сервера з керованими ключами S3, SSE-S3
Цей варіант вимагає мінімальної конфігурації, і всі керовані ключі шифрування використовуються AWS. Вам потрібно лише завантажити свої дані, і S3 вирішить всі інші аспекти. Кожному відра в обліковому записі S3 призначається ключ відра.
Шифрування:
Дані об'єкта + створений текстовий DEK --> Зашифровані дані (зберігаються всередині S3)
Створений текстовий DEK + Головний ключ S3 --> Зашифрований DEK (зберігається всередині S3), а текст видаляється з пам'яті
Дешифрування:
Зашифрований DEK + Головний ключ S3 --> Текстовий DEK
Текстовий DEK + Зашифровані дані --> Дані об'єкта
Зверніть увагу, що в цьому випадку ключ керується AWS (обертання лише кожні 3 роки). Якщо ви використовуєте власний ключ, ви зможете змінювати, вимикати та застосовувати контроль доступу.
Шифрування на стороні сервера з керованими ключами KMS, SSE-KMS
Цей метод дозволяє S3 використовувати службу керування ключами для генерації ключів шифрування даних. KMS надає вам набагато більшу гнучкість у керуванні ключами. Наприклад, ви можете вимикати, обертати та застосовувати контроль доступу до CMK, а також вимагати проти їх використання за допомогою AWS Cloud Trail.
Шифрування:
S3 запитує ключі даних від KMS CMK
KMS використовує CMK для генерації пари DEK текстовий і DEK зашифрований та надсилає їх до S3
S3 використовує текстовий ключ для шифрування даних, зберігає зашифровані дані та зашифрований ключ і видаляє з пам'яті текстовий ключ
Дешифрування:
S3 запитує KMS розшифрувати зашифрований ключ даних об'єкта
KMS розшифровує ключ даних за допомогою CMK та надсилає його назад до S3
S3 розшифровує дані об'єкта
Шифрування на стороні сервера з наданими користувачем ключами, SSE-C
Цей варіант дозволяє вам використовувати власний головний ключ, який ви вже можливо використовуєте поза AWS. Ваш наданий користувачем ключ буде надісланий разом із вашими даними до S3, де S3 виконає шифрування для вас.
Шифрування:
Користувач надсилає дані об'єкта + Ключ користувача до S3
Ключ користувача використовується для шифрування даних, і зашифровані дані зберігаються
також зберігається солений HMAC-значення ключа користувача для майбутньої перевірки ключа
ключ користувача видаляється з пам'яті
Дешифрування:
Користувач надсилає ключ користувача
Ключ перевіряється на відповідність збереженому значенню HMAC
Наданий користувачем ключ використовується для розшифрування даних
Шифрування на стороні клієнта з KMS, CSE-KMS
Аналогічно до SSE-KMS, цей метод також використовує службу керування ключами для генерації ключів шифрування даних. Однак цього разу KMS викликається через клієнта, а не S3. Потім шифрування відбувається на стороні клієнта, і зашифровані дані надсилаються до S3 для зберігання.
Шифрування:
Клієнт запитує ключ даних від KMS
KMS повертає текстовий DEK та зашифрований DEK з CMK
Обидва ключі надсилаються назад
Клієнт потім шифрує дані за допомогою текстового DEK та надсилає зашифровані дані до S3 + зашифрований DEK (який зберігається як метадані зашифрованих даних всередині S3)
Дешифрування:
Зашифровані дані з зашифрованим DEK надсилаються клієнту
Клієнт запитує KMS розшифрувати зашифрований ключ за допомогою CMK, і KMS надсилає текстовий DEK
Тепер клієнт може розшифрувати зашифровані дані
Шифрування на стороні клієнта з наданими користувачем ключами, CSE-C
Використовуючи цей механізм, ви можете використовувати надані вами ключі та використовувати клієнт AWS-SDK для шифрування даних перед надсиланням їх до S3 для зберігання.
Шифрування:
Клієнт генерує DEK та шифрує текстові дані
Потім, використовуючи власний власний CMK, він шифрує DEK
надсилає зашифровані дані + зашифрований DEK до S3, де вони зберігаються
Дешифрування:
S3 надсилає зашифровані дані та DEK
Оскільки клієнт вже має CMK, який використовувався для шифрування DEK, він розшифровує DEK, а потім використовує текстовий DEK для розшифрування даних
# Get buckets ACLsawss3apiget-bucket-acl--bucket<bucket-name>awss3apiget-object-acl--bucket<bucket-name>--keyflag# Get policyawss3apiget-bucket-policy--bucket<bucket-name>awss3apiget-bucket-policy-status--bucket<bucket-name>#if it's public# list S3 buckets associated with a profileawss3lsawss3apilist-buckets# list content of bucket (no creds)awss3lss3://bucket-name--no-sign-requestawss3lss3://bucket-name--recursive# list content of bucket (with creds)awss3lss3://bucket-nameawss3apilist-objects-v2--bucket<bucket-name>awss3apilist-objects--bucket<bucket-name>awss3apilist-object-versions--bucket<bucket-name># copy local folder to S3awss3cpMyFolders3://bucket-name--recursive# deleteawss3rbs3://bucket-name–-force# download a whole S3 bucketawss3syncs3://<bucket>/.# move S3 bucket to different locationawss3syncs3://oldbuckets3://newbucket--source-regionus-west-1# list the sizes of an S3 bucket and its contentsawss3apilist-objects--bucketBUCKETNAME--outputjson--query"[sum(Contents[].Size), length(Contents[])]"# Update Bucket policyawss3apiput-bucket-policy--policyfile:///root/policy.json--bucket<bucket-name>##JSON policy example{"Id":"Policy1568185116930","Version":"2012-10-17","Statement": [{"Sid":"Stmt1568184932403","Action": ["s3:ListBucket"],"Effect":"Allow","Resource":"arn:aws:s3:::welcome","Principal":"*"},{"Sid":"Stmt1568185007451","Action": ["s3:GetObject"],"Effect":"Allow","Resource":"arn:aws:s3:::welcome/*","Principal":"*"}]}# Update bucket ACLawss3apiget-bucket-acl--bucket<bucket-name># Way 1 to get the ACLawss3apiput-bucket-acl--bucket<bucket-name>--access-control-policyfile://acl.jsonawss3apiget-object-acl--bucket<bucket-name>--keyflag#Way 2 to get the ACLawss3apiput-object-acl--bucket<bucket-name>--keyflag--access-control-policyfile://objacl.json##JSON ACL example## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.{"Owner":{"DisplayName":"<DisplayName>","ID":"<ID>"},"Grants": [{"Grantee":{"Type":"Group","URI":"http://acs.amazonaws.com/groups/global/AuthenticatedUsers"},"Permission":"FULL_CONTROL"}]}## An ACL should give you the permission WRITE_ACP to be able to put a new ACL
двохстековий
Ви можете отримати доступ до віджета S3 через двохстекову точку доступу, використовуючи ім'я віртуального хоста або шляхове ім'я точки доступу. Це корисно для доступу до S3 через IPv6.
Точки доступу двохстекового використовують наступний синтаксис:
bucketname.s3.dualstack.aws-region.amazonaws.com
s3.dualstack.aws-region.amazonaws.com/bucketname
Підвищення привілеїв
На наступній сторінці ви можете перевірити, як зловживати дозволами S3 для підвищення привілеїв:
Згідно з цим дослідженням було можливо кешувати відповідь від довільного віджета так, ніби вона належить до іншого. Це могло бути використано для зміни, наприклад, відповідей на файли JavaScript та компрометації довільних сторінок, використовуючи S3 для зберігання статичного коду.
Amazon Athena
Amazon Athena - це інтерактивна служба запитів, яка спрощує аналіз даних безпосередньо в Amazon Simple Storage Service (Amazon S3) з використанням стандартного SQL.
Вам потрібно підготувати таблицю реляційної БД з форматом вмісту, який буде відображатися в контрольованих віджетах S3. Після цього Amazon Athena зможе заповнити БД з журналів, щоб ви могли виконувати запити.
Amazon Athena підтримує можливість запитувати дані S3, які вже зашифровані, і, якщо налаштовано, Athena також може шифрувати результати запиту, які потім можна зберігати в S3.
Це шифрування результатів незалежне від запитуваних даних S3, що означає, що навіть якщо дані S3 не зашифровані, результати запиту можуть бути зашифровані. Важливою є те, що Amazon Athena підтримує лише дані, які були зашифровані за допомогою наступних методів шифрування S3, SSE-S3, SSE-KMS та CSE-KMS.
SSE-C та CSE-E не підтримуються. Крім цього, важливо розуміти, що Amazon Athena буде виконувати запити лише до зашифрованих об'єктів, які знаходяться в тій же регіоні, що й сам запит. Якщо вам потрібно запитувати дані S3, які були зашифровані за допомогою KMS, то користувачу Athena потрібні конкретні дозволи для виконання запиту.
Енумерація
# Get catalogsawsathenalist-data-catalogs# Get databases inside catalogawsathenalist-databases--catalog-name<catalog-name>awsathenalist-table-metadata--catalog-name<catalog-name>--database-name<db-name># Get query executions, queries and resultsawsathenalist-query-executionsawsathenaget-query-execution--query-execution-id<id># Get query and meta of resultsawsathenaget-query-results--query-execution-id<id># This will rerun the query and get the results# Get workgroups & Prepared statementsawsathenalist-work-groupsawsathenalist-prepared-statements--work-group<wg-name>awsathenaget-prepared-statement--statement-name<name>--work-group<wg-name># Run queryawsathenastart-query-execution--query-string<query>