Amazon S3 es un servicio que te permite almacenar grandes cantidades de datos.
Amazon S3 proporciona múltiples opciones para lograr la protección de datos en reposo. Las opciones incluyen Permisos (Política), Cifrado (Cliente y Servidor), Versionado de Buckets y Eliminación basada en MFA. El usuario puede habilitar cualquiera de estas opciones para lograr la protección de datos. La replicación de datos es una facilidad interna de AWS donde S3 replica automáticamente cada objeto en todas las Zonas de Disponibilidad y la organización no necesita habilitarla en este caso.
Con permisos basados en recursos, puedes definir permisos para subdirectorios de tu bucket por separado.
Versionado de Buckets y Eliminación basada en MFA
Cuando se habilita el versionado de buckets, cualquier acción que intente alterar un archivo dentro de un archivo generará una nueva versión del archivo, manteniendo también el contenido anterior del mismo. Por lo tanto, no sobrescribirá su contenido.
Además, la eliminación basada en MFA evitará que se eliminen versiones de archivos en el bucket de S3 y también que se deshabilite el versionado de buckets, por lo que un atacante no podrá alterar estos archivos.
Registros de acceso de S3
Es posible habilitar los registros de acceso de S3 (que por defecto están deshabilitados) para algún bucket y guardar los registros en un bucket diferente para saber quién está accediendo al bucket (ambos buckets deben estar en la misma región).
URLs prefirmadas de S3
Es posible generar una URL prefirmada que generalmente se puede utilizar para acceder al archivo especificado en el bucket. Una URL prefirmada se ve así:
Un URL prefirmado se puede crear desde la CLI utilizando las credenciales de un principal con acceso al objeto (si la cuenta que utilizas no tiene acceso, se creará un URL prefirmado más corto pero será inútil)
La única permiso requerido para generar una URL firmada previamente es el permiso que se está otorgando, por lo tanto, para el comando anterior, el único permiso necesario por el principal es s3:GetObject
También es posible crear URLs firmadas previamente con otros permisos:
DEK significa Clave de Encriptación de Datos y es la clave que siempre se genera y se utiliza para encriptar datos.
Encriptación en el lado del servidor con claves gestionadas por S3, SSE-S3
Esta opción requiere una configuración mínima y toda la gestión de las claves de encriptación utilizadas es gestionada por AWS. Todo lo que necesitas hacer es subir tus datos y S3 se encargará de todos los demás aspectos. A cada bucket en una cuenta de S3 se le asigna una clave de bucket.
Encriptación:
Datos del objeto + DEK en texto plano creado --> Datos encriptados (almacenados dentro de S3)
DEK en texto plano creado + Clave Maestra de S3 --> DEK encriptado (almacenado dentro de S3) y el texto en plano se borra de la memoria
Desencriptación:
DEK encriptado + Clave Maestra de S3 --> DEK en texto plano
DEK en texto plano + Datos encriptados --> Datos del objeto
Por favor, ten en cuenta que en este caso la clave es gestionada por AWS (rotación solo cada 3 años). Si utilizas tu propia clave podrás rotar, deshabilitar y aplicar control de acceso.
Encriptación en el lado del servidor con claves gestionadas por KMS, SSE-KMS
Este método permite a S3 utilizar el servicio de gestión de claves para generar tus claves de encriptación de datos. KMS te brinda una mayor flexibilidad en cómo se gestionan tus claves. Por ejemplo, puedes deshabilitar, rotar y aplicar controles de acceso al CMK, y ordenar en contra de su uso utilizando AWS Cloud Trail.
Encriptación:
S3 solicita claves de datos a KMS CMK
KMS utiliza un CMK para generar el par DEK en texto plano y DEK encriptado y los envía a S3
S3 utiliza la clave en texto plano para encriptar los datos, almacena los datos encriptados y la clave encriptada y borra de la memoria la clave en texto plano
Desencriptación:
S3 solicita a KMS desencriptar la clave de datos encriptada del objeto
KMS desencripta la clave de datos con el CMK y la envía de vuelta a S3
S3 desencripta los datos del objeto
Encriptación en el lado del servidor con claves proporcionadas por el cliente, SSE-C
Esta opción te brinda la oportunidad de proporcionar tu propia clave maestra que ya podrías estar utilizando fuera de AWS. Tu clave proporcionada por el cliente se enviaría con tus datos a S3, donde S3 realizaría la encriptación por ti.
Encriptación:
El usuario envía los datos del objeto + Clave del cliente a S3
La clave del cliente se utiliza para encriptar los datos y se almacenan los datos encriptados
se almacena también un valor HMAC salteado de la clave del cliente para futura validación de la clave
la clave del cliente se borra de la memoria
Desencriptación:
El usuario envía la clave del cliente
La clave se valida contra el valor HMAC almacenado
La clave proporcionada por el cliente se utiliza entonces para desencriptar los datos
Encriptación en el lado del cliente con KMS, CSE-KMS
Similar a SSE-KMS, esto también utiliza el servicio de gestión de claves para generar tus claves de encriptación de datos. Sin embargo, esta vez KMS es invocado a través del cliente y no de S3. La encriptación luego se realiza en el lado del cliente y los datos encriptados se envían a S3 para ser almacenados.
Encriptación:
Cliente solicita una clave de datos a KMS
KMS devuelve el DEK en texto plano y el DEK encriptado con el CMK
Ambas claves se envían de vuelta
El cliente luego encripta los datos con el DEK en texto plano y envía a S3 los datos encriptados + el DEK encriptado (que se guarda como metadatos de los datos encriptados dentro de S3)
Desencriptación:
Los datos encriptados con el DEK encriptado se envían al cliente
El cliente solicita a KMS desencriptar la clave encriptada usando el CMK y KMS devuelve el DEK en texto plano
El cliente ahora puede desencriptar los datos encriptados
Encriptación en el lado del cliente con claves proporcionadas por el cliente, CSE-C
Utilizando este mecanismo, puedes utilizar tus propias claves proporcionadas y utilizar un cliente de AWS-SDK para encriptar tus datos antes de enviarlos a S3 para su almacenamiento.
Encriptación:
El cliente genera un DEK y encripta los datos en texto plano
Luego, utilizando su propio CMK personalizado, encripta el DEK
envía los datos encriptados + DEK encriptado a S3 donde se almacenan
Desencriptación:
S3 envía los datos encriptados y el DEK
Como el cliente ya tiene el CMK utilizado para encriptar el DEK, desencripta el DEK y luego utiliza el DEK en texto plano para desencriptar los datos
Enumeración
Una de las formas tradicionales principales de comprometer organizaciones de AWS comienza por comprometer buckets públicamente accesibles. Puedes encontrarenumeradores de buckets públicos en esta página.
# 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
Puedes acceder a un bucket de S3 a través de un endpoint de doble pila utilizando un nombre de endpoint de estilo alojado virtual o de estilo de ruta. Estos son útiles para acceder a S3 a través de IPv6.
Los endpoints de doble pila utilizan la siguiente sintaxis:
bucketname.s3.dualstack.aws-region.amazonaws.com
s3.dualstack.aws-region.amazonaws.com/bucketname
Escalada de privilegios
En la siguiente página puedes verificar cómo abusar de los permisos de S3 para escalar privilegios:
Según esta investigación era posible almacenar en caché la respuesta de un bucket arbitrario como si perteneciera a otro. Esto podría haber sido abusado para cambiar, por ejemplo, las respuestas de archivos javascript y comprometer páginas arbitrarias que utilizan S3 para almacenar código estático.
Amazon Athena
Amazon Athena es un servicio de consulta interactivo que facilita el análisis de datos directamente en Amazon Simple Storage Service (Amazon S3) utilizando SQL estándar.
Necesitas preparar una tabla de base de datos relacional con el formato del contenido que va a aparecer en los buckets de S3 monitoreados. Luego, Amazon Athena podrá poblar la base de datos a partir de los registros, para que puedas hacer consultas.
Amazon Athena admite la capacidad de consultar datos de S3 que ya están encriptados y, si está configurado para hacerlo, Athena también puede encriptar los resultados de la consulta que luego se pueden almacenar en S3.
Esta encriptación de resultados es independiente de los datos de S3 subyacentes consultados, lo que significa que incluso si los datos de S3 no están encriptados, los resultados consultados pueden estar encriptados. Un par de puntos a tener en cuenta es que Amazon Athena solo admite datos que han sido encriptados con los siguientes métodos de encriptación de S3, SSE-S3, SSE-KMS y CSE-KMS.
SSE-C y CSE-E no son compatibles. Además, es importante entender que Amazon Athena solo ejecutará consultas contra objetos encriptados que estén en la misma región que la consulta en sí. Si necesitas consultar datos de S3 que han sido encriptados usando KMS, entonces se requieren permisos específicos por parte del usuario de Athena para permitirles realizar la consulta.
Enumeración
# 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>