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 для розшифрування даних
Перерахування
Один з традиційних основних способів компрометації організацій AWS починається з компрометації бакетів, які є публічно доступними. Ви можете знайтиперерахувачі публічних бакетів на цій сторінці.
# 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
dual-stack
Ви можете отримати доступ до S3 бакету через двосторонній кінцевий пункт, використовуючи віртуальне ім'я кінцевого пункту в стилі хостингу або в стилі шляху. Це корисно для доступу до S3 через IPv6.
Двосторонні кінцеві пункти використовують наступний синтаксис:
bucketname.s3.dualstack.aws-region.amazonaws.com
s3.dualstack.aws-region.amazonaws.com/bucketname
Privesc
На наступній сторінці ви можете перевірити, як зловживати дозволами S3 для ескалації привілеїв:
Unauthenticated Access
S3 Post Exploitation
Persistence
Інші вразливості S3
Проблема отруєння кешу HTTP 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 потрібні специфічні дозволи, щоб дозволити їм виконати запит.
Enumeration
# 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>