Pólizas De Los Buckets S3. Utilidad Y Ejemplos Prácticos

Introducción

En el artículo anterior de esta serie hablamos del versionado en los buckets S3, porque habilitarlo es una buena práctica y como influye una vez una se suspende en un bucket S3. En este artículo estaremos hablando sobre las pólizas de los buckets S3, que son, para que sirven y como se pueden utilizar en la práctica.

¿Qué son las pólizas de los buckets S3?

Las pólizas de los Bucket S3 nos permiten controlar el acceso a nuestros buckets, así como predefinir ciertas reglas relacionadas al mismo, por ejemplo, quien puede leer los objetos almacenados en el bucket o crearlos. Si necesitamos que todos los objetos en nuestro bucket sean encriptados, esto lo podemos lograr a través de las pólizas de los bucket S3. A continuación algunos aspectos más específicos relacionados a las pólizas de los bucket S3:

  • Un documento JSON que permite el acceso a ciertos usuarios a los objetos de un bucket o a ciertas acciones sobre el propio bucket
  • El campo Principal es requerido en la póliza de un bucket S3
  • Por defecto, cuando un Bucket S3 es creado, no contiene ninguna póliza

Póliza de bucket S3

{
  "Sid": "PublicRead",
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::compacompila-website/*",
  "Principal": "*"
}

Para entender esta póliza, analicemos cada uno de sus campos:

Sid

Es un campo opcional, y básicamente se usa como un indicador para que quien vea la póliza se haga una idea de cual es el objetivo de la misma. En este caso es PublicRead y por lo tanto podemoa hacernos una idea de cual es el objetivo de esta póliza

Effect

Es un campo opcional, en caso que no esté presente, su valor es Allow, su otro valor puede ser Deny. Este campo se usa para determinar si la acción definida en la próxima propiedad será permitida o no

Action

Define la acción que se desea permitir o denegar, por ejemplo en este caso la acción en cuestión es s3:GetObject, y como el valor del campo anterior es Allow, en este caso se está permitiendo la acción de obtener un objeto de S3

Resource

Define el recurso sobre el cual se permite o deniega la acción. Ya sabemos que se permite en esta póliza obtener objetos de S3. Pero evidentemente hay que definir sobre que bucket de S3 se permite esto, y esto es lo que se define en este campo. Por lo tanto aquí se expresa el ARN (Nombre del recurso en Amazon) del bucket en cuestión

Principal

Se refiere a la entidad IAM que podrá en este caso realizar la acción sobre el bucket S3 definido en el campo Resource. Por ejemplo, en este caso, el valor es *, por lo tanto, cualquier entidad podrá leer los objetos de este bucket S3

Resumen

Por lo tanto, podemos concluir que esta póliza permite que cualquier entidad lea los objetos del bucket S3 cuyo nombre es compacompila-website

Ejemplos de pólizas de Bucket S3

Permitir que una distribución de Cloudfront lea los objetos de un bucket S3

{
  "Sid": "AllowCloudFrontServicePrincipal",
  "Effect": "Allow",
  "Principal": {
    "Service": "cloudfront.amazonaws.com"
  },
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::compacompila-website/*",
  "Condition": {
    "StringEquals": {
      "AWS:SourceArn": "arn:aws:cloudfront::039612854661:distribution/E265T4FYP4BBY0"
    }
  }
}

Esta póliza permite que la distribución de Cloudfront (campo Principal) cuyo ARN es arn:aws:cloudfront::039612854661:distribution/E265T4FYP4BBY0 (campo Condition) lea todos los objetos (campo Action) del bucket S3 cuyo nombre es compacompila-website (campo Resource)

Permitir que una distribución de Cloudfront lea objetos específicos de un bucket S3

{
  "Sid": "AllowCloudFrontServicePrincipal",
  "Effect": "Allow",
  "Principal": {
    "Service": "cloudfront.amazonaws.com"
  },
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::compacompila-website/images/*",
  "Condition": {
    "StringEquals": {
      "AWS:SourceArn": "arn:aws:cloudfront::039612854661:distribution/E265T4FYP4BBY0"
    }
  }
}

Esta póliza tiene una única diferencia con la anterior, y es que no permite la lectura de todos los objetos en el bucket, sino de los objetos ubicados dentro del índice (carpeta) images. Esto se define en el campo Resource

Permitir que un rol específico lea objetos con un tag específico

{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/SomeRole"
  },
  "Action": ["s3:GetObject", "s3:GetObjectVersion"],
  "Resource": "arn:aws:s3:::compacompila-website/*",
  "Condition": {
    "StringEquals": {
      "s3:ExistingObjectTag/environment": "production"
    }
  }
}

Esta póliza permite que el rol arn:aws:iam::111122223333:role/SomeRole lea objetos y también la versión de los mismos del bucket cuyo nombre es compacompila-website siempre y cuando estos contengan la etiqueta environment con el valor production

Permitir que un rol específico cree objetos con un tag específico

{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/SomeRole"
  },
  "Action": ["s3:PutObject"],
  "Resource": "arn:aws:s3:::compacompila-website/*",
  "Condition": {
    "StringEquals": {
      "s3:RequestObjectTag/departmanet": "Finance"
    }
  }
}

Esta póliza permite que el rol arn:aws:iam::111122223333:role/SomeRole cree objetos en el bucket cuyo nombre es compacompila-website siempre y cuando estos contengan la etiqueta department con el valor Finance

Denegar todas las acciones a no ser que se acceda a través de HTTPS

{
  "Effect": "Deny",
  "Principal": "*",
  "Action": ["s3:*"],
  "Resource": [
    "arn:aws:s3:::compacompila-website/*",
    "arn:aws:s3:::compacompila-website"
  ],
  "Condition": {
    "Bool": {
      "aws:SecureTransport": "false"
    }
  }
}

Esta póliza deniega todas las acciones sobre el bucket S3 compacompila-website si la petición no es HTTPS

En el campo resource, el valor arn:aws:s3:::compacompila-website aplica para las acciones que son sobre el bucket como tal, por ejemplo, s3:ListBucket, sin embargo, el valor arn:aws:s3:::compacompila-website/* aplica para las acciones que son sobre los objetos, por ejemplo, s3:GetObject

Hasta la próxima

Esto es todo por ahora relacionado al quinto artículo de esta serie donde estaré brindándote una guía completa sobre los buckets de S3. En el próximo artículo estaremos hablando sobre las URLs pre firmadas y su utilidad. Nos vemos


Contenido relacionado

Recibe las últimas publicaciones en tu correo
0%