amazon-s3 - que - subir archivos a aws s3
¿Existe una política S3 para limitar el acceso solo para ver/acceder a un segmento? (18)
Tengo un cubo simple que se parece a images.mysite.com
en mi S3 y otros cubos que contienen copias de seguridad, etc.
Quiero permitir que un usuario específico pueda acceder al cubo images.mysite.com
para subir imágenes. Sin embargo, NO QUIERO que vea ninguno de los otros cubos; ni siquiera que ellos existan.
No podría hacer una política que haga esto; cada vez que intento algo restrictivo, termina bloqueando el listado de cualquier cubeta.
¿Confundido acerca de por qué no se verificó ninguna respuesta?
Analicemos cada declaración de política de las soluciones anteriores:
Esta declaración de política se aplica al contenido del depósito, pero no al dinero en sí. Probablemente, esto no sea lo que pidió la pregunta, porque no puede ver lo que hay en el cubo.
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}
Esta política de dos declaraciones from acceso de solo lectura al cubo en ( arn:aws:s3:::your_bucket_here/
) de solo lectura , pero aún permite operaciones CRUD en el contenido del arn:aws:s3:::your_bucket_here/*
( arn:aws:s3:::your_bucket_here/*
).
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::your_bucket_here",
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectAclVersion"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}
Sin embargo, la política incluye la siguiente declaración, que permite al usuario ver todos los segmentos en el punto final. Probablemente esto no sea lo que la pregunta solicitó.
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
Sin embargo, lo anterior es muy útil si usa un cliente que explora una tienda S3. Si su cliente accede a la tienda y no directamente al cubo, necesita acceso a la lista de depósitos en la raíz.
Agregue una cláusula de Deny
para el (los) cubo (s) al que no desea acceder. Recuerde que aún pueden aparecer en la lista, pero no podrá acceder a los contenidos que contienen.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": "*" }, { "Effect": "Deny", "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] } ] }
Esto funcionó perfecto para mí. El usuario puede cargar, descargar y obtener una lista de archivos, pero no podrá ver los archivos de otro cubo.
{
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::mybucketname/*",
"Condition": {}
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
},
{
"Effect": "Deny",
"Action": [
"s3:DeleteBucket",
"s3:DeleteBucketPolicy",
"s3:DeleteBucketWebsite",
"s3:DeleteObject",
"s3:DeleteObjectVersion"
],
"Resource": "arn:aws:s3:::mybucketname/*",
"Condition": {}
}
]
}
Estoy interpretando esta pregunta como: "¿Puedo permitir el acceso a un contenedor en el que no se podrá acceder a ningún otro contenedor y, por lo tanto, será invisible?". Porque, mostrar el nombre del cubo al que no se otorgó acceso equivale a una fuga de información.
Y la respuesta correcta es no. El permiso requerido es ListAllMyBuckets, que permitirá al usuario ver TODOS los depósitos. Dejar este permiso hará que la consola quede inutilizable.
Existe una gran manera de permitir a los usuarios acceder a un segmento específico sin comprender el conocimiento de otros sectores. Una política de grupo similar a la siguiente permitirá a los usuarios ver solo "bucket a". El único inconveniente es que el usuario solo podrá acceder al depósito si se conectan al punto final del depósito dado. Para el siguiente ejemplo, sería bucket-a.s3.amazonaws.com. El depósito también puede tener que tener "Usuarios autenticados" permitidos para que esto ocurra.
{
"Statement": [
{
"Sid": "<EXAMPLE_SID>",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucket-a"
]
},
{
"Sid": "<EXAMPLE_SID>",
"Action": "s3:*",
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucket-a/*"
]
}
]
}
Este método fue probado con Cyberduck en Mac OS / X y utilizando el paquete s3cmd
./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat
ion=ap-southeast-2
Existe una manera fácil o alternativa de hacerlo utilizando AWS Organizations. La organización de AWS le permite tener múltiples cuentas de usuario. Su cuenta principal tendrá varias cuentas AWS (Sub) y, independientemente de los servicios (s3 / EC2 / *) que se agreguen en las cuentas de AWS, solo esos recursos estarán visibles.
Consulte https://aws.amazon.com/blogs/aws/aws-organizations-policy-based-management-for-multiple-aws-accounts/ https://aws.amazon.com/organizations/
He estado probando esto por un tiempo y finalmente se me ocurrió una solución funcional. Debe usar diferentes "Recursos" dependiendo del tipo de acción que esté realizando. También PutBucketAcl
algunas acciones faltantes en la respuesta anterior (como DeleteObject
) y restringí algunas más (como PutBucketAcl
).
La siguiente política de IAM me funciona ahora:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::itnighq",
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectVersionAcl"
],
"Resource": "arn:aws:s3:::itnighq/*",
"Condition": {}
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
]
}
Las acciones relacionadas con un cubo y aquellas relacionadas con objetos deben tener diferentes arn.
La solución a continuación funcionó para mí. Quería una política para otorgar acceso a un usuario específico my_iam_user en un cubo específico my-s3-bucket .
Esta política permite a mi usuario enumerar, eliminar y obtener archivos de un cubo s3 específico.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListBucket",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/my_iam_user"
},
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::my-s3-bucket"
},
{
"Sid": "AddDeleteFiles",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/my_iam_user"
},
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-s3-bucket/*"
}
]
}
Me las arreglé para conseguir el siguiente trabajo. Significó que la lista de otros cubos recibió el mensaje Acceso denegado. Pero aún así pude ver el cubo que quería si me conectaba con el nombre del cubo establecido como ruta.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::test"
},
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::test"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::test/*"]
}
]
}
Estaba usando Cyberduck para probar esta conexión.
No es posible proporcionar acceso a la consola S3 sin otorgar el permiso ListAllMyBuckets
.
En mi caso (y tal vez el tuyo, lector futuro), una alternativa aceptable es redirigir a los usuarios al iniciar sesión directamente al grupo que deseas que vean.
Para lograr esto, agregue lo siguiente a su firma de IAM en url: /s3/?bucket=bucket-name
URL de inicio de sesión completo (reemplace su alias y nombre de depósito ):
https://your-alias.signin.aws.amazon.com/console/s3/?bucket=bucket-name
Política de IAM (replace bucket-name ):
{
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket-name",
"arn:aws:s3:::bucket-name/*"
]
}
]
}
Para obtener más información acerca de cómo crear permisos específicos para los usuarios, lea este blog: http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-amazon-iam/
Nuestro caso de uso: Proporcione espacio de respaldo para los clientes de nuestra aplicación en la nube a la que puedan acceder los clientes directamente utilizando las herramientas comunes de S3. Por supuesto, ningún cliente debería ver lo que otros clientes tienen.
Como lo explicó Cloudberryman, "Puedes enumerar todos los segmentos o ninguno", así que tenemos que encontrar una solución. Fondo:
Es necesario otorgar derechos ListAllMyBuckets al usuario para que la consola AWS S3 o S3Fox se conecten sin un mensaje de error. Pero ListAllMyBuckets enumera todos los segmentos, independientemente de los recursos asignados (en realidad, solo arn: ... ::: * funciona). Eso es un error serio, si me preguntas. Por cierto. La denegación de ListBucket para todos los segmentos no impide que se incluyan en la lista, ya que ListBucket otorga derechos para mostrar el contenido del depósito.
Hay 3 posibilidades que considero que funcionan. Elegí el último.
(1) use nombres de cubo crípticos, por ejemplo, GUID
Ventaja: fácil de configurar
Desventaja: difícil de administrar, especialmente para el cliente. (imagine encontrar una GUID específica entre miles de otras). También muestra la cantidad de cubos = número de clientes que usan el servicio de respaldo.
(2) use un cubo con las carpetas específicas del cliente
Así es como Amazon sugiere por sus ejemplos S3 / IAM que brinden espacio para acceder solo a ciertos usuarios o grupos de usuarios. Ver: AWS Ejemplo de políticas de IAM
Ventaja: bastante fácil de configurar, va con las ideas de AWS
Desventaja: fuerzas para hacer que la existencia de todos los cubos sea pública, para que el cliente pueda encontrar su cubo de "casa". La contabilidad de AWS proporciona estadísticas del uso del depósito, pero no del uso de la carpeta, lo que dificulta el cálculo del costo por cliente.
(3) no conceda el derecho de acceso para ListAllMyBuckets
Ventaja: obtienes lo que quieres: los clientes no pueden ver los cubos de otros clientes
Desventaja: el cliente no puede ver su propio cubo. S3Browser viene con un bonito mensaje de "no se puede hacer" y le pide que ingrese el nombre del cubo. S3Fox arroja un mensaje de error cuando se conecta a la raíz, pero permite la navegación directa al cubo del cliente si se conoce el nombre del cubo. La consola Amazon S3 no funciona en absoluto.
Espero que esto ayude a manejar S3 IAM como lo necesite.
Probablemente el caso de uso más simple:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bucket-name"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::bucket-name/*"]
}
]
}
Prueba esta política También tenga en cuenta que no hay forma de permitir que el usuario liste solo el segmento seleccionado. Puede enumerar todos los segmentos o ninguno.
{
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
]
}
Si bien no es posible restringir la acción s3:ListAllMyBuckets
a s3:ListAllMyBuckets
específicos, en cuanto a la solución alternativa, puede enviarles la URL de la consola para un depósito específico, por ejemplo
-
https://s3.console.aws.amazon.com/s3/buckets/BUCKET_NAME/
Fuente: lista de restricción de depósitos S3 de la consola S3
Para hacerlo, deberá especificar el siguiente documento de política para un usuario o grupo dado:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": [
"arn:aws:s3:::my-bucket-1",
"arn:aws:s3:::my-bucket-2"
]
},
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectVersionAcl"
],
"Resource": [
"arn:aws:s3:::my-bucket-1/*",
"arn:aws:s3:::my-bucket-2/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
}
]
}
Donde my-bucket-1
y my-bucket-2
son sus cubos para dar acceso de lectura y escritura.
Relacionado:
- Escribir políticas de IAM: Cómo otorgar acceso a un cubo de Amazon S3
- Restringir lista de cubos para un usuario específico
- ¿Cómo se brinda a un usuario acceso solo a un segmento en particular en AWS S3?
- Especificación de recursos en una política y s3:ListAllMyBuckets
Solo agrego una necesidad similar, resuelta por esto:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:Put*",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket-name",
"arn:aws:s3:::my-bucket-name/*"
]
}
]
}
Una buena solución simple que se nos ocurrió es bloquear al usuario para iniciar sesión en el directorio raíz. Por lo tanto, deben iniciar sesión con la ruta remota establecida en la carpeta deseada.
{
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::folder-name*",
"Condition": {}
}
]
}
Uso las siguientes cosas para ocultar los contenidos de Bucket de otros usuarios. Esto no solo ayuda a ocultar otros depósitos (no use ListAllMyBuckets), sino también carpetas en el mismo segmento, cuando crea un depósito, pero desea tener subcarpetas en él que le asignan los permisos adecuados al usuario / subcarpeta de IAM.
La siguiente política se aplica al Grupo IAM y todos los usuarios están en este Grupo. aws:userid
tomar aws:userid
y crear una subcarpeta con el mismo nombre en el depósito.
Se puede tomar aws iam get-user --user-name "user_name_for_folder_access":
: aws iam get-user --user-name "user_name_for_folder_access":
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::bucket_name/${aws:userid}/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket_name"
]
}
]
}