2012-05-14 15 views
35

Estoy desarrollando una aplicación web y disponemos de la siguiente ACL asignado a la cuenta de AWS que utiliza para acceder a sus datos:Amazon S3 ACL para sólo lectura y de escritura única de acceso

{ 
    "Statement": [ 
    { 
     "Sid": "xxxxxxxxx", // don't know if this is supposed to be confidential 
     "Action": [ 
     "s3:*" 
     ], 
     "Effect": "Allow", 
     "Resource": [ 
     "arn:aws:s3:::cdn.crayze.com/*" 
     ] 
    } 
    ] 
} 

Sin embargo, me Nos gustaría hacer esto un poco más restrictivo para que si nuestras credenciales de AWS alguna vez se vieran comprometidas, un atacante no pudiera destruir ningún dato.

De la documentación, parece que quiero permitir solo las siguientes acciones: s3:GetObject y s3:PutObject, pero específicamente quiero que la cuenta solo pueda crear objetos que ya no existen, es decir, una solicitud PUT en un el objeto existente debe ser denegado. es posible?

+0

¡No sabía sobre las etiquetas de idioma! ¿Dónde están los mencionados? –

+2

Creo que la razón por la que no es compatible con esto es porque S3 es una especie de coherencia eventual, por lo que no existe una semántica autoritativa de "el objeto no existe". – jberryman

Respuesta

37

Esto no es posible en Amazon S3 como probablemente lo haya previsto; Sin embargo, puede evitar esta limitación por Using Versioning cuales es un medio de mantener múltiples variantes de un objeto en el mismo cubo y ha sido desarrollado con casos de uso como esto en mente:

le califica de versiones de impida que los objetos se eliminen o sobrescrito por error, o para archivar objetos para que pueda recuperar versiones anteriores de ellos.

Hay un par de preguntas frecuentes relacionadas, así, por ejemplo:

  • What is Versioning? - de versiones le permite conservar, recuperar y restaurar todas las versiones de cada objeto almacenado en un depósito de Amazon S3 . Una vez que habilita el control de versiones para un depósito, Amazon S3 conserva los objetos existentes cada vez que realiza una operación PUT, POST, COPY o DELETE en ellos. Por defecto, las solicitudes GET recuperarán la versión escrita más reciente. Las versiones anteriores de un objeto sobrescrito o eliminado se pueden recuperar especificando una versión en la solicitud.

  • Why should I use Versioning? - Amazon S3 ofrece a los clientes una infraestructura de almacenamiento altamente duradera. El control de versiones ofrece un nivel adicional de protección al proporcionar un medio de recuperación cuando los clientes sobrescriben accidentalmente o eliminan objetos. Esto le permite recuperarse fácilmente de acciones de usuarios involuntarios y fallas de aplicaciones. También puede usar el control de versiones para la retención y el archivo de datos. [Énfasis mío]

  • How does Versioning protect me from accidental deletion of my objects? - Cuando un usuario realiza una operación de eliminación en un objeto, solicitudes por defecto posteriores ya no recuperar el objeto. Sin embargo, todas las versiones de ese objeto continuarán conservadas en su depósito de Amazon S3 y pueden recuperarse o recuperarse. Solo el propietario de un depósito de Amazon S3 puede eliminar permanentemente una versión. [el énfasis es mío]

Si usted es realmente crucial sobre las credenciales de AWS del propietario del depósito (que pueden ser diferentes de los usuarios que acceden por supuesto), se puede tomar un paso más allá, incluso, ver How can I ensure maximum protection of my preserved versions? : MFA

de versiones Borrar capacidad, que utiliza multi-factor authentication, se puede utilizar para proporcionar una capa adicional de seguridad. [...] Si habilita Versiones con MFA Eliminar en su depósito de Amazon S3, se requieren dos formas de autenticación para eliminar permanentemente una versión de un objeto: sus credenciales de cuenta AWS y un código de seis dígitos y número de serie válidos desde un dispositivo de autenticación en su posesión física. [...]

+6

Desafortunadamente, esta es la única solución disponible para un requisito de copia de seguridad muy común y obvio ("escribir solo nuevo"). Si usa el control de versiones S3, no permite utilizar las políticas de administración del ciclo de vida de S3. Por lo tanto, ahora está obligado a elegir entre tener una seguridad de copia de seguridad sólida o una manera conveniente de eliminar copias de seguridad antiguas. No creo que sea demasiado esperar ambas cosas. –

+4

Utilizo tanto el control de versiones como el sistema del ciclo de vida dentro del mismo contenedor con bastante frecuencia donde sea necesario, el uso de uno no excluye al otro. De la descripción del control de versiones dentro de la interfaz s3: '' 'Puede usar las reglas de Lifecycle para administrar todas las versiones de sus objetos, así como los costos asociados. Las reglas del ciclo de vida le permiten archivar automáticamente sus objetos en la clase de almacenamiento Glacier y/o eliminarlos después de un período de tiempo específico .''' – PhillipHolmes

+1

Suena bien. ¿Es posible que un atacante deshabilite el control de versiones?¿O no importa, porque de todos modos no podrían eliminar los objetos ya versionados? – z0r

-1

Sí, No es posible crear una política en la que otorgue permiso de solo en objetos nuevos (no existe en s3).

Soy un desarrollador de Bucket Explorer. Puede probar Bucket Explorer, que tiene la versión en dos sentidos. 1. Control de versiones de Amazon S3 si está habilitado en el Bucket 2. Esto es el propio entorno de versiones del explorador de Bcuket cuando las versiones de Amazon S3 están deshabilitadas en el Bucket.

También puede probar Bucket Explorer Team Edition si desea dar acceso específico a su amigo o cliente.

3

Si esto es sobreescritura accidental que está tratando de evitar, y sus necesidades de negocio permite una ventana de tiempo corto de inconsistencia, se puede hacer la reversión en la función Lambda:

  1. Que sea una política que "ningún nuevos objetos con el mismo nombre ". La mayoría de las veces no sucederá. Para aplicarlo:
  2. Escuche los eventos S3: PutObject en un AWS Lambda function.
  3. Cuando se dispara el evento, verifique si hay más de una versión presente.
  4. Si hay más de una versión presente, elimine todas menos la más nueva.
  5. Notifique a quien subió lo que sucedió (es útil tener el cargador original en el x-amz-meta-* del objeto. Más información here).